@decaf-ts/for-fabric 0.4.7 → 0.4.8-hotfix.1

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.
@@ -2519,21 +2519,21 @@ async function getSigner(keyDirectoryPath) {
2519
2519
  return await promises.readFile(keyPath);
2520
2520
  };
2521
2521
  const privateKeyPem = await contentOfLoadFile(keyDirectoryPath, signerFileReader);
2522
- const privateKey = await extractPrivateKey(privateKeyPem);
2523
- const keys = Object.getOwnPropertySymbols(privateKey);
2524
- const k = privateKey[keys[0]];
2522
+ let k;
2523
+ if (isBrowser()) {
2524
+ const privateKey = await extractPrivateKey(privateKeyPem);
2525
+ const keys = Object.getOwnPropertySymbols(privateKey);
2526
+ k = privateKey[keys[0]];
2527
+ } else {
2528
+ const {createPrivateKey: createPrivateKey} = await import("crypto");
2529
+ k = createPrivateKey(privateKeyPem);
2530
+ }
2525
2531
  return signers.newPrivateKeySigner(k);
2526
2532
  }
2527
2533
 
2528
2534
  async function extractPrivateKey(pem) {
2529
- const libName = "crypto";
2530
2535
  let subtle;
2531
- if (isBrowser()) {
2532
- subtle = globalThis.crypto.subtle;
2533
- } else {
2534
- const lib = await normalizeImport(import(libName));
2535
- subtle = lib.subtle || lib.webcrypto.subtle;
2536
- }
2536
+ subtle = globalThis.crypto.subtle;
2537
2537
  if (!subtle) throw new Error("Could not load SubtleCrypto module");
2538
2538
  function str2ab(str) {
2539
2539
  const buf = new ArrayBuffer(str.length);
@@ -3871,11 +3871,11 @@ class FabricClientDispatch extends Dispatch {
3871
3871
 
3872
3872
  if (FabricClientAdapter) FabricClientAdapter["_baseDispatch"] = FabricClientDispatch;
3873
3873
 
3874
- const VERSION = "0.4.7";
3874
+ const VERSION = "0.4.8";
3875
3875
 
3876
3876
  const PACKAGE_NAME = "@decaf-ts/for-fabric";
3877
3877
 
3878
3878
  Metadata.registerLibrary(PACKAGE_NAME, VERSION);
3879
3879
 
3880
3880
  export { AllowanceError, BASE_ALPHABET, BalanceError, BaseEncoder, CA_ROLE, CRYPTO, ClientSerializer, CoreUtils, CryptoUtils, DefaultFabricClientFlags, DeterministicSerializer, ERC20Events, EndorsementError, EndorsementPolicyError, FabricBaseModel, FabricClientAdapter, FabricClientDispatch, FabricClientRepository, FabricERC20ClientRepository, FabricEnrollmentService, FabricFlavour, FabricIdentifiedBaseModel, FabricIdentityService, FabricModelKeys, HFCAIdentityAttributes, HFCAIdentityType, Identity, IdentityCredentials, IdentityType, ImplicitPrivateCollection, MissingContextError, MissingPKCSS11Lib, ModelCollection, MvccReadConflictError, NamespaceCollection, NotInitializedError, OverflowError, Owner, PACKAGE_NAME, PhantomReadConflictError, RegistrationError, RegistrationRequestBuilder, SEGREGATED_COLLECTION_EXTRACTION_PRIORITY, SimpleDeterministicSerializer, TransactionBufferSizeError, TransactionLimitsError, TransactionTimeoutError, UnauthorizedPrivateDataAccess, VERSION, add, applyMirrorFlags, applySegregationFlags, collectionFor, contentOfLoadFile, createMirrorHandler, deleteMirrorHandler, evalMirrorMetadata, extractCollections, extractIds, extractMspId, extractPrivateKey, extractSegregatedCollections, generateFabricEventName, generateModelDesignDocs, generateModelIndexes, getAkiAndSerialFromCert, getCAUser, getFirstDirFileName, getFirstDirFileNameContent, getIdentity, getSigner, mirror, mirrorWriteGuard, ownedBy, ownedByOnCreate, parseEventName, privateCollectionFor, privateData, readFile, readMirrorHandler, readModelFile, readModelFolders, safeParseInt, segregatedDataOnCreate, segregatedDataOnDelete, segregatedDataOnRead, segregatedDataOnUpdate, sharedCollectionFor, sharedData, sortKeysOnlyRecursive, sub, transactionId, transactionIdOnCreate, updateMirrorHandler, writeCollectionDesignDocs, writeCollections, writeDesignDocs, writeIndexes };
3881
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWZhYnJpYy5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC9pbmRleGVzL2dlbmVyYXRpb24udHMiLCIuLi9zcmMvY2xpZW50L2NvbGxlY3Rpb25zL2dlbmVyYXRpb24udHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudFBhZ2luYXRvci50cyIsIi4uL3NyYy9jbGllbnQvRmFicmljQ2xpZW50UmVwb3NpdG9yeS50cyIsIi4uL3NyYy9jb250cmFjdHMvZXJjMjAvbW9kZWxzLnRzIiwiLi4vc3JjL3NoYXJlZC9DbGllbnRTZXJpYWxpemVyLnRzIiwiLi4vc3JjL2NsaWVudC9lcmMyMC9GYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnkudHMiLCIuLi9zcmMvY2xpZW50L2lkcy9pZC1leHRyYWN0aW9uLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9JZGVudGl0eUNyZWRlbnRpYWxzLnRzIiwiLi4vc3JjL3NoYXJlZC9jb25zdGFudHMudHMiLCIuLi9zcmMvc2hhcmVkL21vZGVsL0lkZW50aXR5LnRzIiwiLi4vc3JjL2NsaWVudC91dGlscy50cyIsIi4uL3NyYy9jbGllbnQvY3J5cHRvLnRzIiwiLi4vc3JjL3NoYXJlZC9lcnJvcnMudHMiLCIuLi9zcmMvY2xpZW50L3NlcnZpY2VzL0ZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9SZWdpc3RyYXRpb25SZXF1ZXN0QnVpbGRlci50cyIsIi4uL3NyYy9zaGFyZWQvZXJjMjAvZXJjMjAtY29uc3RhbnRzLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9GYWJyaWNCYXNlTW9kZWwudHMiLCIuLi9zcmMvc2hhcmVkL21vZGVsL0ZhYnJpY0lkZW50aWZpZWRCYXNlTW9kZWwudHMiLCIuLi9zcmMvc2hhcmVkL292ZXJyaWRlcy9vdmVycmlkZXMudHMiLCIuLi9zcmMvc2hhcmVkL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvc2hhcmVkL0RldGVybWluaXN0aWNTZXJpYWxpemVyLnRzIiwiLi4vc3JjL3NoYXJlZC9ldmVudHMudHMiLCIuLi9zcmMvc2hhcmVkL21hdGgudHMiLCIuLi9zcmMvc2hhcmVkL1NpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GYWJyaWNJZGVudGl0eVNlcnZpY2UudHMiLCIuLi9zcmMvY2xpZW50L3NlcnZpY2VzL2NvbnN0YW50cy50cyIsIi4uL3NyYy9jbGllbnQvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2NsaWVudC9mYWJyaWMtZnMudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudFN0YXRlbWVudC50cyIsIi4uL3NyYy9jbGllbnQvRmFicmljQ2xpZW50QWRhcHRlci50cyIsIi4uL3NyYy9jbGllbnQvRmFicmljQ2xpZW50RGlzcGF0Y2gudHMiLCIuLi9zcmMvdmVyc2lvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHtcbiAgQ3JlYXRlSW5kZXhSZXF1ZXN0LFxuICBDb3VjaERCRGVzaWduRG9jLFxuICBnZW5lcmF0ZUluZGV4ZXMsXG4gIGdlbmVyYXRlVmlld3MsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7IE1vZGVsLCBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG5leHBvcnQgdHlwZSBJbmRleCA9IENyZWF0ZUluZGV4UmVxdWVzdDtcblxuZnVuY3Rpb24gZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbiAgY29uc3QgZGlybmFtZTogc3RyaW5nID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoZGlybmFtZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZGlybmFtZSk7XG4gIGZzLm1rZGlyU3luYyhkaXJuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTW9kZWxJbmRleGVzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG06IENvbnN0cnVjdG9yPE0+XG4pOiBJbmRleFtdIHtcbiAgcmV0dXJuIGdlbmVyYXRlSW5kZXhlcyhbbV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNb2RlbERlc2lnbkRvY3M8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIGFjY3VtPzogUmVjb3JkPHN0cmluZywgQ291Y2hEQkRlc2lnbkRvYz5cbik6IENvdWNoREJEZXNpZ25Eb2NbXSB7XG4gIGNvbnN0IHZpZXdzID0gZ2VuZXJhdGVWaWV3cyhbbV0pO1xuICBjb25zdCBzdG9yYWdlOiBSZWNvcmQ8c3RyaW5nLCBDb3VjaERCRGVzaWduRG9jPiA9IGFjY3VtIHx8IHt9O1xuICB2aWV3cy5mb3JFYWNoKChkb2MpID0+IHtcbiAgICBzdG9yYWdlW2RvYy5faWRdID0gZG9jO1xuICB9KTtcbiAgcmV0dXJuIHZpZXdzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZE1vZGVsRmlsZShmaWxlOiBhbnkpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBleHBvcnRzID0gcmVxdWlyZShwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgZmlsZS5wYXJlbnRQYXRoLCBmaWxlLm5hbWUpKTtcblxuICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKGV4cG9ydHMpLmZpbHRlcigoZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtID0gbmV3IChlIGFzIENvbnN0cnVjdG9yKSgpO1xuICAgICAgcmV0dXJuIG0gaW5zdGFuY2VvZiBNb2RlbDtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KSBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT5bXTtcbiAgcmV0dXJuIHZhbHVlcztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRNb2RlbEZvbGRlcnMoXG4gIC4uLmZvbGRlcnM6IHN0cmluZ1tdXG4pOiBQcm9taXNlPE1vZGVsQ29uc3RydWN0b3I8YW55PltdPiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuXG4gIGNvbnN0IHJlc3VsdDogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGZvbGRlciBvZiBmb2xkZXJzKSB7XG4gICAgY29uc3QgZmlsZXMgPSBmc1xuICAgICAgLnJlYWRkaXJTeW5jKGZvbGRlciwge1xuICAgICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlLFxuICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZjogYW55KSA9PiBmLmlzRmlsZSgpICYmIGYubmFtZS5lbmRzV2l0aChcImpzXCIpKTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLnJlYWRNb2RlbEZpbGUoZmlsZSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVJbmRleGVzKFxuICBpbmRleGVzOiBJbmRleFtdLFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBjb2xsZWN0aW9uPzogc3RyaW5nXG4pIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcblxuICBpbmRleGVzLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgY29uc3QgZmlsZSA9IHBhdGgucmVzb2x2ZShcbiAgICAgIHBhdGguam9pbihcbiAgICAgICAgcCxcbiAgICAgICAgYC4vTUVUQS1JTkYvc3RhdGVkYi9jb3VjaGRiLyR7Y29sbGVjdGlvbiA/IGBjb2xsZWN0aW9ucy8ke2NvbGxlY3Rpb259L2AgOiBcIlwifWluZGV4ZXMvJHtpbmRleC5uYW1lfS5qc29uYFxuICAgICAgKVxuICAgICk7XG4gICAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGUpO1xuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZSwgSlNPTi5zdHJpbmdpZnkoaW5kZXgsIHVuZGVmaW5lZCwgMikpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlRGVzaWduRG9jcyhcbiAgZGVzaWduRG9jczogQ291Y2hEQkRlc2lnbkRvY1tdLFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBjb2xsZWN0aW9uPzogc3RyaW5nXG4pIHtcbiAgaWYgKCFkZXNpZ25Eb2NzLmxlbmd0aCkgcmV0dXJuO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG4gIGRlc2lnbkRvY3MuZm9yRWFjaCgoZG9jKSA9PiB7XG4gICAgY29uc3QgZG9jSWQgPSBkb2MuX2lkLnJlcGxhY2UoL15fZGVzaWduXFwvLywgXCJcIik7XG4gICAgY29uc3QgZmlsZSA9IHBhdGgucmVzb2x2ZShcbiAgICAgIHBhdGguam9pbihcbiAgICAgICAgcCxcbiAgICAgICAgYC4vTUVUQS1JTkYvc3RhdGVkYi9jb3VjaGRiLyR7Y29sbGVjdGlvbiA/IGBjb2xsZWN0aW9ucy8ke2NvbGxlY3Rpb259L2AgOiBcIlwifWRlc2lnbl9kb2NzLyR7ZG9jSWR9Lmpzb25gXG4gICAgICApXG4gICAgKTtcbiAgICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZSk7XG4gICAgY29uc3QgcGF5bG9hZCA9IHsgLi4uZG9jIH07XG4gICAgZGVsZXRlIHBheWxvYWQuX3JldjtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGUsIEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIHVuZGVmaW5lZCwgMikpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBDb3VjaERCRGVzaWduRG9jIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb2xsZWN0aW9uUmVzb2x2ZXIgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2luZGV4XCI7XG5pbXBvcnQgeyB3cml0ZURlc2lnbkRvY3MgfSBmcm9tIFwiLi4vaW5kZXhlcy9nZW5lcmF0aW9uXCI7XG5cbi8vXG4vLyBleHBvcnQgdHlwZSBGYWJyaWNDb2xsZWN0aW9uID0ge1xuLy8gICBuYW1lOiBcImNvbGxlY3Rpb25NYXJibGVzXCI7XG4vLyAgIHBvbGljeTogXCJPUignT3JnMU1TUC5tZW1iZXInLCAnT3JnMk1TUC5tZW1iZXInKVwiO1xuLy8gICByZXF1aXJlZFBlZXJDb3VudDogMDtcbi8vICAgbWF4UGVlckNvdW50OiAzO1xuLy8gICBibG9ja1RvTGl2ZTogMDtcbi8vICAgbWVtYmVyT25seVJlYWQ6IHRydWU7XG4vLyAgIG1lbWJlck9ubHlXcml0ZTogdHJ1ZTtcbi8vICAgZW5kb3JzZW1lbnRQb2xpY3k6IHtcbi8vICAgICBpZGVudGl0aWVzOiBbXG4vLyAgICAgICB7IHJvbGU6IHsgbmFtZTogXCJtZW1iZXJcIjsgbXNwSWQ6IFwiT3JnMU1TUFwiIH0gfSxcbi8vICAgICAgIHsgcm9sZTogeyBuYW1lOiBcIm1lbWJlclwiOyBtc3BJZDogXCJPcmcyTVNQXCIgfSB9LFxuLy8gICAgIF07XG4vLyAgICAgcnVsZTogXCJPUignT3JnMU1TUC5tZW1iZXInLCAnT3JnMk1TUC5tZW1iZXInKVwiO1xuLy8gICB9O1xuLy8gfTtcblxuZXhwb3J0IHR5cGUgRmFicmljUG9saWN5SWRlbnRpdHkgPSB7XG4gIHJvbGU6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgbXNwSWQ6IHN0cmluZztcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIEZhYnJpY0NvbGxlY3Rpb24gPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgcG9saWN5OiBzdHJpbmc7XG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXI7XG4gIG1heFBlZXJDb3VudDogbnVtYmVyO1xuICBibG9ja1RvTGl2ZTogbnVtYmVyO1xuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbjtcbiAgbWVtYmVyT25seVdyaXRlOiBib29sZWFuO1xuICBlbmRvcnNlbWVudFBvbGljeToge1xuICAgIGlkZW50aXRpZXM6IEZhYnJpY1BvbGljeUlkZW50aXR5W107XG4gICAgcnVsZTogc3RyaW5nO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgUHJpdmF0ZUNvbGxlY3Rpb24gPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgcG9saWN5OiBzdHJpbmc7XG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXI7XG4gIG1heFBlZXJDb3VudDogbnVtYmVyO1xuICBibG9ja1RvTGl2ZTogbnVtYmVyO1xuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbjtcbiAgbWVtYmVyT25seVdyaXRlOiBib29sZWFuO1xuICBlbmRvcnNlbWVudFBvbGljeT86IHtcbiAgICBzaWduYXR1cmVQb2xpY3k6IHN0cmluZztcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0aW9uRm9yKFxuICBjb2xsZWN0aW9uTmFtZTogc3RyaW5nLFxuICBwb2xpY3k6IHN0cmluZyxcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlcixcbiAgbWF4UGVlckNvdW50OiBudW1iZXIsXG4gIGJsb2NrVG9MaXZlOiBudW1iZXIsXG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuLFxuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW5cbik6IFByaXZhdGVDb2xsZWN0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBjb2xsZWN0aW9uTmFtZSxcbiAgICBwb2xpY3k6IHBvbGljeSxcbiAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICBtYXhQZWVyQ291bnQsXG4gICAgYmxvY2tUb0xpdmUsXG4gICAgbWVtYmVyT25seVJlYWQsXG4gICAgbWVtYmVyT25seVdyaXRlLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUNvbGxlY3Rpb25Gb3IoXG4gIG1zcElkOiBzdHJpbmcsXG4gIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcgPSBgJHttc3BJZH1Qcml2YXRlYCxcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlciA9IDAsXG4gIG1heFBlZXJDb3VudDogbnVtYmVyID0gMCxcbiAgYmxvY2tUb0xpdmU6IG51bWJlciA9IDAsXG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuID0gdHJ1ZSxcbiAgbWVtYmVyT25seVdyaXRlOiBib29sZWFuID0gdHJ1ZVxuKTogUHJpdmF0ZUNvbGxlY3Rpb24ge1xuICBjb25zdCBjID0gY29sbGVjdGlvbkZvcihcbiAgICBjb2xsZWN0aW9uTmFtZSxcbiAgICBgT1IoJyR7bXNwSWR9Lm1lbWJlcicpYCxcbiAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICBtYXhQZWVyQ291bnQsXG4gICAgYmxvY2tUb0xpdmUsXG4gICAgbWVtYmVyT25seVJlYWQsXG4gICAgbWVtYmVyT25seVdyaXRlXG4gICk7XG5cbiAgYy5lbmRvcnNlbWVudFBvbGljeSA9IHtcbiAgICBzaWduYXR1cmVQb2xpY3k6IGBPUignJHttc3BJZH0ucGVlcicpYCxcbiAgfTtcbiAgcmV0dXJuIGM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGFyZWRDb2xsZWN0aW9uRm9yKFxuICBtc3BJZHM6IHN0cmluZ1tdLFxuICBjb2xsZWN0aW9uTmFtZTogc3RyaW5nLFxuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyID0gMSxcbiAgbWF4UGVlckNvdW50OiBudW1iZXIgPSAyLFxuICBibG9ja1RvTGl2ZTogbnVtYmVyID0gMCxcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW4gPSB0cnVlLFxuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW4gPSB0cnVlXG4pOiBQcml2YXRlQ29sbGVjdGlvbiB7XG4gIGNvbnN0IGMgPSBjb2xsZWN0aW9uRm9yKFxuICAgIGNvbGxlY3Rpb25OYW1lLFxuICAgIGBPUigke21zcElkcy5tYXAoKG0pID0+IGAnJHttfS5tZW1iZXInYCkuam9pbihcIixcIil9KWAsXG4gICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgbWF4UGVlckNvdW50LFxuICAgIGJsb2NrVG9MaXZlLFxuICAgIG1lbWJlck9ubHlSZWFkLFxuICAgIG1lbWJlck9ubHlXcml0ZVxuICApO1xuICBjLmVuZG9yc2VtZW50UG9saWN5ID0ge1xuICAgIHNpZ25hdHVyZVBvbGljeTogYEFORCgke21zcElkcy5tYXAoKG0pID0+IGAnJHttfS5wZWVyJ2ApLmpvaW4oXCIsXCIpfSlgLFxuICB9O1xuICByZXR1cm4gYztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RDb2xsZWN0aW9uczxNIGV4dGVuZHMgTW9kZWw+KFxuICBtOiBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwSWRzOiBzdHJpbmdbXSxcbiAgb3ZlcnJpZGVzOiB7XG4gICAgcHJpdmF0ZUNvbHM/OiBQYXJ0aWFsPFByaXZhdGVDb2xsZWN0aW9uPjtcbiAgICBzaGFyZWRDb2xzPzogUGFydGlhbDxQcml2YXRlQ29sbGVjdGlvbj47XG4gIH0gPSB7fSxcbiAgbWlycm9yOiBib29sZWFuID0gZmFsc2Vcbikge1xuICBsZXQgeyBwcml2YXRlQ29scywgc2hhcmVkQ29scyB9ID0gTW9kZWwuY29sbGVjdGlvbnNGb3IobSk7XG5cbiAgZnVuY3Rpb24gcmVzb2x2ZUNvbGxlY3Rpb24oYXJnOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIGFyZyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFyZztcbiAgICAgIHJldHVybiBhcmcobSwgbXNwSWRzWzBdKSBhcyBzdHJpbmc7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZUNvbHMgPSBwcml2YXRlQ29scy5tYXAocmVzb2x2ZUNvbGxlY3Rpb24pO1xuICBzaGFyZWRDb2xzID0gc2hhcmVkQ29scy5tYXAocmVzb2x2ZUNvbGxlY3Rpb24pO1xuXG4gIGNvbnN0IHByaXZhdGVEZWZhdWx0cyA9IE9iamVjdC5hc3NpZ24oXG4gICAge30sXG4gICAge1xuICAgICAgcmVxdWlyZWRQZWVyQ291bnQ6IDAsXG4gICAgICBtYXhQZWVyQ291bnQ6IDAsXG4gICAgICBibG9ja1RvTGl2ZTogMCxcbiAgICAgIG1lbWJlck9ubHlSZWFkOiB0cnVlLFxuICAgICAgbWVtYmVyT25seVdyaXRlOiB0cnVlLFxuICAgIH0sXG4gICAgb3ZlcnJpZGVzPy5wcml2YXRlQ29scyB8fCB7fVxuICApO1xuICBjb25zdCBzaGFyZWREZWZhdWx0cyA9IE9iamVjdC5hc3NpZ24oXG4gICAge30sXG4gICAge1xuICAgICAgcmVxdWlyZWRQZWVyQ291bnQ6IDEsXG4gICAgICBtYXhQZWVyQ291bnQ6IDIsXG4gICAgICBibG9ja1RvTGl2ZTogMCxcbiAgICAgIG1lbWJlck9ubHlSZWFkOiB0cnVlLFxuICAgICAgbWVtYmVyT25seVdyaXRlOiB0cnVlLFxuICAgIH0sXG4gICAgb3ZlcnJpZGVzPy5zaGFyZWRDb2xzIHx8IHt9XG4gICk7XG5cbiAgY29uc3QgbWlycm9yTWV0YSA9IG1pcnJvciA/IE1vZGVsLm1pcnJvcmVkQXQobSkgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgcHJpdmF0ZXMgPSBtc3BJZHNcbiAgICAubWFwKChtc3BJZCkgPT5cbiAgICAgIChwcml2YXRlQ29scyBhcyBzdHJpbmdbXSkubWFwKChwKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcmVxdWlyZWRQZWVyQ291bnQsIG1heFBlZXJDb3VudCwgYmxvY2tUb0xpdmUsIG1lbWJlck9ubHlSZWFkIH0gPVxuICAgICAgICAgIHByaXZhdGVEZWZhdWx0cztcbiAgICAgICAgcmV0dXJuIHByaXZhdGVDb2xsZWN0aW9uRm9yKFxuICAgICAgICAgIG1zcElkLFxuICAgICAgICAgIHAsXG4gICAgICAgICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgICAgICAgbWF4UGVlckNvdW50LFxuICAgICAgICAgIGJsb2NrVG9MaXZlLFxuICAgICAgICAgIG1lbWJlck9ubHlSZWFkLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgIClcbiAgICAuZmxhdCgpO1xuXG4gIGlmIChtaXJyb3JNZXRhICYmIG1pcnJvck1ldGEubXNwSWQpIHtcbiAgICBjb25zdCByZXNvbHZlZCA9XG4gICAgICB0eXBlb2YgbWlycm9yTWV0YS5yZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IG1pcnJvck1ldGEucmVzb2x2ZXJcbiAgICAgICAgOiBtaXJyb3JNZXRhLnJlc29sdmVyKG0sIG1pcnJvck1ldGEubXNwSWQpO1xuICAgIGlmIChcbiAgICAgIHJlc29sdmVkICYmXG4gICAgICAhcHJpdmF0ZXMuc29tZShcbiAgICAgICAgKHApID0+IHAubmFtZSA9PT0gcmVzb2x2ZWQgJiYgcC5wb2xpY3kuaW5jbHVkZXMobWlycm9yTWV0YS5tc3BJZClcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcmVxdWlyZWRQZWVyQ291bnQsIG1heFBlZXJDb3VudCwgYmxvY2tUb0xpdmUsIG1lbWJlck9ubHlSZWFkIH0gPVxuICAgICAgICBwcml2YXRlRGVmYXVsdHM7XG4gICAgICBwcml2YXRlcy5wdXNoKFxuICAgICAgICBwcml2YXRlQ29sbGVjdGlvbkZvcihcbiAgICAgICAgICBtaXJyb3JNZXRhLm1zcElkLFxuICAgICAgICAgIHJlc29sdmVkLFxuICAgICAgICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgICAgICAgIG1heFBlZXJDb3VudCxcbiAgICAgICAgICBibG9ja1RvTGl2ZSxcbiAgICAgICAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICAgICAgICBmYWxzZVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNoYXJlZCA9IChzaGFyZWRDb2xzIGFzIHN0cmluZ1tdKS5tYXAoKHApID0+IHtcbiAgICBjb25zdCB7XG4gICAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICAgIG1heFBlZXJDb3VudCxcbiAgICAgIGJsb2NrVG9MaXZlLFxuICAgICAgbWVtYmVyT25seVJlYWQsXG4gICAgICBtZW1iZXJPbmx5V3JpdGUsXG4gICAgfSA9IHNoYXJlZERlZmF1bHRzO1xuICAgIHJldHVybiBzaGFyZWRDb2xsZWN0aW9uRm9yKFxuICAgICAgbXNwSWRzLFxuICAgICAgcCxcbiAgICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgICAgbWF4UGVlckNvdW50LFxuICAgICAgYmxvY2tUb0xpdmUsXG4gICAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICAgIG1lbWJlck9ubHlXcml0ZVxuICAgICk7XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcHJpdmF0ZXMsXG4gICAgc2hhcmVkLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVDb2xsZWN0aW9ucyhcbiAgY29sczogUHJpdmF0ZUNvbGxlY3Rpb25bXSxcbiAgcDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgZmlsZU5hbWUgPSBcImNvbGxlY3Rpb25zX2NvbmZpZ1wiXG4pIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcblxuICBmdW5jdGlvbiBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIGNvbnN0IGRpcm5hbWU6IHN0cmluZyA9IHBhdGguZGlybmFtZShmaWxlUGF0aCkgYXMgc3RyaW5nO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpcm5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGRpcm5hbWUpO1xuICAgIGZzLm1rZGlyU3luYyhkaXJuYW1lKTtcbiAgfVxuXG4gIGNvbnN0IGZpbGUgPSBwYXRoLnJlc29sdmUocGF0aC5qb2luKHAsIGAuL01FVEEtSU5GLyR7ZmlsZU5hbWV9Lmpzb25gKSk7XG4gIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlKTtcbiAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCBKU09OLnN0cmluZ2lmeShjb2xzLCB1bmRlZmluZWQsIDIpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQ29sbGVjdGlvbkRlc2lnbkRvY3MoXG4gIGRvY3M6IENvdWNoREJEZXNpZ25Eb2NbXSxcbiAgcDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgY29sbGVjdGlvbj86IHN0cmluZ1xuKSB7XG4gIGlmICghZG9jcz8ubGVuZ3RoKSByZXR1cm47XG4gIHdyaXRlRGVzaWduRG9jcyhkb2NzLCBwLCBjb2xsZWN0aW9uKTtcbn1cbiIsImltcG9ydCB7XG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgUGFnaW5hdG9yLFxuICBQcmVwYXJlZFN0YXRlbWVudCxcbiAgU2VyaWFsaXplZFBhZ2UsXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7IE1hbmdvUXVlcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnRQYWdpbmF0b3I8TSBleHRlbmRzIE1vZGVsPiBleHRlbmRzIFBhZ2luYXRvcjxcbiAgTSxcbiAgTVtdLFxuICBNYW5nb1F1ZXJ5XG4+IHtcbiAgYm9va21hcms/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYWRhcHRlcjogRmFicmljQ2xpZW50QWRhcHRlcixcbiAgICBxdWVyeTogTWFuZ29RdWVyeSB8IFByZXBhcmVkU3RhdGVtZW50PGFueT4sXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPlxuICApIHtcbiAgICBzdXBlcihhZGFwdGVyLCBxdWVyeSwgc2l6ZSwgY2xhenopO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBwcm90ZWN0ZWQgcHJlcGFyZShyYXdTdGF0ZW1lbnQ6IE1hbmdvUXVlcnkpOiBNYW5nb1F1ZXJ5IHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIGBSYXcgcXVlcnkgYWNjZXNzIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcy4gb25seSBwcmVwYXJlZCBzdGF0ZW1lbnRzIGFyZSBuYXRpdmVseSBhdmFpbGFibGVgXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHBhZ2UoXG4gICAgcGFnZTogbnVtYmVyID0gMSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIHJldHVybiBzdXBlci5wYWdlKHBhZ2UsIC4uLmFyZ3MpOyAvLyB0aGlzIHdpbGwgZmFpbCBmb3Igbm9uLXByZXBhcmVkIHN0YXRlbWVudHNcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBpc1NlcmlhbGl6ZWRQYWdlKG9iajogU2VyaWFsaXplZFBhZ2U8YW55PiB8IGFueSkge1xuICAgIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiBBcnJheS5pc0FycmF5KG9iai5kYXRhKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBNYXliZUNvbnRleHR1YWxBcmcgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIENvbnRleHRPZixcbiAgRGlyZWN0aW9uTGltaXRPZmZzZXQsXG4gIEZsYWdzT2YsXG4gIE9ic2VydmVySGFuZGxlcixcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBhZ2luYXRvcixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBQcmVwYXJlZFN0YXRlbWVudEtleXMsXG4gIFJlcG9zaXRvcnksXG4gIFNlcmlhbGl6ZWRQYWdlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IHR5cGUgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgZW5mb3JjZURCRGVjb3JhdG9ycyxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgUHJpbWFyeUtleVR5cGUsXG4gIHJlZHVjZUVycm9yc1RvUHJpbnQsXG4gIFZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb3VjaERCS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudFBhZ2luYXRvciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudFBhZ2luYXRvclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIGZvciBGYWJyaWMgY2xpZW50IG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IEV4dGVuZHMgdGhlIGdlbmVyaWMgUmVwb3NpdG9yeSB0byBwcmVwYXJlIGNvbnRleHQgYW5kIGFyZ3VtZW50cyBmb3IgQ1JVRCBvcGVyYXRpb25zIGV4ZWN1dGVkIHZpYSBhIEZhYnJpYyBjbGllbnQgQWRhcHRlciwgd2lyaW5nIFJlcG9zaXRvcnlGbGFncyBhbmQgRmFicmljLXNwZWNpZmljIG92ZXJyaWRlcy5cbiAqIEB0ZW1wbGF0ZSBNIGV4dGVuZHMgTW9kZWwgLSBUaGUgbW9kZWwgdHlwZSBoYW5kbGVkIGJ5IHRoaXMgcmVwb3NpdG9yeVxuICogQHBhcmFtIHtBZGFwdGVyPGFueSwgTWFuZ29RdWVyeSwgRmFicmljRmxhZ3MsIENvbnRleHQ8RmFicmljRmxhZ3M+Pn0gW2FkYXB0ZXJdIC0gT3B0aW9uYWwgYWRhcHRlciBpbnN0YW5jZSB1c2VkIHRvIGV4ZWN1dGUgb3BlcmF0aW9uc1xuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gW2NsYXp6XSAtIE9wdGlvbmFsIG1vZGVsIGNvbnN0cnVjdG9yIHVzZWQgYnkgdGhlIHJlcG9zaXRvcnlcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgRmFicmljQ2xpZW50UmVwb3NpdG9yeVxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbiAqIGltcG9ydCB7IEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1mYWJyaWNcIjtcbiAqXG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgTW9kZWwgeyBpZCE6IHN0cmluZzsgbmFtZSE6IHN0cmluZzsgfVxuICogY29uc3QgcmVwbyA9IG5ldyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5PFVzZXI+KCk7XG4gKiBjb25zdCBjcmVhdGVkID0gYXdhaXQgcmVwby5jcmVhdGUobmV3IFVzZXIoeyBpZDogXCIxXCIsIG5hbWU6IFwiQWxpY2VcIiB9KSk7XG4gKiBjb25zdCBsb2FkZWQgPSBhd2FpdCByZXBvLnJlYWQoXCIxXCIpO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG8gYXMgRmFicmljQ2xpZW50UmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gKiAgIEFwcC0+PlJlcG86IGNyZWF0ZShtb2RlbClcbiAqICAgUmVwby0+PlJlcG86IGNyZWF0ZVByZWZpeChtb2RlbCwgLi4uYXJncylcbiAqICAgUmVwby0+PkFkYXB0ZXI6IGNyZWF0ZSh0YWJsZSwgaWQsIG1vZGVsLCBmbGFncylcbiAqICAgQWRhcHRlci0tPj5SZXBvOiByZXN1bHRcbiAqICAgUmVwby0tPj5BcHA6IG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5PFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIEEgZXh0ZW5kcyBGYWJyaWNDbGllbnRBZGFwdGVyID0gRmFicmljQ2xpZW50QWRhcHRlcixcbj4gZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIEE+IHtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIF9vdmVycmlkZXMgPSBPYmplY3QuYXNzaWduKHt9LCBzdXBlcltcIl9vdmVycmlkZXNcIl0sIHtcbiAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgIGFsbG93UmF3U3RhdGVtZW50czogZmFsc2UsXG4gICAgZm9yY2VQcmVwYXJlU2ltcGxlUXVlcmllczogdHJ1ZSxcbiAgICBmb3JjZVByZXBhcmVDb21wbGV4UXVlcmllczogdHJ1ZSxcbiAgICBhbGxvd0dlbmVyYXRpb25PdmVycmlkZTogZmFsc2UsXG4gICAgcmVidWlsZFdpdGhUcmFuc2llbnQ6IGZhbHNlLFxuICB9KTtcblxuICBjb25zdHJ1Y3RvcihhZGFwdGVyPzogQSwgY2xheno/OiBDb25zdHJ1Y3RvcjxNPiwgZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIGNsYXp6LCBmb3JjZSk7XG4gIH1cblxuICBvdmVycmlkZSBvdmVycmlkZShmbGFnczogUGFydGlhbDxGbGFnc09mPENvbnRleHRPZjxBPj4+KTogdGhpcyB7XG4gICAgcmV0dXJuIHN1cGVyXG4gICAgICAub3ZlcnJpZGUoT2JqZWN0LmFzc2lnbih7fSwgZmxhZ3MsIHRoaXMuX292ZXJyaWRlcykpXG4gICAgICAuZm9yKGZsYWdzIGFzIGFueSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgT2JzZXJ2ZXJIYW5kbGVyKCk6IE9ic2VydmVySGFuZGxlciB7XG4gICAgcmV0dXJuIHN1cGVyLk9ic2VydmVySGFuZGxlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcGFnaW5hdGVCeShcbiAgICBrZXk6IGtleW9mIE0sXG4gICAgb3JkZXI6IE9yZGVyRGlyZWN0aW9uLFxuICAgIHJlZjogT21pdDxEaXJlY3Rpb25MaW1pdE9mZnNldCwgXCJkaXJlY3Rpb25cIj4gPSB7XG4gICAgICBvZmZzZXQ6IDEsXG4gICAgICBsaW1pdDogMTAsXG4gICAgfSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPFNlcmlhbGl6ZWRQYWdlPE0+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFX0JZLCB0cnVlKVxuICAgICkuZm9yKHRoaXMucGFnaW5hdGVCeSk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgcGFnaW5hdGluZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gd2l0aCBwYWdlIHNpemUgJHtyZWYubGltaXR9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFxuICAgICAgdGhpcy5wYWdpbmF0ZUJ5Lm5hbWUsXG4gICAgICBrZXksXG4gICAgICBvcmRlcixcbiAgICAgIHsgbGltaXQ6IHJlZi5saW1pdCwgb2Zmc2V0OiByZWYub2Zmc2V0LCBib29rbWFyazogcmVmLmJvb2ttYXJrIH0sXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGxpc3RCeShcbiAgICBrZXk6IGtleW9mIE0sXG4gICAgb3JkZXI6IE9yZGVyRGlyZWN0aW9uLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5MSVNUX0JZLCB0cnVlKVxuICAgICkuZm9yKHRoaXMubGlzdEJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBsaXN0aW5nICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBieSAke2tleSBhcyBzdHJpbmd9ICR7b3JkZXJ9YFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMubGlzdEJ5Lm5hbWUsXG4gICAgICBrZXksXG4gICAgICBvcmRlcixcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kQnkoXG4gICAga2V5OiBrZXlvZiBNLFxuICAgIHZhbHVlOiBhbnksXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5maW5kQnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgYWxsICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoICR7a2V5IGFzIHN0cmluZ30gJHt2YWx1ZX1gXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuc3RhdGVtZW50KFxuICAgICAgdGhpcy5maW5kQnkubmFtZSxcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICkpIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpbmRPbmVCeShcbiAgICBrZXk6IGtleW9mIE0sXG4gICAgdmFsdWU6IGFueSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZmluZE9uZUJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBmaW5kaW5nIE9uZSAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gd2l0aCAke2tleSBhcyBzdHJpbmd9ICR7dmFsdWV9YFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMuZmluZE9uZUJ5Lm5hbWUsXG4gICAgICBrZXksXG4gICAgICB2YWx1ZSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3JkZXI6IE9yZGVyRGlyZWN0aW9uID0gT3JkZXJEaXJlY3Rpb24uQVNDLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZmluZCk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgZGVmYXVsdCBxdWVyeSBhdHRyaWJ1dGVzYFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMuZmluZC5uYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBvcmRlcixcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBwYWdlKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgZGlyZWN0aW9uOiBPcmRlckRpcmVjdGlvbiA9IE9yZGVyRGlyZWN0aW9uLkFTQyxcbiAgICByZWY6IE9taXQ8RGlyZWN0aW9uTGltaXRPZmZzZXQsIFwiZGlyZWN0aW9uXCI+ID0ge1xuICAgICAgb2Zmc2V0OiAxLFxuICAgICAgbGltaXQ6IDEwLFxuICAgIH0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxTZXJpYWxpemVkUGFnZTxNPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLnBhZ2UpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYHBhZ2luZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgZGVmYXVsdCBxdWVyeSBhdHRyaWJ1dGVzYFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMucGFnZS5uYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBkaXJlY3Rpb24sXG4gICAgICByZWYsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgc3RhdGVtZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHgsIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFBlcnNpc3RlbmNlS2V5cy5TVEFURU1FTlQsIHRydWUpXG4gICAgKS5mb3IodGhpcy5zdGF0ZW1lbnQpO1xuICAgIGxvZy52ZXJib3NlKGBFeGVjdXRpbmcgcHJlcGFyZWQgc3RhdGVtZW50ICR7bmFtZX1gKTtcbiAgICBjb25zdCBjYWxsQXJncyA9IGN0eEFyZ3Muc2xpY2UoMCwgLTEpO1xuICAgIGNvbnN0IHJlc3VsdCA9IEpTT04ucGFyc2UoXG4gICAgICB0aGlzLmFkYXB0ZXIuZGVjb2RlKFxuICAgICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICBjdHgsXG4gICAgICAgICAgUGVyc2lzdGVuY2VLZXlzLlNUQVRFTUVOVCxcbiAgICAgICAgICBbbmFtZSwgSlNPTi5zdHJpbmdpZnkoY2FsbEFyZ3MpXSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHRoaXMuY2xhc3MubmFtZVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcblxuICAgIGxldCBoeWRyYXRlZDogYW55O1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgIGh5ZHJhdGVkID0gcmVzdWx0Lm1hcCgocjogYW55KSA9PlxuICAgICAgICAociBhcyBhbnkpW0NvdWNoREJLZXlzLlRBQkxFXSAmJlxuICAgICAgICAociBhcyBhbnkpW0NvdWNoREJLZXlzLlRBQkxFXSA9PT0gTW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpXG4gICAgICAgICAgPyAobmV3IHRoaXMuY2xhc3MocikgYXMgTSlcbiAgICAgICAgICA6IHJcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIChyZXN1bHQgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gJiZcbiAgICAgIChyZXN1bHQgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gPT09IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKVxuICAgICkge1xuICAgICAgaHlkcmF0ZWQgPSBuZXcgdGhpcy5jbGFzcyhyZXN1bHQpIGFzIE07XG4gICAgfSBlbHNlIGlmIChGYWJyaWNDbGllbnRQYWdpbmF0b3IuaXNTZXJpYWxpemVkUGFnZShyZXN1bHQpKSB7XG4gICAgICBoeWRyYXRlZCA9IE9iamVjdC5hc3NpZ24ocmVzdWx0LCB7XG4gICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhLm1hcCgoZDogYW55KSA9PiBuZXcgdGhpcy5jbGFzcyhkKSBhcyBNKSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBoeWRyYXRlZCA9IHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUFmdGVyUmVhZChoeWRyYXRlZCwgY3R4KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXBwbHlBZnRlclJlYWQodmFsdWU6IGFueSwgY3R4OiBDb250ZXh0T2Y8QT4pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghY3R4LmdldE9yVW5kZWZpbmVkKFwiYWZ0ZXJRdWVyeUhhbmRsZXJzXCIpKSByZXR1cm4gdmFsdWU7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTW9kZWwpIHtcbiAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgUmVwb3NpdG9yeTxNLCBBPiwgYW55PihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgY3R4LFxuICAgICAgICB2YWx1ZSBhcyBNLFxuICAgICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICAgIE9wZXJhdGlvbktleXMuQUZURVJcbiAgICAgICk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodmFsdWUubWFwKChlbnRyeSkgPT4gdGhpcy5hcHBseUFmdGVyUmVhZChlbnRyeSwgY3R4KSkpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoRmFicmljQ2xpZW50UGFnaW5hdG9yLmlzU2VyaWFsaXplZFBhZ2UodmFsdWUpKSB7XG4gICAgICBhd2FpdCB0aGlzLmFwcGx5QWZ0ZXJSZWFkKHZhbHVlLmRhdGEsIGN0eCk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNvdW50T2YoXG4gICAga2V5Pzoga2V5b2YgTSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5jb3VudE9mKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBjb3VudGluZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0ke2tleSA/IGAgYnkgJHtrZXkgYXMgc3RyaW5nfWAgOiBcIlwifWBcbiAgICApO1xuICAgIGNvbnN0IHN0bXRBcmdzID0ga2V5ID8gW2tleSwgLi4uY3R4QXJnc10gOiBjdHhBcmdzO1xuICAgIHJldHVybiB0aGlzLnN0YXRlbWVudChQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0YsIC4uLnN0bXRBcmdzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIG1heE9mPEsgZXh0ZW5kcyBrZXlvZiBNPihcbiAgICBrZXk6IEssXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW0tdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5tYXhPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyBtYXggb2YgJHtrZXkgYXMgc3RyaW5nfSBpbiAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1BWF9PRiwga2V5LCAuLi5jdHhBcmdzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIG1pbk9mPEsgZXh0ZW5kcyBrZXlvZiBNPihcbiAgICBrZXk6IEssXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW0tdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5taW5PZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyBtaW4gb2YgJHtrZXkgYXMgc3RyaW5nfSBpbiAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1JTl9PRiwga2V5LCAuLi5jdHhBcmdzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGF2Z09mPEsgZXh0ZW5kcyBrZXlvZiBNPihcbiAgICBrZXk6IEssXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRiwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmF2Z09mKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBjYWxjdWxhdGluZyBhdmcgb2YgJHtrZXkgYXMgc3RyaW5nfSBpbiAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRiwga2V5LCAuLi5jdHhBcmdzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHN1bU9mPEsgZXh0ZW5kcyBrZXlvZiBNPihcbiAgICBrZXk6IEssXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRiwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLnN1bU9mKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBjYWxjdWxhdGluZyBzdW0gb2YgJHtrZXkgYXMgc3RyaW5nfSBpbiAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRiwga2V5LCAuLi5jdHhBcmdzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGRpc3RpbmN0T2Y8SyBleHRlbmRzIGtleW9mIE0+KFxuICAgIGtleTogSyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bS11bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuRElTVElOQ1RfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5kaXN0aW5jdE9mKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBmaW5kaW5nIGRpc3RpbmN0IHZhbHVlcyBvZiAke2tleSBhcyBzdHJpbmd9IGluICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfWBcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnN0YXRlbWVudChQcmVwYXJlZFN0YXRlbWVudEtleXMuRElTVElOQ1RfT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBncm91cE9mPEsgZXh0ZW5kcyBrZXlvZiBNPihcbiAgICBrZXk6IEssXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBNW10+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5HUk9VUF9PRiwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmdyb3VwT2YpO1xuICAgIGxvZy52ZXJib3NlKGBncm91cGluZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgJHtrZXkgYXMgc3RyaW5nfWApO1xuICAgIHJldHVybiB0aGlzLnN0YXRlbWVudChQcmVwYXJlZFN0YXRlbWVudEtleXMuR1JPVVBfT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBhc3luYyBoZWFsdGhjaGVjayguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+Pikge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5oZWFsdGhjaGVjayk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuaGVhbHRoY2hlY2sodGhpcy5jbGFzcywgLi4uY3R4QXJncyk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlKFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IHsgY3R4LCBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuY3JlYXRlKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ3JlYXRpbmcgbmV3ICR7dGhpcy5jbGFzcy5uYW1lfSBpbiB0YWJsZSAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX1gXG4gICAgKTtcbiAgICB0aGlzLmVuc3VyZUxlZ2FjeU1pcnJvckZsYWcoY3R4LCBtb2RlbCk7XG4gICAgY29uc3QgcHJlcGFyZWQgPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgY3R4KTtcbiAgICBjb25zdCB7IHJlY29yZCwgaWQsIHRyYW5zaWVudCB9ID0gcHJlcGFyZWQ7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZShcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBpZCxcbiAgICAgIHJlY29yZCxcbiAgICAgIHRyYW5zaWVudCxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHJlc3VsdCwgdGhpcy5jbGFzcywgaWQsIHRyYW5zaWVudCwgY3R4KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCB7IGN0eEFyZ3MsIGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZSk7XG4gICAgdGhpcy5lbnN1cmVMZWdhY3lNaXJyb3JGbGFnKGN0eCwgbW9kZWwpO1xuICAgIGNvbnN0IHByZXBhcmVkID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIGN0eCk7XG4gICAgY29uc3QgeyBpZCwgdHJhbnNpZW50IH0gPSBwcmVwYXJlZDtcbiAgICBsZXQgcmVjb3JkID0gcHJlcGFyZWQucmVjb3JkO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGB1cGRhdGluZyAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IHdpdGggaWQgJHtpZH1gXG4gICAgKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIudXBkYXRlKFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGlkLFxuICAgICAgcmVjb3JkLFxuICAgICAgdHJhbnNpZW50LFxuICAgICAgLi4uY3R4QXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4ocmVjb3JkLCB0aGlzLmNsYXNzLCBpZCwgdHJhbnNpZW50LCBjdHgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbFByZWZpeChcbiAgICBtb2RlbHM6IE1bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPFtNW10sIC4uLmFueVtdLCBDb250ZXh0T2Y8QT5dPiB7XG4gICAgY29uc3QgeyBjdHgsIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIE9wZXJhdGlvbktleXMuQ1JFQVRFLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuY3JlYXRlQWxsUHJlZml4KTtcbiAgICBjb25zdCBpZ25vcmVIYW5kbGVycyA9IGN0eC5nZXQoXCJpZ25vcmVIYW5kbGVyc1wiKTtcbiAgICBjb25zdCBpZ25vcmVWYWxpZGF0ZSA9IGN0eC5nZXQoXCJpZ25vcmVWYWxpZGF0aW9uXCIpO1xuICAgIGlmICghbW9kZWxzLmxlbmd0aCkgcmV0dXJuIFttb2RlbHMsIC4uLmN0eEFyZ3NdIGFzIGFueTtcblxuICAgIG1vZGVscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIGlmICghaWdub3JlSGFuZGxlcnMpXG4gICAgICAgICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9yczxNLCBSZXBvc2l0b3J5PE0sIEE+LCBhbnk+KFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIGN0eCxcbiAgICAgICAgICAgIG0sXG4gICAgICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGlmICghaWdub3JlVmFsaWRhdGUpIHtcbiAgICAgIGNvbnN0IGlnbm9yZWRQcm9wcyA9IGN0eC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW107XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBtb2RlbHMubWFwKChtKSA9PiBQcm9taXNlLnJlc29sdmUobS5oYXNFcnJvcnMoLi4uaWdub3JlZFByb3BzKSkpXG4gICAgICApO1xuXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2VzID0gcmVkdWNlRXJyb3JzVG9QcmludChlcnJvcnMpO1xuXG4gICAgICBpZiAoZXJyb3JNZXNzYWdlcykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvck1lc3NhZ2VzKTtcbiAgICB9XG4gICAgcmV0dXJuIFttb2RlbHMsIC4uLmN0eEFyZ3NdIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbChcbiAgICBtb2RlbHM6IE1bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGlmICghbW9kZWxzLmxlbmd0aCkgcmV0dXJuIG1vZGVscztcbiAgICBjb25zdCB7IGN0eCwgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZUFsbCk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENyZWF0aW5nICR7bW9kZWxzLmxlbmd0aH0gbmV3ICR7dGhpcy5jbGFzcy5uYW1lfSBpbiB0YWJsZSAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX1gXG4gICAgKTtcblxuICAgIG1vZGVscy5mb3JFYWNoKChtb2RlbCkgPT4gdGhpcy5lbnN1cmVMZWdhY3lNaXJyb3JGbGFnKGN0eCwgbW9kZWwpKTtcbiAgICBjb25zdCBwcmVwYXJlZCA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIGN0eCkpO1xuICAgIGNvbnN0IGlkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5pZCk7XG4gICAgY29uc3QgcGF5bG9hZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAucmVjb3JkKTtcbiAgICBjb25zdCB0cmFuc2llbnRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLnRyYW5zaWVudCk7XG4gICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGVBbGwoXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgaWRzIGFzIFByaW1hcnlLZXlUeXBlW10sXG4gICAgICBwYXlsb2FkcyxcbiAgICAgIHRyYW5zaWVudHMsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBjcmVhdGVkLm1hcChhc3luYyAociwgaSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IGlkc1tpXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4ociwgdGhpcy5jbGFzcywgaWQsIHRyYW5zaWVudHNbaV0sIGN0eCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyByZWFkQWxsKFxuICAgIGtleXM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKSB7XG4gICAgY29uc3QgeyBjdHgsIGxvZywgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkQWxsKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgcmVhZGluZyAke2tleXMubGVuZ3RofSAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkQWxsKHRoaXMuY2xhc3MsIGtleXMsIC4uLmN0eEFyZ3MpO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywga2V5c1tpXSwge30sIGN0eClcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKFxuICAgIG1vZGVsczogTVtdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgeyBjdHgsIGxvZywgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGVBbGwpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBVcGRhdGluZyAke21vZGVscy5sZW5ndGh9IG5ldyAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG5cbiAgICBtb2RlbHMuZm9yRWFjaCgobW9kZWwpID0+IHRoaXMuZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHgsIG1vZGVsKSk7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCBjdHgpKTtcbiAgICBjb25zdCBpZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAuaWQpO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIudXBkYXRlQWxsKFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGlkcyBhcyBQcmltYXJ5S2V5VHlwZVtdLFxuICAgICAgcHJlcGFyZWQubWFwKChyKSA9PiByLnJlY29yZCksXG4gICAgICBwcmVwYXJlZC5tYXAoKHIpID0+IHIudHJhbnNpZW50KSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIHVwZGF0ZWQubWFwKGFzeW5jICh1LCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gaWRzW2ldO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihcbiAgICAgICAgICB1LFxuICAgICAgICAgIHRoaXMuY2xhc3MsXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgcHJlcGFyZWRbaV0udHJhbnNpZW50LFxuICAgICAgICAgIGN0eFxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVMZWdhY3lNaXJyb3JGbGFnKGN0eDogQ29udGV4dE9mPEE+LCBtb2RlbDogTSk6IHZvaWQge1xuICAgIGlmIChNb2RlbC5taXJyb3JlZEF0KG1vZGVsKSkge1xuICAgICAgY3R4LmFjY3VtdWxhdGUoeyBsZWdhY3k6IHRydWUgfSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWwsIGNvbHVtbiwgcGssIHRhYmxlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgdHlwZSBNb2RlbEFyZywgcmVxdWlyZWQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVSQzIwIHRva2VuIG1ldGFkYXRhIG1vZGVsXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFuIEVSQzIwIHRva2VuIGRlZmluaXRpb24gd2l0aGluIHRoZSBGYWJyaWMgRVJDMjAgc2FtcGxlLCBpbmNsdWRpbmcgbmFtZSwgc3ltYm9sLCBkZWNpbWFscywgYW5kIHRoZSBvd25pbmcgaWRlbnRpdHkuIFVzZWQgdG8gZGVmaW5lIHRoZSB1bmlxdWUgdG9rZW4gbWFuYWdlZCBieSB0aGUgY29udHJhY3QuXG4gKiBAcGFyYW0ge01vZGVsQXJnPEVSQzIwVG9rZW4+fSBbbV0gLSBPcHRpb25hbCBwYXJ0aWFsIGRhdGEgb3IgYW5vdGhlciBpbnN0YW5jZSB0byBpbml0aWFsaXplIHRoZSBtb2RlbFxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBFUkMyMFRva2VuXG4gKiBAZXhhbXBsZVxuICogY29uc3QgdG9rZW4gPSBuZXcgRVJDMjBUb2tlbih7IG5hbWU6IFwiTXlUb2tlblwiLCBzeW1ib2w6IFwiTVRLXCIsIGRlY2ltYWxzOiAxOCwgb3duZXI6IFwieDUwOTo6Li4uXCIgfSk7XG4gKiAvLyBQZXJzaXN0IHRocm91Z2ggYSByZXBvc2l0b3J5OiBhd2FpdCByZXBvLmNyZWF0ZSh0b2tlbiwgY3R4KVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgUmVwb1xuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gKiAgIEFwcC0+PlJlcG86IGNyZWF0ZShuZXcgRVJDMjBUb2tlbih7Li4ufSksIGN0eClcbiAqICAgUmVwby0+PkFkYXB0ZXI6IGNyZWF0ZSh0YWJsZSwgaWQ9bmFtZSwgcmVjb3JkLCBmbGFncylcbiAqICAgQWRhcHRlci0tPj5SZXBvOiBzdG9yZWRcbiAqICAgUmVwby0tPj5BcHA6IG1vZGVsXG4gKi9cbkB0YWJsZShcImVyYzIwX3Rva2Vuc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBFUkMyMFRva2VuIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVG9rZW4gdW5pcXVlIG5hbWVcbiAgICogQHN1bW1hcnkgU2VydmVzIGFzIHRoZSBwcmltYXJ5IGtleSBmb3IgdGhlIEVSQzIwIHRva2VuIGRlZmluaXRpb247IHR5cGljYWxseSBhIGh1bWFuLXJlYWRhYmxlIGlkZW50aWZpZXJcbiAgICovXG4gIG5hbWUhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gT3duaW5nIGlkZW50aXR5IG9mIHRoZSB0b2tlblxuICAgKiBAc3VtbWFyeSBYLjUwOSBzdWJqZWN0IG9yIE1TUCBpZGVudGl0eSBzdHJpbmcgdGhhdCBkZW5vdGVzIHdobyBvd25zL2NvbnRyb2xzIHRoZSB0b2tlbiBkZWZpbml0aW9uXG4gICAqL1xuICBvd25lciE6IHN0cmluZztcbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVG9rZW4gc3ltYm9sXG4gICAqIEBzdW1tYXJ5IFNob3J0IHRpY2tlci1saWtlIHN5bWJvbCB1c2VkIHRvIHJlcHJlc2VudCB0aGUgdG9rZW4gKGUuZy4sIE1USylcbiAgICovXG4gIHN5bWJvbCE6IHN0cmluZztcbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVjaW1hbCBwcmVjaXNpb24gZm9yIHRva2VuIGFtb3VudHNcbiAgICogQHN1bW1hcnkgTnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBzZXBhcmF0b3IgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdG9rZW4gYmFsYW5jZXNcbiAgICovXG4gIGRlY2ltYWxzITogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKG0/OiBNb2RlbEFyZzxFUkMyMFdhbGxldD4pIHtcbiAgICBzdXBlcihtKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFUkMyMCB3YWxsZXQgbW9kZWxcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBob2xkZXIgYWNjb3VudCBmb3IgYW4gRVJDMjAgdG9rZW4gd2l0aGluIHRoZSBGYWJyaWMgbmV0d29yaywgdHJhY2tpbmcgYmFsYW5jZSBhbmQgdG9rZW4gYXNzb2NpYXRpb24uXG4gKiBAcGFyYW0ge01vZGVsQXJnPEVSQzIwV2FsbGV0Pn0gW21dIC0gT3B0aW9uYWwgcGFydGlhbCBkYXRhIG9yIGFub3RoZXIgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kZWxcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgRVJDMjBXYWxsZXRcbiAqIEBleGFtcGxlXG4gKiBjb25zdCB3YWxsZXQgPSBuZXcgRVJDMjBXYWxsZXQoeyBpZDogXCJhY2N0MVwiLCB0b2tlbjogXCJNeVRva2VuXCIsIGJhbGFuY2U6IDEwMDAgfSk7XG4gKiAvLyBVcGRhdGUgYmFsYW5jZSB2aWEgcmVwb3NpdG9yeTogYXdhaXQgcmVwby51cGRhdGUod2FsbGV0LCBjdHgpXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBSZXBvXG4gKiAgIEFwcC0+PlJlcG86IHJlYWQoXCJhY2N0MVwiLCBjdHgpXG4gKiAgIFJlcG8tLT4+QXBwOiBFUkMyMFdhbGxldFxuICovXG5AdGFibGUoXCJlcmMyMF93YWxsZXRzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEVSQzIwV2FsbGV0IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gV2FsbGV0IHVuaXF1ZSBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFByaW1hcnkga2V5IGZvciB0aGUgd2FsbGV0OyBjb21tb25seSByZWZlcmVuY2VzIGFuIGFjY291bnQgb3IgaWRlbnRpdHlcbiAgICovXG4gIGlkITogc3RyaW5nO1xuXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFzc29jaWF0ZWQgdG9rZW4gbmFtZVxuICAgKiBAc3VtbWFyeSBSZWZlcmVuY2VzIHRoZSBFUkMyMFRva2VuIHRoaXMgd2FsbGV0IGhvbGRzOyBtYWludGFpbmVkIGFzIGEgcmVsYXRpb25zaGlwIGZvciBjYXNjYWRpbmcgdXBkYXRlcy9kZWxldGVzXG4gICAqL1xuICB0b2tlbiE6IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUb2tlbiBiYWxhbmNlIGZvciB0aGlzIHdhbGxldFxuICAgKiBAc3VtbWFyeSBDdXJyZW50IGFtb3VudCBvZiB0aGUgYXNzb2NpYXRlZCB0b2tlbiBoZWxkIGJ5IHRoaXMgd2FsbGV0XG4gICAqL1xuICBiYWxhbmNlITogbnVtYmVyO1xuXG4gIEBjb2x1bW4oKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENhcHRpdmUgZmxhZyBvciBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IE9wdGlvbmFsIGZpZWxkIHVzZWQgYnkgc29tZSBmbG93cyB0byBtYXJrIG5vbi10cmFuc2ZlcmFibGUgZnVuZHMgb3IgbWFuYWdlZCBjdXN0b2R5XG4gICAqL1xuICBjYXB0aXZlITogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG0/OiBNb2RlbEFyZzxFUkMyMFdhbGxldD4pIHtcbiAgICBzdXBlcihtKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFUkMyMCBhbGxvd2FuY2UgbW9kZWxcbiAqIEBzdW1tYXJ5IENhcHR1cmVzIGFuIGFwcHJvdmFsIHJlbGF0aW9uc2hpcCB3aGVyZSBhbiBvd25lciBhbGxvd3MgYSBzcGVuZGVyIHRvIHRyYW5zZmVyIHVwIHRvIGEgY2VydGFpbiB2YWx1ZSBmcm9tIHRoZSBvd25lcidzIHdhbGxldC5cbiAqIEBwYXJhbSB7TW9kZWxBcmc8QWxsb3dhbmNlPn0gW21dIC0gT3B0aW9uYWwgcGFydGlhbCBkYXRhIG9yIGFub3RoZXIgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kZWxcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgQWxsb3dhbmNlXG4gKiBAZXhhbXBsZVxuICogY29uc3QgYWxsb3dhbmNlID0gbmV3IEFsbG93YW5jZSh7IG93bmVyOiBcImFjY3QxXCIsIHNwZW5kZXI6IFwiYWNjdDJcIiwgdmFsdWU6IDUwIH0pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgQXBwLT4+QXBwOiBuZXcgQWxsb3dhbmNlKHsgb3duZXIsIHNwZW5kZXIsIHZhbHVlIH0pXG4gKi9cbkB0YWJsZShcImVyYzIwX2FsbG93YW5jZXNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgQWxsb3dhbmNlIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWxsb3dhbmNlIHVuaXF1ZSBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFByaW1hcnkga2V5IGZvciB0aGUgYWxsb3dhbmNlOyB0eXBpY2FsbHkgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFwcHJvdmFsIHJlbGF0aW9uc2hpcFxuICAgKi9cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gT3duZXIgd2FsbGV0IGlkZW50aWZpZXJcbiAgICogQHN1bW1hcnkgV2FsbGV0IHRoYXQgYXV0aG9yaXplcyB0aGUgYWxsb3dhbmNlXG4gICAqL1xuICBvd25lciE6IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTcGVuZGVyIHdhbGxldCBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFdhbGxldCBhbGxvd2VkIHRvIHNwZW5kIHVwIHRvIHRoZSBhcHByb3ZlZCB2YWx1ZSBmcm9tIHRoZSBvd25lclxuICAgKi9cbiAgc3BlbmRlciE6IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHByb3ZlZCB2YWx1ZVxuICAgKiBAc3VtbWFyeSBNYXhpbXVtIHRva2VuIGFtb3VudCB0aGUgc3BlbmRlciBtYXkgdHJhbnNmZXIgb24gYmVoYWxmIG9mIHRoZSBvd25lclxuICAgKi9cbiAgdmFsdWUhOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IobT86IE1vZGVsQXJnPEFsbG93YW5jZT4pIHtcbiAgICBzdXBlcihtKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgSlNPTlNlcmlhbGl6ZXIsXG4gIE1vZGVsLFxuICBNb2RlbEtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENsaWVudC1zaWRlIEpTT04gc2VyaWFsaXplciBmb3IgRGVjYWYgbW9kZWxzIHRhcmdldGluZyBIeXBlcmxlZGdlciBGYWJyaWNcbiAqIEBzdW1tYXJ5IEV4dGVuZHMgdGhlIGJhc2UgSlNPTlNlcmlhbGl6ZXIgdG8gZW1iZWQgbW9kZWwgbWV0YWRhdGEgKGFuY2hvcikgcmVxdWlyZWQgdG8gcmVjb25zdHJ1Y3QgaW5zdGFuY2VzIG9uIHRoZSBjbGllbnQsIGFuZCB0byBzYWZlbHkgc2VyaWFsaXplL2Rlc2VyaWFsaXplIEZhYnJpYy1ib3VuZCBtb2RlbHMuXG4gKiBAdGVtcGxhdGUgTSBleHRlbmRzIE1vZGVsIC0gVGhlIERlY2FmIG1vZGVsIHR5cGUgaGFuZGxlZCBieSB0aGlzIHNlcmlhbGl6ZXJcbiAqIEBwYXJhbSB7dm9pZH0gW2NvbnN0cnVjdG9yXSBObyBwdWJsaWMgY29uc3RydWN0b3IgYXJndW1lbnRzOyBwcm92aWRlZCBmb3IgZG9jdW1lbnRhdGlvbiBjb21wbGV0ZW5lc3NcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgQ2xpZW50U2VyaWFsaXplclxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgQ2xpZW50U2VyaWFsaXplcjxVc2VyPigpO1xuICogY29uc3QganNvbiA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKG5ldyBVc2VyKHsgaWQ6IFwiMVwiLCBuYW1lOiBcIkFsaWNlXCIgfSkpO1xuICogY29uc3QgdXNlciA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoanNvbik7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBTZXJpYWxpemVyIGFzIENsaWVudFNlcmlhbGl6ZXJcbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgQXBwLT4+U2VyaWFsaXplcjogc2VyaWFsaXplKG1vZGVsKVxuICogICBTZXJpYWxpemVyLT4+U2VyaWFsaXplcjogcHJlU2VyaWFsaXplKG1vZGVsKVxuICogICBTZXJpYWxpemVyLS0+PkFwcDogSlNPTiBzdHJpbmdcbiAqICAgQXBwLT4+U2VyaWFsaXplcjogZGVzZXJpYWxpemUoanNvbilcbiAqICAgU2VyaWFsaXplci0+PlNlcmlhbGl6ZXI6IEpTT04ucGFyc2UoanNvbilcbiAqICAgU2VyaWFsaXplci0+Pk1vZGVsOiBNb2RlbC5idWlsZChwYXJzZWQsIGFuY2hvcilcbiAqICAgTW9kZWwtLT4+QXBwOiBpbnN0YW5jZVxuICovXG5leHBvcnQgY2xhc3MgQ2xpZW50U2VyaWFsaXplcjxNIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZSBhIG1vZGVsIGZvciBKU09OIHNlcmlhbGl6YXRpb24gZW1iZWRkaW5nIGNsYXNzIGFuY2hvclxuICAgKiBAc3VtbWFyeSBDbG9uZXMgdGhlIG1vZGVsIGFuZCBpbmplY3RzIHRoZSBjbGFzcyBtZXRhZGF0YSBhbmNob3Igc28gaXQgY2FuIGJlIHJlY29uc3RydWN0ZWQgZHVyaW5nIGRlc2VyaWFsaXphdGlvbi4gRmFsbHMgYmFjayB0byBwcm92aWRlZCB0YWJsZSBuYW1lIGlmIG1ldGFkYXRhIGlzIG5vdCBhdmFpbGFibGUuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gTW9kZWwgdHlwZSBoYW5kbGVkIGJ5IHRoaXMgc2VyaWFsaXplclxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHNlcmlhbGl6ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW21vZGVsTmFtZV0gLSBPcHRpb25hbCB0YWJsZSBuYW1lIHRvIHVzZSB3aGVuIG1ldGFkYXRhIGNhbm5vdCBiZSBkZXJpdmVkXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIGFueT59IEEgcGxhaW4gb2JqZWN0IHJlYWR5IHRvIGJlIEpTT04uc3RyaW5naWZ5J2RcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0sIG1vZGVsTmFtZT86IHN0cmluZykge1xuICAgIC8vIFRPRE86IG5lc3RlZCBwcmVzZXJpYWxpemF0aW9uIChzbyBpbmNyZWFzZSBwZXJmb3JtYW5jZSB3aGVuIGRlc2VyaWFsaXppbmcpXG4gICAgY29uc3QgdG9TZXJpYWxpemU6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCk7XG4gICAgbGV0IG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KTtcblxuICAgIGlmICghbWV0YWRhdGEgfHwgbWV0YWRhdGEgPT09IFwiT2JqZWN0XCIpXG4gICAgICBpZiAobW9kZWxOYW1lKSBtZXRhZGF0YSA9IG1vZGVsTmFtZTtcbiAgICAgIGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGZpbmQgbWV0YWRhdGEgZm9yICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgICAgICk7XG4gICAgdG9TZXJpYWxpemVbTW9kZWxLZXlzLkFOQ0hPUl0gPSBtZXRhZGF0YTtcbiAgICByZXR1cm4gdG9TZXJpYWxpemU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYnVpbGRzIGEgbW9kZWwgZnJvbSBpdHMgSlNPTiBzZXJpYWxpemF0aW9uXG4gICAqIEBzdW1tYXJ5IFBhcnNlcyB0aGUgSlNPTiBzdHJpbmcsIHJldHJpZXZlcyB0aGUgZW1iZWRkZWQgbW9kZWwgYW5jaG9yLCBhbmQgdXNlcyBNb2RlbC5idWlsZCB0byByZWNvbnN0cnVjdCB0aGUgb3JpZ2luYWwgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFRoZSBKU09OIHN0cmluZyBwcmV2aW91c2x5IHByb2R1Y2VkIGJ5IHNlcmlhbGl6ZVxuICAgKiBAcmV0dXJuIHtNfSBUaGUgcmVjb25zdHJ1Y3RlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgb3ZlcnJpZGUgZGVzZXJpYWxpemUoc3RyOiBzdHJpbmcpOiBNIHtcbiAgICBjb25zdCBkZXNlcmlhbGl6YXRpb24gPSBKU09OLnBhcnNlKHN0cik7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gZGVzZXJpYWxpemF0aW9uW01vZGVsS2V5cy5BTkNIT1JdO1xuICAgIGlmICghY2xhc3NOYW1lKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgY2xhc3MgcmVmZXJlbmNlIGluIHNlcmlhbGl6ZWQgbW9kZWxcIik7XG4gICAgY29uc3QgbW9kZWw6IE0gPSBNb2RlbC5idWlsZChkZXNlcmlhbGl6YXRpb24sIGNsYXNzTmFtZSkgYXMgdW5rbm93biBhcyBNO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2VyaWFsaXplcyBhIG1vZGVsIHRvIGEgSlNPTiBzdHJpbmdcbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIG1vZGVsIHZpYSBwcmVTZXJpYWxpemUsIGVtYmVkZGluZyBtZXRhZGF0YSBuZWVkZWQgZm9yIHJlY29uc3RydWN0aW9uLCBhbmQgcmV0dXJucyBhIEpTT04gc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gc2VyaWFsaXplXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFibGVdIC0gT3B0aW9uYWwgdGFibGUgbmFtZSB0byBpbmNsdWRlIGFzIGFuY2hvciB3aGVuIG1ldGFkYXRhIGlzIHVuYXZhaWxhYmxlXG4gICAqIEByZXR1cm4ge3N0cmluZ30gQSBKU09OIHN0cmluZyBjb250YWluaW5nIHRoZSBzZXJpYWxpemVkIG1vZGVsIHdpdGggYW5jaG9yIG1ldGFkYXRhXG4gICAqL1xuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0sIG1vZGVsTmFtZT86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMucHJlU2VyaWFsaXplKG1vZGVsLCBtb2RlbE5hbWUpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRmFicmljQ2xpZW50UmVwb3NpdG9yeSB9IGZyb20gXCIuLi9GYWJyaWNDbGllbnRSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBFUkMyMFRva2VuLCBFUkMyMFdhbGxldCB9IGZyb20gXCIuLi8uLi9jb250cmFjdHMvZXJjMjAvbW9kZWxzXCI7XG5pbXBvcnQgeyBNb2RlbCwgU2VyaWFsaXplciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHsgQ2xpZW50U2VyaWFsaXplciB9IGZyb20gXCIuLi8uLi9zaGFyZWQvQ2xpZW50U2VyaWFsaXplclwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgQ29udGV4dE9mLFxuICBDb250ZXh0dWFsQXJncyxcbiAgRXZlbnRJZHMsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgU2VxdWVuY2UsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG4vKipcbiAqIFJlcG9zaXRvcnkgZm9yIGludGVyYWN0aW5nIHdpdGggRVJDMjAgY29udHJhY3RzIG9uIGEgSHlwZXJsZWRnZXIgRmFicmljIG5ldHdvcmsuXG4gKiBFeHRlbmRzIHRoZSBiYXNlIEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgY2xhc3MgYW5kIHV0aWxpemVzIHRoZSBDbGllbnRTZXJpYWxpemVyIGZvciBkYXRhIHNlcmlhbGl6YXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnk8XG4gIEEgZXh0ZW5kcyBGYWJyaWNDbGllbnRBZGFwdGVyLFxuPiBleHRlbmRzIEZhYnJpY0NsaWVudFJlcG9zaXRvcnk8RVJDMjBXYWxsZXQsIEE+IHtcbiAgcHJpdmF0ZSBzdGF0aWMgc2VyaWFsaXplciA9IG5ldyBDbGllbnRTZXJpYWxpemVyKCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXI8YW55PiA9XG4gICAgRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LnNlcmlhbGl6ZXI7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIG9mIGFuIGV2ZW50LlxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIGFsbCByZWdpc3RlcmVkIG9ic2VydmVycyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGEgZGF0YWJhc2UgZXZlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSB0YWJsZSBuYW1lIHdoZXJlIHRoZSBldmVudCBvY2N1cnJlZC5cbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2YgZXZlbnQgdGhhdCBvY2N1cnJlZC5cbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgSUQgb3IgSURzIG9mIHRoZSBhZmZlY3RlZCByZWNvcmRzLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWQuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBvYnNlcnZlciBoYW5kbGVyIGlzIG5vdCBpbml0aWFsaXplZC5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZU9ic2VydmVyczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhYmxlOiBDb25zdHJ1Y3RvcjxNPiB8IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiT2JzZXJ2ZXJIYW5kbGVyIG5vdCBpbml0aWFsaXplZC4gRGlkIHlvdSByZWdpc3RlciBhbnkgb2JzZXJ2YWJsZXM/XCJcbiAgICAgICk7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBVcGRhdGluZyAke3RoaXMub2JzZXJ2ZXJIYW5kbGVyLmNvdW50KCl9IG9ic2VydmVycyBmb3IgJHt0aGlzfWBcbiAgICApO1xuXG4gICAgdGFibGUgPSAoXG4gICAgICB0eXBlb2YgdGFibGUgPT09IFwic3RyaW5nXCIgPyBNb2RlbC5nZXQodGFibGUpIDogdGFibGVcbiAgICApIGFzIENvbnN0cnVjdG9yPE0+O1xuICAgIGxldCBwYXJzZWRJZDogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyc2VkSWQgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlkKSkge1xuICAgICAgcGFyc2VkSWQgPSBpZC5tYXAoXG4gICAgICAgIChpKSA9PiBTZXF1ZW5jZS5wYXJzZVZhbHVlKE1vZGVsLnNlcXVlbmNlRm9yKHRhYmxlKS50eXBlLCBpKSBhcyBzdHJpbmdcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnNlZElkID0gU2VxdWVuY2UucGFyc2VWYWx1ZShcbiAgICAgICAgTW9kZWwuc2VxdWVuY2VGb3IodGFibGUpLnR5cGUsXG4gICAgICAgIGlkXG4gICAgICApIGFzIHN0cmluZztcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5vYnNlcnZlckhhbmRsZXIudXBkYXRlT2JzZXJ2ZXJzKFxuICAgICAgdGFibGUsXG4gICAgICBldmVudCxcbiAgICAgIHBhcnNlZElkISxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgYSBVaW50OEFycmF5IGludG8gYSBzdHJpbmcgdXNpbmcgdGhlIFRleHREZWNvZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBVaW50OEFycmF5IHRvIGRlY29kZS5cbiAgICogQHJldHVybnMgVGhlIGRlY29kZWQgc3RyaW5nLlxuICAgKi9cbiAgZGVjb2RlKGRhdGE6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIHJldHVybiBGYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnkuZGVjb2Rlci5kZWNvZGUoZGF0YSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihhZGFwdGVyPzogQSkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIEVSQzIwV2FsbGV0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWUgb2YgdGhlIEVSQzIwIHRva2VuLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBuYW1lIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiVG9rZW5OYW1lXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IGFuZCBkZWNvZGVzIHRoZSByZXR1cm5lZCBkYXRhLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBuYW1lIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHRva2VuTmFtZSguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+Pik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInRva2VuTmFtZVwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy50b2tlbk5hbWVcbiAgICApO1xuICAgIGNvbnN0IG5hbWUgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihjdHgsIFwiVG9rZW5OYW1lXCIpO1xuICAgIHJldHVybiB0aGlzLmRlY29kZShuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHN5bWJvbCBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgc3ltYm9sIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiU3ltYm9sXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IGFuZCBkZWNvZGVzIHRoZSByZXR1cm5lZCBkYXRhLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBzeW1ib2wgb2YgdGhlIEVSQzIwIHRva2VuLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgc3ltYm9sKC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwic3ltYm9sXCIsIHRydWUpKS5mb3IodGhpcy5zeW1ib2wpO1xuICAgIGNvbnN0IHN5bWJvbCA9IGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKGN0eCwgXCJTeW1ib2xcIik7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKHN5bWJvbCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgZm9yIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgZm9yIHRoZSBFUkMyMCB0b2tlbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiRGVjaW1hbHNcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QgYW5kIGRlY29kZXMgdGhlIHJldHVybmVkIGRhdGEuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyBmb3IgdGhlIEVSQzIwIHRva2VuLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgZGVjaW1hbHMoLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj4pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJkZWNpbWFsc1wiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5kZWNpbWFsc1xuICAgICk7XG4gICAgY29uc3QgZGVjaW1hbHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihjdHgsIFwiRGVjaW1hbHNcIik7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmRlY29kZShkZWNpbWFscykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgdG90YWwgc3VwcGx5IG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSB0b3RhbCBzdXBwbHkgb2YgdGhlIEVSQzIwIHRva2VuLlxuICAgKiBJdCBjYWxscyB0aGUgXCJUb3RhbFN1cHBseVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCBhbmQgZGVjb2RlcyB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdG90YWwgc3VwcGx5IG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHRvdGFsU3VwcGx5KFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInRvdGFsU3VwcGx5XCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLnRvdGFsU3VwcGx5XG4gICAgKTtcbiAgICBjb25zdCB0b3RhbCA9IGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKGN0eCwgXCJUb3RhbFN1cHBseVwiKTtcbiAgICByZXR1cm4gTnVtYmVyKHRoaXMuZGVjb2RlKHRvdGFsKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBiYWxhbmNlIG9mIHRoZSBFUkMyMCB0b2tlbiBmb3IgYSBzcGVjaWZpZWQgb3duZXIuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gZmV0Y2ggdGhlIGJhbGFuY2Ugb2YgdGhlIEVSQzIwIHRva2VuIGZvciBhIGdpdmVuIG93bmVyLlxuICAgKiBJdCBjYWxscyB0aGUgXCJCYWxhbmNlT2ZcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgcHJvdmlkZWQgb3duZXIncyBhZGRyZXNzIGFzIGEgcGFyYW1ldGVyLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNvbnZlcnRlZCB0byBhIG51bWJlci5cbiAgICpcbiAgICogQHBhcmFtIG93bmVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIEVSQzIwIHRva2VuIG93bmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBiYWxhbmNlIG9mIHRoZSBFUkMyMCB0b2tlbiBmb3IgdGhlIHNwZWNpZmllZCBvd25lci5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIGJhbGFuY2VPZihcbiAgICBvd25lcjogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcImJhbGFuY2VcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMuYmFsYW5jZU9mXG4gICAgKTtcbiAgICBjb25zdCBiYWxhbmNlID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oY3R4LCBcIkJhbGFuY2VPZlwiLCBbXG4gICAgICBvd25lcixcbiAgICBdKTtcbiAgICByZXR1cm4gTnVtYmVyKHRoaXMuZGVjb2RlKGJhbGFuY2UpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2ZlcnMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBhIHJlY2lwaWVudC5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byB0cmFuc2ZlciBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIGEgcmVjaXBpZW50LlxuICAgKiBJdCBjYWxscyB0aGUgXCJUcmFuc2ZlclwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSByZWNpcGllbnQncyBhZGRyZXNzIGFuZCB0aGUgdHJhbnNmZXIgYW1vdW50IGFzIHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY2hlY2tlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gdG8gLSBUaGUgYWRkcmVzcyBvZiB0aGUgcmVjaXBpZW50LlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byB0cmFuc2Zlci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYHRydWVgIGlmIHRoZSB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bCwgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgdHJhbnNmZXIoXG4gICAgdG86IHN0cmluZyxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJ0cmFuc2ZlclwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy50cmFuc2ZlclxuICAgICk7XG4gICAgY29uc3QgdHJhbnNmZXJyZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIlRyYW5zZmVyXCIsIFtcbiAgICAgIHRvLFxuICAgICAgdmFsdWUudG9TdHJpbmcoKSxcbiAgICBdKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvZGUodHJhbnNmZXJyZWQpID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2ZlcnMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyBmcm9tIG9uZSBhY2NvdW50IHRvIGFub3RoZXIuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gdHJhbnNmZXIgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyBmcm9tIG9uZSBhY2NvdW50IHRvIGFub3RoZXIuXG4gICAqIEZvciB0aGlzIHRyYW5zZmVyIHRvIHdvcmsgdGhlIHNwZW5kZXIgKCBhY2NvdW50IHRoYXQgd2lsbCB0cmlnZ2VyIHRoaXMgZnVuY3Rpb24gKSBuZWVkIHRvIGhhdmUgdGhlIHZhbHVlIGFwcHJvdmVkIGFzIGFuIGFsbG93YW5jZSBieSB0aGUgc2VuZGVyLlxuICAgKiBJdCBjYWxscyB0aGUgXCJUcmFuc2ZlckZyb21cIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgc2VuZGVyJ3MgYWRkcmVzcywgcmVjaXBpZW50J3MgYWRkcmVzcywgYW5kIHRoZSB0cmFuc2ZlciBhbW91bnQgYXMgcGFyYW1ldGVycy5cbiAgICogVGhlIHJldHVybmVkIGRhdGEgaXMgdGhlbiBkZWNvZGVkIGFuZCBjaGVja2VkIHRvIGRldGVybWluZSBpZiB0aGUgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWwuXG4gICAqXG4gICAqIEBwYXJhbSBmcm9tIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHNlbmRlci5cbiAgICogQHBhcmFtIHRvIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gdHJhbnNmZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWwsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyRnJvbShcbiAgICBmcm9tOiBzdHJpbmcsXG4gICAgdG86IHN0cmluZyxcbiAgICB2YWx1ZTogbnVtYmVyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJ0cmFuc2ZlckZyb21cIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMudHJhbnNmZXJGcm9tKTtcbiAgICBjb25zdCB0cmFuc2ZlcnJlZCA9IGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIFwiVHJhbnNmZXJGcm9tXCIsXG4gICAgICBbZnJvbSwgdG8sIHZhbHVlLnRvU3RyaW5nKCldXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLmRlY29kZSh0cmFuc2ZlcnJlZCkgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcHJvdmVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYmUgc3BlbnQgYnkgYSBzcGVjaWZpZWQgc3BlbmRlci5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGFwcHJvdmUgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBiZSBzcGVudCBieSBhIHNwZWNpZmllZCBzcGVuZGVyLlxuICAgKiBJdCBjYWxscyB0aGUgXCJBcHByb3ZlXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIHNwZW5kZXIncyBhZGRyZXNzIGFuZCB0aGUgYXBwcm92YWwgYW1vdW50IGFzIHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY2hlY2tlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGFwcHJvdmFsIHdhcyBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gc3BlbmRlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzcGVuZGVyLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBhcHByb3ZlIGZvciB0aGUgc3BlbmRlci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYHRydWVgIGlmIHRoZSBhcHByb3ZhbCB3YXMgc3VjY2Vzc2Z1bCwgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgYXBwcm92ZShzcGVuZGVyOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYXBwcm92ZVwiLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoY29udGV4dEFyZ3MuYXJncywgdGhpcy5hcHByb3ZlKTtcbiAgICBjb25zdCBhcHByb3ZlZCA9IGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiQXBwcm92ZVwiLCBbXG4gICAgICBzcGVuZGVyLFxuICAgICAgdmFsdWUudG9TdHJpbmcoKSxcbiAgICBdKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvZGUoYXBwcm92ZWQpID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGFsbG93YW5jZSBvZiBFUkMyMCB0b2tlbnMgdGhhdCB0aGUgc3BlY2lmaWVkIG93bmVyIGhhcyBhcHByb3ZlZCBmb3IgYSBzcGVuZGVyLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBhbGxvd2FuY2Ugb2YgRVJDMjAgdG9rZW5zIHRoYXQgdGhlIHNwZWNpZmllZCBvd25lciBoYXMgYXBwcm92ZWQgZm9yIGEgc3BlbmRlci5cbiAgICogSXQgY2FsbHMgdGhlIFwiQWxsb3dhbmNlXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIG93bmVyJ3MgYWRkcmVzcyBhbmQgdGhlIHNwZW5kZXIncyBhZGRyZXNzIGFzIHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY29udmVydGVkIHRvIGEgbnVtYmVyLlxuICAgKlxuICAgKiBAcGFyYW0gb3duZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgRVJDMjAgdG9rZW4gb3duZXIuXG4gICAqIEBwYXJhbSBzcGVuZGVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHNwZW5kZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGFsbG93YW5jZSBvZiBFUkMyMCB0b2tlbnMgdGhhdCB0aGUgc3BlY2lmaWVkIG93bmVyIGhhcyBhcHByb3ZlZCBmb3IgdGhlIHNwZW5kZXIuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBhbGxvd2FuY2Uob3duZXI6IHN0cmluZywgc3BlbmRlcjogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYWxsb3dhbmNlXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmFsbG93YW5jZSk7XG4gICAgY29uc3QgYWxsb3dhbmNlID0gYXdhaXQgdGhpcy5hZGFwdGVyLnN1Ym1pdFRyYW5zYWN0aW9uKGN0eCwgXCJBbGxvd2FuY2VcIiwgW1xuICAgICAgb3duZXIsXG4gICAgICBzcGVuZGVyLFxuICAgIF0pO1xuICAgIHJldHVybiBOdW1iZXIodGhpcy5kZWNvZGUoYWxsb3dhbmNlKSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIEVSQzIwIGNvbnRyYWN0IHdpdGggdGhlIHByb3ZpZGVkIHRva2VuIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGluaXRpYWxpemUgdGhlIEVSQzIwIGNvbnRyYWN0IHdpdGggdGhlIGdpdmVuIHRva2VuIGluZm9ybWF0aW9uLlxuICAgKiBJdCBjYWxscyB0aGUgXCJJbml0aWFsaXplXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIHNlcmlhbGl6ZWQgdG9rZW4gZGF0YSBhcyBhIHBhcmFtZXRlci5cbiAgICogVGhlIHJldHVybmVkIGRhdGEgaXMgdGhlbiBkZWNvZGVkIGFuZCBjaGVja2VkIHRvIGRldGVybWluZSBpZiB0aGUgaW5pdGlhbGl6YXRpb24gd2FzIHN1Y2Nlc3NmdWwuXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBFUkMyMCB0b2tlbiBpbmZvcm1hdGlvbiB0byBpbml0aWFsaXplIHRoZSBjb250cmFjdCB3aXRoLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBgdHJ1ZWAgaWYgdGhlIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplKHRva2VuOiBFUkMyMFRva2VuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImluaXRpYWxpemVcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgY29uc3QgaW5pdGlsaWF6ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIkluaXRpYWxpemVcIixcbiAgICAgIFtGYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnkuc2VyaWFsaXplci5zZXJpYWxpemUodG9rZW4pXVxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5kZWNvZGUoaW5pdGlsaWF6ZWQpID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIEVSQzIwIGNvbnRyYWN0IGhhcyBiZWVuIGluaXRpYWxpemVkLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gdmVyaWZ5IGlmIHRoZSBFUkMyMCBjb250cmFjdCBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiAgICogSXQgY2FsbHMgdGhlIFwiQ2hlY2tJbml0aWFsaXplZFwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCwgd2hpY2ggZG9lcyBub3QgcmVxdWlyZSBhbnkgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGluaXRpYWxpemF0aW9uIGNoZWNrIGlzIGNvbXBsZXRlZC5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscy5cbiAgICovXG4gIGFzeW5jIGNoZWNrSW5pdGlhbGl6ZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImNoZWNrSW5pdGlhbGl6ZWRcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuY2hlY2tJbml0aWFsaXplZCk7XG4gICAgYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oY3R4LCBcIkNoZWNrSW5pdGlhbGl6ZWRcIik7XG4gIH1cblxuICAvKipcbiAgICogTWludHMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2Vucy5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBtaW50IGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMuXG4gICAqIEl0IGNhbGxzIHRoZSBcIk1pbnRcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgbWludGluZyBhbW91bnQgYXMgYSBwYXJhbWV0ZXIuXG4gICAqIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYW55IHZhbHVlLCBidXQgaXQgdXBkYXRlcyB0aGUgbWludGVyJ3MgbnVtYmVyIG9mIHRva2Vucy5cbiAgICpcbiAgICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIG1pbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBtaW50aW5nIHByb2Nlc3MgaXMgY29tcGxldGVkLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgbWludChhbW91bnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJtaW50XCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLm1pbnQpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiTWludFwiLCBbYW1vdW50LnRvU3RyaW5nKCldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdXJucyBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIGZyb20gdGhlIG1pbnRlcidzIGFjY291bnQuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBidXJuIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkJ1cm5cIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgYnVybmluZyBhbW91bnQgYXMgYSBwYXJhbWV0ZXIuXG4gICAqIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYW55IHZhbHVlLCBidXQgaXQgZGVjcmVhc2VzIHRoZSBtaW50ZXIncyBudW1iZXIgb2YgdG9rZW5zLlxuICAgKlxuICAgKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYnVybi5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJ1cm5pbmcgcHJvY2VzcyBpcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gICAqL1xuICBhc3luYyBidXJuKGFtb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImJ1cm5cIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuYnVybik7XG4gICAgYXdhaXQgdGhpcy5hZGFwdGVyLnN1Ym1pdFRyYW5zYWN0aW9uKGN0eCwgXCJCdXJuXCIsIFthbW91bnQudG9TdHJpbmcoKV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1cm5zIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgZnJvbSBhIHNwZWNpZmllZCBhY2NvdW50LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gYnVybiBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIGZyb20gYSBnaXZlbiBhY2NvdW50LlxuICAgKiBJdCBjYWxscyB0aGUgXCJCdXJuRnJvbVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBhY2NvdW50J3MgYWRkcmVzcyBhbmQgdGhlIGJ1cm5pbmcgYW1vdW50IGFzIHBhcmFtZXRlcnMuXG4gICAqIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYW55IHZhbHVlLCBidXQgaXQgZGVjcmVhc2VzIHRoZSBzcGVjaWZpZWQgYWNjb3VudCdzIG51bWJlciBvZiB0b2tlbnMuXG4gICAqXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gVGhlIGFkZHJlc3Mgb2YgdGhlIGFjY291bnQgZnJvbSB3aGljaCB0byBidXJuIHRoZSBFUkMyMCB0b2tlbnMuXG4gICAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBidXJuLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYnVybmluZyBwcm9jZXNzIGlzIGNvbXBsZXRlZC5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscy5cbiAgICovXG4gIGFzeW5jIGJ1cm5Gcm9tKGFjY291bnQ6IHN0cmluZywgYW1vdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYnVybkZyb21cIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuYnVybkZyb20pO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiQnVybkZyb21cIiwgW1xuICAgICAgYWNjb3VudCxcbiAgICAgIGFtb3VudC50b1N0cmluZygpLFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgYmFsYW5jZSBvZiBFUkMyMCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGllbnQncyBhY2NvdW50LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gZmV0Y2ggdGhlIGJhbGFuY2Ugb2YgRVJDMjAgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2xpZW50J3MgYWNjb3VudC5cbiAgICogSXQgY2FsbHMgdGhlIFwiQ2xpZW50QWNjb3VudEJhbGFuY2VcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QsIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYW55IHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY29udmVydGVkIHRvIGEgbnVtYmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBiYWxhbmNlIG9mIEVSQzIwIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIGNsaWVudCdzIGFjY291bnQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBjbGllbnRBY2NvdW50QmFsYW5jZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJhY2NvdW50QmFsYW5jZVwiLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoY29udGV4dEFyZ3MuYXJncywgdGhpcy5jbGllbnRBY2NvdW50QmFsYW5jZSk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEFjY291bnRCYWxhbmNlID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIkNsaWVudEFjY291bnRCYWxhbmNlXCJcbiAgICApO1xuXG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmRlY29kZShzZXJpYWxpemVkQWNjb3VudEJhbGFuY2UpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGNsaWVudCdzIGFjY291bnQgSUQgZnJvbSB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gZmV0Y2ggdGhlIGNsaWVudCdzIGFjY291bnQgSUQuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkNsaWVudEFjY291bnRJRFwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCwgd2hpY2ggZG9lcyBub3QgcmVxdWlyZSBhbnkgcGFyYW1ldGVycy5cbiAgICogVGhlIHJldHVybmVkIGRhdGEgaXMgdGhlbiBkZWNvZGVkIGFuZCByZXR1cm5lZCBhcyBhIHN0cmluZy5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY2xpZW50J3MgYWNjb3VudCBJRC5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIGNsaWVudEFjY291bnRJRCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJhY2NvdW50SWRcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuY2xpZW50QWNjb3VudElEKTtcbiAgICBjb25zdCBjbGllbnRBY2NvdW50SUQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIFwiQ2xpZW50QWNjb3VudElEXCJcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKGNsaWVudEFjY291bnRJRCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgUHJpbWFyeUtleVR5cGUgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGNvbXBvc2VBdHRyaWJ1dGVWYWx1ZSB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdElkczxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gIG1vZGVsczogTSB8IE1bXSB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gIGlkczogUHJpbWFyeUtleVR5cGUgfCBQcmltYXJ5S2V5VHlwZVtdXG4pIHtcbiAgbGV0IHBrOiBrZXlvZiBNO1xuICBsZXQgY29tcG9zZWQ6IGFueTtcbiAgbGV0IHBrUHJvcHM6IFNlcXVlbmNlT3B0aW9ucztcblxuICBmdW5jdGlvbiBleHRyYWN0SWQobTogTSB8IFJlY29yZDxzdHJpbmcsIGFueT4sIGlkczogUHJpbWFyeUtleVR5cGUpIHtcbiAgICBwayA9IHBrIHx8IE1vZGVsLnBrKGNsYXp6KTtcbiAgICBwa1Byb3BzID0gcGtQcm9wcyB8fCBNb2RlbC5zZXF1ZW5jZUZvcihjbGF6eik7XG4gICAgY29tcG9zZWQgPSBjb21wb3NlZCB8fCBNb2RlbC5jb21wb3NlZChjbGF6eiwgcGspO1xuXG4gICAgaWYgKGNvbXBvc2VkKSB7XG4gICAgICByZXR1cm4gY29tcG9zZUF0dHJpYnV0ZVZhbHVlKG0gYXMgYW55LCBjb21wb3NlZCk7XG4gICAgfVxuXG4gICAgY29uc3QgaWQgPSAobSBhcyBhbnkpW3BrXSB8fCBpZHM7XG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBjb3VsZCBub3QgcmVidWlsZCBpZCBmb3IgJHttLmNvbnN0cnVjdG9yLm5hbWV9YCk7XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkobW9kZWxzKSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShpZHMpIHx8IGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJpbmNvbnNpc3RlbnQgcGFyYW1ldGVycy4gYm90aCBtdXN0IGJlIGFycmF5cyBvZiBlcXVhbCBsZW5ndGhcIlxuICAgICAgKTtcbiAgICByZXR1cm4gbW9kZWxzLm1hcCgobSwgaSkgPT4gZXh0cmFjdElkKG0sIGlkc1tpXSkpO1xuICB9XG4gIHJldHVybiBleHRyYWN0SWQobW9kZWxzLCBpZHMgYXMgUHJpbWFyeUtleVR5cGUpO1xufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsLCBjb2x1bW4sIHBrIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgdHlwZSBNb2RlbEFyZywgcmVxdWlyZWQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJZGVudGl0eSBjcmVkZW50aWFsIG1vZGVsIHN0b3JpbmcgY3J5cHRvZ3JhcGhpYyBtYXRlcmlhbHNcbiAqIEBzdW1tYXJ5IEhvbGRzIGNlcnRpZmljYXRlIGNoYWluIGFuZCBwcml2YXRlIGtleSBpbmZvcm1hdGlvbiBmb3IgYSBGYWJyaWMgaWRlbnRpdHksIG1hbmFnZWQgYXMgYSBzZXBhcmF0ZSBlbnRpdHkgbGlua2VkIGZyb20gSWRlbnRpdHlcbiAqIEBwYXJhbSB7TW9kZWxBcmc8SWRlbnRpdHlDcmVkZW50aWFscz59IFthcmddIC0gT3B0aW9uYWwgaW5pdGlhbGl6YXRpb24gb2JqZWN0IHVzZWQgdG8gcG9wdWxhdGUgbW9kZWwgZmllbGRzXG4gKiBAY2xhc3MgSWRlbnRpdHlDcmVkZW50aWFsc1xuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBjcmVkZW50aWFscyBlbnRyeVxuICogY29uc3QgY3JlZHMgPSBuZXcgSWRlbnRpdHlDcmVkZW50aWFscyh7IGlkOiBcImNyZWRzMVwiLCBjZXJ0aWZpY2F0ZTogXCIuLi5cIiwgcm9vdENlcnRpZmljYXRlOiBcIi4uLlwiLCBwcml2YXRlS2V5OiBcIi4uLlwiIH0pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgTW9kZWwgYXMgSWRlbnRpdHlDcmVkZW50aWFsc1xuICogICBBcHAtPj5Nb2RlbDogbmV3IElkZW50aXR5Q3JlZGVudGlhbHMoeyBpZCwgY2VydGlmaWNhdGUsIHJvb3RDZXJ0aWZpY2F0ZSwgcHJpdmF0ZUtleSB9KVxuICogICBNb2RlbC0tPj5BcHA6IGluc3RhbmNlXG4gKiBAc2VlIG1vZGVsXG4gKi9cbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlDcmVkZW50aWFscyBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNyZWRlbnRpYWxzIHJlY29yZFxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSBmb3IgcmVmZXJlbmNpbmcgdGhpcyBjcmVkZW50aWFscyBlbnRyeVxuICAgKi9cbiAgQGRlc2NyaXB0aW9uKFwiVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNyZWRlbnRpYWxzIHJlY29yZFwiKVxuICBAY29sdW1uKClcbiAgQHBrKClcbiAgaWQhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQRU0tZW5jb2RlZCBYLjUwOSBjZXJ0aWZpY2F0ZSBmb3IgdGhlIGlkZW50aXR5XG4gICAqIEBzdW1tYXJ5IExlYWYgY2VydGlmaWNhdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBpZGVudGl0eVxuICAgKi9cbiAgQGRlc2NyaXB0aW9uKFwiUEVNLWVuY29kZWQgWC41MDkgY2VydGlmaWNhdGUgZm9yIHRoZSBpZGVudGl0eVwiKVxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgY2VydGlmaWNhdGUhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQRU0tZW5jb2RlZCByb290IG9yIGludGVybWVkaWF0ZSBjZXJ0aWZpY2F0ZVxuICAgKiBAc3VtbWFyeSBSb290IG9mIHRydXN0IHVzZWQgdG8gdmFsaWRhdGUgdGhlIGxlYWYgY2VydGlmaWNhdGVcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlBFTS1lbmNvZGVkIHJvb3Qgb3IgaW50ZXJtZWRpYXRlIGNlcnRpZmljYXRlXCIpXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICByb290Q2VydGlmaWNhdGUhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQRU0tZW5jb2RlZCBwcml2YXRlIGtleSBtYXRlcmlhbFxuICAgKiBAc3VtbWFyeSBQcml2YXRlIGtleSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpZGVudGl0eSBjZXJ0aWZpY2F0ZVxuICAgKi9cbiAgQGRlc2NyaXB0aW9uKFwiUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXlcIilcbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIHByaXZhdGVLZXkhOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoYXJnPzogTW9kZWxBcmc8SWRlbnRpdHlDcmVkZW50aWFscz4pIHtcbiAgICBzdXBlcihhcmcpO1xuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBLZXlzIHVzZWQgdG8gbWFyayBGYWJyaWMtc3BlY2lmaWMgbW9kZWwgbWV0YWRhdGFcbiAqIEBzdW1tYXJ5IEVudW1lcmF0aW9uIG9mIHNwZWNpYWwga2V5cyB1c2VkIGJ5IHRoZSBzZXJpYWxpemF0aW9uIGxheWVyIHRvIHBlcnNpc3QgRmFicmljLXJlbGF0ZWQgZmxhZ3Mgb24gbW9kZWxzXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBlbnVtIEZhYnJpY01vZGVsS2V5cyB7XG4gIC8qKiBQcml2YXRlIGRhdGEgbWFya2VyIHVzZWQgdG8gdGFnIHByb3BlcnRpZXMgb3IgbW9kZWxzIGZvciBGYWJyaWMgcHJpdmF0ZSBjb2xsZWN0aW9ucyAqL1xuICBQUklWQVRFID0gXCJwcml2YXRlXCIsXG4gIFNIQVJFRCA9IFwic2hhcmVkXCIsXG4gIC8qKiBOYW1lc3BhY2UgcHJlZml4IHVzZWQgZm9yIEZhYnJpYy1zcGVjaWZpYyBtZXRhZGF0YSBrZXlzICovXG4gIEZBQlJJQyA9IFwiZmFicmljXCIsXG4gIE9XTkVEX0JZID0gXCJvd25lZC1ieVwiLFxuICBUUkFOU0FDVElPTl9JRCA9IFwidHJhbnNhY3Rpb24taWRcIixcbiAgTUlSUk9SID0gXCJtaXJyb3JcIixcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN1cHBvcnRlZCBpZGVudGl0eSB0eXBlcyBmb3IgRmFicmljIGNyZWRlbnRpYWxzXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGlvbiBvZiBpZGVudGl0eSBmb3JtYXRzIHJlY29nbml6ZWQgYnkgdGhpcyBsaWJyYXJ5XG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBlbnVtIElkZW50aXR5VHlwZSB7XG4gIC8qKiBTdGFuZGFyZCBYLjUwOSBpZGVudGl0eSBmb3JtYXQgdXNlZCBieSBIeXBlcmxlZGdlciBGYWJyaWMgKi9cbiAgWDUwOSA9IFwiWC41MDlcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RyaW5nIGlkZW50aWZpZXIgZm9yIHRoZSBGYWJyaWMgYWRhcHRlciBmbGF2b3VyXG4gKiBAc3VtbWFyeSBVc2VkIHRvIHRhZyBhZGFwdGVycy9yZXBvc2l0b3JpZXMgdGhhdCBvcGVyYXRlIGFnYWluc3QgSHlwZXJsZWRnZXIgRmFicmljXG4gKiBAY29uc3QgRmFicmljRmxhdm91clxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgY29uc3QgRmFicmljRmxhdm91ciA9IFwiaGxmLWZhYnJpY1wiO1xuIiwiaW1wb3J0IHtcbiAgQmFzZU1vZGVsLFxuICBDYXNjYWRlLFxuICBjb2x1bW4sXG4gIGluZGV4LFxuICBvbmVUb09uZSxcbiAgcGssXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSWRlbnRpdHlDcmVkZW50aWFscyB9IGZyb20gXCIuL0lkZW50aXR5Q3JlZGVudGlhbHNcIjtcbmltcG9ydCB7IElkZW50aXR5VHlwZSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGRlc2NyaXB0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIElkZW50aXR5IG1vZGVsIHJlcHJlc2VudGluZyBhIEZhYnJpYyB3YWxsZXQgZW50cnlcbiAqIEBzdW1tYXJ5IEVuY2Fwc3VsYXRlcyBhbiBpZGVudGl0eSBzdG9yZWQgaW4gYSBGYWJyaWMgd2FsbGV0LCBpbmNsdWRpbmcgaXRzIE1TUCBpZGVudGlmaWVyLCBjcmVkZW50aWFsIGxpbmthZ2UsIGFuZCB0eXBlIGluZm9ybWF0aW9uLiBCdWlsdCBvbiBCYXNlTW9kZWwgZm9yIGludGVncmF0aW9uIHdpdGggRGVjYWYgdmFsaWRhdGlvbiBhbmQgcGVyc2lzdGVuY2UuXG4gKiBAcGFyYW0ge01vZGVsQXJnPElkZW50aXR5Pn0gW2FyZ10gLSBPcHRpb25hbCBpbml0aWFsaXphdGlvbiBvYmplY3QgdXNlZCB0byBwb3B1bGF0ZSBtb2RlbCBmaWVsZHNcbiAqIEBjbGFzcyBJZGVudGl0eVxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIG5ldyBpZGVudGl0eSByZWZlcmVuY2luZyBleGlzdGluZyBjcmVkZW50aWFsc1xuICogY29uc3QgaWQgPSBuZXcgSWRlbnRpdHkoeyBpZDogXCJ1c2VyMVwiLCBtc3BJZDogXCJPcmcxTVNQXCIsIHR5cGU6IElkZW50aXR5VHlwZS5YNTA5IH0pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgTW9kZWwgYXMgSWRlbnRpdHlcbiAqICAgQXBwLT4+TW9kZWw6IG5ldyBJZGVudGl0eSh7IGlkLCBtc3BJZCwgdHlwZSB9KVxuICogICBNb2RlbC0tPj5BcHA6IGluc3RhbmNlXG4gKi9cbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgSWRlbnRpdHkgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpZGVudGl0eSBpbiB0aGUgd2FsbGV0XG4gICAqIEBzdW1tYXJ5IFByaW1hcnkga2V5IHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgaWRlbnRpdHkgcmVjb3JkXG4gICAqL1xuICBAZGVzY3JpcHRpb24oXCJVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaWRlbnRpdHlcIilcbiAgQHBrKClcbiAgaWQhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaW5rIHRvIHRoZSBpZGVudGl0eSBjcmVkZW50aWFscyBzdG9yZWQgc2VwYXJhdGVseVxuICAgKiBAc3VtbWFyeSBPbmUtdG8tb25lIHJlbGF0aW9uc2hpcCB0byB0aGUgY3JlZGVudGlhbHMgZW50aXR5OyBjYXNjYWRlcyBvbiB1cGRhdGUgYW5kIGRlbGV0ZVxuICAgKi9cbiAgQG9uZVRvT25lKElkZW50aXR5Q3JlZGVudGlhbHMsIHtcbiAgICB1cGRhdGU6IENhc2NhZGUuQ0FTQ0FERSxcbiAgICBkZWxldGU6IENhc2NhZGUuQ0FTQ0FERSxcbiAgfSlcbiAgY3JlZGVudGlhbHMhOiBJZGVudGl0eUNyZWRlbnRpYWxzO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIGlkZW50aWZpZXJcbiAgICogQHN1bW1hcnkgVGhlIE1TUCBJRCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvcmdhbml6YXRpb24gdGhhdCBpc3N1ZWQgdGhpcyBpZGVudGl0eVxuICAgKi9cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIEBpbmRleCgpXG4gIG1zcElkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVHlwZSBvZiBpZGVudGl0eVxuICAgKiBAc3VtbWFyeSBJbmRpY2F0ZXMgdGhlIGlkZW50aXR5IGVuY29kaW5nL2Zvcm1hdDsgZGVmYXVsdHMgdG8gWC41MDlcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICB0eXBlOiBJZGVudGl0eVR5cGUgPSBJZGVudGl0eVR5cGUuWDUwOTtcblxuICBjb25zdHJ1Y3Rvcihhcmc6IE1vZGVsQXJnPElkZW50aXR5Pikge1xuICAgIHN1cGVyKGFyZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IHN0cmluZ0Zvcm1hdCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IExvZ2dlciwgTWluaUxvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgSWRlbnRpdHksIFNpZ25lciwgc2lnbmVycyB9IGZyb20gXCJAaHlwZXJsZWRnZXIvZmFicmljLWdhdGV3YXlcIjtcbmltcG9ydCB7IENyeXB0b1NldHRpbmcsIElDcnlwdG9TdWl0ZSwgVXNlciB9IGZyb20gXCJmYWJyaWMtY29tbW9uXCI7XG5pbXBvcnQgeyBIU01PcHRpb25zIH0gZnJvbSBcIi4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplSW1wb3J0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgY3J5cHRvLCB7IFg1MDlDZXJ0aWZpY2F0ZSB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IFg1MDlDZXJ0aWZpY2F0ZSBhcyBYNTA5Q2VydCB9IGZyb20gXCJAcGVjdWxpYXIveDUwOVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb3JlIHV0aWxpdGllcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBmaWxlcywgY3J5cHRvIGlkZW50aXRpZXMsIGFuZCBGYWJyaWMgU0RLIGhlbHBlcnNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHN0YXRpYyBoZWxwZXIgbWV0aG9kcyB0byByZWFkIGNyZWRlbnRpYWxzIGFuZCBrZXlzIGZyb20gZGlzayBvciByYXcgY29udGVudCwgY29uc3RydWN0IEZhYnJpYyBnYXRld2F5IElkZW50aXRpZXMgYW5kIFNpZ25lcnMsIGFuZCBwZXJmb3JtIGNvbW1vbiBmaWxlc3lzdGVtIG9wZXJhdGlvbnMgdXNlZCBieSB0aGUgRmFicmljIGNsaWVudCB0b29saW5nLlxuICogQGNsYXNzIENvcmVVdGlsc1xuICogQGV4YW1wbGVcbiAqIC8vIFJlYWQgYW4gaWRlbnRpdHkgYW5kIHNpZ25lciBmcm9tIGRpcmVjdG9yaWVzXG4gKiBjb25zdCBpZGVudGl0eSA9IGF3YWl0IENvcmVVdGlscy5nZXRJZGVudGl0eSgnT3JnMU1TUCcsICcvbXNwL3NpZ25jZXJ0cycpO1xuICogY29uc3Qgc2lnbmVyID0gYXdhaXQgQ29yZVV0aWxzLmdldFNpZ25lcignL21zcC9rZXlzdG9yZScpO1xuICogLy8gQnVpbGQgYSBDQSB1c2VyXG4gKiBjb25zdCB1c2VyID0gYXdhaXQgQ29yZVV0aWxzLmdldENBVXNlcignYXBwVXNlcicsIHBlbUtleSwgcGVtQ2VydCwgJ09yZzFNU1AnKTtcbiAqL1xuZXhwb3J0IGNsYXNzIENvcmVVdGlscyB7XG4gIHByaXZhdGUgc3RhdGljIGxvZ2dlcjogTG9nZ2VyID0gbmV3IE1pbmlMb2dnZXIoQ29yZVV0aWxzLm5hbWUpO1xuXG4gIHByaXZhdGUgc3RhdGljIGNyeXB0b1N1aXRlOiBJQ3J5cHRvU3VpdGU7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXNvbHZlIGZpbGUgY29udGVudCBmcm9tIGEgcGF0aCBvciByZXR1cm4gcHJvdmlkZWQgcmF3IGNvbnRlbnRcbiAgICogQHN1bW1hcnkgSWYgdGhlIGlucHV0IGlzIGEgVWludDhBcnJheSBvciBQRU0gY29udGVudCwgcmV0dXJucyBpdCBhcy1pczsgb3RoZXJ3aXNlIHVzZXMgYSBwcm92aWRlZCBhc3luYyBmaWxlUmVhZGVyIHRvIGxvYWQgdGhlIGNvbnRlbnQgZnJvbSBkaXNrLlxuICAgKiBAcGFyYW0ge3N0cmluZ3xVaW50OEFycmF5fSBjb250ZW50T3JQYXRoIC0gRWl0aGVyIGEgcmF3IGNvbnRlbnQgYnVmZmVyL3N0cmluZyBvciBhIGZpbGVzeXN0ZW0gcGF0aFxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyk6IFByb21pc2U8c3RyaW5nfFVpbnQ4QXJyYXl8QnVmZmVyPn0gZmlsZVJlYWRlciAtIEFzeW5jIGZ1bmN0aW9uIHRvIHJlYWQgZmlsZSBjb250ZW50IHdoZW4gYSBwYXRoIGlzIHByb3ZpZGVkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nfFVpbnQ4QXJyYXl8QnVmZmVyPn0gVGhlIGNvbnRlbnQgdG8gYmUgdXNlZCBkb3duc3RyZWFtXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBhc3luYyBjb250ZW50T2ZMb2FkRmlsZShcbiAgICBjb250ZW50T3JQYXRoOiBzdHJpbmcgfCBVaW50OEFycmF5LFxuICAgIGZpbGVSZWFkZXI6IChwYXRoOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nIHwgVWludDhBcnJheSB8IEJ1ZmZlcj5cbiAgKSB7XG4gICAgaWYgKGNvbnRlbnRPclBhdGggaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgICBpZiAoXG4gICAgICBjb250ZW50T3JQYXRoLm1hdGNoKFxuICAgICAgICAvLS0tLS1CRUdJTiAoQ0VSVElGSUNBVEV8S0VZfFBSSVZBVEUgS0VZKS0tLS0tLis/LS0tLS1FTkQgXFwxLS0tLS0kL2dtc1xuICAgICAgKVxuICAgIClcbiAgICAgIHJldHVybiBjb250ZW50T3JQYXRoO1xuICAgIHJldHVybiBhd2FpdCBmaWxlUmVhZGVyKGNvbnRlbnRPclBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkIGZpbGUgY29udGVudCBmcm9tIGEgcGF0aCBvciByZXR1cm4gcHJvdmlkZWQgQnVmZmVyXG4gICAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIHdyYXBwZXIgdGhhdCBsb2FkcyBhIGZpbGUgdXNpbmcgZnMucHJvbWlzZXMgd2hlbiBhIHBhdGggc3RyaW5nIGlzIHByb3ZpZGVkOyBvdGhlcndpc2UgcmV0dXJucyB0aGUgZ2l2ZW4gQnVmZmVyIGRpcmVjdGx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ3xCdWZmZXJ9IGNvbnRlbnRPclBhdGggLSBQYXRoIHRvIGEgZmlsZSBvbiBkaXNrIG9yIGFuIGFscmVhZHktbG9hZGVkIEJ1ZmZlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IFRoZSBmaWxlIGNvbnRlbnQgYXMgYSBCdWZmZXIvc3RyaW5nIGRlcGVuZGluZyBvbiByZWFkZXJcbiAgICovXG4gIHN0YXRpYyBhc3luYyByZWFkRmlsZShjb250ZW50T3JQYXRoOiBzdHJpbmcgfCBCdWZmZXIpIHtcbiAgICBpZiAodHlwZW9mIGNvbnRlbnRPclBhdGggIT09IFwic3RyaW5nXCIpIHJldHVybiBjb250ZW50T3JQYXRoO1xuXG4gICAgY29uc3QgZmlsZVJlYWRlciA9IGFzeW5jIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUocGF0aCk7XG4gICAgfTtcblxuICAgIHJldHVybiBhd2FpdCBmaWxlUmVhZGVyKGNvbnRlbnRPclBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgYSBGYWJyaWMgQ0EgVXNlciBvYmplY3Qgd2l0aCBlbnJvbGxtZW50XG4gICAqIEBzdW1tYXJ5IENvbnN0cnVjdHMgYSBmYWJyaWMtY29tbW9uIFVzZXIsIHNldHMgYSBjcnlwdG8gc3VpdGUsIGltcG9ydHMgdGhlIHByb3ZpZGVkIHByaXZhdGUga2V5LCBhbmQgc2V0cyBlbnJvbGxtZW50IHdpdGggY2VydGlmaWNhdGUgYW5kIE1TUCBJRC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJOYW1lIC0gVGhlIHVzZXIgbmFtZSBmb3IgdGhlIENBIHVzZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByaXZhdGVLZXkgLSBQRU0tZW5jb2RlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2VydGlmaWNhdGUgLSBQRU0tZW5jb2RlZCBYLjUwOSBjZXJ0aWZpY2F0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbXNwSWQgLSBNZW1iZXJzaGlwIFNlcnZpY2UgUHJvdmlkZXIgaWRlbnRpZmllclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFVzZXI+fSBUaGUgZW5yb2xsZWQgRmFicmljIFVzZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRDQVVzZXIoXG4gICAgdXNlck5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgY2VydGlmaWNhdGU6IHN0cmluZyxcbiAgICBtc3BJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IGhzbT86IEhTTU9wdGlvbnMgfVxuICApOiBQcm9taXNlPFVzZXI+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIHN0cmluZ0Zvcm1hdChcbiAgICAgICAgXCJDcmVhdGluZyBDQSB7MH0gdXNlciB7MX0gd2l0aCBjZXJ0aWZpY2F0ZSB7Mn1cIixcbiAgICAgICAgbXNwSWQsXG4gICAgICAgIHVzZXJOYW1lLFxuICAgICAgICBjZXJ0aWZpY2F0ZVxuICAgICAgKVxuICAgICk7XG4gICAgY29uc3QgdXNlciA9IG5ldyBVc2VyKHVzZXJOYW1lKTtcbiAgICBjb25zdCBjb25maWcgPSBvcHRpb25zPy5oc21cbiAgICAgID8ge1xuICAgICAgICAgIHNvZnR3YXJlOiBmYWxzZSxcbiAgICAgICAgICBsaWI6IG9wdGlvbnMuaHNtLmxpYnJhcnksXG4gICAgICAgICAgc2xvdDogb3B0aW9ucy5oc20uc2xvdCxcbiAgICAgICAgICBsYWJlbDogb3B0aW9ucy5oc20udG9rZW5MYWJlbCxcbiAgICAgICAgICBwaW46IFN0cmluZyhvcHRpb25zLmhzbS5waW4pLFxuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjcnlwdG9TdWl0ZSA9IHRoaXMuZ2V0Q3J5cHRvU3VpdGUoY29uZmlnKTtcblxuICAgIHVzZXIuc2V0Q3J5cHRvU3VpdGUoY3J5cHRvU3VpdGUpO1xuICAgIGNvbnN0IGVucm9sbG1lbnRLZXkgPSBvcHRpb25zPy5oc21cbiAgICAgID8gYXdhaXQgdGhpcy5nZXRIU01FbnJvbGxtZW50S2V5KGNyeXB0b1N1aXRlLCBjZXJ0aWZpY2F0ZSwgb3B0aW9ucy5oc20pXG4gICAgICA6IHRoaXMuZ2V0U29mdHdhcmVFbnJvbGxtZW50S2V5KGNyeXB0b1N1aXRlLCBwcml2YXRlS2V5KTtcbiAgICBhd2FpdCB1c2VyLnNldEVucm9sbG1lbnQoZW5yb2xsbWVudEtleSwgY2VydGlmaWNhdGUsIG1zcElkKTtcbiAgICByZXR1cm4gdXNlcjtcbiAgfVxuXG4gIHN0YXRpYyBnZXRDcnlwdG9TdWl0ZShvcHRpb25zPzogQ3J5cHRvU2V0dGluZyk6IElDcnlwdG9TdWl0ZSB7XG4gICAgaWYgKCFvcHRpb25zKSByZXR1cm4gVXNlci5uZXdDcnlwdG9TdWl0ZSgpO1xuICAgIGlmIChDb3JlVXRpbHMuY3J5cHRvU3VpdGUpIHJldHVybiBDb3JlVXRpbHMuY3J5cHRvU3VpdGU7XG5cbiAgICBDb3JlVXRpbHMuY3J5cHRvU3VpdGUgPSBVc2VyLm5ld0NyeXB0b1N1aXRlKG9wdGlvbnMpO1xuICAgIHJldHVybiBDb3JlVXRpbHMuY3J5cHRvU3VpdGU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRTb2Z0d2FyZUVucm9sbG1lbnRLZXkoXG4gICAgY3J5cHRvU3VpdGU6IGFueSxcbiAgICBwcml2YXRlS2V5Pzogc3RyaW5nXG4gICkge1xuICAgIGlmICghcHJpdmF0ZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlByaXZhdGUga2V5IG11c3QgYmUgcHJvdmlkZWQgd2hlbiBIU00gY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcGxpZWRcIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyeXB0b1N1aXRlLmNyZWF0ZUtleUZyb21SYXcocHJpdmF0ZUtleSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBnZXRIU01FbnJvbGxtZW50S2V5KFxuICAgIGNyeXB0b1N1aXRlOiBhbnksXG4gICAgY2VydGlmaWNhdGU6IHN0cmluZyxcbiAgICBoc206IEhTTU9wdGlvbnNcbiAgKSB7XG4gICAgY29uc3Qgc2tpID1cbiAgICAgIGhzbS5rZXlJZEhleCAmJiBoc20ua2V5SWRIZXgudHJpbSgpLmxlbmd0aCA+IDBcbiAgICAgICAgPyBCdWZmZXIuZnJvbShoc20ua2V5SWRIZXgsIFwiaGV4XCIpXG4gICAgICAgIDogYXdhaXQgdGhpcy5nZXRDZXJ0aWZpY2F0ZVNLSShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY3J5cHRvU3VpdGUuZ2V0S2V5KHNraSk7XG4gICAgaWYgKCFrZXkgfHwgKHR5cGVvZiBrZXkuaXNQcml2YXRlID09PSBcImZ1bmN0aW9uXCIgJiYgIWtleS5pc1ByaXZhdGUoKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byByZXNvbHZlIHByaXZhdGUga2V5IGZyb20gSFNNXCIpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldENlcnRpZmljYXRlU0tJKGNlcnRpZmljYXRlOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGNvbnN0IHg1MDkgPSBuZXcgWDUwOUNlcnRpZmljYXRlKGNlcnRpZmljYXRlKTtcbiAgICBjb25zdCBqd2sgPSB4NTA5LnB1YmxpY0tleS5leHBvcnQoeyBmb3JtYXQ6IFwiandrXCIgfSk7XG4gICAgY29uc3QgcHJlZml4ID0gQnVmZmVyLmZyb20oWzB4MDRdKTtcbiAgICBjb25zdCB4ID0gQnVmZmVyLmZyb20oandrLnggfHwgXCJcIiwgXCJiYXNlNjR1cmxcIik7XG4gICAgY29uc3QgeSA9IEJ1ZmZlci5mcm9tKGp3ay55IHx8IFwiXCIsIFwiYmFzZTY0dXJsXCIpO1xuICAgIHJldHVybiBjcnlwdG9cbiAgICAgIC5jcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgICAudXBkYXRlKEJ1ZmZlci5jb25jYXQoW3ByZWZpeCwgeCwgeV0pKVxuICAgICAgLmRpZ2VzdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBhIEZhYnJpYyBHYXRld2F5IElkZW50aXR5IGZyb20gYW4gTVNQIElEIGFuZCBjZXJ0aWZpY2F0ZVxuICAgKiBAc3VtbWFyeSBSZWFkcyBhIGNlcnRpZmljYXRlIGZyb20gYSBkaXJlY3RvcnkgcGF0aCBvciBhY2NlcHRzIHJhdyBjb250ZW50IGFuZCByZXR1cm5zIGFuIElkZW50aXR5IG9iamVjdCBzdWl0YWJsZSBmb3IgdGhlIEZhYnJpYyBHYXRld2F5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbXNwSWQgLSBNZW1iZXJzaGlwIFNlcnZpY2UgUHJvdmlkZXIgSURcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNlcnREaXJlY3RvcnlQYXRoIC0gUGF0aCB0byBhIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZSBmaWxlLCBvciBQRU0gY29udGVudFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPElkZW50aXR5Pn0gVGhlIGlkZW50aXR5IGNvbnRhaW5pbmcgbXNwSWQgYW5kIGNlcnRpZmljYXRlIGNyZWRlbnRpYWxzXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0SWRlbnRpdHkoXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjZXJ0RGlyZWN0b3J5UGF0aDogc3RyaW5nXG4gICk6IFByb21pc2U8SWRlbnRpdHk+IHtcbiAgICBjb25zdCBpZGVudGl0eUZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgICAgY29uc3QgY2VydFBhdGggPSBhd2FpdCB0aGlzLmdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgICBjb25zdCBjcmVkZW50aWFscyA9IGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGNlcnRQYXRoKTtcbiAgICAgIHJldHVybiBjcmVkZW50aWFscztcbiAgICB9O1xuXG4gICAgY29uc3QgY3JlZGVudGlhbHM6IFVpbnQ4QXJyYXkgPSAoYXdhaXQgdGhpcy5jb250ZW50T2ZMb2FkRmlsZShcbiAgICAgIGNlcnREaXJlY3RvcnlQYXRoLFxuICAgICAgaWRlbnRpdHlGaWxlUmVhZGVyXG4gICAgKSkgYXMgVWludDhBcnJheTtcblxuICAgIHJldHVybiB7IG1zcElkLCBjcmVkZW50aWFscyB9O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEZpcnN0RGlyRmlsZU5hbWUoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcInBhdGhcIikpO1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgcHJvbWlzZXMucmVhZGRpcihkaXJQYXRoKTtcbiAgICByZXR1cm4gam9pbihkaXJQYXRoLCBmaWxlc1swXSk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcInBhdGhcIikpO1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgcHJvbWlzZXMucmVhZGRpcihkaXJQYXRoKTtcbiAgICByZXR1cm4gKGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGpvaW4oZGlyUGF0aCwgZmlsZXNbMF0pKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRGaWxlQ29udGVudChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgIHJldHVybiAoYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgpKS50b1N0cmluZygpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldFNpZ25lcihrZXlEaXJlY3RvcnlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFNpZ25lcj4ge1xuICAgIGNvbnN0IHNpZ25lckZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgICAgY29uc3Qga2V5UGF0aCA9IGF3YWl0IHRoaXMuZ2V0Rmlyc3REaXJGaWxlTmFtZShwYXRoKTtcbiAgICAgIHJldHVybiBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShrZXlQYXRoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcHJpdmF0ZUtleVBlbSA9IChhd2FpdCB0aGlzLmNvbnRlbnRPZkxvYWRGaWxlKFxuICAgICAga2V5RGlyZWN0b3J5UGF0aCxcbiAgICAgIHNpZ25lckZpbGVSZWFkZXJcbiAgICApKSBhcyBCdWZmZXI7XG4gICAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IHRoaXMuZXh0cmFjdFByaXZhdGVLZXkocHJpdmF0ZUtleVBlbSk7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocHJpdmF0ZUtleSk7XG4gICAgY29uc3QgayA9IChwcml2YXRlS2V5IGFzIGFueSlba2V5c1swXV07XG4gICAgLy8gLS1cblxuICAgIHJldHVybiBzaWduZXJzLm5ld1ByaXZhdGVLZXlTaWduZXIoayBhcyBhbnkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZXh0cmFjdFByaXZhdGVLZXkocGVtOiBCdWZmZXIpIHtcbiAgICBjb25zdCBsaWJOYW1lID0gXCJjcnlwdG9cIjtcbiAgICBsZXQgc3VidGxlOiBhbnk7XG4gICAgaWYgKFxuICAgICAgKGdsb2JhbFRoaXMgYXMgYW55KS53aW5kb3cgJiZcbiAgICAgICgoZ2xvYmFsVGhpcyBhcyBhbnkpLndpbmRvdyBhcyB7IENyeXB0bzogYW55IH0pLkNyeXB0b1xuICAgICkge1xuICAgICAgc3VidGxlID0gKChnbG9iYWxUaGlzIGFzIGFueSkuQ3J5cHRvIGFzIGFueSkuc3VidGxlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBsaWIgPSAoYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChsaWJOYW1lKSkpIGFzIGFueTtcbiAgICAgIHN1YnRsZSA9IGxpYi5zdWJ0bGUgfHwgbGliLndlYmNyeXB0by5zdWJ0bGU7XG4gICAgfVxuXG4gICAgaWYgKCFzdWJ0bGUpIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBsb2FkIFN1YnRsZUNyeXB0byBtb2R1bGVcIik7XG5cbiAgICBmdW5jdGlvbiBzdHIyYWIoc3RyOiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihzdHIubGVuZ3RoKTtcbiAgICAgIGNvbnN0IGJ1ZlZpZXcgPSBuZXcgVWludDhBcnJheShidWYpO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIHN0ckxlbiA9IHN0ci5sZW5ndGg7IGkgPCBzdHJMZW47IGkrKykge1xuICAgICAgICBidWZWaWV3W2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYnVmO1xuICAgIH1cblxuICAgIGNvbnN0IHN0ciA9IHBlbVxuICAgICAgLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgICAgLnJlcGxhY2UoXCItLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cIiwgXCJcIilcbiAgICAgIC5yZXBsYWNlQWxsKFwiXFxuXCIsIFwiXCIpXG4gICAgICAucmVwbGFjZShcIi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS1cIiwgXCJcIik7XG4gICAgY29uc3QgZGVjb2RlZCA9IEJ1ZmZlci5mcm9tKHN0ciwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJiaW5hcnlcIik7XG4gICAgY29uc3QgYmluYXJ5RGVyID0gc3RyMmFiKGRlY29kZWQpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICBcInBrY3M4XCIsXG4gICAgICBiaW5hcnlEZXIsXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgbmFtZWRDdXJ2ZTogXCJQLTI1NlwiLFxuICAgICAgfSxcbiAgICAgIHRydWUsXG4gICAgICBbXCJzaWduXCJdXG4gICAgKTtcblxuICAgIHJldHVybiBrZXk7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgY2VydGlmaWNhdGUgU2VyaWFsIE51bWJlciBhbmQgdGhlIEFLSSAoQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyKVxuICogaW4gdGhlIGZvcm1hdCBGYWJyaWMgQ0EgZXhwZWN0cyAocGxhaW4gaGV4LCBubyBjb2xvbnMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWtpQW5kU2VyaWFsRnJvbUNlcnQoY2VydDogc3RyaW5nKToge1xuICBha2k6IHN0cmluZztcbiAgc2VyaWFsOiBzdHJpbmc7XG59IHtcbiAgY29uc3QgeDUwOUNlcnRpZmljYXRlID0gbmV3IFg1MDlDZXJ0KGNlcnQpO1xuXG4gIC8vIEZpbmQgdGhlIEFLSSAoQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyKSBleHRlbnNpb24gYnkgaXRzIE9JRDogMi41LjI5LjM1XG4gIGNvbnN0IGFraUV4dCA9IHg1MDlDZXJ0aWZpY2F0ZS5leHRlbnNpb25zPy5maW5kKFxuICAgIChlKSA9PiBlLnR5cGUgPT09IFwiMi41LjI5LjM1XCJcbiAgKTtcbiAgaWYgKCFha2lFeHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIkF1dGhvcml0eSBLZXkgSWRlbnRpZmllciAoQUtJKSBleHRlbnNpb24gbm90IGZvdW5kIGluIGNlcnRpZmljYXRlLlwiXG4gICAgKTtcbiAgfVxuXG4gIC8vIGFraUV4dC52YWx1ZSBpcyB0aGUgZXh0ZW5zaW9uIGNvbnRlbnQgaW4gREVSIGJ5dGVzLiBDb252ZXJ0IGl0IHRvIGEgaGV4IHN0cmluZy5cbiAgbGV0IGFraSA9IEJ1ZmZlci5mcm9tKG5ldyBVaW50OEFycmF5KGFraUV4dC52YWx1ZSkpXG4gICAgLnRvU3RyaW5nKFwiaGV4XCIpXG4gICAgLnRvVXBwZXJDYXNlKCk7XG5cbiAgLyoqXG4gICAqIENvbW1vbiBjYXNlOlxuICAgKiBUaGUgREVSLWVuY29kZWQgQUtJIGV4dGVuc2lvbiBvZnRlbiBzdGFydHMgd2l0aDpcbiAgICogICAzMCAxNiA4MCAxNCA8MjAtYnl0ZSBrZXlJZGVudGlmaWVyPlxuICAgKiBJbiBoZXgsIHRoYXQncyBcIjMwMTY4MDE0XCIgKyA0MCBoZXggY2hhcnMgKDIwIGJ5dGVzKS5cbiAgICpcbiAgICogRmFicmljIENBIGV4cGVjdHMgT05MWSB0aGUgMjAtYnl0ZSBrZXlJZGVudGlmaWVyICg0MCBoZXggY2hhcnMpLFxuICAgKiBzbyB3ZSBzdHJpcCB0aGUgXCIzMDE2ODAxNFwiIHByZWZpeCB3aGVuIHByZXNlbnQuXG4gICAqL1xuICBpZiAoYWtpLnN0YXJ0c1dpdGgoXCIzMDE2ODAxNFwiKSAmJiBha2kubGVuZ3RoID49IDggKyA0MClcbiAgICBha2kgPSBha2kuc2xpY2UoOCwgOCArIDQwKTtcblxuICByZXR1cm4geyBha2ksIHNlcmlhbDogeDUwOUNlcnRpZmljYXRlLnNlcmlhbE51bWJlciB9O1xufVxuIiwiaW1wb3J0ICogYXMgeDUwOSBmcm9tIFwiQHBlY3VsaWFyL3g1MDlcIjtcbmltcG9ydCB7IENyeXB0bywgQ3J5cHRvS2V5IH0gZnJvbSBcIkBwZWN1bGlhci93ZWJjcnlwdG9cIjtcbmltcG9ydCB7IHN0cmluZ0Zvcm1hdCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGlzQnJvd3NlciwgTWluaUxvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG5jb25zdCBjcnlwdG8gPSBuZXcgQ3J5cHRvKCk7XG54NTA5LmNyeXB0b1Byb3ZpZGVyLnNldChjcnlwdG8pO1xuXG5leHBvcnQgZW51bSBCQVNFX0FMUEhBQkVUIHtcbiAgQkFTRTIgPSBcIjAxXCIsXG4gIEJBU0U4ID0gXCIwMTIzNDU2N1wiLFxuICBCQVNFMTEgPSBcIjAxMjM0NTY3ODlhXCIsXG4gIEJBU0UxNiA9IFwiMDEyMzQ1Njc4OWFiY2RlZlwiLFxuICBCQVNFMzIgPSBcIjAxMjM0NTY3ODlBQkNERUZHSEpLTU5QUVJTVFZXWFlaXCIsXG4gIEJBU0UzMl9aID0gXCJ5Ym5kcmZnOGVqa21jcHF4b3QxdXdpc3phMzQ1aDc2OVwiLFxuICBCQVNFMzYgPSBcIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiLFxuICBCQVNFNTggPSBcIjEyMzQ1Njc4OUFCQ0RFRkdISktMTU5QUVJTVFVWV1hZWmFiY2RlZmdoaWprbW5vcHFyc3R1dnd4eXpcIixcbiAgQkFTRTYyID0gXCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWlwiLFxuICBCQVNFNjQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky9cIixcbiAgQkFTRTY3ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fLiF+XCIsXG59XG5cbmV4cG9ydCB0eXBlIGtleU9iamVjdCA9IHtcbiAgaXY6IEFycmF5QnVmZmVyO1xuICBrZXk6IENyeXB0b0tleTtcbn07XG5cbmV4cG9ydCBlbnVtIENSWVBUTyB7XG4gIEhBU0ggPSBcIlNIQS0yNTZcIixcbiAgSVRFUkFUSU9OUyA9IDEwMDAsXG4gIEtFWUxFTkdUSCA9IDQ4LFxuICBERVJJVkVEX0lWX0xFTkdUSCA9IDE2LFxuICBERVJJVkVEX0tFWV9MRU5HVEggPSAzMiwgLy8gQmVjYXVzZSBTSEEtMjU2IHVzZWQgaGFzIGEgbmF0aXZlIHNpemUgb2YgMzIgYnl0ZXNcbiAgQUxHT1JZVEhNID0gXCJBRVMtR0NNXCIsXG4gIEtFWV9BTEdPUllUSE0gPSBcIlBCS0RGMlwiLFxufVxuXG5leHBvcnQgY2xhc3MgQmFzZUVuY29kZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VNYXA6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGJhc2U6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBsZWFkZXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBmYWN0b3I6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBpRmFjdG9yOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhbHBoYWJldDogQkFTRV9BTFBIQUJFVCkge1xuICAgIGlmICh0aGlzLmFscGhhYmV0Lmxlbmd0aCA+PSAyNTUpIHRocm93IG5ldyBFcnJvcihcIkFscGhhYmV0IHRvbyBsb25nXCIpO1xuXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmJhc2VNYXAubGVuZ3RoOyBqKyspIHRoaXMuYmFzZU1hcFtqXSA9IDI1NTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxwaGFiZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHggPSBhbHBoYWJldC5jaGFyQXQoaSk7XG4gICAgICBjb25zdCB4YyA9IHguY2hhckNvZGVBdCgwKTtcbiAgICAgIGlmICh0aGlzLmJhc2VNYXBbeGNdICE9PSAyNTUpIHRocm93IG5ldyBFcnJvcih4ICsgXCIgaXMgYW1iaWd1b3VzXCIpO1xuXG4gICAgICB0aGlzLmJhc2VNYXBbeGNdID0gaTtcbiAgICB9XG5cbiAgICB0aGlzLmJhc2UgPSB0aGlzLmFscGhhYmV0Lmxlbmd0aDtcbiAgICB0aGlzLmxlYWRlciA9IHRoaXMuYWxwaGFiZXQuY2hhckF0KDApO1xuICAgIHRoaXMuZmFjdG9yID0gTWF0aC5sb2codGhpcy5iYXNlKSAvIE1hdGgubG9nKDI1Nik7IC8vIGxvZyhCQVNFKSAvIGxvZygyNTYpLCByb3VuZGVkIHVwXG4gICAgdGhpcy5pRmFjdG9yID0gTWF0aC5sb2coMjU2KSAvIE1hdGgubG9nKHRoaXMuYmFzZSk7IC8vIGxvZygyNTYpIC8gbG9nKEJBU0UpLCByb3VuZGVkIHVwXG4gIH1cblxuICBlbmNvZGUoc291cmNlOiBVaW50OEFycmF5IHwgRGF0YVZpZXcgfCBhbnlbXSB8IHN0cmluZykge1xuICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBzb3VyY2UgPSBCdWZmZXIuZnJvbShzb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHNvdXJjZSkpIHtcbiAgICAgIHNvdXJjZSA9IG5ldyBVaW50OEFycmF5KFxuICAgICAgICBzb3VyY2UuYnVmZmVyLFxuICAgICAgICBzb3VyY2UuYnl0ZU9mZnNldCxcbiAgICAgICAgc291cmNlLmJ5dGVMZW5ndGhcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgIHNvdXJjZSA9IFVpbnQ4QXJyYXkuZnJvbShzb3VyY2UpO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2UubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcblxuICAgIC8vIFNraXAgJiBjb3VudCBsZWFkaW5nIHplcm9lcy5cbiAgICBsZXQgemVyb2VzID0gMDtcbiAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICBsZXQgcGJlZ2luID0gMDtcbiAgICBjb25zdCBwZW5kID0gc291cmNlLmxlbmd0aDtcbiAgICB3aGlsZSAocGJlZ2luICE9PSBwZW5kICYmIHNvdXJjZVtwYmVnaW5dID09PSAwKSB7XG4gICAgICBwYmVnaW4rKztcbiAgICAgIHplcm9lcysrO1xuICAgIH1cbiAgICAvLyBBbGxvY2F0ZSBlbm91Z2ggc3BhY2UgaW4gYmlnLWVuZGlhbiBiYXNlNTggcmVwcmVzZW50YXRpb24uXG4gICAgY29uc3Qgc2l6ZSA9ICgocGVuZCAtIHBiZWdpbikgKiB0aGlzLmlGYWN0b3IgKyAxKSA+Pj4gMDtcbiAgICBjb25zdCBiNTggPSBuZXcgVWludDhBcnJheShzaXplKTtcbiAgICAvLyBQcm9jZXNzIHRoZSBieXRlcy5cbiAgICB3aGlsZSAocGJlZ2luICE9PSBwZW5kKSB7XG4gICAgICBsZXQgY2FycnkgPSBzb3VyY2VbcGJlZ2luXTtcbiAgICAgIC8vIEFwcGx5IFwiYjU4ID0gYjU4ICogMjU2ICsgY2hcIi5cbiAgICAgIGxldCBpID0gMDtcbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBpdDEgPSBzaXplIC0gMTtcbiAgICAgICAgKGNhcnJ5ICE9PSAwIHx8IGkgPCBsZW5ndGgpICYmIGl0MSAhPT0gLTE7XG4gICAgICAgIGl0MS0tLCBpKytcbiAgICAgICkge1xuICAgICAgICBjYXJyeSArPSAoMjU2ICogYjU4W2l0MV0pID4+PiAwO1xuICAgICAgICBiNThbaXQxXSA9IGNhcnJ5ICUgdGhpcy5iYXNlID4+PiAwO1xuICAgICAgICBjYXJyeSA9IChjYXJyeSAvIHRoaXMuYmFzZSkgPj4+IDA7XG4gICAgICB9XG4gICAgICBpZiAoY2FycnkgIT09IDApIHRocm93IG5ldyBFcnJvcihcIk5vbi16ZXJvIGNhcnJ5XCIpO1xuXG4gICAgICBsZW5ndGggPSBpO1xuICAgICAgcGJlZ2luKys7XG4gICAgfVxuICAgIC8vIFNraXAgbGVhZGluZyB6ZXJvZXMgaW4gYmFzZTU4IHJlc3VsdC5cbiAgICBsZXQgaXQyID0gc2l6ZSAtIGxlbmd0aDtcbiAgICB3aGlsZSAoaXQyICE9PSBzaXplICYmIGI1OFtpdDJdID09PSAwKSBpdDIrKztcblxuICAgIC8vIFRyYW5zbGF0ZSB0aGUgcmVzdWx0IGludG8gYSBzdHJpbmcuXG4gICAgbGV0IHN0ciA9IHRoaXMubGVhZGVyLnJlcGVhdCh6ZXJvZXMpO1xuICAgIGZvciAoOyBpdDIgPCBzaXplOyArK2l0Mikge1xuICAgICAgc3RyICs9IHRoaXMuYWxwaGFiZXQuY2hhckF0KGI1OFtpdDJdKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIHByaXZhdGUgZGVjb2RlVW5zYWZlKHNvdXJjZTogc3RyaW5nKTogVWludDhBcnJheSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHNvdXJjZS5sZW5ndGggPT09IDApIHJldHVybiBuZXcgVWludDhBcnJheSgwKTtcblxuICAgIGxldCBwc3ogPSAwO1xuICAgIC8vIFNraXAgYW5kIGNvdW50IGxlYWRpbmcgJzEncy5cbiAgICBsZXQgemVyb2VzID0gMDtcbiAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICB3aGlsZSAoc291cmNlW3Bzel0gPT09IHRoaXMubGVhZGVyKSB7XG4gICAgICB6ZXJvZXMrKztcbiAgICAgIHBzeisrO1xuICAgIH1cbiAgICAvLyBBbGxvY2F0ZSBlbm91Z2ggc3BhY2UgaW4gYmlnLWVuZGlhbiBiYXNlMjU2IHJlcHJlc2VudGF0aW9uLlxuICAgIGNvbnN0IHNpemUgPSAoKHNvdXJjZS5sZW5ndGggLSBwc3opICogdGhpcy5mYWN0b3IgKyAxKSA+Pj4gMDsgLy8gbG9nKDU4KSAvIGxvZygyNTYpLCByb3VuZGVkIHVwLlxuICAgIGNvbnN0IGIyNTYgPSBuZXcgVWludDhBcnJheShzaXplKTtcbiAgICAvLyBQcm9jZXNzIHRoZSBjaGFyYWN0ZXJzLlxuICAgIHdoaWxlIChzb3VyY2VbcHN6XSkge1xuICAgICAgLy8gRGVjb2RlIGNoYXJhY3RlclxuICAgICAgbGV0IGNhcnJ5ID0gdGhpcy5iYXNlTWFwW3NvdXJjZS5jaGFyQ29kZUF0KHBzeildO1xuICAgICAgLy8gSW52YWxpZCBjaGFyYWN0ZXJcbiAgICAgIGlmIChjYXJyeSA9PT0gMjU1KSByZXR1cm47XG5cbiAgICAgIGxldCBpID0gMDtcbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBpdDMgPSBzaXplIC0gMTtcbiAgICAgICAgKGNhcnJ5ICE9PSAwIHx8IGkgPCBsZW5ndGgpICYmIGl0MyAhPT0gLTE7XG4gICAgICAgIGl0My0tLCBpKytcbiAgICAgICkge1xuICAgICAgICBjYXJyeSArPSAodGhpcy5iYXNlICogYjI1NltpdDNdKSA+Pj4gMDtcbiAgICAgICAgYjI1NltpdDNdID0gY2FycnkgJSAyNTYgPj4+IDA7XG4gICAgICAgIGNhcnJ5ID0gKGNhcnJ5IC8gMjU2KSA+Pj4gMDtcbiAgICAgIH1cbiAgICAgIGlmIChjYXJyeSAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKFwiTm9uLXplcm8gY2FycnlcIik7XG5cbiAgICAgIGxlbmd0aCA9IGk7XG4gICAgICBwc3orKztcbiAgICB9XG4gICAgLy8gU2tpcCBsZWFkaW5nIHplcm9lcyBpbiBiMjU2LlxuICAgIGxldCBpdDQgPSBzaXplIC0gbGVuZ3RoO1xuICAgIHdoaWxlIChpdDQgIT09IHNpemUgJiYgYjI1NltpdDRdID09PSAwKSBpdDQrKztcblxuICAgIGNvbnN0IHZjaCA9IG5ldyBVaW50OEFycmF5KHplcm9lcyArIChzaXplIC0gaXQ0KSk7XG4gICAgbGV0IGogPSB6ZXJvZXM7XG4gICAgd2hpbGUgKGl0NCAhPT0gc2l6ZSkgdmNoW2orK10gPSBiMjU2W2l0NCsrXTtcblxuICAgIHJldHVybiB2Y2g7XG4gIH1cblxuICBkZWNvZGUoc291cmNlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBidWZmZXIgPSB0aGlzLmRlY29kZVVuc2FmZShzb3VyY2UpO1xuICAgIGlmIChidWZmZXIpIHJldHVybiBidWZmZXI7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm9uLWJhc2VcIiArIHRoaXMuYmFzZSArIFwiIGNoYXJhY3RlclwiKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ3J5cHRvVXRpbHMge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBiNThlbmNvZGVyID0gbmV3IEJhc2VFbmNvZGVyKEJBU0VfQUxQSEFCRVQuQkFTRTU4KTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IE1pbmlMb2dnZXIoQ3J5cHRvVXRpbHMubmFtZSk7XG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIHN0YXRpYyBmYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoc3RyaW5nRm9ybWF0KFwiUGFyc2luZyBjZXJ0aWZpY2F0ZTogezB9XCIsIGNlcnRpZmljYXRlKSk7XG4gICAgY29uc3QgY2VydCA9IG5ldyB4NTA5Llg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3QgeyBzdWJqZWN0LCBpc3N1ZXIgfSA9IGNlcnQ7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBzdHJpbmdGb3JtYXQoXG4gICAgICAgIFwiQ2VydGlmaWNhdGUgcGFyc2VkIHdpdGggc3ViamVjdCB7MH0gYW5kIGlzc3VlciB7MX1cIixcbiAgICAgICAgc3ViamVjdCxcbiAgICAgICAgaXNzdWVyXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gYHg1MDk6Oi8ke3N1YmplY3QucmVwbGFjZUFsbChcIiwgXCIsIFwiL1wiKX06Oi8ke2lzc3Vlci5yZXBsYWNlQWxsKFwiLCBcIiwgXCIvXCIpfWA7XG4gIH1cblxuICBzdGF0aWMgZW5jb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iNThlbmNvZGVyLmVuY29kZShzdHIpO1xuICB9XG4gIHN0YXRpYyBkZWNvZGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRlY29kZWQgPSB0aGlzLmI1OGVuY29kZXIuZGVjb2RlKHN0cik7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGRlY29kZWQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdGF0aWMgc3RyaW5nVG9BcnJheUJ1ZmZlcihzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihzdHIubGVuZ3RoKTtcbiAgICBjb25zdCBidWZWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICBmb3IgKGxldCBpID0gMCwgc3RyTGVuID0gc3RyLmxlbmd0aDsgaSA8IHN0ckxlbjsgaSsrKSB7XG4gICAgICBidWZWaWV3W2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBleHRyYWN0S2V5KFxuICAgIHR5cGU6IFwicHJpdmF0ZVwiIHwgXCJwdWJsaWNcIixcbiAgICBwZW06IEJ1ZmZlciB8IHN0cmluZyxcbiAgICB1c2FnZXM/OiBhbnlbXVxuICApIHtcbiAgICBjb25zdCBzdWJ0bGUgPSBjcnlwdG8uc3VidGxlO1xuXG4gICAgY29uc3Qgc3RyID0gcGVtXG4gICAgICAudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgICAucmVwbGFjZShcbiAgICAgICAgbmV3IFJlZ0V4cChgLS0tLS1CRUdJTiAoJHt0eXBlLnRvVXBwZXJDYXNlKCl9IEtFWXxDRVJUSUZJQ0FURSktLS0tLWApLFxuICAgICAgICBcIlwiXG4gICAgICApXG4gICAgICAucmVwbGFjZUFsbChcIlxcblwiLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoXG4gICAgICAgIG5ldyBSZWdFeHAoYC0tLS0tRU5EICgke3R5cGUudG9VcHBlckNhc2UoKX0gS0VZfENFUlRJRklDQVRFKS0tLS0tYCksXG4gICAgICAgIFwiXCJcbiAgICAgICk7XG4gICAgY29uc3QgZGVjb2RlZCA9IEJ1ZmZlci5mcm9tKHN0ciwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJiaW5hcnlcIik7XG4gICAgY29uc3QgYmluYXJ5RGVyID0gdGhpcy5zdHJpbmdUb0FycmF5QnVmZmVyKGRlY29kZWQpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICBcInBrY3M4XCIsXG4gICAgICBiaW5hcnlEZXIsXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgbmFtZWRDdXJ2ZTogXCJQLTI1NlwiLFxuICAgICAgfSxcbiAgICAgIHRydWUsXG4gICAgICB1c2FnZXMgPyB1c2FnZXMgOiBbXCJzaWduXCJdXG4gICAgKTtcblxuICAgIHJldHVybiBrZXk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZXh0cmFjdFByaXZhdGVLZXkocGVtOiBCdWZmZXIgfCBzdHJpbmcsIHVzYWdlcz86IGFueVtdKSB7XG4gICAgcmV0dXJuIHRoaXMuZXh0cmFjdEtleShcInByaXZhdGVcIiwgcGVtLCB1c2FnZXMpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGV4dHJhY3RQdWJsaWNLZXkocGVtOiBCdWZmZXIgfCBzdHJpbmcsIHVzYWdlcz86IGFueVtdKSB7XG4gICAgcmV0dXJuIHRoaXMuZXh0cmFjdEtleShcInB1YmxpY1wiLCBwZW0sIHVzYWdlcyk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgc2lnbihwcml2YXRlS2V5OiBzdHJpbmcsIGRhdGE6IEJ1ZmZlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5leHRyYWN0UHJpdmF0ZUtleShwcml2YXRlS2V5KTtcbiAgICBjb25zdCBidWZmID0gKGF3YWl0IGNyeXB0by5zdWJ0bGUuc2lnbihcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJFQ0RTQVwiLFxuICAgICAgICBoYXNoOiBcIlNIQS0yNTZcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBkYXRhIGFzIGFueVxuICAgICkpIGFzIEFycmF5QnVmZmVyO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkoYnVmZikpXG4gICAgICAubWFwKChiKSA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIikpXG4gICAgICAuam9pbihcIlwiKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyB2ZXJpZnkoXG4gICAgY2VydGlmaWNhdGU6IHN0cmluZyxcbiAgICBzaWduYXR1cmU6IEJ1ZmZlciB8IHN0cmluZyxcbiAgICBkYXRhOiBCdWZmZXIgfCBzdHJpbmdcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2VydCA9IG5ldyB4NTA5Llg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2VydC5wdWJsaWNLZXkuZXhwb3J0KCk7XG4gICAgc2lnbmF0dXJlID0gKFxuICAgICAgdHlwZW9mIHNpZ25hdHVyZSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSwgXCJoZXhcIikgOiBzaWduYXR1cmVcbiAgICApIGFzIEJ1ZmZlcjtcbiAgICBkYXRhID0gKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiID8gQnVmZmVyLmZyb20oZGF0YSkgOiBkYXRhKSBhcyBCdWZmZXI7XG4gICAgcmV0dXJuIGNyeXB0by5zdWJ0bGUudmVyaWZ5KFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIGhhc2g6IFwiU0hBLTI1NlwiLFxuICAgICAgfSxcbiAgICAgIGtleSxcbiAgICAgIHNpZ25hdHVyZSBhcyBhbnksXG4gICAgICBkYXRhIGFzIGFueVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZW5jcnlwdChjZXJ0aWZpY2F0ZTogc3RyaW5nLCBkYXRhOiBzdHJpbmcgfCBCdWZmZXIpIHtcbiAgICBjb25zdCBjZXJ0ID0gbmV3IHg1MDkuWDUwOUNlcnRpZmljYXRlKGNlcnRpZmljYXRlKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBjZXJ0LnB1YmxpY0tleS5leHBvcnQoKTtcbiAgICBkYXRhID0gKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiID8gQnVmZmVyLmZyb20oZGF0YSkgOiBkYXRhKSBhcyBCdWZmZXI7XG4gICAgY29uc3QgYnVmZiA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZW5jcnlwdChcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJFQ0RTQVwiLFxuICAgICAgfSxcbiAgICAgIGtleSxcbiAgICAgIGRhdGFcbiAgICApO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkoYnVmZikpXG4gICAgICAubWFwKChiKSA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIikpXG4gICAgICAuam9pbihcIlwiKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldFN1YnRsZUNyeXB0bygpIHtcbiAgICByZXR1cm4gaXNCcm93c2VyKClcbiAgICAgID8gKGdsb2JhbFRoaXMgYXMgYW55KS53aW5kb3cuY3J5cHRvLnN1YnRsZVxuICAgICAgOiBjcnlwdG8uc3VidGxlO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGRlY3J5cHQocHJpdmF0ZUtleTogc3RyaW5nLCBkYXRhOiBzdHJpbmcgfCBCdWZmZXIpIHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXkpO1xuICAgIGRhdGEgPSAoXG4gICAgICB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEsIFwiaGV4XCIpIDogZGF0YVxuICAgICkgYXMgQnVmZmVyO1xuICAgIHJldHVybiB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmRlY3J5cHQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBkYXRhXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIGdldCBhIHJhbmRvbSBtYXN0ZXIga2V5XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvbiBJZiBkYXRhIGlzIG5vdCBwYXNzZWQsIGEgcmFuZG9tIEFycmF5QnVmZmVyIHdpbGwgYmUgZ2VuZXJhdGVkXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGRhdGEgZW5jcnl0aW9uIGRhdGFcbiAgICpcbiAgICogQGZ1bmN0aW9uIGdldE1hc3RlclxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldE1hc3RlcihkYXRhPzogQXJyYXlCdWZmZXIpOiBQcm9taXNlPGtleU9iamVjdD4ge1xuICAgIGNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZ2VuR2VuZXNpcyA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgICBkYXRhID0gdGV4dEVuY29kZXIuZW5jb2RlKGdlbkdlbmVzaXMpLmJ1ZmZlcjtcbiAgICB9XG5cbiAgICBjb25zdCBpbXBvcnRlZEtleSA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuaW1wb3J0S2V5KFxuICAgICAgXCJyYXdcIixcbiAgICAgIGRhdGEsXG4gICAgICBDUllQVE8uS0VZX0FMR09SWVRITSBhcyBzdHJpbmcsXG4gICAgICBmYWxzZSxcbiAgICAgIFtcImRlcml2ZUJpdHNcIl1cbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogaW1wb3J0ZWRLZXksXG4gICAgICBpdjogZGF0YSEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIGRlcml2ZSBhIGtleSBmcm9tIGFub3RoZXIga2V5XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzYWx0XG4gICAqIEBwYXJhbSB7Q3J5cHRvS2V5fSBrZXkgT3JpZ2luYWwga2V5XG4gICAqXG4gICAqIEBmdW5jdGlvbiBnZXREZXJpdmF0aW9uS2V5XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0RGVyaXZhdGlvbktleShzYWx0OiBzdHJpbmcsIGtleTogQ3J5cHRvS2V5KSB7XG4gICAgY29uc3QgdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICBjb25zdCBzYWx0QnVmZmVyID0gdGV4dEVuY29kZXIuZW5jb2RlKHNhbHQpO1xuICAgIGNvbnN0IHNhbHRIYXNoZWQgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmRpZ2VzdChcbiAgICAgIFwiU0hBLTI1NlwiLFxuICAgICAgc2FsdEJ1ZmZlclxuICAgICk7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbmFtZTogQ1JZUFRPLktFWV9BTEdPUllUSE0gYXMgc3RyaW5nLFxuICAgICAgaGFzaDogQ1JZUFRPLkhBU0gsXG4gICAgICBzYWx0OiBzYWx0SGFzaGVkLFxuICAgICAgaXRlcmF0aW9uczogQ1JZUFRPLklURVJBVElPTlMsXG4gICAgfTtcbiAgICBjb25zdCBkZXJpdmF0aW9uID0gYXdhaXQgdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kZXJpdmVCaXRzKFxuICAgICAgcGFyYW1zLFxuICAgICAga2V5LFxuICAgICAgQ1JZUFRPLktFWUxFTkdUSCAqIDhcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmdldEtleShkZXJpdmF0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5IGFuZCBJViBmcm9tIHRoZSBDcnl0b0tleSBhcnJheVxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBkZXJpdmF0aW9uXG4gICAqXG4gICAqIEBmdW5jdGlvbiBnZXRLZXlcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRLZXkoZGVyaXZhdGlvbjogQXJyYXlCdWZmZXIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgY29uc3QgaXZsZW4gPSAxNjtcbiAgICBjb25zdCBrZXlsZW4gPSAzMjtcbiAgICBjb25zdCBkZXJpdmVkS2V5ID0gZGVyaXZhdGlvbi5zbGljZSgwLCBrZXlsZW4pO1xuICAgIGNvbnN0IGl2ID0gZGVyaXZhdGlvbi5zbGljZShrZXlsZW4pO1xuICAgIGNvbnN0IGltcG9ydGVkRW5jcnlwdGlvbktleSA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuaW1wb3J0S2V5KFxuICAgICAgXCJyYXdcIixcbiAgICAgIGRlcml2ZWRLZXksXG4gICAgICB7IG5hbWU6IENSWVBUTy5BTEdPUllUSE0gYXMgc3RyaW5nIH0sXG4gICAgICBmYWxzZSxcbiAgICAgIFtcImVuY3J5cHRcIiwgXCJkZWNyeXB0XCJdXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiBpbXBvcnRlZEVuY3J5cHRpb25LZXksXG4gICAgICBpdjogaXYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIGRlY3J5cHQgZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICAgKiBAcGFyYW0ge2tleU9iamVjdH0ga2V5T2JqZWN0XG4gICAqXG4gICAqIEBmdW5jdGlvbiBlbmNyeXB0XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZW5jcnlwdFBpbihcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAga2V5T2JqZWN0OiBrZXlPYmplY3RcbiAgKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4ge1xuICAgIGNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgY29uc3QgdGV4dEJ1ZmZlciA9IHRleHRFbmNvZGVyLmVuY29kZSh0ZXh0KTtcbiAgICBjb25zdCBlbmNyeXB0ZWRUZXh0ID0gYXdhaXQgdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5lbmNyeXB0KFxuICAgICAgeyBuYW1lOiBDUllQVE8uQUxHT1JZVEhNIGFzIHN0cmluZywgaXY6IGtleU9iamVjdC5pdiB9LFxuICAgICAga2V5T2JqZWN0LmtleSxcbiAgICAgIHRleHRCdWZmZXJcbiAgICApO1xuICAgIHJldHVybiBlbmNyeXB0ZWRUZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFV0aWwgZnVuY3Rpb24gdG8gZGVjcnlwdCBkYXRhXG4gICAqXG4gICAqIEBwYXJhbSB7QnVmZmVyU291cmNlfSBlbmNyeXB0ZWRUZXh0XG4gICAqIEBwYXJhbSB7a2V5T2JqZWN0fSBrZXlPYmplY3RcbiAgICpcbiAgICogQGZ1bmN0aW9uIGRlY3J5cHRcbiAgICovXG4gIHN0YXRpYyBhc3luYyBkZWNyeXB0UGluKFxuICAgIGVuY3J5cHRlZFRleHQ6IEFycmF5QnVmZmVyLFxuICAgIGtleU9iamVjdDoga2V5T2JqZWN0XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgICBjb25zdCBkZWNyeXB0ZWRUZXh0ID0gYXdhaXQgdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kZWNyeXB0KFxuICAgICAgeyBuYW1lOiBDUllQVE8uQUxHT1JZVEhNIGFzIHN0cmluZywgaXY6IGtleU9iamVjdC5pdiB9LFxuICAgICAga2V5T2JqZWN0LmtleSxcbiAgICAgIGVuY3J5cHRlZFRleHRcbiAgICApO1xuICAgIHJldHVybiB0ZXh0RGVjb2Rlci5kZWNvZGUoZGVjcnlwdGVkVGV4dCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VFcnJvciwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG4vLyBpbXBvcnQgeyBNSVNTSU5HX1BSSVZBVEVfREFUQV9FUlJPUl9NRVNTQUdFIH0gZnJvbSBcIi4uL2NvbnRyYWN0cy9wcml2YXRlLWRhdGFcIjtcbi8qKlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBvdmVyZmxvdyBlcnJvciBpbiBhcml0aG1ldGljIG9wZXJhdGlvbnMgaW4gU21hcnQgQ29udHJhY3RzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0aGUgZXJyb3IgbWVzc2FnZVxuICpcbiAqIEBjbGFzcyBPdmVyZmxvd0Vycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgT3ZlcmZsb3dFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBPdmVyZmxvd0Vycm9yLm5hbWUpO1xuICB9XG59XG5cbi8qKlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhIGZhaWx1cmUgaW4gYmFsYW5jZSB0byBwZXJmb3JtIGEgdHJhbnNhY3Rpb24gaW4gU21hcnQgQ29udHJhY3RzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0aGUgZXJyb3IgbWVzc2FnZVxuICpcbiAqIEBjbGFzcyBCYWxhbmNlRXJyb3JcbiAqIEBleHRlbmRzIEludGVybmFsRXJyb3JcbiAqXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBCYWxhbmNlRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQmFsYW5jZUVycm9yLm5hbWUpO1xuICB9XG59XG5cbi8qKlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhIGZhaWx1cmUgaW4gYmFsYW5jZSB0byBwZXJmb3JtIGEgdHJhbnNhY3Rpb24gaW4gU21hcnQgQ29udHJhY3RzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0aGUgZXJyb3IgbWVzc2FnZVxuICpcbiAqIEBjbGFzcyBCYWxhbmNlRXJyb3JcbiAqIEBleHRlbmRzIEludGVybmFsRXJyb3JcbiAqXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBBbGxvd2FuY2VFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBBbGxvd2FuY2VFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIHJlZ2lzdHJhdGluZyBuZXcgZW50aXRpZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNnIHRoZSBlcnJvciBtZXNzYWdlXG4gKlxuICogQGNsYXNzIFJlZ2lzdHJhdGlvbkVycm9yXG4gKlxuICogQGNhdGVnb3J0IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgUmVnaXN0cmF0aW9uRXJyb3IgZXh0ZW5kcyBBdXRob3JpemF0aW9uRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBSZWdpc3RyYXRpb25FcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBhbiB1bnN1cHBvcnRlZCBvcGVyYXRpb24gaXMgYXR0ZW1wdGVkXG4gKiBAc3VtbWFyeSBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIGFuIG9wZXJhdGlvbiBpcyByZXF1ZXN0ZWQgdGhhdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50XG4gKiBwZXJzaXN0ZW5jZSBhZGFwdGVyIG9yIGNvbmZpZ3VyYXRpb24uIEl0IGV4dGVuZHMgdGhlIEJhc2VFcnJvciBjbGFzcyBhbmQgc2V0cyBhIDUwMCBzdGF0dXMgY29kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBhbiBFcnJvciBvYmplY3QgdG8gd3JhcFxuICogQGNsYXNzIFVuc3VwcG9ydGVkRXJyb3JcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBUaHJvd2luZyBhbiBVbnN1cHBvcnRlZEVycm9yXG4gKiBpZiAoIWFkYXB0ZXIuc3VwcG9ydHNUcmFuc2FjdGlvbnMoKSkge1xuICogICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignVHJhbnNhY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYWRhcHRlcicpO1xuICogfVxuICpcbiAqIC8vIENhdGNoaW5nIGFuIFVuc3VwcG9ydGVkRXJyb3JcbiAqIHRyeSB7XG4gKiAgIGF3YWl0IGFkYXB0ZXIuYmVnaW5UcmFuc2FjdGlvbigpO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRFcnJvcikge1xuICogICAgIGNvbnNvbGUuZXJyb3IoJ09wZXJhdGlvbiBub3Qgc3VwcG9ydGVkOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBNaXNzaW5nQ29udGV4dEVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIE1pc3NpbmdDb250ZXh0RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yID0gXCJNSVNTSU5HX1BSSVZBVEVfREFUQV9FUlJPUl9NRVNTQUdFXCIpIHtcbiAgICBzdXBlcihVbmF1dGhvcml6ZWRQcml2YXRlRGF0YUFjY2Vzcy5uYW1lLCBtc2csIDQwMyk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGVycm9yIHRoYXQgb2NjdXJzIHdoZW4gYSByZXF1aXJlZCBpbml0aWFsaXphdGlvbiBzdGVwIGlzIG5vdCBwZXJmb3JtZWQuXG4gKlxuICogQGNsYXNzIE5vdEluaXRpYWxpemVkRXJyb3JcbiAqIEBleHRlbmRzIEJhc2VFcnJvclxuICpcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZyB8IEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBhbiBFcnJvciBvYmplY3QgdG8gd3JhcC5cbiAqXG4gKiBAdGhyb3dzIHtOb3RJbml0aWFsaXplZEVycm9yfSAtIFRocm93cyBhbiBlcnJvciB3aGVuIGEgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24gc3RlcCBpcyBub3QgcGVyZm9ybWVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJbml0aWFsaXplIHRoZSBhcHBsaWNhdGlvblxuICogaWYgKCFpc0luaXRpYWxpemVkKSB7XG4gKiAgIHRocm93IG5ldyBOb3RJbml0aWFsaXplZEVycm9yKCdBcHBsaWNhdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQnKTtcbiAqIH1cbiAqXG4gKiAvLyBDYXRjaGluZyBhbiBOb3RJbml0aWFsaXplZEVycm9yXG4gKiB0cnkge1xuICogICAvLyBQZXJmb3JtIG9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIGluaXRpYWxpemF0aW9uXG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RJbml0aWFsaXplZEVycm9yKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcignSW5pdGlhbGl6YXRpb24gZXJyb3I6JywgZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTm90SW5pdGlhbGl6ZWRFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihOb3RJbml0aWFsaXplZEVycm9yLm5hbWUsIG1zZywgNDA5KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWlzc2luZ1BLQ1NTMTFMaWIgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgTWlzc2luZ1BLQ1NTMTFMaWIubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5kb3JzZW1lbnRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIEVuZG9yc2VtZW50RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTXZjY1JlYWRDb25mbGljdEVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgTXZjY1JlYWRDb25mbGljdEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBoYW50b21SZWFkQ29uZmxpY3RFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFBoYW50b21SZWFkQ29uZmxpY3RFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbmRvcnNlbWVudFBvbGljeUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgRW5kb3JzZW1lbnRQb2xpY3lFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkxpbWl0c0Vycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IEVycm9yLFxuICAgIG5hbWU6IHN0cmluZyA9IFRyYW5zYWN0aW9uTGltaXRzRXJyb3IubmFtZSxcbiAgICBjb2RlID0gNTkwXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIG5hbWUsIGNvZGUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvblRpbWVvdXRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFRyYW5zYWN0aW9uVGltZW91dEVycm9yLm5hbWUsIDU5MSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQnVmZmVyU2l6ZUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgVHJhbnNhY3Rpb25CdWZmZXJTaXplRXJyb3IubmFtZSwgNTkyKTtcbiAgfVxufVxuIiwiaW1wb3J0IEZhYnJpY0NBU2VydmljZXMgZnJvbSBcImZhYnJpYy1jYS1jbGllbnRcIjtcbmltcG9ydCB7XG4gIEFmZmlsaWF0aW9uU2VydmljZSxcbiAgSWRlbnRpdHlTZXJ2aWNlLFxuICBJRW5yb2xsUmVzcG9uc2UsXG4gIElSZWdpc3RlclJlcXVlc3QsXG4gIElTZXJ2aWNlUmVzcG9uc2UsXG4gIFRMU09wdGlvbnMsXG59IGZyb20gXCJmYWJyaWMtY2EtY2xpZW50XCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7IENBQ29uZmlnLCBDcmVkZW50aWFscyB9IGZyb20gXCIuLi8uLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9tb2RlbC9JZGVudGl0eVwiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBDb25mbGljdEVycm9yLFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvcmVVdGlscyB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQ0FfUk9MRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ3J5cHRvVXRpbHMgfSBmcm9tIFwiLi4vY3J5cHRvXCI7XG5pbXBvcnQge1xuICBDZXJ0aWZpY2F0ZVJlc3BvbnNlLFxuICBGYWJyaWNJZGVudGl0eSxcbiAgR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgSWRlbnRpdHlSZXNwb25zZSxcbn0gZnJvbSBcIi4uLy4uL3NoYXJlZC9mYWJyaWMtdHlwZXNcIjtcbmltcG9ydCB7IFJlZ2lzdHJhdGlvbkVycm9yIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9lcnJvcnNcIjtcbmltcG9ydCB7IExvZ2dlZENsYXNzLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEh5cGVybGVkZ2VyIEZhYnJpYyBDQSBpZGVudGl0eSB0eXBlcy5cbiAqIEBzdW1tYXJ5IEVudW1lcmF0ZXMgdGhlIHN1cHBvcnRlZCBpZGVudGl0eSB0eXBlcyByZWNvZ25pemVkIGJ5IEZhYnJpYyBDQSBmb3IgcmVnaXN0cmF0aW9uIGFuZCBpZGVudGl0eSBtYW5hZ2VtZW50LlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgZW51bSBIRkNBSWRlbnRpdHlUeXBlIHtcbiAgUEVFUiA9IFwicGVlclwiLFxuICBPUkRFUkVSID0gXCJvcmRlcmVyXCIsXG4gIENMSUVOVCA9IFwiY2xpZW50XCIsXG4gIFVTRVIgPSBcInVzZXJcIixcbiAgQURNSU4gPSBcImFkbWluXCIsXG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLZXkvdmFsdWUgYXR0cmlidXRlIHVzZWQgZHVyaW5nIENBIHJlZ2lzdHJhdGlvbi5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW4gYXR0cmlidXRlIGVudHJ5IHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGEgRmFicmljIENBIGlkZW50aXR5IGR1cmluZyByZWdpc3RyYXRpb24sIG9wdGlvbmFsbHkgbWFya2luZyBpdCBmb3IgaW5jbHVzaW9uIGluIGVjZXJ0LlxuICogQGludGVyZmFjZSBJS2V5VmFsdWVBdHRyaWJ1dGVcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIEF0dHJpYnV0ZSBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gQXR0cmlidXRlIHZhbHVlLlxuICogQHBhcmFtIHtib29sZWFufSBbZWNlcnRdIC0gV2hldGhlciB0aGUgYXR0cmlidXRlIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgZW5yb2xsbWVudCBjZXJ0aWZpY2F0ZSAoRUNlcnQpLlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElLZXlWYWx1ZUF0dHJpYnV0ZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgZWNlcnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdGFuZGFyZCBGYWJyaWMgQ0EgaWRlbnRpdHkgYXR0cmlidXRlIGtleXMuXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHdlbGwta25vd24gRmFicmljIENBIGF0dHJpYnV0ZSBrZXlzIHRoYXQgY2FuIGJlIGFzc2lnbmVkIHRvIGlkZW50aXRpZXMgZm9yIGRlbGVnYXRpb25zIGFuZCBwZXJtaXNzaW9ucy5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGVudW0gSEZDQUlkZW50aXR5QXR0cmlidXRlcyB7XG4gIEhGUkVHSVNUUkFSUk9MRVMgPSBcImhmLlJlZ2lzdHJhci5Sb2xlc1wiLFxuICBIRlJFR0lTVFJBUkRFTEVHQVRFUk9MRVMgPSBcImhmLlJlZ2lzdHJhci5EZWxlZ2F0ZVJvbGVzXCIsXG4gIEhGUkVHSVNUUkFSQVRUUklCVVRFUyA9IFwiaGYuUmVnaXN0cmFyLkF0dHJpYnV0ZXNcIixcbiAgSEZJTlRFUk1FRElBVEVDQSA9IFwiaGYuSW50ZXJtZWRpYXRlQ0FcIixcbiAgSEZSRVZPS0VSID0gXCJoZi5SZXZva2VyXCIsXG4gIEhGQUZGSUxJQVRJT05NR1IgPSBcImhmLkFmZmlsaWF0aW9uTWdyXCIsXG4gIEhGR0VOQ1JMID0gXCJoZi5HZW5DUkxcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2VydmljZSB3cmFwcGVyIGZvciBpbnRlcmFjdGluZyB3aXRoIGEgRmFicmljIENBLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgaGlnaC1sZXZlbCBvcGVyYXRpb25zIGZvciBtYW5hZ2luZyBpZGVudGl0aWVzIGFnYWluc3QgYSBIeXBlcmxlZGdlciBGYWJyaWMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5LCBpbmNsdWRpbmcgcmVnaXN0cmF0aW9uLCBlbnJvbGxtZW50LCByZXZvY2F0aW9uLCBhbmQgYWRtaW5pc3RyYXRpdmUgcXVlcmllcy4gRW5jYXBzdWxhdGVzIGxvd2VyLWxldmVsIEZhYnJpYyBDQSBjbGllbnQgY2FsbHMgd2l0aCBjb25zaXN0ZW50IGxvZ2dpbmcgYW5kIGVycm9yIG1hcHBpbmcuXG4gKiBAcGFyYW0ge0NBQ29uZmlnfSBjYUNvbmZpZyAtIENvbm5lY3Rpb24gYW5kIFRMUyBjb25maWd1cmF0aW9uIGZvciB0aGUgdGFyZ2V0IENBLlxuICogQGNsYXNzIEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlXG4gKiBAZXhhbXBsZVxuICogLy8gUmVnaXN0ZXIgYW5kIGVucm9sbCBhIG5ldyB1c2VyXG4gKiBjb25zdCBzdmMgPSBuZXcgRmFicmljRW5yb2xsbWVudFNlcnZpY2Uoe1xuICogICB1cmw6ICdodHRwczovL2xvY2FsaG9zdDo3MDU0JyxcbiAqICAgY2FOYW1lOiAnT3JnMUNBJyxcbiAqICAgdGxzOiB7IHRydXN0ZWRSb290czogWycvcGF0aC90by9jYS5wZW0nXSwgdmVyaWZ5OiBmYWxzZSB9LFxuICogICBjYUNlcnQ6ICcvcGF0aC90by9hZG1pbi9jZXJ0RGlyJyxcbiAqICAgY2FLZXk6ICcvcGF0aC90by9hZG1pbi9rZXlEaXInXG4gKiB9KTtcbiAqIGF3YWl0IHN2Yy5yZWdpc3Rlcih7IHVzZXJOYW1lOiAnYWxpY2UnLCBwYXNzd29yZDogJ3MzY3IzdCcgfSwgZmFsc2UsICdvcmcxLmRlcGFydG1lbnQxJywgQ0FfUk9MRS5VU0VSKTtcbiAqIGNvbnN0IGlkID0gYXdhaXQgc3ZjLmVucm9sbCgnYWxpY2UnLCAnczNjcjN0Jyk7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIGF1dG9udW1iZXJcbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFN2YyBhcyBGYWJyaWNFbnJvbGxtZW50U2VydmljZVxuICogICBwYXJ0aWNpcGFudCBDQSBhcyBGYWJyaWMgQ0FcbiAqICAgQXBwLT4+U3ZjOiByZWdpc3RlcihjcmVkZW50aWFscywgLi4uKVxuICogICBTdmMtPj5DQTogcmVnaXN0ZXIocmVxdWVzdCwgYWRtaW5Vc2VyKVxuICogICBDQS0tPj5TdmM6IGVucm9sbG1lbnRTZWNyZXRcbiAqICAgU3ZjLS0+PkFwcDogc2VjcmV0XG4gKiAgIEFwcC0+PlN2YzogZW5yb2xsKGVucm9sbG1lbnRJZCwgc2VjcmV0KVxuICogICBTdmMtPj5DQTogZW5yb2xsKHtlbnJvbGxtZW50SUQsIHNlY3JldH0pXG4gKiAgIENBLS0+PlN2YzogY2VydGlmaWNhdGVzXG4gKiAgIFN2Yy0tPj5BcHA6IElkZW50aXR5XG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNFbnJvbGxtZW50U2VydmljZSBleHRlbmRzIExvZ2dlZENsYXNzIHtcbiAgcHJpdmF0ZSBjYT86IEZhYnJpY0NBU2VydmljZXM7XG5cbiAgcHJpdmF0ZSBjZXJ0aWZpY2F0ZVNlcnZpY2U/OiBhbnk7XG5cbiAgcHJpdmF0ZSBhZmZpbGlhdGlvblNlcnZpY2U/OiBBZmZpbGlhdGlvblNlcnZpY2U7XG5cbiAgcHJpdmF0ZSBpZGVudGl0eVNlcnZpY2U/OiBJZGVudGl0eVNlcnZpY2U7XG5cbiAgcHJpdmF0ZSBjbGllbnQ/OiBhbnk7XG5cbiAgcHJpdmF0ZSB1c2VyPzogVXNlcjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNhQ29uZmlnOiBDQUNvbmZpZykge1xuICAgIENvcmVVdGlscy5nZXRDcnlwdG9TdWl0ZShcbiAgICAgIGNhQ29uZmlnLmhzbVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHNvZnR3YXJlOiBmYWxzZSxcbiAgICAgICAgICAgIGxpYjogY2FDb25maWcuaHNtLmxpYnJhcnksXG4gICAgICAgICAgICBzbG90OiBjYUNvbmZpZy5oc20uc2xvdCxcbiAgICAgICAgICAgIGxhYmVsOiBjYUNvbmZpZy5oc20udG9rZW5MYWJlbCxcbiAgICAgICAgICAgIHBpbjogU3RyaW5nKGNhQ29uZmlnLmhzbS5waW4pLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICApO1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgVXNlcigpOiBQcm9taXNlPFVzZXI+IHtcbiAgICBpZiAodGhpcy51c2VyKSByZXR1cm4gdGhpcy51c2VyO1xuICAgIGNvbnN0IHsgY2FOYW1lLCBjYUNlcnQsIGNhS2V5LCB1cmwsIGhzbSB9ID0gdGhpcy5jYUNvbmZpZztcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5Vc2VyKTtcbiAgICBsb2cuZGVidWcoYENyZWF0aW5nIENBIHVzZXIgZm9yICR7Y2FOYW1lfSBhdCAke3VybH1gKTtcbiAgICBsb2cuZGVidWcoYFJldHJpZXZpbmcgQ0EgY2VydGlmaWNhdGUgZnJvbSAke2NhQ2VydH1gKTtcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGF3YWl0IENvcmVVdGlscy5nZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChjYUNlcnQpO1xuICAgIGxldCBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWhzbSkge1xuICAgICAgaWYgKCFjYUtleSkge1xuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTWlzc2luZyBjYUtleSBjb25maWd1cmF0aW9uIGZvciBDQSAke2NhTmFtZX0uIFByb3ZpZGUgYSBrZXkgZGlyZWN0b3J5IG9yIGNvbmZpZ3VyZSBIU00gc3VwcG9ydC5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFJldHJpZXZpbmcgQ0Ega2V5IGZyb20gJHtjYUtleX1gKTtcbiAgICAgIGtleSA9IGF3YWl0IENvcmVVdGlscy5nZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChjYUtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYFVzaW5nIEhTTSBjb25maWd1cmF0aW9uIGZvciBDQSAke2NhTmFtZX0gd2l0aCBsaWJyYXJ5ICR7aHNtLmxpYnJhcnl9YFxuICAgICAgKTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBMb2FkaW5nIEFkbWluIHVzZXIgZm9yIGNhICR7Y2FOYW1lfWApO1xuICAgIHRoaXMudXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoXCJhZG1pblwiLCBrZXksIGNlcnRpZmljYXRlLCBjYU5hbWUsIHtcbiAgICAgIGhzbSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy51c2VyO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIENBKCk6IFByb21pc2U8RmFicmljQ0FTZXJ2aWNlcz4ge1xuICAgIGlmICh0aGlzLmNhKSByZXR1cm4gdGhpcy5jYTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5DQSk7XG4gICAgY29uc3QgeyB1cmwsIHRscywgY2FOYW1lIH0gPSB0aGlzLmNhQ29uZmlnO1xuXG4gICAgLy8gRk9SIFNvbWUgUmVhc29uIHRoZSB2ZXJpZmljYXRpb24gZmFpbHMgbmVlZCB0byBpbnZlc3RpZ2F0ZSB0aGlzIHdvcmtzIGZvciBub3dcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgdHJ1c3RlZFJvb3RzLCB2ZXJpZnkgfSA9IHRscyBhcyBUTFNPcHRpb25zO1xuXG4gICAgY29uc3Qgcm9vdCA9ICh0cnVzdGVkUm9vdHMgYXMgc3RyaW5nW10pWzBdIGFzIHN0cmluZztcbiAgICBsb2cuZGVidWcoYFJldHJpZXZpbmcgQ0EgY2VydGlmaWNhdGUgZnJvbSAke3Jvb3R9LiBjd2Q6ICR7cHJvY2Vzcy5jd2QoKX1gKTtcblxuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpbGVDb250ZW50KHJvb3QpO1xuICAgIGxvZy5kZWJ1ZyhgQ3JlYXRpbmcgQ0EgQ2xpZW50IGZvciBDQSAke2NhTmFtZX0gdW5kZXIgJHt1cmx9YCk7XG4gICAgdGhpcy5jYSA9IG5ldyBGYWJyaWNDQVNlcnZpY2VzKFxuICAgICAgdXJsLFxuICAgICAge1xuICAgICAgICB0cnVzdGVkUm9vdHM6IEJ1ZmZlci5mcm9tKGNlcnRpZmljYXRlKSxcbiAgICAgICAgdmVyaWZ5LFxuICAgICAgfSBhcyBUTFNPcHRpb25zLFxuICAgICAgY2FOYW1lXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5jYTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBDbGllbnQoKTogUHJvbWlzZTx7IG5ld0NlcnRpZmljYXRlU2VydmljZTogYW55IH0+IHtcbiAgICBpZiAodGhpcy5jbGllbnQpIHJldHVybiB0aGlzLmNsaWVudDtcbiAgICBjb25zdCBjYSA9IGF3YWl0IHRoaXMuQ0EoKTtcbiAgICB0aGlzLmNsaWVudCA9IChjYSBhcyBhbnkpW1wiX0ZhYnJpY0NBU2VydmljZXNcIl07XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIENlcnRpZmljYXRlKCkge1xuICAgIGlmICghdGhpcy5jZXJ0aWZpY2F0ZVNlcnZpY2UpXG4gICAgICB0aGlzLmNlcnRpZmljYXRlU2VydmljZSA9IChhd2FpdCB0aGlzLkNsaWVudCgpKS5uZXdDZXJ0aWZpY2F0ZVNlcnZpY2UoKTtcbiAgICByZXR1cm4gdGhpcy5jZXJ0aWZpY2F0ZVNlcnZpY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgQWZmaWxpYXRpb25zKCkge1xuICAgIGlmICghdGhpcy5hZmZpbGlhdGlvblNlcnZpY2UpXG4gICAgICB0aGlzLmFmZmlsaWF0aW9uU2VydmljZSA9IChhd2FpdCB0aGlzLkNBKCkpLm5ld0FmZmlsaWF0aW9uU2VydmljZSgpO1xuICAgIHJldHVybiB0aGlzLmFmZmlsaWF0aW9uU2VydmljZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBJZGVudGl0aWVzKCkge1xuICAgIGlmICghdGhpcy5pZGVudGl0eVNlcnZpY2UpXG4gICAgICB0aGlzLmlkZW50aXR5U2VydmljZSA9IChhd2FpdCB0aGlzLkNBKCkpLm5ld0lkZW50aXR5U2VydmljZSgpO1xuICAgIHJldHVybiB0aGlzLmlkZW50aXR5U2VydmljZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmUgY2VydGlmaWNhdGVzIGZyb20gdGhlIENBLlxuICAgKiBAc3VtbWFyeSBDYWxscyB0aGUgQ0EgY2VydGlmaWNhdGUgc2VydmljZSB0byBsaXN0IGNlcnRpZmljYXRlcywgb3B0aW9uYWxseSBtYXBwaW5nIHRvIFBFTSBzdHJpbmdzIG9ubHkuXG4gICAqIEBwYXJhbSB7R2V0Q2VydGlmaWNhdGVzUmVxdWVzdH0gW3JlcXVlc3RdIC0gT3B0aW9uYWwgZmlsdGVyIHJlcXVlc3QgZm9yIGNlcnRpZmljYXRlIGxvb2t1cC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbZG9NYXA9dHJ1ZV0gLSBXaGVuIHRydWUsIHJldHVybnMgYXJyYXkgb2YgUEVNIHN0cmluZ3M7IG90aGVyd2lzZSByZXR1cm5zIGZ1bGwgcmVzcG9uc2Ugb2JqZWN0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZ1tdIHwgQ2VydGlmaWNhdGVSZXNwb25zZT59IEFycmF5IG9mIFBFTSBzdHJpbmdzIG9yIHRoZSBmdWxsIGNlcnRpZmljYXRlIHJlc3BvbnNlLlxuICAgKi9cbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzKFxuICAgIHJlcXVlc3Q/OiBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICAgIGRvTWFwID0gdHJ1ZVxuICApOiBQcm9taXNlPHN0cmluZ1tdIHwgQ2VydGlmaWNhdGVSZXNwb25zZT4ge1xuICAgIGNvbnN0IGNlcnRpZmljYXRlU2VydmljZSA9IGF3YWl0IHRoaXMuQ2VydGlmaWNhdGUoKTtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5Vc2VyKCk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0Q2VydGlmaWNhdGVzKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgUmV0cmlldmluZyBjZXJ0aWZpY2F0ZXMke3JlcXVlc3QgPyBgIGZvciAke3JlcXVlc3QuaWR9YCA6IFwiXCJ9IGZvciBDQSAke3RoaXMuY2FDb25maWcuY2FOYW1lfWBcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBDZXJ0aWZpY2F0ZVJlc3BvbnNlID0gKFxuICAgICAgYXdhaXQgY2VydGlmaWNhdGVTZXJ2aWNlLmdldENlcnRpZmljYXRlcyhyZXF1ZXN0IHx8IHt9LCB1c2VyKVxuICAgICkucmVzdWx0O1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBGb3VuZCAke3Jlc3BvbnNlLmNlcnRzLmxlbmd0aH0gY2VydGlmaWNhdGVzOiAke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlKX1gXG4gICAgKTtcbiAgICByZXR1cm4gZG9NYXAgPyByZXNwb25zZS5jZXJ0cy5tYXAoKGMpID0+IGMuUEVNKSA6IHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaXN0IGlkZW50aXRpZXMgcmVnaXN0ZXJlZCBpbiB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFF1ZXJpZXMgdGhlIENBIGlkZW50aXR5IHNlcnZpY2UgdG8gZmV0Y2ggYWxsIGlkZW50aXRpZXMgYW5kIHJldHVybnMgdGhlIGxpc3QgYXMgRmFicmljSWRlbnRpdHkgb2JqZWN0cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxGYWJyaWNJZGVudGl0eVtdPn0gVGhlIGxpc3Qgb2YgaWRlbnRpdGllcyByZWdpc3RlcmVkIGluIHRoZSBDQS5cbiAgICovXG4gIGFzeW5jIGdldElkZW50aXRpZXMoKTogUHJvbWlzZTxGYWJyaWNJZGVudGl0eVtdPiB7XG4gICAgY29uc3QgaWRlbnRpdGllc1NlcnZpY2UgPSBhd2FpdCB0aGlzLklkZW50aXRpZXMoKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRJZGVudGl0aWVzKTtcbiAgICBsb2cuZGVidWcoYFJldHJpZXZpbmcgSWRlbnRpdGllcyB1bmRlciBDQSAke3RoaXMuY2FDb25maWcuY2FOYW1lfWApO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBJZGVudGl0eVJlc3BvbnNlID0gKFxuICAgICAgYXdhaXQgaWRlbnRpdGllc1NlcnZpY2UuZ2V0QWxsKGF3YWl0IHRoaXMuVXNlcigpKVxuICAgICkucmVzdWx0O1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBGb3VuZCAke3Jlc3BvbnNlLmlkZW50aXRpZXMubGVuZ3RofSBJZGVudGl0aWVzOiAke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlKX1gXG4gICAgKTtcbiAgICByZXR1cm4gcmVzcG9uc2UuaWRlbnRpdGllcztcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUVycm9yKGU6IEVycm9yKSB7XG4gICAgY29uc3QgcmVnZXhwID0gLy4qY29kZTpcXHMoXFxkKykuKj9tZXNzYWdlOlxcc1tcIiddKC4rKVtcIiddL2dzO1xuICAgIGNvbnN0IG1hdGNoID0gcmVnZXhwLmV4ZWMoZS5tZXNzYWdlKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gbmV3IFJlZ2lzdHJhdGlvbkVycm9yKGUpO1xuICAgIGNvbnN0IFssIGNvZGUsIG1lc3NhZ2VdID0gbWF0Y2g7XG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICBjYXNlIFwiNzRcIjpcbiAgICAgIGNhc2UgXCI3MVwiOlxuICAgICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IobWVzc2FnZSk7XG4gICAgICBjYXNlIFwiMjBcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBBdXRob3JpemF0aW9uRXJyb3IobWVzc2FnZSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbmV3IFJlZ2lzdHJhdGlvbkVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmUgYWZmaWxpYXRpb25zIGZyb20gdGhlIENBLlxuICAgKiBAc3VtbWFyeSBRdWVyaWVzIHRoZSBDQSBmb3IgdGhlIGxpc3Qgb2YgYWZmaWxpYXRpb25zIGF2YWlsYWJsZSB1bmRlciB0aGUgY29uZmlndXJlZCBDQS5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgYWZmaWxpYXRpb25zIHJlc3VsdCBwYXlsb2FkLlxuICAgKi9cbiAgYXN5bmMgZ2V0QWZmaWxpYXRpb25zKCkge1xuICAgIGNvbnN0IGFmZmlsaWF0aW9uU2VydmljZSA9IGF3YWl0IHRoaXMuQWZmaWxpYXRpb25zKCk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0QWZmaWxpYXRpb25zKTtcbiAgICBsb2cuZGVidWcoYFJldHJpZXZpbmcgQWZmaWxpYXRpb25zIHVuZGVyIENBICR7dGhpcy5jYUNvbmZpZy5jYU5hbWV9YCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSAoYXdhaXQgYWZmaWxpYXRpb25TZXJ2aWNlLmdldEFsbChhd2FpdCB0aGlzLlVzZXIoKSkpXG4gICAgICAucmVzdWx0O1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBGb3VuZCAke3Jlc3BvbnNlLmEubGVuZ3RofSBBZmZpbGlhdGlvbnM6ICR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpfWBcbiAgICApO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZCBpZGVudGl0eSBkZXRhaWxzIGZyb20gdGhlIENBIGJ5IGVucm9sbG1lbnQgSUQuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhbmQgdmFsaWRhdGVzIGEgc2luZ2xlIGlkZW50aXR5LCB0aHJvd2luZyBOb3RGb3VuZEVycm9yIHdoZW4gbWlzc2luZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVucm9sbG1lbnRJZCAtIEVucm9sbG1lbnQgSUQgdG8gbG9va3VwLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEZhYnJpY0lkZW50aXR5Pn0gVGhlIGlkZW50aXR5IGRldGFpbHMgc3RvcmVkIGluIHRoZSBDQS5cbiAgICovXG4gIGFzeW5jIHJlYWQoZW5yb2xsbWVudElkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjYSA9IGF3YWl0IHRoaXMuQ0EoKTtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5Vc2VyKCk7XG4gICAgbGV0IHJlc3VsdDogSVNlcnZpY2VSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgY2EubmV3SWRlbnRpdHlTZXJ2aWNlKCkuZ2V0T25lKGVucm9sbG1lbnRJZCwgdXNlcik7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkbid0IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXN1bHQuc3VjY2VzcylcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGRuJ3QgZmluZCBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke3Jlc3VsdC5lcnJvcnMuam9pbihcIlxcblwiKX1gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQgYXMgRmFicmljSWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGEgbmV3IGlkZW50aXR5IHdpdGggdGhlIENBLlxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgcmVnaXN0cmF0aW9uIHJlcXVlc3QgZm9yIGEgbmV3IGVucm9sbG1lbnQgSUQsIHJldHVybmluZyB0aGUgZW5yb2xsbWVudCBzZWNyZXQgdXBvbiBzdWNjZXNzLlxuICAgKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBtb2RlbCAtIENyZWRlbnRpYWxzIGNvbnRhaW5pbmcgdXNlck5hbWUgYW5kIHBhc3N3b3JkIGZvciB0aGUgbmV3IGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N1cGVyVXNlcj1mYWxzZV0gLSBXaGV0aGVyIHRvIHJlZ2lzdGVyIHRoZSBpZGVudGl0eSBhcyBhIHN1cGVyIHVzZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWZmaWxpYXRpb249XCJcIl0gLSBBZmZpbGlhdGlvbiBzdHJpbmcgKGUuZy4sIG9yZzEuZGVwYXJ0bWVudDEpLlxuICAgKiBAcGFyYW0ge0NBX1JPTEUgfCBzdHJpbmd9IFt1c2VyUm9sZV0gLSBSb2xlIHRvIGFzc2lnbiB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7SUtleVZhbHVlQXR0cmlidXRlfSBbYXR0cnNdIC0gT3B0aW9uYWwgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW21heEVucm9sbG1lbnRzXSAtIE1heGltdW0gbnVtYmVyIG9mIGVucm9sbG1lbnRzIGFsbG93ZWQgZm9yIHRoZSBpZGVudGl0eS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSBUaGUgZW5yb2xsbWVudCBzZWNyZXQgZm9yIHRoZSByZWdpc3RlcmVkIGlkZW50aXR5LlxuICAgKi9cbiAgYXN5bmMgcmVnaXN0ZXIoXG4gICAgbW9kZWw6IENyZWRlbnRpYWxzLFxuICAgIGlzU3VwZXJVc2VyOiBib29sZWFuID0gZmFsc2UsXG4gICAgYWZmaWxpYXRpb246IHN0cmluZyA9IFwiXCIsXG4gICAgdXNlclJvbGU/OiBDQV9ST0xFIHwgc3RyaW5nLFxuICAgIGF0dHJzPzogSUtleVZhbHVlQXR0cmlidXRlLFxuICAgIG1heEVucm9sbG1lbnRzPzogbnVtYmVyXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IHJlZ2lzdHJhdGlvbjogc3RyaW5nO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJlZ2lzdGVyKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyB1c2VyTmFtZSwgcGFzc3dvcmQgfSA9IG1vZGVsO1xuICAgICAgY29uc3QgY2EgPSBhd2FpdCB0aGlzLkNBKCk7XG4gICAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5Vc2VyKCk7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgZW5yb2xsbWVudElEOiB1c2VyTmFtZSBhcyBzdHJpbmcsXG4gICAgICAgIGVucm9sbG1lbnRTZWNyZXQ6IHBhc3N3b3JkLFxuICAgICAgICBhZmZpbGlhdGlvbjogYWZmaWxpYXRpb24sXG4gICAgICAgIHVzZXJSb2xlOiB1c2VyUm9sZSxcbiAgICAgICAgYXR0cnM6IGF0dHJzLFxuICAgICAgICBtYXhFbnJvbGxtZW50czogbWF4RW5yb2xsbWVudHMsXG4gICAgICB9IGFzIElSZWdpc3RlclJlcXVlc3Q7XG4gICAgICByZWdpc3RyYXRpb24gPSBhd2FpdCBjYS5yZWdpc3Rlcihwcm9wcywgdXNlcik7XG4gICAgICBsb2cuaW5mbyhcbiAgICAgICAgYFJlZ2lzdHJhdGlvbiBmb3IgJHt1c2VyTmFtZX0gY3JlYXRlZCB3aXRoIHVzZXIgdHlwZSAke3VzZXJSb2xlID8/IFwiVW5kZWZpbmVkIFJvbGVcIn0gJHtpc1N1cGVyVXNlciA/IFwiYXMgc3VwZXIgdXNlclwiIDogXCJcIn1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVnaXN0cmF0aW9uO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBpZGVudGl0eUZyb21FbnJvbGxtZW50KFxuICAgIGVucm9sbG1lbnQ6IElFbnJvbGxSZXNwb25zZSxcbiAgICBtc3BJZDogc3RyaW5nXG4gICk6IElkZW50aXR5IHtcbiAgICBjb25zdCB7IGNlcnRpZmljYXRlLCBrZXksIHJvb3RDZXJ0aWZpY2F0ZSB9ID0gZW5yb2xsbWVudDtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcihGYWJyaWNFbnJvbGxtZW50U2VydmljZSwge30pLmZvcihcbiAgICAgIHRoaXMuaWRlbnRpdHlGcm9tRW5yb2xsbWVudFxuICAgICk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEdlbmVyYXRpbmcgSWRlbnRpdHkgZnJvbSBjZXJ0aWZpY2F0ZSAke2NlcnRpZmljYXRlfSBpbiBtc3AgJHttc3BJZH1gXG4gICAgKTtcbiAgICBjb25zdCBjbGllbnRJZCA9IENyeXB0b1V0aWxzLmZhYnJpY0lkRnJvbUNlcnRpZmljYXRlKGNlcnRpZmljYXRlKTtcbiAgICBjb25zdCBpZCA9IENyeXB0b1V0aWxzLmVuY29kZShjbGllbnRJZCk7XG4gICAgbG9nLmRlYnVnKGBJZGVudGl0eSAke2NsaWVudElkfSBhbmQgZW5jb2RlZElkICR7aWR9YCk7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5KHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgY2VydGlmaWNhdGU6IGNlcnRpZmljYXRlLFxuICAgICAgICBwcml2YXRlS2V5OiBrZXkudG9CeXRlcygpLFxuICAgICAgICByb290Q2VydGlmaWNhdGU6IHJvb3RDZXJ0aWZpY2F0ZSxcbiAgICAgICAgY3JlYXRlZE9uOiBub3csXG4gICAgICAgIHVwZGF0ZWRPbjogbm93LFxuICAgICAgfSxcbiAgICAgIG1zcElkOiBtc3BJZCxcbiAgICAgIGNyZWF0ZWRPbjogbm93LFxuICAgICAgdXBkYXRlZE9uOiBub3csXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVucm9sbCBhbiBpZGVudGl0eSB3aXRoIHRoZSBDQSB1c2luZyBhIHJlZ2lzdHJhdGlvbiBzZWNyZXQuXG4gICAqIEBzdW1tYXJ5IEV4Y2hhbmdlcyB0aGUgZW5yb2xsbWVudCBJRCBhbmQgc2VjcmV0IGZvciBjZXJ0aWZpY2F0ZXMsIHJldHVybmluZyBhIGNvbnN0cnVjdGVkIElkZW50aXR5IG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBlbnJvbGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb24gLSBFbnJvbGxtZW50IHNlY3JldCByZXR1cm5lZCBhdCByZWdpc3RyYXRpb24gdGltZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBlbnJvbGxlZCBpZGVudGl0eSBvYmplY3Qgd2l0aCBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIGVucm9sbChlbnJvbGxtZW50SWQ6IHN0cmluZywgcmVnaXN0cmF0aW9uOiBzdHJpbmcpIHtcbiAgICBsZXQgaWRlbnRpdHk6IElkZW50aXR5O1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmVucm9sbCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgICAgbG9nLmRlYnVnKGBFbnJvbGxpbmcgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgICBjb25zdCBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UgPSBhd2FpdCBjYS5lbnJvbGwoe1xuICAgICAgICBlbnJvbGxtZW50SUQ6IGVucm9sbG1lbnRJZCxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcmVnaXN0cmF0aW9uLFxuICAgICAgfSk7XG4gICAgICBpZGVudGl0eSA9IEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlLmlkZW50aXR5RnJvbUVucm9sbG1lbnQoXG4gICAgICAgIGVucm9sbG1lbnQsXG4gICAgICAgIHRoaXMuY2FDb25maWcuY2FOYW1lXG4gICAgICApO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBTdWNjZXNzZnVsbHkgZW5yb2xsZWQgJHtlbnJvbGxtZW50SWR9IHVuZGVyICR7dGhpcy5jYUNvbmZpZy5jYU5hbWV9IGFzICR7aWRlbnRpdHkuaWR9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkZW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhbmQgZW5yb2xsIGEgbmV3IGlkZW50aXR5IGluIG9uZSBzdGVwLlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgYSBuZXcgZW5yb2xsbWVudCBJRCB3aXRoIHRoZSBDQSBhbmQgaW1tZWRpYXRlbHkgZXhjaGFuZ2VzIHRoZSBzZWNyZXQgdG8gZW5yb2xsLCByZXR1cm5pbmcgdGhlIGNyZWF0ZWQgSWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IG1vZGVsIC0gQ3JlZGVudGlhbHMgZm9yIHRoZSBuZXcgaWRlbnRpdHkgY29udGFpbmluZyB1c2VyTmFtZSBhbmQgcGFzc3dvcmQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3VwZXJVc2VyPWZhbHNlXSAtIFdoZXRoZXIgdG8gcmVnaXN0ZXIgdGhlIGlkZW50aXR5IGFzIGEgc3VwZXIgdXNlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthZmZpbGlhdGlvbj1cIlwiXSAtIEFmZmlsaWF0aW9uIHN0cmluZyAoZS5nLiwgb3JnMS5kZXBhcnRtZW50MSkuXG4gICAqIEBwYXJhbSB7Q0FfUk9MRSB8IHN0cmluZ30gW3VzZXJSb2xlXSAtIFJvbGUgdG8gYXNzaWduIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtJS2V5VmFsdWVBdHRyaWJ1dGV9IFthdHRyc10gLSBPcHRpb25hbCBhdHRyaWJ1dGVzIHRvIGF0dGFjaCB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4RW5yb2xsbWVudHNdIC0gTWF4aW11bSBudW1iZXIgb2YgZW5yb2xsbWVudHMgYWxsb3dlZCBmb3IgdGhlIGlkZW50aXR5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPElkZW50aXR5Pn0gVGhlIGVucm9sbGVkIGlkZW50aXR5LlxuICAgKi9cbiAgYXN5bmMgcmVnaXN0ZXJBbmRFbnJvbGwoXG4gICAgbW9kZWw6IENyZWRlbnRpYWxzLFxuICAgIGlzU3VwZXJVc2VyOiBib29sZWFuID0gZmFsc2UsXG4gICAgYWZmaWxpYXRpb246IHN0cmluZyA9IFwiXCIsXG4gICAgdXNlclJvbGU/OiBDQV9ST0xFIHwgc3RyaW5nLFxuICAgIGF0dHJzPzogSUtleVZhbHVlQXR0cmlidXRlLFxuICAgIG1heEVucm9sbG1lbnRzPzogbnVtYmVyXG4gICk6IFByb21pc2U8SWRlbnRpdHk+IHtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSBhd2FpdCB0aGlzLnJlZ2lzdGVyKFxuICAgICAgbW9kZWwsXG4gICAgICBpc1N1cGVyVXNlcixcbiAgICAgIGFmZmlsaWF0aW9uLFxuICAgICAgdXNlclJvbGUsXG4gICAgICBhdHRycyxcbiAgICAgIG1heEVucm9sbG1lbnRzXG4gICAgKTtcbiAgICBjb25zdCB7IHVzZXJOYW1lIH0gPSBtb2RlbDtcbiAgICByZXR1cm4gdGhpcy5lbnJvbGwodXNlck5hbWUgYXMgc3RyaW5nLCByZWdpc3RyYXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldm9rZXMgdGhlIGVucm9sbG1lbnQgb2YgYW4gaWRlbnRpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIGVucm9sbG1lbnQgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBlbnJvbGxtZW50SWQgLSBUaGUgZW5yb2xsbWVudCBJRCBvZiB0aGUgaWRlbnRpdHkgdG8gYmUgcmV2b2tlZC5cbiAgICpcbiAgICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlc3VsdCBvZiB0aGUgcmV2b2NhdGlvbiBvcGVyYXRpb24uXG4gICAqXG4gICAqIEB0aHJvd3Mge05vdEZvdW5kRXJyb3J9IElmIHRoZSBlbnJvbGxtZW50IHdpdGggdGhlIHNwZWNpZmllZCBJRCBkb2VzIG5vdCBleGlzdC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlcmUgaXMgYW4gZXJyb3IgZHVyaW5nIHRoZSByZXZvY2F0aW9uIHByb2Nlc3MuXG4gICAqL1xuICBhc3luYyByZXZva2UoZW5yb2xsbWVudElkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjYSA9IGF3YWl0IHRoaXMuQ0EoKTtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5Vc2VyKCk7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBhd2FpdCB0aGlzLnJlYWQoZW5yb2xsbWVudElkKTtcbiAgICBpZiAoIWlkZW50aXR5KVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgZmluZCBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9YFxuICAgICAgKTtcbiAgICBsZXQgcmVzdWx0OiBJU2VydmljZVJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBjYS5yZXZva2UoXG4gICAgICAgIHsgZW5yb2xsbWVudElEOiBpZGVudGl0eS5pZCwgcmVhc29uOiBcIlVzZXIgRGVsZXRhdGlvblwiIH0sXG4gICAgICAgIHVzZXJcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgcmV2b2tlIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgcmV2b2tlIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7cmVzdWx0LmVycm9ycy5qb2luKFwiXFxuXCIpfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSVJlZ2lzdGVyUmVxdWVzdCwgSUtleVZhbHVlQXR0cmlidXRlIH0gZnJvbSBcImZhYnJpYy1jYS1jbGllbnRcIjtcbmltcG9ydCB7IENBX1JPTEUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIG1pbixcbiAgbWlubGVuZ3RoLFxuICBNb2RlbCxcbiAgcmVxdWlyZWQsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVnaXN0cmF0aW9uUmVxdWVzdEJ1aWxkZXIgZXh0ZW5kcyBNb2RlbCB7XG4gIEByZXF1aXJlZCgpXG4gIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiO1xuICBAbWlubGVuZ3RoKDEpXG4gIGF0dHJzPzogSUtleVZhbHVlQXR0cmlidXRlW107XG4gIEByZXF1aXJlZCgpXG4gIGVucm9sbG1lbnRJRCE6IHN0cmluZztcbiAgQHJlcXVpcmVkKClcbiAgZW5yb2xsbWVudFNlY3JldCE6IHN0cmluZztcbiAgQG1pbigwKVxuICBtYXhFbnJvbGxtZW50cz86IG51bWJlcjtcbiAgQHJlcXVpcmVkKClcbiAgcm9sZSE6IHN0cmluZztcblxuICBidWlsZCgpOiBJUmVnaXN0ZXJSZXF1ZXN0IHtcbiAgICBjb25zdCBlcnJzID0gdGhpcy5oYXNFcnJvcnMoKTtcbiAgICBpZiAoZXJycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJzLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBJUmVnaXN0ZXJSZXF1ZXN0ID0ge1xuICAgICAgZW5yb2xsbWVudElEOiB0aGlzLmVucm9sbG1lbnRJRCxcbiAgICAgIGVucm9sbG1lbnRTZWNyZXQ6IHRoaXMuZW5yb2xsbWVudFNlY3JldCxcbiAgICAgIHJvbGU6IHRoaXMucm9sZSxcbiAgICAgIGFmZmlsaWF0aW9uOiB0aGlzLmFmZmlsaWF0aW9uLFxuICAgIH07XG4gICAgaWYgKHR5cGVvZiB0aGlzLm1heEVucm9sbG1lbnRzICE9PSBcInVuZGVmaW5lZFwiKVxuICAgICAgcmVzcG9uc2UubWF4RW5yb2xsbWVudHMgPSB0aGlzLm1heEVucm9sbG1lbnRzO1xuICAgIGlmICh0aGlzLmF0dHJzKSByZXNwb25zZS5hdHRycyA9IHRoaXMuYXR0cnM7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgc2V0QWZmaWxpYXRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuYWZmaWxpYXRpb24gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZEF0dHIoYXR0cjogSUtleVZhbHVlQXR0cmlidXRlKSB7XG4gICAgdGhpcy5hdHRycyA9IHRoaXMuYXR0cnMgfHwgW107XG4gICAgdGhpcy5hdHRycy5wdXNoKGF0dHIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0QXR0cnModmFsdWU6IElLZXlWYWx1ZUF0dHJpYnV0ZVtdKSB7XG4gICAgdGhpcy5hdHRycyA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RW5yb2xsbWVudElEKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVucm9sbG1lbnRJRCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RW5yb2xsbWVudFNlY3JldCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5lbnJvbGxtZW50U2VjcmV0ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRNYXhFbnJvbGxtZW50cyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5tYXhFbnJvbGxtZW50cyA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Um9sZSh2YWx1ZTogQ0FfUk9MRSB8IHN0cmluZykge1xuICAgIHRoaXMucm9sZSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iLCIvKipcbiAqIEVudW0gcmVwcmVzZW50aW5nIHRoZSBldmVudHMgZW1pdHRlZCBieSBhbiBFUkMyMCBjb250cmFjdC5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhpcyBlbnVtIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHNwZWNpZmljIGV2ZW50cyB0aGF0IGNhbiBiZSBlbWl0dGVkIGJ5IGFuIEVSQzIwIGNvbnRyYWN0LlxuICogVGhlIGV2ZW50cyBhcmUgbmFtZWQgYWNjb3JkaW5nIHRvIHRoZSBFSVAtMjAgc3RhbmRhcmQuXG4gKi9cbmV4cG9ydCBlbnVtIEVSQzIwRXZlbnRzIHtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGB0cmFuc2ZlcmAgZnVuY3Rpb24gaXMgY2FsbGVkIHN1Y2Nlc3NmdWxseS5cbiAgICpcbiAgICogQHBhcmFtIGZyb20gLSBUaGUgYWRkcmVzcyBvZiB0aGUgc2VuZGVyLlxuICAgKiBAcGFyYW0gdG8gLSBUaGUgYWRkcmVzcyBvZiB0aGUgcmVjaXBpZW50LlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgYW1vdW50IG9mIHRva2VucyB0cmFuc2ZlcnJlZC5cbiAgICovXG4gIFRSQU5TRkVSID0gXCJUcmFuc2ZlclwiLFxuXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYW4gYGFwcHJvdmVgIGZ1bmN0aW9uIGlzIGNhbGxlZCBzdWNjZXNzZnVsbHkuXG4gICAqXG4gICAqIEBwYXJhbSBvd25lciAtIFRoZSBhZGRyZXNzIG9mIHRoZSB0b2tlbiBvd25lci5cbiAgICogQHBhcmFtIHNwZW5kZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgYXBwcm92ZWQgc3BlbmRlci5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgYXBwcm92ZWQgZm9yIHRoZSBzcGVuZGVyLlxuICAgKi9cbiAgQVBQUk9WQUwgPSBcIkFwcHJvdmFsXCIsXG59XG4iLCJpbXBvcnQgeyBNb2RlbCwgdHlwZSBNb2RlbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCB1cGRhdGVkQXQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IGRlc2NyaXB0aW9uLCB1c2VzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGF2b3VyIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5AdXNlcyhGYWJyaWNGbGF2b3VyKVxuZXhwb3J0IGNsYXNzIEZhYnJpY0Jhc2VNb2RlbCBleHRlbmRzIE1vZGVsIHtcbiAgQGRlc2NyaXB0aW9uKFwiU3RvcmVzIHRoZSBvcmlnaW5hbCB0aW1lc3RhbXAgb2YgY3JlYXRpb25cIilcbiAgQGNvbHVtbigpXG4gIEBjcmVhdGVkQXQoKVxuICBjcmVhdGVkQXQhOiBEYXRlO1xuXG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgdGltZXN0YW1wIG9mIHRoZSBsYXN0IHVwZGF0ZVwiKVxuICBAY29sdW1uKClcbiAgQHVwZGF0ZWRBdCgpXG4gIHVwZGF0ZWRBdCE6IERhdGU7XG5cbiAgQGRlc2NyaXB0aW9uKFwiU3RvcmVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBtb2RlbFwiKVxuICBAY29sdW1uKClcbiAgQHZlcnNpb24oKVxuICB2ZXJzaW9uITogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGFyZz86IE1vZGVsQXJnPEZhYnJpY0Jhc2VNb2RlbD4pIHtcbiAgICBzdXBlcihhcmcpO1xuICB9XG59XG4iLCJpbXBvcnQgeyB0eXBlIE1vZGVsQXJnIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQnksIHVwZGF0ZWRCeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgZGVzY3JpcHRpb24sIHVzZXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0ZsYXZvdXIgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBGYWJyaWNCYXNlTW9kZWwgfSBmcm9tIFwiLi9GYWJyaWNCYXNlTW9kZWxcIjtcblxuQHVzZXMoRmFicmljRmxhdm91cilcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsIGV4dGVuZHMgRmFicmljQmFzZU1vZGVsIHtcbiAgQGRlc2NyaXB0aW9uKFwiU3RvcmVzIHRoZSBjcmVhdG9yXCIpXG4gIEBjb2x1bW4oKVxuICBAY3JlYXRlZEJ5KClcbiAgY3JlYXRlZEJ5ITogc3RyaW5nO1xuXG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgdXNlciB0aGF0IGxhc3QgdXBkYXRlZCB0aGUgbW9kZWxcIilcbiAgQGNvbHVtbigpXG4gIEB1cGRhdGVkQnkoKVxuICB1cGRhdGVkQnkhOiBzdHJpbmc7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGFyZz86IE1vZGVsQXJnPEZhYnJpY0lkZW50aWZpZWRCYXNlTW9kZWw+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY01vZGVsS2V5cyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFNlZ3JlZ2F0ZWRNb2RlbCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgREJLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb2xsZWN0aW9uUmVzb2x2ZXIsIE1pcnJvck1ldGFkYXRhIH0gZnJvbSBcIi4uL2RlY29yYXRvcnNcIjtcblxuTW9kZWwucHJvdG90eXBlLmlzU2hhcmVkID0gZnVuY3Rpb24gaXNTaGFyZWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogTVxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBNb2RlbC5pc1NoYXJlZCh0aGlzLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KTtcbn07XG5cbk1vZGVsLnByb3RvdHlwZS5pc1ByaXZhdGUgPSBmdW5jdGlvbiBpc1ByaXZhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogTVxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBNb2RlbC5pc1ByaXZhdGUodGhpcy5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPik7XG59O1xuXG5Nb2RlbC5wcm90b3R5cGUuc2VncmVnYXRlID0gZnVuY3Rpb24gc2VncmVnYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IE1cbik6IFNlZ3JlZ2F0ZWRNb2RlbDxNPiB7XG4gIHJldHVybiBNb2RlbC5zZWdyZWdhdGUodGhpcyk7XG59O1xuXG4oTW9kZWwgYXMgYW55KS5zZWdyZWdhdGUgPSBmdW5jdGlvbiBzZWdyZWdhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE1cbik6IFNlZ3JlZ2F0ZWRNb2RlbDxNPiB7XG4gIGlmICghTW9kZWwuaXNUcmFuc2llbnQobW9kZWwpKSByZXR1cm4geyBtb2RlbDogbW9kZWwgfTtcbiAgY29uc3QgZGVjb3JhdGVkUHJvcGVydGllcyA9XG4gICAgTWV0YWRhdGEuZ2V0QXR0cmlidXRlcyhtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIHx8IFtdO1xuXG4gIGNvbnN0IHRyYW5zaWVudFByb3BzID0gTWV0YWRhdGEuZ2V0KFxuICAgIG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSxcbiAgICBEQktleXMuVFJBTlNJRU5UXG4gICk7XG4gIGNvbnN0IHByaXZhdGVQcm9wZXJ0aWVzID0gTWV0YWRhdGEuZ2V0KFxuICAgIG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSxcbiAgICBGYWJyaWNNb2RlbEtleXMuUFJJVkFURVxuICApO1xuICBjb25zdCBzaGFyZWRQcm9wZXJ0aWVzID0gTWV0YWRhdGEuZ2V0KFxuICAgIG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSxcbiAgICBGYWJyaWNNb2RlbEtleXMuU0hBUkVEXG4gICk7XG5cbiAgY29uc3QgcmVzdWx0OiBTZWdyZWdhdGVkTW9kZWw8TT4gPSB7XG4gICAgbW9kZWw6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICAgIHB1YmxpYzoge30gYXMgUmVjb3JkPGtleW9mIE0sIGFueT4sXG4gICAgdHJhbnNpZW50OiB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PixcbiAgICBwcml2YXRlczoge30gYXMgUmVjb3JkPGtleW9mIE0sIGFueT4sXG4gICAgc2hhcmVkOiB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PixcbiAgfTtcblxuICBjb25zdCB0cmFuc2llbnRLZXlzID0gT2JqZWN0LmtleXModHJhbnNpZW50UHJvcHMgfHwge30pO1xuICBjb25zdCBwcml2YXRlS2V5cyA9IE9iamVjdC5rZXlzKHByaXZhdGVQcm9wZXJ0aWVzIHx8IHt9KTtcbiAgY29uc3Qgc2hhcmVkS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZFByb3BlcnRpZXMgfHwge30pO1xuXG4gIC8vIGNvbnN0IHBrS2V5ID0gTW9kZWwucGsobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVjb3JhdGVkUHJvcGVydGllcykge1xuICAgIGNvbnN0IHZhbHVlID0gbW9kZWxba2V5IGFzIGtleW9mIE1dO1xuICAgIGNvbnN0IGlzVHJhbnNpZW50ID0gdHJhbnNpZW50S2V5cy5pbmNsdWRlcyhrZXkpO1xuICAgIGNvbnN0IGlzUHVibGljID0gIWlzVHJhbnNpZW50O1xuICAgIGNvbnN0IGlzUHJpdmF0ZSA9IHByaXZhdGVLZXlzLmluY2x1ZGVzKGtleSk7XG4gICAgY29uc3QgaXNTaGFyZWQgPSBzaGFyZWRLZXlzLmluY2x1ZGVzKGtleSk7XG4gICAgLy8gY29uc3QgaXNQcmltYXJ5S2V5ID0ga2V5ID09PSBwa0tleTtcblxuICAgIGlmIChpc1RyYW5zaWVudCB8fCBpc1ByaXZhdGUgfHwgaXNTaGFyZWQpIHtcbiAgICAgIHJlc3VsdC50cmFuc2llbnQgPSByZXN1bHQudHJhbnNpZW50IHx8ICh7fSBhcyBhbnkpO1xuICAgICAgKHJlc3VsdC50cmFuc2llbnQgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIGlmIChpc1ByaXZhdGUpIHtcbiAgICAgIHJlc3VsdC5wcml2YXRlcyA9IHJlc3VsdC5wcml2YXRlcyB8fCAoe30gYXMgYW55KTtcbiAgICAgIChyZXN1bHQucHJpdmF0ZXMgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIGlmIChpc1NoYXJlZCkge1xuICAgICAgcmVzdWx0LnNoYXJlZCA9IHJlc3VsdC5zaGFyZWQgfHwgKHt9IGFzIGFueSk7XG4gICAgICAocmVzdWx0LnNoYXJlZCBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzUHVibGljKSB7XG4gICAgICByZXN1bHQucHVibGljID0gKHJlc3VsdC5wdWJsaWMgfHwge30pIGFzIGFueTtcbiAgICAgIChyZXN1bHQucHVibGljIGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJlc3VsdC5tb2RlbCA9IE1vZGVsLmJ1aWxkKHJlc3VsdC5wdWJsaWMsIG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUpO1xuICByZXR1cm4gcmVzdWx0IGFzIFNlZ3JlZ2F0ZWRNb2RlbDxNPjtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLmlzUHJpdmF0ZSA9IGZ1bmN0aW9uIGlzUHJpdmF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+XG4pOiBib29sZWFuIHtcbiAgcmV0dXJuICEhTWV0YWRhdGEuZ2V0KFxuICAgIHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSkgOiBtb2RlbCxcbiAgICBGYWJyaWNNb2RlbEtleXMuUFJJVkFURVxuICApO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkuaXNTaGFyZWQgPSBmdW5jdGlvbiBpc1NoYXJlZDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+XG4pOiBib29sZWFuIHtcbiAgcmV0dXJuICEhTWV0YWRhdGEuZ2V0KFxuICAgIHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSkgOiBtb2RlbCxcbiAgICBGYWJyaWNNb2RlbEtleXMuU0hBUkVEXG4gICk7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5taXJyb3JlZCA9IGZ1bmN0aW9uIG1pcnJvcmVkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gTWV0YWRhdGEuZ2V0KFxuICAgIHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSkgOiBtb2RlbCxcbiAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk1JUlJPUilcbiAgKTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLm93bmVyT2YgPSBmdW5jdGlvbiBvd25lck9mPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBtZXRhID0gTWV0YWRhdGEuZ2V0KFxuICAgIG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSxcbiAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk9XTkVEX0JZKVxuICApO1xuICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBtb2RlbFttZXRhIGFzIGtleW9mIE1dIGFzIHN0cmluZztcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLm1pcnJvcmVkQXQgPSBmdW5jdGlvbiBtaXJyb3JlZEF0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IE1pcnJvck1ldGFkYXRhIHwgdW5kZWZpbmVkIHtcbiAgbW9kZWwgPSB0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IChtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIDogbW9kZWw7XG4gIHJldHVybiBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwgYXMgYW55LFxuICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuTUlSUk9SKVxuICApO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkuY29sbGVjdGlvbnNGb3IgPSBmdW5jdGlvbiBjb2xsZWN0aW9uc0ZvcjxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+XG4pOiB7XG4gIHByaXZhdGVDb2xzOiAoc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKVtdO1xuICBzaGFyZWRDb2xzOiAoc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKVtdO1xufSB7XG4gIGNvbnN0IHByaXZhdGVLZXlzOiBzdHJpbmdbXSA9IFtGYWJyaWNNb2RlbEtleXMuUFJJVkFURV0gYXMgc3RyaW5nW107XG4gIGNvbnN0IHNoYXJlZEtleXM6IHN0cmluZ1tdID0gW0ZhYnJpY01vZGVsS2V5cy5TSEFSRURdIGFzIHN0cmluZ1tdO1xuXG4gIGNvbnN0IHByaXZhdGVLZXkgPSBNZXRhZGF0YS5rZXkoLi4ucHJpdmF0ZUtleXMpO1xuICBjb25zdCBzaGFyZWRLZXkgPSBNZXRhZGF0YS5rZXkoLi4uc2hhcmVkS2V5cyk7XG5cbiAgY29uc3QgY29uc3RyID0gdHlwZW9mIG1vZGVsID09PSBcImZ1bmN0aW9uXCIgPyBtb2RlbCA6IG1vZGVsLmNvbnN0cnVjdG9yO1xuXG4gIGNvbnN0IHByaXZhdGVNZXRhOiB7IGNvbGxlY3Rpb25zOiBzdHJpbmdbXSB9ID0gTWV0YWRhdGEuZ2V0KFxuICAgIGNvbnN0ciBhcyBhbnksXG4gICAgcHJpdmF0ZUtleVxuICApO1xuICBjb25zdCBzaGFyZWRNZXRhOiB7IGNvbGxlY3Rpb25zOiBzdHJpbmdbXSB9ID0gTWV0YWRhdGEuZ2V0KFxuICAgIGNvbnN0ciBhcyBhbnksXG4gICAgc2hhcmVkS2V5XG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBwcml2YXRlQ29sczogcHJpdmF0ZU1ldGE/LmNvbGxlY3Rpb25zIHx8IFtdLFxuICAgIHNoYXJlZENvbHM6IHNoYXJlZE1ldGE/LmNvbGxlY3Rpb25zIHx8IFtdLFxuICB9O1xufS5iaW5kKE1vZGVsKTtcbiIsImltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgUmVwbyxcbiAgQ29udGV4dCxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbiAgUmVwb3NpdG9yeSxcbiAgQ29udGV4dE9mLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIGdlbmVyYXRlZCxcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgb25DcmVhdGUsXG4gIG9uRGVsZXRlLFxuICBvblJlYWQsXG4gIG9uVXBkYXRlLFxuICByZWFkb25seSxcbiAgdHJhbnNpZW50LFxuICBWYWxpZGF0aW9uRXJyb3IsXG4gIERCS2V5cyxcbiAgREJPcGVyYXRpb25zLFxuICBvbixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbCwgcmVxdWlyZWQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNNb2RlbEtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHsgQ29udGV4dCBhcyBITENvbnRleHQgfSBmcm9tIFwiZmFicmljLWNvbnRyYWN0LWFwaVwiO1xuaW1wb3J0IHsgQ2xpZW50SWRlbnRpdHkgfSBmcm9tIFwiZmFicmljLXNoaW0tYXBpXCI7XG5pbXBvcnQgeyBGYWJyaWNFUkMyMENvbnRyYWN0IH0gZnJvbSBcIi4uL2NvbnRyYWN0cy9lcmMyMC9lcmMyMGNvbnRyYWN0XCI7XG5pbXBvcnQge1xuICBhcHBseSxcbiAgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIG1ldGFkYXRhLFxuICBNZXRhZGF0YSxcbiAgcHJvcCxcbiAgcHJvcE1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0ZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IHRvUGFzY2FsQ2FzZSB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgRmFicmljQ29udHJhY3RGbGFncyB9IGZyb20gXCIuLi9jb250cmFjdHMvdHlwZXNcIjtcbmltcG9ydCBcIi4uL3NoYXJlZC9vdmVycmlkZXNcIjtcbmltcG9ydCB7IHR5cGUgRmFicmljQ29udHJhY3RDb250ZXh0IH0gZnJvbSBcIi4uL2NvbnRyYWN0cy9Db250cmFjdENvbnRleHRcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXh0cmFjdHMgdGhlIE1TUCBJRCBmcm9tIGVpdGhlciBhIHN0cmluZyBvciBDbGllbnRJZGVudGl0eSBvYmplY3RcbiAqIEBwYXJhbSBpZGVudGl0eSAtIFRoZSBpZGVudGl0eSB2YWx1ZSB3aGljaCBjYW4gYmUgYSBzdHJpbmcgTVNQIElEIG9yIENsaWVudElkZW50aXR5IG9iamVjdFxuICogQHJldHVybnMgVGhlIE1TUCBJRCBhcyBhIHN0cmluZywgb3IgdW5kZWZpbmVkIGlmIG5vdCBhdmFpbGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RNc3BJZChcbiAgaWRlbnRpdHk6IHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWlkZW50aXR5KSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIGlkZW50aXR5ID09PSBcInN0cmluZ1wiKSByZXR1cm4gaWRlbnRpdHk7XG4gIHJldHVybiBpZGVudGl0eS5nZXRNU1BJRCgpO1xufVxuXG4vKipcbiAqIERlY29yYXRvciBmb3IgbWFya2luZyBtZXRob2RzIHRoYXQgcmVxdWlyZSBvd25lcnNoaXAgYXV0aG9yaXphdGlvbi5cbiAqIENoZWNrcyB0aGUgb3duZXIgb2YgdGhlIHRva2VuIGJlZm9yZSBhbGxvd2luZyB0aGUgbWV0aG9kIHRvIGJlIGV4ZWN1dGVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBUb2tlbkNvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3Qge1xuICogICBAT3duZXIoKVxuICogICBhc3luYyBNaW50KGN0eDogQ29udGV4dCwgYW1vdW50OiBudW1iZXIpIHtcbiAqICAgICAvLyBNaW50IHRva2VuIGxvZ2ljXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIHtNZXRob2REZWNvcmF0b3J9IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IGNoZWNrcyBvd25lcnNoaXAgYXV0aG9yaXphdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE93bmVyKCkge1xuICByZXR1cm4gZnVuY3Rpb24gKFxuICAgIHRhcmdldDogYW55LFxuICAgIHByb3BlcnR5S2V5OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkge1xuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcblxuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBhc3luYyBmdW5jdGlvbiAoXG4gICAgICB0aGlzOiBGYWJyaWNFUkMyMENvbnRyYWN0LFxuICAgICAgLi4uYXJnczogYW55W11cbiAgICApIHtcbiAgICAgIGNvbnN0IGN0eDogSExDb250ZXh0ID0gYXJnc1swXTtcbiAgICAgIGNvbnN0IGFjb3VudElkID0gY3R4LmNsaWVudElkZW50aXR5LmdldElEKCk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdCA9IGF3YWl0ICh0aGlzIGFzIEZhYnJpY0VSQzIwQ29udHJhY3QpW1xuICAgICAgICBcInRva2VuUmVwb3NpdG9yeVwiXG4gICAgICBdLnNlbGVjdCgpO1xuXG4gICAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCBzZWxlY3QuZXhlY3V0ZShjdHgpO1xuXG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFwiTm8gdG9rZW5zIGF2YWlhbGJsZVwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUbyBtYW55IHRva2VuIGF2YWlsYWJsZSA6ICR7dG9rZW5zLmxlbmd0aH1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRva2Vuc1swXS5vd25lciAhPSBhY291bnRJZCkge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgICAgICAgIGBVc2VyIG5vdCBhdXRob3JpemVkIHRvIHJ1biAke3Byb3BlcnR5S2V5fSBvbiB0aGUgdG9rZW5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvd25lZEJ5T25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgUiBleHRlbmRzIFJlcG88TT4sXG4gIFYsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHN0dWIgfSA9IGNvbnRleHQgYXMgYW55O1xuXG4gIGNvbnN0IGNyZWF0b3IgPSBhd2FpdCBzdHViLmdldENyZWF0b3IoKTtcbiAgY29uc3Qgb3duZXIgPSBjcmVhdG9yLm1zcGlkO1xuXG4gIGNvbnN0IHNldE93bmVkQnlLZXlWYWx1ZSA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhcmdldDogTSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnRcbiAgKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgfSk7XG4gIH07XG5cbiAgc2V0T3duZWRCeUtleVZhbHVlKG1vZGVsLCBrZXkgYXMgc3RyaW5nLCBvd25lcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvd25lZEJ5KCkge1xuICBmdW5jdGlvbiBvd25lZEJ5KCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqOiBhbnksIGF0dHJpYnV0ZT86IGFueSkge1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICBnZW5lcmF0ZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgb25DcmVhdGUob3duZWRCeU9uQ3JlYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFxuICAgICAgICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpLFxuICAgICAgICAgIGF0dHJpYnV0ZVxuICAgICAgICApXG4gICAgICApKG9iaiwgYXR0cmlidXRlKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5PV05FRF9CWSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogb3duZWRCeSxcbiAgICAgIGFyZ3M6IFtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cmFuc2FjdGlvbklkT25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgUiBleHRlbmRzIFJlcG88TT4sXG4gIFYsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHN0dWIgfSA9IGNvbnRleHQgYXMgYW55O1xuICBtb2RlbFtrZXldID0gc3R1Yi5nZXRUeElEKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2FjdGlvbklkKCkge1xuICBmdW5jdGlvbiB0cmFuc2FjdGlvbklkKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqOiBhbnksIGF0dHJpYnV0ZT86IGFueSkge1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICByZWFkb25seSgpLFxuICAgICAgICBvbkNyZWF0ZSh0cmFuc2FjdGlvbklkT25DcmVhdGUpLFxuICAgICAgICBvblVwZGF0ZSh0cmFuc2FjdGlvbklkT25DcmVhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoXG4gICAgICAgICAgTWV0YWRhdGEua2V5KFxuICAgICAgICAgICAgRmFicmljTW9kZWxLZXlzLkZBQlJJQyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgICAgIEZhYnJpY01vZGVsS2V5cy5UUkFOU0FDVElPTl9JRFxuICAgICAgICAgICksXG4gICAgICAgICAgYXR0cmlidXRlXG4gICAgICAgIClcbiAgICAgICkob2JqLCBhdHRyaWJ1dGUpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlRSQU5TQUNUSU9OX0lEKVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB0cmFuc2FjdGlvbklkLFxuICAgICAgYXJnczogW10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IHR5cGUgTWlycm9yQ29uZGl0aW9uID0gKG1zcDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG5leHBvcnQgdHlwZSBNaXJyb3JNZXRhZGF0YSA9IHtcbiAgY29uZGl0aW9uPzogTWlycm9yQ29uZGl0aW9uO1xuICByZXNvbHZlcjogQ29sbGVjdGlvblJlc29sdmVyIHwgc3RyaW5nO1xuICBtc3BJZDogc3RyaW5nO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV2YWxNaXJyb3JNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSxcbiAgcmVzb2x2ZXI6IHVuZGVmaW5lZCB8IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcixcbiAgY3R4OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+XG4pIHtcbiAgbGV0IGNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyB8IHVuZGVmaW5lZCA9IHJlc29sdmVyO1xuICBpZiAodHlwZW9mIGNvbGxlY3Rpb24gIT09IFwic3RyaW5nXCIpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3duZXIgPVxuICAgICAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fCBjdHguZ2V0KFwic3R1YlwiKS5nZXRDcmVhdG9yKCkudG9TdHJpbmcoKTtcbiAgICAgIGlmIChyZXNvbHZlciAmJiB0eXBlb2YgcmVzb2x2ZXIgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgY29sbGVjdGlvbiA9IGF3YWl0IHJlc29sdmVyKG1vZGVsLCBvd25lciwgY3R4KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIHJlc29sdmUgY29sbGVjdGlvbiBtaXJyb3IgbmFtZTogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29sbGVjdGlvbiB8fCB0eXBlb2YgY29sbGVjdGlvbiAhPT0gXCJzdHJpbmdcIilcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBObyBjb2xsZWN0aW9uIGZvdW5kIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgKTtcbiAgcmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgY29uc3Qgc291cmNlTW9kZWwgPSBtb2RlbDtcbiAgLy8gUHV0IG1pcnJvciBmbGFncyBkaXJlY3RseSBvbiBjb250ZXh0IHNvIGFkYXB0ZXIucHJlcGFyZSgpIGFuZCBhZGFwdGVyLmNyZWF0ZSgpIGNhbiBzZWUgdGhlbVxuICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG8gPSB0aGlzLm92ZXJyaWRlKFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgKHRoaXMgYXMgYW55KS5fb3ZlcnJpZGVzLCB7XG4gICAgICAgIG1pcnJvcjogdHJ1ZSxcbiAgICAgICAgbWlycm9yQ29sbGVjdGlvbjogY29sbGVjdGlvbixcbiAgICAgICAgaWdub3JlVmFsaWRhdGlvbjogdHJ1ZSxcbiAgICAgICAgaWdub3JlSGFuZGxlcnM6IHRydWUsXG4gICAgICB9IGFzIGFueSlcbiAgICApO1xuICAgIGNvbnN0IG1pcnJvciA9IGF3YWl0IHJlcG8uY3JlYXRlKHNvdXJjZU1vZGVsLCBjb250ZXh0KTtcbiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgICAgYE1pcnJvciBmb3IgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGNyZWF0ZWQgd2l0aCAke01vZGVsLnBrKG1vZGVsKSBhcyBzdHJpbmd9OiAke21pcnJvcltNb2RlbC5wayhtb2RlbCldfWBcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIENsZWFuIHVwIG1pcnJvciBmbGFncyBmcm9tIGNvbnRleHRcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgY29uc3Qgc291cmNlTW9kZWwgPSBtb2RlbDtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIG1pcnJvckNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgICBhcHBseVVwZGF0ZVZhbGlkYXRpb246IGZhbHNlLFxuICAgICAgICBtZXJnZUZvclVwZGF0ZTogZmFsc2UsXG4gICAgICB9IGFzIGFueSlcbiAgICApO1xuICAgIGF3YWl0IHJlcG8udXBkYXRlKHNvdXJjZU1vZGVsLCBjb250ZXh0KTtcbiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgICAgYE1pcnJvciBmb3IgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IHVwZGF0ZWQ6ICR7KG1vZGVsIGFzIGFueSlbTW9kZWwucGsobW9kZWwpXX1gXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgZmFicmljQ3R4LnB1dChcInNlZ3JlZ2F0ZWRcIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICB0cnkge1xuICAgIGNvbnN0IHBrUHJvcCA9IE1vZGVsLnBrKG1vZGVsKSBhcyBrZXlvZiBNO1xuICAgIGNvbnN0IGlkID0gbW9kZWxbcGtQcm9wXTtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBzZWdyZWdhdGVkOiBjb2xsZWN0aW9uLFxuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcmVwby5kZWxldGUoaWQgYXMgYW55LCBjb250ZXh0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1heSBhbHJlYWR5IGJlIGRlbGV0ZWQgYnkgYWRhcHRlci5kZWxldGVTZWdyZWdhdGVkQ29sbGVjdGlvbnNcbiAgICB9XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBkZWxldGVkOiAke1N0cmluZyhpZCl9YFxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwic2VncmVnYXRlZFwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWlycm9yV3JpdGVHdWFyZDxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAga2V5OiBrZXlvZiBNLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbXNwID0gZXh0cmFjdE1zcElkKFxuICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgKTtcbiAgaWYgKCFtc3ApIHJldHVybjtcbiAgaWYgKG1zcCA9PT0gZGF0YS5tc3BJZCB8fCAoZGF0YS5jb25kaXRpb24gJiYgZGF0YS5jb25kaXRpb24obXNwKSkpIHtcbiAgICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgICAgYE9yZ2FuaXphdGlvbiAke21zcH0gaXMgbm90IGF1dGhvcml6ZWQgdG8gbW9kaWZ5IG1pcnJvcmVkIGRhdGFgXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZE1pcnJvckhhbmRsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbXNwID0gZXh0cmFjdE1zcElkKFxuICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgKTtcblxuICBpZiAoIW1zcCkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgY29uc3QgbWF0Y2hlcyA9IG1zcCA9PT0gZGF0YS5tc3BJZCB8fCAoZGF0YS5jb25kaXRpb24gJiYgZGF0YS5jb25kaXRpb24obXNwKSk7XG5cbiAgaWYgKG1hdGNoZXMpIHtcbiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgICAgYE1pcnJvciByZWFkOiBNU1AgJHttc3B9IG1hdGNoZXMsIHJvdXRpbmcgcmVhZHMgdG8gbWlycm9yIGNvbGxlY3Rpb24gJHtjb2xsZWN0aW9ufWBcbiAgICApO1xuICAgIC8vIFJvdXRlIHJlYWRzIGV4Y2x1c2l2ZWx5IHRocm91Z2ggdGhlIG1pcnJvciBjb2xsZWN0aW9uXG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJmdWxseVNlZ3JlZ2F0ZWRcIiwgdHJ1ZSk7XG4gICAgZmFicmljQ3R4LnJlYWRGcm9tKGNvbGxlY3Rpb24pO1xuICB9XG4gIC8vIFdoZW4gTVNQIGRvZXMgTk9UIG1hdGNoLCBub3JtYWwgcmVhZCBmbG93IOKAlCBhbGwgZGF0YSBpcyBpbiBwdWJsaWMgc3RhdGVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pcnJvcihcbiAgY29sbGVjdGlvbjogQ29sbGVjdGlvblJlc29sdmVyIHwgc3RyaW5nLFxuICBtc3BJZE9yQ29uZGl0aW9uPzogc3RyaW5nIHwgTWlycm9yQ29uZGl0aW9uLFxuICBjb25kaXRpb24/OiBNaXJyb3JDb25kaXRpb25cbikge1xuICBjb25zdCBpc0NvbmRpdGlvbk9ubHkgPVxuICAgIHR5cGVvZiBtc3BJZE9yQ29uZGl0aW9uICE9PSBcInN0cmluZ1wiICYmIEJvb2xlYW4obXNwSWRPckNvbmRpdGlvbik7XG4gIGNvbnN0IG1zcElkID0gaXNDb25kaXRpb25Pbmx5XG4gICAgPyB1bmRlZmluZWRcbiAgICA6IChtc3BJZE9yQ29uZGl0aW9uIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNvbmQgPSBpc0NvbmRpdGlvbk9ubHlcbiAgICA/IChtc3BJZE9yQ29uZGl0aW9uIGFzIE1pcnJvckNvbmRpdGlvbilcbiAgICA6IGNvbmRpdGlvbjtcblxuICBmdW5jdGlvbiBtaXJyb3IoXG4gICAgcmVzb2x2ZXI6IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyxcbiAgICBtc3BJZDogc3RyaW5nLFxuICAgIGNvbmRpdGlvbj86IE1pcnJvckNvbmRpdGlvblxuICApIHtcbiAgICBjb25zdCBtZXRhOiBNaXJyb3JNZXRhZGF0YSA9IHtcbiAgICAgIGNvbmRpdGlvbjogY29uZGl0aW9uLFxuICAgICAgbXNwSWQ6IG1zcElkLFxuICAgICAgcmVzb2x2ZXI6IHJlc29sdmVyLFxuICAgIH07XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgbWV0YWRhdGEoXG4gICAgICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuTUlSUk9SKSxcbiAgICAgICAgbWV0YVxuICAgICAgKSxcbiAgICAgIC8vIFJlYWQgaGFuZGxlciBydW5zIGVhcmx5IChwcmlvcml0eSAzMCkgdG8gc2V0IHVwIGNvbnRleHQgYmVmb3JlIGFueSByZWFkc1xuICAgICAgb25SZWFkKHJlYWRNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMzAgfSksXG4gICAgICAvLyBXcml0ZSBndWFyZHMg4oCUIHJlamVjdCBtYXRjaGluZyBNU1BzIGJlZm9yZSBhbnkgcHJvY2Vzc2luZ1xuICAgICAgb25DcmVhdGUobWlycm9yV3JpdGVHdWFyZCBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDIwIH0pLFxuICAgICAgb25VcGRhdGUobWlycm9yV3JpdGVHdWFyZCBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDIwIH0pLFxuICAgICAgb25EZWxldGUobWlycm9yV3JpdGVHdWFyZCBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDIwIH0pLFxuICAgICAgLy8gTWlycm9yIHN5bmMgaGFuZGxlcnMg4oCUIHdyaXRlIGZ1bGwgbW9kZWwgYWZ0ZXIgb3RoZXIgaGFuZGxlcnMgKHByaW9yaXR5IDEwMClcbiAgICAgIG9uQ3JlYXRlKGNyZWF0ZU1pcnJvckhhbmRsZXIgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAxMDAgfSksXG4gICAgICBvblVwZGF0ZSh1cGRhdGVNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMTAwIH0pLFxuICAgICAgb25EZWxldGUoZGVsZXRlTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDEwMCB9KVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLk1JUlJPUilcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogbWlycm9yLFxuICAgICAgYXJnczogW2NvbGxlY3Rpb24sIG1zcElkLCBjb25kXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uUmVzb2x2ZXIgPSA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwPzogc3RyaW5nLFxuICAuLi5hcmdzOiBhbnlbXVxuKSA9PiBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBNb2RlbENvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciA9IDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZD86IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IG9yZ05hbWUgPVxuICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgY29uc3QgY29uc3RyID0gdHlwZW9mIG1vZGVsID09PSBcImZ1bmN0aW9uXCIgPyBtb2RlbCA6IG1vZGVsLmNvbnN0cnVjdG9yO1xuICBpZiAoIW9yZ05hbWUpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTW9kZWwgJHtjb25zdHIubmFtZX0gaXMgbm90IG93bmVkIGJ5IGFueSBvcmdhbml6YXRpb24uIGRpZCB5b3UgdXNlIEBvd25lZEJ5KCkgKG9yIHByb3ZpZGUgdGhlIG5hbWUpP2BcbiAgICApO1xuICByZXR1cm4gYCR7dG9QYXNjYWxDYXNlKGNvbnN0ci5uYW1lKX0ke29yZ05hbWUgPyB0b1Bhc2NhbENhc2Uob3JnTmFtZSkgOiBcIlwifWA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gTmFtZXNwYWNlQ29sbGVjdGlvbihuYW1lc3BhY2U6IHN0cmluZyk6IENvbGxlY3Rpb25SZXNvbHZlciB7XG4gIHJldHVybiA8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LCBtc3BJZD86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG9yZ05hbWUgPVxuICAgICAgbXNwSWQgfHwgKHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gTW9kZWwub3duZXJPZihtb2RlbCkgOiB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGNvbnN0ciA9IHR5cGVvZiBtb2RlbCA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWwgOiBtb2RlbC5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoIW9yZ05hbWUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE1vZGVsICR7Y29uc3RyLm5hbWV9IGlzIG5vdCBvd25lZCBieSBhbnkgb3JnYW5pemF0aW9uLiBkaWQgeW91IHVzZSBAb3duZWRCeSgpIChvciBwcm92aWRlIHRoZSBuYW1lKT9gXG4gICAgICApO1xuICAgIHJldHVybiBgJHtuYW1lc3BhY2V9JHtvcmdOYW1lID8gdG9QYXNjYWxDYXNlKG9yZ05hbWUpIDogXCJcIn1gO1xuICB9O1xufVxuXG5leHBvcnQgY29uc3QgSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvbjogQ29sbGVjdGlvblJlc29sdmVyID0gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIG1zcElkPzogc3RyaW5nXG4pID0+IHtcbiAgY29uc3Qgb3JnTmFtZSA9XG4gICAgbXNwSWQgfHwgKHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gTW9kZWwub3duZXJPZihtb2RlbCkgOiB1bmRlZmluZWQpO1xuICBpZiAoIW9yZ05hbWUpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfSBpcyBub3Qgb3duZWQgYnkgYW55IG9yZ2FuaXphdGlvbi4gZGlkIHlvdSB1c2UgQG93bmVkQnkoKSAob3IgcHJvdmlkZSB0aGUgbmFtZSk/YFxuICAgICk7XG4gIHJldHVybiBgX18ke3RvUGFzY2FsQ2FzZShvcmdOYW1lKX1Qcml2YXRlQ29sbGVjdGlvbmA7XG59O1xuXG5leHBvcnQgdHlwZSBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhID0ge1xuICBjb2xsZWN0aW9uczogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyO1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJpb3JpdHkgZm9yIGVhcmx5IGNvbGxlY3Rpb24gZXh0cmFjdGlvbiAoYmVmb3JlIHBrIGdlbmVyYXRpb24gYXQgcHJpb3JpdHkgNjApXG4gKiBAc3VtbWFyeSBUaGlzIHByaW9yaXR5IGVuc3VyZXMgY29sbGVjdGlvbnMgYXJlIHJlZ2lzdGVyZWQgaW4gY29udGV4dCBiZWZvcmUgYW55IHNlcXVlbmNlXG4gKiBvcGVyYXRpb25zIG9jY3VyLCBhbGxvd2luZyBzZXF1ZW5jZXMgdG8gYmUgcmVwbGljYXRlZCB0byBwcml2YXRlL3NoYXJlZCBjb2xsZWN0aW9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNFR1JFR0FURURfQ09MTEVDVElPTl9FWFRSQUNUSU9OX1BSSU9SSVRZID0gMzU7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNlZ3JlZ2F0aW9uRmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IE0sXG4gIGNvbGxlY3Rpb25zOiBzdHJpbmdbXSxcbiAgY3R4OiBhbnlcbikge1xuICAvLyBSZWdpc3RlciBjb2xsZWN0aW9ucyBlYXJseSB1c2luZyByZWFkRnJvbSAtIHRoaXMgYWxsb3dzIHNlcXVlbmNlIGNvZGVcbiAgLy8gdG8ga25vdyB3aGljaCBjb2xsZWN0aW9ucyB0byByZXBsaWNhdGUgdG8gZHVyaW5nIHBrIGdlbmVyYXRpb25cbiAgaWYgKGNvbGxlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAoY3R4IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkucmVhZEZyb20oY29sbGVjdGlvbnMpO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgbW9kZWwgaXMgZnVsbHkgc2VncmVnYXRlZCAoYWxsIG5vbi1wayBwcm9wZXJ0aWVzIGFyZSBwcml2YXRlL3NoYXJlZC90cmFuc2llbnQpLlxuICAvLyBVc2UgTW9kZWwuc2VncmVnYXRlKCkgd2hpY2ggaXMgdGhlIGNhbm9uaWNhbCB3YXkgdG8gZGV0ZXJtaW5lIHdoYXQncyB0cmFuc2llbnQsXG4gIC8vIHJhdGhlciB0aGFuIHJlYWRpbmcgREJLZXlzLlRSQU5TSUVOVCBtZXRhZGF0YSB3aGljaCBtYXkgbm90IGFjY3VtdWxhdGUgY29ycmVjdGx5XG4gIC8vIHdoZW4gY2xhc3MtbGV2ZWwgQHByaXZhdGVEYXRhIGFwcGxpZXMgZGVjb3JhdG9ycyBpdGVyYXRpdmVseS5cbiAgaWYgKCFjdHguaXNGdWxseVNlZ3JlZ2F0ZWQgJiYgY29sbGVjdGlvbnMubGVuZ3RoKSB7XG4gICAgaWYgKCFoYXNQdWJsaWNQcm9wZXJ0aWVzKGNsYXp6LmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KSkge1xuICAgICAgY3R4Lm1hcmtGdWxseVNlZ3JlZ2F0ZWQoKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGx5TWlycm9yRmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICBtc3A6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY3R4OiBGYWJyaWNDb250cmFjdENvbnRleHRcbikge1xuICBpZiAoIW1zcCkgcmV0dXJuO1xuICBjb25zdCBtaXJyb3JNZXRhID0gTW9kZWwubWlycm9yZWRBdChjbGF6eik7XG4gIGlmICghbWlycm9yTWV0YSkgcmV0dXJuO1xuICBjb25zdCBtYXRjaGVzID1cbiAgICBtc3AgPT09IG1pcnJvck1ldGEubXNwSWQgfHxcbiAgICAobWlycm9yTWV0YS5jb25kaXRpb24gJiYgbWlycm9yTWV0YS5jb25kaXRpb24obXNwKSk7XG4gIGlmICghbWF0Y2hlcykgcmV0dXJuO1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKFxuICAgIG5ldyBjbGF6eigpLFxuICAgIG1pcnJvck1ldGEucmVzb2x2ZXIsXG4gICAgY3R4XG4gICk7XG4gIC8vIE1pcnJvciBNU1AgbWF0Y2hlcyDigJQgcm91dGUgcmVhZHMgZXhjbHVzaXZlbHkgdGhyb3VnaCB0aGUgbWlycm9yXG4gIC8vIGNvbGxlY3Rpb24uIENsZWFyIGFueSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY29sbGVjdGlvbnMgc28gcXVlcmllc1xuICAvLyBnbyBPTkxZIHRvIHRoZSBtaXJyb3IsIG5vdCB0byB0aGUgcmVndWxhciBwcml2YXRlL3NoYXJlZCBvbmVzLlxuICBjdHgucHV0KFwic2VncmVnYXRlUmVhZFwiLCB1bmRlZmluZWQpO1xuICBjdHgucHV0KFwic2VncmVnYXRlUmVhZFN0YWNrXCIsIHVuZGVmaW5lZCk7XG4gIGN0eC5wdXQoXCJmdWxseVNlZ3JlZ2F0ZWRcIiwgdHJ1ZSk7XG4gIGN0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBjdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIGN0eC5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gaGFzUHVibGljUHJvcGVydGllczxNIGV4dGVuZHMgTW9kZWw+KGNsYXp6OiBDb25zdHJ1Y3RvcjxNPik6IGJvb2xlYW4ge1xuICBjb25zdCBhdHRyaWJ1dGVzID0gTWV0YWRhdGEuZ2V0QXR0cmlidXRlcyhjbGF6eikgfHwgW107XG4gIGNvbnN0IHBrID0gTW9kZWwucGsoY2xhenopO1xuICBjb25zdCB0cmFuc2llbnRNZXRhID0gTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgREJLZXlzLlRSQU5TSUVOVCkgfHwge307XG4gIGNvbnN0IHByaXZhdGVNZXRhID1cbiAgICBNZXRhZGF0YS5nZXQoY2xhenogYXMgYW55LCBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLlBSSVZBVEUpKSB8fCB7fTtcbiAgY29uc3Qgc2hhcmVkTWV0YSA9XG4gICAgTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5TSEFSRUQpKSB8fCB7fTtcblxuICByZXR1cm4gYXR0cmlidXRlcy5zb21lKChhdHRyKSA9PiB7XG4gICAgaWYgKGF0dHIgPT09IHBrKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGF0dHIgaW4gdHJhbnNpZW50TWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHByaXZhdGVNZXRhKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGF0dHIgaW4gc2hhcmVkTWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRWFybHkgaGFuZGxlciB0byBleHRyYWN0IGFuZCByZWdpc3RlciBjb2xsZWN0aW9ucyBpbiBjb250ZXh0XG4gKiBAc3VtbWFyeSBSdW5zIHdpdGggcHJpb3JpdHkgPCA0MCB0byBleHRyYWN0IGNvbGxlY3Rpb24gbmFtZXMgYmVmb3JlIHBrIGdlbmVyYXRpb24gKHByaW9yaXR5IDYwKS5cbiAqIFRoaXMgYWxsb3dzIEZhYnJpY0NvbnRyYWN0U2VxdWVuY2UgdG8ga25vdyB3aGljaCBjb2xsZWN0aW9ucyB0byByZXBsaWNhdGUgdG8uXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gKiBAcGFyYW0ge0NvbnRleHRPZjxSZXBvc2l0b3J5PE0sIGFueT4+fSBjb250ZXh0IC0gVGhlIGV4ZWN1dGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ge1NlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW119IGRhdGEgLSBUaGUgc2VncmVnYXRlZCBkYXRhIG1ldGFkYXRhXG4gKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdfSBrZXlzIC0gVGhlIHByb3BlcnR5IGtleShzKSBiZWluZyBzZWdyZWdhdGVkXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0cmFjdFNlZ3JlZ2F0ZWRDb2xsZWN0aW9uczxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIGNvbnRleHQ6IENvbnRleHRPZjx0eXBlb2YgdGhpcz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleXM6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcCkge1xuICAgIC8vIENhbid0IGV4dHJhY3QgY29sbGVjdGlvbnMgd2l0aG91dCBNU1AsIHdpbGwgYmUgY2F1Z2h0IGJ5IGxhdGVyIGhhbmRsZXJzXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbWV0YWRhdGEgb2YgZGF0YUFycmF5KSB7XG4gICAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gbWV0YWRhdGEuY29sbGVjdGlvbnM7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuICAgIGlmIChjb2xsZWN0aW9uICYmICFjb2xsZWN0aW9ucy5pbmNsdWRlcyhjb2xsZWN0aW9uKSkge1xuICAgICAgY29sbGVjdGlvbnMucHVzaChjb2xsZWN0aW9uKTtcbiAgICB9XG4gIH1cbiAgYXBwbHlTZWdyZWdhdGlvbkZsYWdzKG1vZGVsLCBjb2xsZWN0aW9ucywgY29udGV4dCk7XG5cbiAgLy8gU3RvcmUgc2VncmVnYXRpb24gbWV0YWRhdGEgb24gdGhlIGFkYXB0ZXIgKHBlcnNpc3RzIGFjcm9zcyBjb250ZXh0IGNoYWlucykuXG4gIC8vIFRoZSBTZXF1ZW5jZSBjcmVhdGVzIGl0cyBvd24gY29udGV4dCB2aWEgbG9nQ3R4LCBsb3NpbmcgY29udGV4dC1zdG9yZWQgZmxhZ3MuXG4gIGNvbnN0IHNlcU5hbWUgPSBNb2RlbC5zZXF1ZW5jZU5hbWUobW9kZWwsIFwicGtcIik7XG4gIChjb250ZXh0IGFzIGFueSkuc2V0U2VxdWVuY2VTZWdyZWdhdGlvbihcbiAgICBzZXFOYW1lLFxuICAgIChjb250ZXh0IGFzIGFueSkuaXNGdWxseVNlZ3JlZ2F0ZWQsXG4gICAgY29sbGVjdGlvbnNcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIC8vIFZhbGlkYXRlIGFsbCBrZXlzIHJlc29sdmUgdG8gdGhlIHNhbWUgY29sbGVjdGlvblxuICBrZXlBcnJheS5mb3JFYWNoKChfaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSBrZXlBcnJheS5tYXAoKGtleSkgPT4gU3RyaW5nKGtleSkpO1xuICAvLyBTdG9yZSB0aGUgc2VncmVnYXRlZCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25SZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNGbGFncz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleXM6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID0gTW9kZWwub3duZXJPZihtb2RlbCkgfHwgZXh0cmFjdE1zcElkKGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikpO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBhd2FpdCBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25VcGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXk6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgb2xkTW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAga2V5QXJyYXkuZm9yRWFjaCgoaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSAoa2V5QXJyYXkgYXMgKGtleW9mIE0pW10pLm1hcCgoa2V5KSA9PiBTdHJpbmcoa2V5KSk7XG4gIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25EZWxldGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55PixcbiAgViBleHRlbmRzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYgfCBWW10sXG4gIGtleTogKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdKSBhcyBWW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gc2VncmVnYXRlZChcbiAgY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyLFxuICB0eXBlOiBGYWJyaWNNb2RlbEtleXMuUFJJVkFURSB8IEZhYnJpY01vZGVsS2V5cy5TSEFSRUQsXG4gIGZpbHRlcj86IChwcm9wTmFtZTogc3RyaW5nKSA9PiBib29sZWFuXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyU2VncmVnYXRlZCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICBmdW5jdGlvbiBzZWdyZWdhdGVkRGVjKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgICAgY29uc3Qga2V5ID0gTWV0YWRhdGEua2V5KHR5cGUsIHByb3BlcnR5S2V5KTtcbiAgICAgIGNvbnN0IGNvbnN0cjogQ29uc3RydWN0b3IgPSB0YXJnZXQuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I7XG5cbiAgICAgIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBrZXkpIHx8IHt9O1xuICAgICAgY29uc3QgY29sbGVjdGlvbnMgPSBuZXcgU2V0KG1ldGEuY29sbGVjdGlvbnMgfHwgW10pO1xuICAgICAgY29sbGVjdGlvbnMuYWRkKGNvbGxlY3Rpb24pO1xuICAgICAgbWV0YS5jb2xsZWN0aW9ucyA9IFsuLi5jb2xsZWN0aW9uc107XG4gICAgICBNZXRhZGF0YS5zZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBrZXksIG1ldGEpO1xuXG4gICAgICBjb25zdCBjb25zdHJNZXRhID0gTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgdHlwZSkgfHwge307XG4gICAgICBjb25zdCBjb25zdHJDb2xsZWN0aW9ucyA9IG5ldyBTZXQoY29uc3RyTWV0YS5jb2xsZWN0aW9ucyB8fCBbXSk7XG4gICAgICBjb25zdHJDb2xsZWN0aW9ucy5hZGQoY29sbGVjdGlvbik7XG4gICAgICBjb25zdHJNZXRhLmNvbGxlY3Rpb25zID0gWy4uLmNvbnN0ckNvbGxlY3Rpb25zXTtcbiAgICAgIE1ldGFkYXRhLnNldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIHR5cGUsIGNvbnN0ck1ldGEpO1xuXG4gICAgICBjb25zdCB0cmFuc2llbnRNZXRhID1cbiAgICAgICAgTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgREJLZXlzLlRSQU5TSUVOVCkgfHwge307XG4gICAgICBjb25zdCB1cGRhdGVkVHJhbnNpZW50TWV0YSA9IHtcbiAgICAgICAgLi4udHJhbnNpZW50TWV0YSxcbiAgICAgICAgW3Byb3BlcnR5S2V5IGFzIGFueV06IHt9LFxuICAgICAgfTtcbiAgICAgIE1ldGFkYXRhLnNldChcbiAgICAgICAgY29uc3RyIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICBEQktleXMuVFJBTlNJRU5ULFxuICAgICAgICB1cGRhdGVkVHJhbnNpZW50TWV0YVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNzOiBhbnlbXSA9IFtdO1xuICAgIGlmICghcHJvcGVydHlLZXkpIHtcbiAgICAgIC8vIGRlY29yYXRlZCBhdCB0aGUgY2xhc3MgbGV2ZWxcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXRBdHRyaWJ1dGVzKHRhcmdldCBhcyBDb25zdHJ1Y3Rvcik7XG4gICAgICBwcm9wZXJ0aWVzPy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihwKSkge1xuICAgICAgICAgIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgdHlwZSkoKHRhcmdldCBhcyBhbnkpLnByb3RvdHlwZSwgcCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZ3JvdXBOYW1lID1cbiAgICAgICAgdHlwZW9mIGNvbGxlY3Rpb24gPT09IFwic3RyaW5nXCIgPyBjb2xsZWN0aW9uIDogY29sbGVjdGlvbi50b1N0cmluZygpO1xuICAgICAgLy8gVXNlIGRpZmZlcmVudCBncm91cCBuYW1lcyBmb3IgZXh0cmFjdGlvbiB2cyBkYXRhIGhhbmRsZXJzIHRvIHByZXZlbnQgbWVyZ2luZ1xuICAgICAgY29uc3QgZXh0cmFjdEdyb3VwTmFtZSA9IGAke2dyb3VwTmFtZX06ZXh0cmFjdGA7XG4gICAgICBjb25zdCBkYXRhR3JvdXBOYW1lID0gYCR7Z3JvdXBOYW1lfTpkYXRhYDtcbiAgICAgIGNvbnN0IGVhcmx5RXh0cmFjdGlvbk1ldGEgPSB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH07XG4gICAgICBjb25zdCBlYXJseUV4dHJhY3Rpb25Hcm91cFNvcnQgPSB7XG4gICAgICAgIHByaW9yaXR5OiBTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSxcbiAgICAgICAgZ3JvdXA6IGV4dHJhY3RHcm91cE5hbWUsXG4gICAgICB9O1xuICAgICAgZGVjcy5wdXNoKFxuICAgICAgICBwcm9wKCksXG4gICAgICAgIHRyYW5zaWVudCgpLFxuICAgICAgICBzZWdyZWdhdGVkRGVjLFxuICAgICAgICAvLyBFYXJseSBleHRyYWN0aW9uIGhhbmRsZXJzIC0gcnVuIEJFRk9SRSBwayBnZW5lcmF0aW9uIChwcmlvcml0eSA2MClcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGNvbGxlY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIGNvbnRleHQgZm9yIHNlcXVlbmNlIHJlcGxpY2F0aW9uXG4gICAgICAgIC8vIFdlIHJlZ2lzdGVyIGZvciBlYWNoIG9wZXJhdGlvbiBleHBsaWNpdGx5IHRvIGVuc3VyZSBwcm9wZXIgaGFuZGxlciBsb29rdXBcbiAgICAgICAgb24oXG4gICAgICAgICAgREJPcGVyYXRpb25zLkFMTCxcbiAgICAgICAgICBleHRyYWN0U2VncmVnYXRlZENvbGxlY3Rpb25zIGFzIGFueSxcbiAgICAgICAgICBlYXJseUV4dHJhY3Rpb25NZXRhLFxuICAgICAgICAgIGVhcmx5RXh0cmFjdGlvbkdyb3VwU29ydFxuICAgICAgICApLFxuICAgICAgICAvLyBNYWluIGhhbmRsZXJzIGZvciBzZWdyZWdhdGVkIGRhdGEgb3BlcmF0aW9ucyAocHJpb3JpdHkgOTUpXG4gICAgICAgIG9uQ3JlYXRlKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGUsXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25SZWFkKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25SZWFkIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvblVwZGF0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uVXBkYXRlIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvbkRlbGV0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uRGVsZXRlIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYXBwbHkoLi4uZGVjcykodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlRGF0YShcbiAgY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyID0gSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvblxuKSB7XG4gIGZ1bmN0aW9uIHByaXZhdGVEYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICAgIHJldHVybiBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuUFJJVkFURSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogcHJpdmF0ZURhdGEsXG4gICAgICBhcmdzOiBbY29sbGVjdGlvbl0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZERhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gIGZ1bmN0aW9uIHNoYXJlZERhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gICAgcmV0dXJuIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgRmFicmljTW9kZWxLZXlzLlNIQVJFRCk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlNIQVJFRClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogc2hhcmVkRGF0YSxcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBKU09OU2VyaWFsaXplcixcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWN1cnNpdmVseSBzb3J0cyBvYmplY3Qga2V5cyB3aXRob3V0IHJlb3JkZXJpbmcgYXJyYXlzXG4gKiBAcGFyYW0ge2FueX0gb2JqIC0gVGhlIHZhbHVlIHRvIHByb2Nlc3NcbiAqIEByZXR1cm4ge2FueX0gQSBjb3B5IHdpdGggc29ydGVkIG9iamVjdCBrZXlzIGJ1dCBwcmVzZXJ2ZWQgYXJyYXkgb3JkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzT25seVJlY3Vyc2l2ZShvYmo6IGFueSk6IGFueSB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG9iajtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iai5tYXAoc29ydEtleXNPbmx5UmVjdXJzaXZlKTtcbiAgaWYgKG9iai5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSByZXR1cm4gb2JqO1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVxuICAgIC5zb3J0KClcbiAgICAucmVkdWNlKChhY2M6IFJlY29yZDxzdHJpbmcsIGFueT4sIGtleSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSBzb3J0S2V5c09ubHlSZWN1cnNpdmUob2JqW2tleV0pO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERldGVybWluaXN0aWMgSlNPTiBzZXJpYWxpemVyIGZvciBGYWJyaWMgbW9kZWxzXG4gKiBAc3VtbWFyeSBFbnN1cmVzIHN0YWJsZSwgZGV0ZXJtaW5pc3RpYyBKU09OIG91dHB1dCBieSBzb3J0aW5nIG9iamVjdCBrZXlzIHJlY3Vyc2l2ZWx5IGJlZm9yZSBzdHJpbmdpZmljYXRpb24sIHdoaWNoIGlzIGltcG9ydGFudCBmb3IgRmFicmljIGVuZG9yc2VtZW50IGFuZCBoYXNoaW5nLiBFeHRlbmRzIEpTT05TZXJpYWxpemVyIHRvIHBsdWcgaW50byBleGlzdGluZyBEZWNhZiBtb2RlbCBzZXJpYWxpemF0aW9uIGZsb3cuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBEZWNhZiBNb2RlbCBzdWJ0eXBlIHNlcmlhbGl6ZWQgYnkgdGhpcyBpbnN0YW5jZVxuICogQHBhcmFtIHt2b2lkfSBbY29uc3RydWN0b3JdIE5vIHB1YmxpYyBjb25zdHJ1Y3RvciBhcmd1bWVudHNcbiAqIEBjbGFzcyBEZXRlcm1pbmlzdGljU2VyaWFsaXplclxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8TXlNb2RlbD4oKTtcbiAqIGNvbnN0IGpzb24gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShtb2RlbCk7XG4gKiBjb25zdCByZWJ1aWx0ID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShqc29uKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IERTIGFzIERldGVybWluaXN0aWNTZXJpYWxpemVyXG4gKiAgIENhbGxlci0+PkRTOiBzZXJpYWxpemUobW9kZWwpXG4gKiAgIERTLT4+RFM6IHByZVNlcmlhbGl6ZShtb2RlbClcbiAqICAgRFMtPj5EUzogc29ydC1rZXlzLXJlY3Vyc2l2ZVxuICogICBEUy0+PkRTOiBqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXG4gKiAgIERTLS0+PkNhbGxlcjogc3RyaW5nXG4gKiAgIENhbGxlci0+PkRTOiBkZXNlcmlhbGl6ZShzdHJpbmcpXG4gKiAgIERTLS0+PkNhbGxlcjogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIERldGVybWluaXN0aWNTZXJpYWxpemVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0pIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIC8vIFRPRE86IFZlcmlmeSB3aHkgdGhlcmUgaXMgbm8gbWV0YWRhdGFcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBsZXQgbWV0YWRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGEgfHwgbW9kZWwuY29uc3RydWN0b3IubmFtZTtcblxuICAgIGNvbnN0IHByZVNlcmlhbGl6ZSA9IGZ1bmN0aW9uIHByZVNlcmlhbGl6ZShcbiAgICAgIHRoaXM6IERldGVybWluaXN0aWNTZXJpYWxpemVyPGFueT4sXG4gICAgICBvYmo6IGFueVxuICAgICk6IGFueSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcCgobykgPT4gcHJlU2VyaWFsaXplLmNhbGwoc2VsZiwgbykpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlU2VyaWFsaXplLmNhbGwodGhpcywgb2JqKTtcbiAgICB9LmJpbmQodGhpcyk7XG5cbiAgICBNb2RlbC5yZWxhdGlvbnMobW9kZWwpLmZvckVhY2goKHIpID0+IHtcbiAgICAgIHRvU2VyaWFsaXplW3JdID0gcHJlU2VyaWFsaXplKHRvU2VyaWFsaXplW3JdKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG9TZXJpYWxpemU7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVidWlsZHMgYSBtb2RlbCBmcm9tIGEgc2VyaWFsaXphdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBmYWlscyB0byBwYXJzZSB0aGUgc3RyaW5nLCBvciB0byBidWlsZCB0aGUgbW9kZWxcbiAgICovXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRlc2VyaWFsaXphdGlvbltNb2RlbEtleXMuQU5DSE9SXTtcbiAgICBpZiAoIWNsYXNzTmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcmlhbGl6ZSBhIG1vZGVsIGludG8gYSBkZXRlcm1pbmlzdGljIEpTT04gc3RyaW5nXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCB3aXRoIHByZVNlcmlhbGl6ZSwgc29ydHMga2V5cyByZWN1cnNpdmVseSwgYW5kIHN0cmluZ2lmaWVzIGRldGVybWluaXN0aWNhbGx5IGZvciBzdGFibGUgb3JkZXJpbmdcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHJldHVybiB7c3RyaW5nfSBEZXRlcm1pbmlzdGljIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsXG4gICAqL1xuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoXCJqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXCIpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNPbmx5UmVjdXJzaXZlKHRoaXMucHJlU2VyaWFsaXplKG1vZGVsKSkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgRmFicmljIGV2ZW50IG5hbWUgZnJvbSBjb21wb25lbnRzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIGV2ZW50IG5hbWUgYnkgam9pbmluZyB0YWJsZSwgZXZlbnQsIGFuZCBvcHRpb25hbCBvd25lciB3aXRoIHVuZGVyc2NvcmVzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUvY29sbGVjdGlvbiBuYW1lXG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmd9IGV2ZW50IC0gVGhlIGV2ZW50IHR5cGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3duZXJdIC0gT3B0aW9uYWwgb3duZXIgaWRlbnRpZmllclxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGV2ZW50IG5hbWUgaW4gZm9ybWF0IFwidGFibGVfZXZlbnRcIiBvciBcInRhYmxlX2V2ZW50X293bmVyXCJcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWUoXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICBvd25lcj86IHN0cmluZ1xuKSB7XG4gIGNvbnN0IHBhcmFtcyA9IFt0YWJsZSwgZXZlbnRdO1xuICBpZiAob3duZXIpIHBhcmFtcy5wdXNoKG93bmVyKTtcbiAgcmV0dXJuIHBhcmFtcy5qb2luKFwiX1wiKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgRmFicmljIGV2ZW50IG5hbWUgaW50byBpdHMgY29tcG9uZW50c1xuICogQHN1bW1hcnkgU3BsaXRzIGFuIGV2ZW50IG5hbWUgYnkgdW5kZXJzY29yZXMgYW5kIGV4dHJhY3RzIHRhYmxlLCBldmVudCwgYW5kIG9wdGlvbmFsIG93bmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBldmVudCBuYW1lIHRvIHBhcnNlXG4gKiBAcmV0dXJuIHt7dGFibGU6IHN0cmluZywgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsIG93bmVyOiBzdHJpbmd9fSBUaGUgcGFyc2VkIGNvbXBvbmVudHMgYXMgYSBzdHJ1Y3R1cmVkIG9iamVjdFxuICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlIGV2ZW50IG5hbWUgZm9ybWF0IGlzIGludmFsaWRcbiAqIEBmdW5jdGlvbiBwYXJzZUV2ZW50TmFtZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgUGFyc2VyIGFzIHBhcnNlRXZlbnROYW1lXG4gKiAgIENhbGxlci0+PlBhcnNlcjogcGFyc2VFdmVudE5hbWUobmFtZSlcbiAqICAgUGFyc2VyLT4+UGFyc2VyOiBzcGxpdCBuYW1lIGJ5IFwiX1wiXG4gKiAgIGFsdCBwYXJ0cyBsZW5ndGggaW52YWxpZFxuICogICAgIFBhcnNlci0tPj5DYWxsZXI6IHRocm93IEludGVybmFsRXJyb3JcbiAqICAgZWxzZVxuICogICAgIFBhcnNlci0tPj5DYWxsZXI6IHsgdGFibGUsIGV2ZW50LCBvd25lcj8gfVxuICogICBlbmRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRXZlbnROYW1lKG5hbWU6IHN0cmluZyk6IHtcbiAgdGFibGU/OiBzdHJpbmc7XG4gIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nO1xuICBvd25lcj86IHN0cmluZztcbn0ge1xuICBjb25zdCBwYXJ0cyA9IG5hbWUuc3BsaXQoXCJfXCIpO1xuICBpZiAocGFydHMubGVuZ3RoIDwgMiB8fCBwYXJ0cy5sZW5ndGggPiAzKVxuICAgIHJldHVybiB7IHRhYmxlOiB1bmRlZmluZWQsIGV2ZW50OiBuYW1lLCBvd25lcjogdW5kZWZpbmVkIH07XG4gIHJldHVybiB7XG4gICAgdGFibGU6IHBhcnRzWzBdLFxuICAgIGV2ZW50OiBwYXJ0c1sxXSxcbiAgICBvd25lcjogcGFydHNbMl0sXG4gIH0gYXMge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmc7XG4gICAgb3duZXI/OiBzdHJpbmc7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBPdmVyZmxvd0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gT3ZlcmZsb3ctc2FmZSBhZGRpdGlvbiBvcGVyYXRpb25cbiAqIEBzdW1tYXJ5IEFkZHMgdHdvIG51bWJlcnMgYW5kIHZlcmlmaWVzIG5vIG92ZXJmbG93IGJ5IHJldmVyc2UtY2hlY2tpbmcgdGhlIG9wZXJhbmRzXG4gKiBAcGFyYW0ge251bWJlcn0gYSAtIEZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gU2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHN1bSBvZiBhIGFuZCBiXG4gKiBAZnVuY3Rpb24gYWRkXG4gKiBAdGhyb3dzIHtPdmVyZmxvd0Vycm9yfSBvbiBhZGRpdGlvbiBvdmVyZmxvd1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgYyA9IGEgKyBiO1xuICBpZiAoYSAhPT0gYyAtIGIgfHwgYiAhPT0gYyAtIGEpIHtcbiAgICB0aHJvdyBuZXcgT3ZlcmZsb3dFcnJvcihgQWRkaXRpb24gb3ZlcmZsb3c6ICR7YX0gKyAke2J9YCk7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE92ZXJmbG93LXNhZmUgc3VidHJhY3Rpb24gb3BlcmF0aW9uXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdHMgYiBmcm9tIGEgYW5kIHZhbGlkYXRlcyBubyBvdmVyZmxvdyBieSByZXZlcnNlLWNoZWNraW5nIHRoZSBvcGVyYW5kc1xuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBNaW51ZW5kXG4gKiBAcGFyYW0ge251bWJlcn0gYiAtIFN1YnRyYWhlbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRpZmZlcmVuY2UgYSAtIGJcbiAqIEBmdW5jdGlvbiBzdWJcbiAqIEB0aHJvd3Mge092ZXJmbG93RXJyb3J9IG9uIHN1YnRhY3Rpb24gb3ZlcmZsb3dcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGMgPSBhIC0gYjtcbiAgaWYgKGEgIT09IGMgKyBiIHx8IGIgIT09IGEgLSBjKSB7XG4gICAgdGhyb3cgbmV3IE92ZXJmbG93RXJyb3IoYFN1YnRyYWN0aW9uIG92ZXJmbG93OiAke2F9IC0gJHtifWApO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFNhZmUgSW50ZWdlciBQYXJzZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqXG4gKiBAZnVuY3Rpb24gc2FmZVBhcnNlSW50XG4gKlxuICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBpZiBwYXJzZUludCByZXR1cm5zIE5hTlxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVQYXJzZUludChzdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBjaGVjayBpZiBzdHJpbmcgb25seSBoYXZlIGRpZ2l0c1xuICBjb25zdCBkaWdpdFJlZ2V4ID0gL15cXGQrJC87XG4gIGlmICghZGlnaXRSZWdleC50ZXN0KHN0cmluZykpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgc3RyaW5nRm9ybWF0KFwiRmFpbGVkIHRvIHBhcnNlOiB7MH1cIiwgXCJzdHJpbmcgY29udGFpbnMgZGlnaXRzXCIpXG4gICAgKTtcbiAgfVxuICBjb25zdCBwYXJzZWRpbnQgPSBwYXJzZUludChzdHJpbmcpO1xuICBpZiAoaXNOYU4ocGFyc2VkaW50KSkge1xuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBzdHJpbmdGb3JtYXQoXCJGYWlsZWQgdG8gcGFyc2U6IHswfVwiLCBcInN0cmluZyBpcyBub3QgYSBwYXJzYWJsZSBpbnRlZ2VyXCIpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkaW50O1xufVxuIiwiaW1wb3J0IHtcbiAgSlNPTlNlcmlhbGl6ZXIsXG4gIE1vZGVsLFxuICBNb2RlbEtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgc29ydEtleXNPbmx5UmVjdXJzaXZlIH0gZnJvbSBcIi4vRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBvdmVycmlkZSBkZXNlcmlhbGl6ZShzdHI6IHN0cmluZywgdGFibGVOYW1lPzogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIC8vIGNvbnN0IGNsYXNzTmFtZSA9IHRhYmxlTmFtZTtcbiAgICAvLyBpZiAoIWNsYXNzTmFtZSlcbiAgICAvLyAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuXG4gICAgLy8gLy8gdGhpcyB3aWxsIHJldHVybiB1bmRlZmluZWQgdmFsdWVzXG4gICAgLy8gY29uc3QgbW9kZWw6IE0gPSBNb2RlbC5idWlsZChkZXNlcmlhbGl6YXRpb24sIGNsYXNzTmFtZSkgYXMgdW5rbm93biBhcyBNO1xuXG4gICAgLy8gLy8gUG9wdWxhdGUgTW9kZWxcbiAgICAvLyBjb25zdCBwcm9jZXNzZWREZXNlYWxpemF0aW9uID0gT2JqZWN0LmtleXMobW9kZWwpLnJlZHVjZShcbiAgICAvLyAgIChhY2N1bTogTSwga2V5KSA9PiB7XG4gICAgLy8gICAgIChhY2N1bSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID1cbiAgICAvLyAgICAgICBkZXNlcmlhbGl6YXRpb25bUmVwb3NpdG9yeS5jb2x1bW4oYWNjdW0sIGtleSldO1xuICAgIC8vICAgICByZXR1cm4gYWNjdW07XG4gICAgLy8gICB9LFxuICAgIC8vICAgbW9kZWxcbiAgICAvLyApO1xuXG4gICAgLy8gY29uc3QgcmVzdWx0ID0gTW9kZWwuYnVpbGQoXG4gICAgLy8gICBwcm9jZXNzZWREZXNlYWxpemF0aW9uLFxuICAgIC8vICAgY2xhc3NOYW1lXG4gICAgLy8gKSBhcyB1bmtub3duIGFzIE07XG5cbiAgICAvLyByZXR1cm4gcmVzdWx0O1xuICAgIHJldHVybiBkZXNlcmlhbGl6YXRpb247XG4gIH1cblxuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0sIHB1dEFuY2hvciA9IHRydWUpOiBzdHJpbmcge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgY29uc3Qgc3RyaW5naWZ5ID0gcmVxdWlyZShcImpzb24tc3RyaW5naWZ5LWRldGVybWluaXN0aWNcIik7XG4gICAgY29uc3QgcHJlU2VyaWFsaXphdGlvbiA9IHRoaXMucHJlU2VyaWFsaXplKG1vZGVsLCBwdXRBbmNob3IpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNPbmx5UmVjdXJzaXZlKHByZVNlcmlhbGl6YXRpb24pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0sIHB1dEFuY2hvcjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIC8vIFRPRE86IFZlcmlmeSB3aHkgdGhlcmUgaXMgbm8gbWV0YWRhdGFcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBsZXQgbWV0YWRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChwdXRBbmNob3IpXG4gICAgICB0b1NlcmlhbGl6ZVtNb2RlbEtleXMuQU5DSE9SXSA9IG1ldGFkYXRhIHx8IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgICBmdW5jdGlvbiBwcmVTZXJpYWxpemUoXG4gICAgICB0aGlzOiBTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxhbnk+LFxuICAgICAgb2JqOiBhbnlcbiAgICApOiBhbnkge1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcChwcmVTZXJpYWxpemUpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlU2VyaWFsaXplKG9iaik7XG4gICAgfVxuICAgIE1vZGVsLnJlbGF0aW9ucyhtb2RlbCkuZm9yRWFjaCgocikgPT4ge1xuICAgICAgdG9TZXJpYWxpemVbcl0gPSBwcmVTZXJpYWxpemUuY2FsbCh0aGlzLCB0b1NlcmlhbGl6ZVtyXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIENsaWVudEJhc2VkU2VydmljZSxcbiAgQ29udGV4dCxcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBQZXJzaXN0ZW5jZUtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IEZhYnJpY0NBU2VydmljZXMsIHtcbiAgQWZmaWxpYXRpb25TZXJ2aWNlLFxuICBJQXR0cmlidXRlUmVxdWVzdCxcbiAgSWRlbnRpdHlTZXJ2aWNlLFxuICBJRW5yb2xsUmVzcG9uc2UsXG4gIElJZGVudGl0eVJlcXVlc3QsXG4gIElSZWdpc3RlclJlcXVlc3QsXG4gIElSZXZva2VSZXF1ZXN0LFxuICBJU2VydmljZVJlc3BvbnNlLFxuICBUTFNPcHRpb25zLFxufSBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHsgQ0FDb25maWcsIENyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQ29uZmxpY3RFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb3JlVXRpbHMsIGdldEFraUFuZFNlcmlhbEZyb21DZXJ0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge1xuICBDZXJ0aWZpY2F0ZVJlc3BvbnNlLFxuICBGYWJyaWNJZGVudGl0eSxcbiAgR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgSWRlbnRpdHlSZXNwb25zZSxcbn0gZnJvbSBcIi4uLy4uL3NoYXJlZC9mYWJyaWMtdHlwZXNcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgQ0FfUk9MRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSUtleVZhbHVlQXR0cmlidXRlIH0gZnJvbSBcIi4vRmFicmljRW5yb2xsbWVudFNlcnZpY2VcIjtcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9pbmRleFwiO1xuaW1wb3J0IHsgQ3J5cHRvVXRpbHMgfSBmcm9tIFwiLi4vY3J5cHRvXCI7XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNJZGVudGl0eVNlcnZpY2UgZXh0ZW5kcyBDbGllbnRCYXNlZFNlcnZpY2U8XG4gIEZhYnJpY0NBU2VydmljZXMsXG4gIENBQ29uZmlnXG4+IHtcbiAgcHJvdGVjdGVkIF91c2VyITogVXNlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCByb290Q2xpZW50KCk6IHsgbmV3Q2VydGlmaWNhdGVTZXJ2aWNlOiBhbnkgfSB7XG4gICAgcmV0dXJuICh0aGlzLmNsaWVudCBhcyBhbnkpW1wiX0ZhYnJpY0NhU2VydmljZXNcIl0gYXMgYW55O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB1c2VyKCk6IFVzZXIge1xuICAgIGlmICghdGhpcy5fdXNlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIkZhYnJpYyBpZGVudGl0eSBzZXJ2aWNlIG5vdCBwcm9wZXJseSBzZXR1cDogbWlzc2luZyB1c2VyXCJcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGNlcnRpZmljYXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q2xpZW50Lm5ld0NlcnRpZmljYXRlU2VydmljZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBhZmZpbGlhdGlvbnMoKTogQWZmaWxpYXRpb25TZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubmV3QWZmaWxpYXRpb25TZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGlkZW50aXRpZXMoKTogSWRlbnRpdHlTZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0VXNlcihjZmc6IENBQ29uZmlnLCBjdHg6IENvbnRleHQpIHtcbiAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyLmZvcih0aGlzLmdldFVzZXIpO1xuICAgIGNvbnN0IHsgY2FOYW1lLCBjYUNlcnQsIGNhS2V5LCB1cmwsIGhzbSB9ID0gY2ZnO1xuXG4gICAgbG9nLmluZm8oYENyZWF0aW5nIENBIHVzZXIgZm9yICR7Y2FOYW1lfSBhdCAke3VybH1gKTtcbiAgICBsb2cudmVyYm9zZShgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7Y2FDZXJ0fWApO1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhQ2VydCk7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaHNtKSB7XG4gICAgICBpZiAoIWNhS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNaXNzaW5nIGNhS2V5IGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfS4gUHJvdmlkZSBhIGtleSBkaXJlY3Rvcnkgb3IgY29uZmlndXJlIEhTTSBzdXBwb3J0LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBrZXkgZnJvbSAke2NhS2V5fWApO1xuICAgICAga2V5ID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgVXNpbmcgSFNNIGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfSB3aXRoIGxpYnJhcnkgJHtoc20ubGlicmFyeX1gXG4gICAgICApO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYExvYWRpbmcgQWRtaW4gdXNlciBmb3IgY2EgJHtjYU5hbWV9YCk7XG4gICAgdGhpcy5fdXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoXCJhZG1pblwiLCBrZXksIGNlcnRpZmljYXRlLCBjYU5hbWUsIHtcbiAgICAgIGhzbSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fdXNlcjtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGluaXRpYWxpemUoXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTx7IGNvbmZpZzogQ0FDb25maWc7IGNsaWVudDogRmFicmljQ0FTZXJ2aWNlcyB9PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUGVyc2lzdGVuY2VLZXlzLklOSVRJQUxJWkFUSU9OLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgY29uc3QgW2NvbmZpZ10gPSBhcmdzO1xuICAgIGlmICghY29uZmlnKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgRmFicmljIENBIGNvbmZpZ3VyYXRpb25cIik7XG5cbiAgICBjb25zdCB7IHVybCwgdGxzLCBjYU5hbWUgfSA9IGNvbmZpZztcbiAgICBsb2cuaW5mbyhgSW5pdGlhbGl6aW5nIENBIENsaWVudCBmb3IgQ0EgJHtjb25maWcuY2FOYW1lfSBhdCAke2NvbmZpZy51cmx9YCk7XG4gICAgY29uc3QgeyB0cnVzdGVkUm9vdHMsIHZlcmlmeSB9ID0gdGxzIGFzIFRMU09wdGlvbnM7XG5cbiAgICBjb25zdCByb290ID0gKHRydXN0ZWRSb290cyBhcyBzdHJpbmdbXSlbMF0gYXMgc3RyaW5nO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7cm9vdH0uIGN3ZDogJHtwcm9jZXNzLmN3ZCgpfWApO1xuXG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0RmlsZUNvbnRlbnQocm9vdCk7XG5cbiAgICBsb2cuZGVidWcoYENBIENlcnRpZmljYXRlOiAke2NlcnRpZmljYXRlLnRvU3RyaW5nKCl9YCk7XG5cbiAgICBjb25zdCBjbGllbnQgPSBuZXcgRmFicmljQ0FTZXJ2aWNlcyhcbiAgICAgIHVybCxcbiAgICAgIHtcbiAgICAgICAgdHJ1c3RlZFJvb3RzOiBCdWZmZXIuZnJvbShjZXJ0aWZpY2F0ZSksXG4gICAgICAgIHZlcmlmeSxcbiAgICAgIH0gYXMgVExTT3B0aW9ucyxcbiAgICAgIGNhTmFtZVxuICAgICk7XG5cbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5nZXRVc2VyKGNvbmZpZywgY3R4KTtcbiAgICBsb2cuZGVidWcoYENBIHVzZXIgbG9hZGVkOiAke3VzZXIuZ2V0TmFtZSgpfWApO1xuICAgIHJldHVybiB7XG4gICAgICBjb25maWcsXG4gICAgICBjbGllbnQsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldENlcnRpZmljYXRlcyguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55Pik6IFByb21pc2U8c3RyaW5nW10+O1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXMoXG4gICAgcmVxdWVzdDogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHN0cmluZ1tdPjtcbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzPE1BUCBleHRlbmRzIGJvb2xlYW4+KFxuICAgIGRvTWFwOiBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICByZXF1ZXN0OiBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICAgIGRvTWFwOiBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICByZXF1ZXN0PzogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCB8IE1BUCxcbiAgICBkb01hcDogTUFQID0gdHJ1ZSBhcyBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT4ge1xuICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ29udGV4dCkge1xuICAgICAgYXJncyA9IFtyZXF1ZXN0XTtcbiAgICAgIGRvTWFwID0gdHJ1ZSBhcyBNQVA7XG4gICAgICByZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlcXVlc3QgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBkb01hcCA9IHJlcXVlc3Q7XG4gICAgICByZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRvTWFwICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgYXJncyA9IFtkb01hcCBhcyBNYXliZUNvbnRleHR1YWxBcmc8YW55PiwgLi4uYXJnc107XG4gICAgICBkb01hcCA9IHRydWUgYXMgTUFQO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgT3BlcmF0aW9uS2V5cy5SRUFELCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5nZXRDZXJ0aWZpY2F0ZXNcbiAgICApO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIGNlcnRpZmljYXRlcyR7cmVxdWVzdCA/IGAgZm9yICR7cmVxdWVzdC5pZH1gIDogXCJcIn0gZm9yIENBICR7dGhpcy5jb25maWcuY2FOYW1lfWBcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBDZXJ0aWZpY2F0ZVJlc3BvbnNlID0gKFxuICAgICAgYXdhaXQgdGhpcy5jZXJ0aWZpY2F0ZXMuZ2V0Q2VydGlmaWNhdGVzKHJlcXVlc3QgfHwge30sIHRoaXMudXNlcilcbiAgICApLnJlc3VsdDtcbiAgICBsb2cudmVyYm9zZShgRm91bmQgJHtyZXNwb25zZS5jZXJ0cy5sZW5ndGh9IGNlcnRpZmljYXRlc2ApO1xuICAgIGxvZy5kZWJ1ZyhyZXNwb25zZS5jZXJ0cyk7XG4gICAgcmV0dXJuIChcbiAgICAgIGRvTWFwID8gcmVzcG9uc2UuY2VydHMubWFwKChjKSA9PiBjLlBFTSkgOiByZXNwb25zZVxuICAgICkgYXMgTUFQIGV4dGVuZHMgZmFsc2UgPyBDZXJ0aWZpY2F0ZVJlc3BvbnNlIDogc3RyaW5nW107XG4gIH1cblxuICBhc3luYyBnZXRJZGVudGl0aWVzKGN0eDogQ29udGV4dCk6IFByb21pc2U8RmFicmljSWRlbnRpdHlbXT4ge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuZ2V0SWRlbnRpdGllcyk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgSWRlbnRpdGllcyB1bmRlciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZTogSWRlbnRpdHlSZXNwb25zZSA9IChhd2FpdCB0aGlzLmlkZW50aXRpZXMuZ2V0QWxsKHRoaXMudXNlcikpXG4gICAgICAucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmlkZW50aXRpZXMubGVuZ3RofSBJZGVudGl0aWVzYCk7XG4gICAgbG9nLmRlYnVnKHJlc3BvbnNlLmlkZW50aXRpZXMpO1xuICAgIHJldHVybiByZXNwb25zZS5pZGVudGl0aWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBhZmZpbGlhdGlvbnMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFF1ZXJpZXMgdGhlIENBIGZvciB0aGUgbGlzdCBvZiBhZmZpbGlhdGlvbnMgYXZhaWxhYmxlIHVuZGVyIHRoZSBjb25maWd1cmVkIENBLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZmZpbGlhdGlvbnMgcmVzdWx0IHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBnZXRBZmZpbGlhdGlvbnMoY3R4OiBDb250ZXh0KSB7XG4gICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IodGhpcy5nZXRBZmZpbGlhdGlvbnMpO1xuICAgIGxvZy52ZXJib3NlKGBSZXRyaWV2aW5nIEFmZmlsaWF0aW9ucyB1bmRlciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCB0aGlzLmFmZmlsaWF0aW9ucy5nZXRBbGwodGhpcy51c2VyKSkucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmEubGVuZ3RofSBBZmZpbGlhdGlvbnNgKTtcbiAgICBsb2cuZGVidWcoSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VFcnJvcihlOiBFcnJvcikge1xuICAgIGNvbnN0IHJlZ2V4cCA9IC8uKmNvZGU6XFxzKFxcZCspLio/bWVzc2FnZTpcXHNbXCInXSguKylbXCInXS9ncztcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4cC5leGVjKGUubWVzc2FnZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihlKTtcbiAgICBjb25zdCBbLCBjb2RlLCBtZXNzYWdlXSA9IG1hdGNoO1xuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSBcIjc0XCI6XG4gICAgICBjYXNlIFwiNzFcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKG1lc3NhZ2UpO1xuICAgICAgY2FzZSBcIjIwXCI6XG4gICAgICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKG1lc3NhZ2UpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWQgaWRlbnRpdHkgZGV0YWlscyBmcm9tIHRoZSBDQSBieSBlbnJvbGxtZW50IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIHZhbGlkYXRlcyBhIHNpbmdsZSBpZGVudGl0eSwgdGhyb3dpbmcgTm90Rm91bmRFcnJvciB3aGVuIG1pc3NpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGxvb2t1cC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxGYWJyaWNJZGVudGl0eT59IFRoZSBpZGVudGl0eSBkZXRhaWxzIHN0b3JlZCBpbiB0aGUgQ0EuXG4gICAqL1xuICBhc3luYyByZWFkKFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8RmFicmljSWRlbnRpdHk+IHtcbiAgICBjb25zdCB7IGxvZyB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIE9wZXJhdGlvbktleXMuUkVBRCwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVhZFxuICAgICk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgaWRlbnRpdHkgd2l0aCBlbnJvbGxtZW50IElEICR7ZW5yb2xsbWVudElkfWApO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuaWRlbnRpdGllcy5nZXRPbmUoZW5yb2xsbWVudElkLCB0aGlzLnVzZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkbid0IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcblxuICAgIHJldHVybiByZXN1bHQucmVzdWx0IGFzIEZhYnJpY0lkZW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhIG5ldyBpZGVudGl0eSB3aXRoIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHJlZ2lzdHJhdGlvbiByZXF1ZXN0IGZvciBhIG5ldyBlbnJvbGxtZW50IElELCByZXR1cm5pbmcgdGhlIGVucm9sbG1lbnQgc2VjcmV0IHVwb24gc3VjY2Vzcy5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZCBmb3IgdGhlIG5ldyBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gVGhlIGVucm9sbG1lbnQgc2VjcmV0IGZvciB0aGUgcmVnaXN0ZXJlZCBpZGVudGl0eS5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyKFxuICAgIG1vZGVsOiBDcmVkZW50aWFscyxcbiAgICBpc1N1cGVyVXNlcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiLFxuICAgIHVzZXJSb2xlPzogQ0FfUk9MRSB8IHN0cmluZyxcbiAgICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZSxcbiAgICBtYXhFbnJvbGxtZW50cz86IG51bWJlcixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWdpc3RlclwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5yZWdpc3RlclxuICAgICk7XG5cbiAgICBsZXQgcmVnaXN0cmF0aW9uOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdXNlck5hbWUsIHBhc3N3b3JkIH0gPSBtb2RlbDtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICBlbnJvbGxtZW50SUQ6IHVzZXJOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcGFzc3dvcmQsXG4gICAgICAgIGFmZmlsaWF0aW9uOiBhZmZpbGlhdGlvbixcbiAgICAgICAgdXNlclJvbGU6IHVzZXJSb2xlLFxuICAgICAgICBhdHRyczogYXR0cnMsXG4gICAgICAgIG1heEVucm9sbG1lbnRzOiBtYXhFbnJvbGxtZW50cyxcbiAgICAgIH0gYXMgSVJlZ2lzdGVyUmVxdWVzdDtcbiAgICAgIHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMuY2xpZW50LnJlZ2lzdGVyKHByb3BzLCB0aGlzLnVzZXIpO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBSZWdpc3RyYXRpb24gZm9yICR7dXNlck5hbWV9IGNyZWF0ZWQgd2l0aCB1c2VyIHR5cGUgJHt1c2VyUm9sZSA/PyBcIlVuZGVmaW5lZCBSb2xlXCJ9ICR7aXNTdXBlclVzZXIgPyBcImFzIHN1cGVyIHVzZXJcIiA6IFwiXCJ9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjdHg6IENvbnRleHRcbiAgKTogSWRlbnRpdHkge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuaWRlbnRpdHlGcm9tRW5yb2xsbWVudCk7XG4gICAgY29uc3QgeyBjZXJ0aWZpY2F0ZSwga2V5LCByb290Q2VydGlmaWNhdGUgfSA9IGVucm9sbG1lbnQ7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgR2VuZXJhdGluZyBJZGVudGl0eSBmcm9tIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGV9IGluIG1zcCAke21zcElkfWBcbiAgICApO1xuICAgIGNvbnN0IGNsaWVudElkID0gQ3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGlkID0gQ3J5cHRvVXRpbHMuZW5jb2RlKGNsaWVudElkKTtcbiAgICBsb2cuZGVidWcoYElkZW50aXR5ICR7Y2xpZW50SWR9IGFuZCBlbmNvZGVkSWQgJHtpZH1gKTtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5KHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgY2VydGlmaWNhdGU6IGNlcnRpZmljYXRlLFxuICAgICAgICBwcml2YXRlS2V5OiBrZXkudG9CeXRlcygpLFxuICAgICAgICByb290Q2VydGlmaWNhdGU6IHJvb3RDZXJ0aWZpY2F0ZSxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogbXNwSWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVucm9sbCBhbiBpZGVudGl0eSB3aXRoIHRoZSBDQSB1c2luZyBhIHJlZ2lzdHJhdGlvbiBzZWNyZXQuXG4gICAqIEBzdW1tYXJ5IEV4Y2hhbmdlcyB0aGUgZW5yb2xsbWVudCBJRCBhbmQgc2VjcmV0IGZvciBjZXJ0aWZpY2F0ZXMsIHJldHVybmluZyBhIGNvbnN0cnVjdGVkIElkZW50aXR5IG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBlbnJvbGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb24gLSBFbnJvbGxtZW50IHNlY3JldCByZXR1cm5lZCBhdCByZWdpc3RyYXRpb24gdGltZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBlbnJvbGxlZCBpZGVudGl0eSBvYmplY3Qgd2l0aCBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIGVucm9sbChcbiAgICBlbnJvbGxtZW50SWQ6IHN0cmluZyxcbiAgICByZWdpc3RyYXRpb246IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwiZW5yb2xsXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLmVucm9sbFxuICAgICk7XG4gICAgbGV0IGlkZW50aXR5OiBJZGVudGl0eTtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKGBFbnJvbGxpbmcgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgICBjb25zdCBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5lbnJvbGwoe1xuICAgICAgICBlbnJvbGxtZW50SUQ6IGVucm9sbG1lbnRJZCxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcmVnaXN0cmF0aW9uLFxuICAgICAgfSk7XG4gICAgICBpZGVudGl0eSA9IEZhYnJpY0lkZW50aXR5U2VydmljZS5pZGVudGl0eUZyb21FbnJvbGxtZW50KFxuICAgICAgICBlbnJvbGxtZW50LFxuICAgICAgICB0aGlzLmNvbmZpZy5jYU5hbWUsXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgU3VjY2Vzc2Z1bGx5IGVucm9sbGVkICR7ZW5yb2xsbWVudElkfSB1bmRlciAke3RoaXMuY29uZmlnLmNhTmFtZX0gYXMgJHtpZGVudGl0eS5pZH1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGFuZCBlbnJvbGwgYSBuZXcgaWRlbnRpdHkgaW4gb25lIHN0ZXAuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhIG5ldyBlbnJvbGxtZW50IElEIHdpdGggdGhlIENBIGFuZCBpbW1lZGlhdGVseSBleGNoYW5nZXMgdGhlIHNlY3JldCB0byBlbnJvbGwsIHJldHVybmluZyB0aGUgY3JlYXRlZCBJZGVudGl0eS5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBmb3IgdGhlIG5ldyBpZGVudGl0eSBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlckFuZEVucm9sbChcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXIsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWdpc3Rlci1lbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVnaXN0ZXJBbmRFbnJvbGxcbiAgICApO1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMucmVnaXN0ZXIoXG4gICAgICBtb2RlbCxcbiAgICAgIGlzU3VwZXJVc2VyLFxuICAgICAgYWZmaWxpYXRpb24sXG4gICAgICB1c2VyUm9sZSxcbiAgICAgIGF0dHJzLFxuICAgICAgbWF4RW5yb2xsbWVudHMsXG4gICAgICBjdHhcbiAgICApO1xuICAgIGNvbnN0IHsgdXNlck5hbWUgfSA9IG1vZGVsO1xuICAgIHJldHVybiB0aGlzLmVucm9sbCh1c2VyTmFtZSBhcyBzdHJpbmcsIHJlZ2lzdHJhdGlvbiwgY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmUtZW5yb2xsIGFuIGV4aXN0aW5nIGlkZW50aXR5IHVzaW5nIGl0cyBjdXJyZW50IGVucm9sbG1lbnQuXG4gICAqIEBzdW1tYXJ5IFJlbmV3cyB0aGUgZW5yb2xsbWVudCBjZXJ0aWZpY2F0ZSBieSBjYWxsaW5nIHRoZSBDQSByZWVucm9sbC5cbiAgICogQHBhcmFtIHtVc2VyfSBjdXJyZW50VXNlciAtIEFscmVhZHkgZW5yb2xsZWQgdXNlciwgbXVzdCBoYXZlIGEgc2lnbmluZyBpZGVudGl0eS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSByZW5ld2VkIGlkZW50aXR5IG9iamVjdCB3aXRoIG5ldyBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUlkZW50aXR5KFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIGlkZW50aXR5OiB7IGNlcnRpZmljYXRlOiBzdHJpbmc7IHByaXZhdGVLZXk6IHN0cmluZyB9LFxuICAgIGlkZW50aXR5UmVxdWVzdDogSUlkZW50aXR5UmVxdWVzdCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwicmVlbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudXBkYXRlSWRlbnRpdHlcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxvZy5pbmZvKGBSZW5ld2luZyBpZGVudGl0eSBmb3IgJHtlbnJvbGxtZW50SWR9YCk7XG5cbiAgICAgIC8vIFVwZGF0ZSBhdHRyaWJ1dGVzIGluIHRoZSBDQSByZWdpc3RyeSAoYWRtaW4gb3BlcmF0aW9uKS4gVGhpcyBjaGFuZ2VzIHRoZSBcInNvdXJjZSBvZiB0cnV0aFwiLlxuICAgICAgY29uc3QgaWRlbnRpdHlTZXJ2aWNlID0gdGhpcy5jbGllbnQubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG5cbiAgICAgIGNvbnN0IGNhVXNlcklkZW50aXR5ID0gKGF3YWl0IGlkZW50aXR5U2VydmljZS5nZXRPbmUoXG4gICAgICAgIGVucm9sbG1lbnRJZCxcbiAgICAgICAgdGhpcy51c2VyXG4gICAgICApKSBhcyB7IHJlc3VsdDogeyBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZVtdIH0gfTtcblxuICAgICAgYXdhaXQgaWRlbnRpdHlTZXJ2aWNlLnVwZGF0ZShlbnJvbGxtZW50SWQsIGlkZW50aXR5UmVxdWVzdCwgdGhpcy51c2VyKTsgLy8gYXMgSVNlcnZpY2VSZXNwb25zZSAmIHsgcmVzdWx0OiBJSWRlbnRpdHlSZXF1ZXN0IH07XG5cbiAgICAgIC8vIFJlZW5yb2xsIGFzIHRoZSB1c2VyLiBSZXF1ZXN0IG11c3QgYmUgc2lnbmVkIHVzaW5nIHRoZSBleGlzdGluZyBjZXJ0aWZpY2F0ZS5cbiAgICAgIGNvbnN0IHJlZW5yb2xsVXNlciA9IFVzZXIuY3JlYXRlVXNlcihcbiAgICAgICAgZW5yb2xsbWVudElkLFxuICAgICAgICBcIlwiLCAvLyBlbnJvbGxtZW50U2VjcmV0IG5vdCByZXF1aXJlZCBmb3IgcmVlbnJvbGxcbiAgICAgICAgdGhpcy51c2VyLmdldE1zcGlkKCksXG4gICAgICAgIGlkZW50aXR5LmNlcnRpZmljYXRlLFxuICAgICAgICBpZGVudGl0eS5wcml2YXRlS2V5XG4gICAgICApO1xuICAgICAgcmVlbnJvbGxVc2VyLnNldENyeXB0b1N1aXRlKHRoaXMudXNlci5nZXRDcnlwdG9TdWl0ZSgpKTtcblxuICAgICAgY29uc3QgZW5yb2xsbWVudEF0dHJzOiBJQXR0cmlidXRlUmVxdWVzdFtdID0gKFxuICAgICAgICBjYVVzZXJJZGVudGl0eS5yZXN1bHQuYXR0cnMgfHwgW11cbiAgICAgICkubWFwKCh7IG5hbWUgfSkgPT4gKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgfSkpO1xuXG4gICAgICBjb25zdCBlbnJvbGxtZW50ID0gYXdhaXQgdGhpcy5jbGllbnQucmVlbnJvbGwoXG4gICAgICAgIHJlZW5yb2xsVXNlcixcbiAgICAgICAgZW5yb2xsbWVudEF0dHJzXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZW5ld2VkSWRlbnRpdHkgPSBGYWJyaWNJZGVudGl0eVNlcnZpY2UuaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICAgICAgZW5yb2xsbWVudCxcbiAgICAgICAgdGhpcy5jb25maWcuY2FOYW1lLFxuICAgICAgICBjdHhcbiAgICAgICk7XG5cbiAgICAgIC8vIFJldm9rZSB0aGUgcHJldmlvdXMgY2VydGlmaWNhdGUgb25seSwgc28gdGhlIG9sZCBjZXJ0IGJlY29tZXMgaW52YWxpZC5cbiAgICAgIGxvZy5kZWJ1ZyhgUmV2b2tpbmcgcHJldmlvdXMgY2VydGlmaWNhdGVzIGZvciAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIGNvbnN0IHsgYWtpLCBzZXJpYWwgfSA9IGdldEFraUFuZFNlcmlhbEZyb21DZXJ0KGlkZW50aXR5LmNlcnRpZmljYXRlKTtcbiAgICAgIGF3YWl0IHRoaXMucmV2b2tlKGVucm9sbG1lbnRJZCwgeyBha2ksIHNlcmlhbCB9LCBhcmdzKTtcblxuICAgICAgbG9nLmRlYnVnKGBSZW5ldyBpZGVudGl0eSBzdWNjZXNzZnVsIGZvciAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIHJldHVybiByZW5ld2VkSWRlbnRpdHk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldm9rZXMgdGhlIGVucm9sbG1lbnQgb2YgYW4gaWRlbnRpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIGVucm9sbG1lbnQgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBlbnJvbGxtZW50SWQgLSBUaGUgZW5yb2xsbWVudCBJRCBvZiB0aGUgaWRlbnRpdHkgdG8gYmUgcmV2b2tlZC5cbiAgICpcbiAgICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlc3VsdCBvZiB0aGUgcmV2b2NhdGlvbiBvcGVyYXRpb24uXG4gICAqXG4gICAqIEB0aHJvd3Mge05vdEZvdW5kRXJyb3J9IElmIHRoZSBlbnJvbGxtZW50IHdpdGggdGhlIHNwZWNpZmllZCBJRCBkb2VzIG5vdCBleGlzdC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlcmUgaXMgYW4gZXJyb3IgZHVyaW5nIHRoZSByZXZvY2F0aW9uIHByb2Nlc3MuXG4gICAqL1xuICBhc3luYyByZXZva2UoXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgcmV2b2tlT3B0aW9uczogT21pdDxJUmV2b2tlUmVxdWVzdCwgXCJlbnJvbGxtZW50SURcIj4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJU2VydmljZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInJldm9rZVwiLCB0cnVlKSkuZm9yKHRoaXMucmV2b2tlKTtcbiAgICBsb2cudmVyYm9zZShgUmV2b2tpbmcgaWRlbnRpdHkgd2l0aCBlbnJvbGxtZW50IElEICR7ZW5yb2xsbWVudElkfWApO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgdGhpcy5yZWFkKGVucm9sbG1lbnRJZCk7XG4gICAgaWYgKCFpZGVudGl0eSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfWBcbiAgICAgICk7XG4gICAgbGV0IHJlc3VsdDogSVNlcnZpY2VSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgQm9vbGVhbihyZXZva2VPcHRpb25zLnNlcmlhbCkgfHwgQm9vbGVhbihyZXZva2VPcHRpb25zLmFraSlcbiAgICAgICAgICA/IFwiUmV2b2tlIFVzZXIgQ2VydGlmaWNhdGVcIlxuICAgICAgICAgIDogXCJVc2VyIERlbGV0aW9uXCI7XG5cbiAgICAgIGNvbnN0IHJldm9rZVJlcXVlc3Q6IElSZXZva2VSZXF1ZXN0ID0ge1xuICAgICAgICByZWFzb24sXG4gICAgICAgIC4uLnJldm9rZU9wdGlvbnMsXG4gICAgICAgIGVucm9sbG1lbnRJRDogaWRlbnRpdHkuaWQsXG4gICAgICB9O1xuXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmNsaWVudC5yZXZva2UocmV2b2tlUmVxdWVzdCwgdGhpcy51c2VyKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgcm9sZSB0eXBlcyB1c2VkIGR1cmluZyBlbnJvbGxtZW50IGFuZCByZWdpc3RyYXRpb24uXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBzdGFuZGFyZCBIeXBlcmxlZGdlciBGYWJyaWMgQ0Egcm9sZXMgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gaWRlbnRpdGllcyB3aGVuIHJlZ2lzdGVyaW5nIHdpdGggdGhlIENBIHNlcnZpY2UuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIENBX1JPTEUge1xuICAvKiogQWRtaW5pc3RyYXRvciByb2xlIHdpdGggZWxldmF0ZWQgcHJpdmlsZWdlcyBmb3IgbWFuYWdpbmcgaWRlbnRpdGllcyBhbmQgYWZmaWxpYXRpb25zICovXG4gIEFETUlOID0gXCJhZG1pblwiLFxuICAvKiogU3RhbmRhcmQgdXNlciByb2xlIGZvciBhcHBsaWNhdGlvbiBjbGllbnRzIGludGVyYWN0aW5nIHdpdGggdGhlIG5ldHdvcmsgKi9cbiAgVVNFUiA9IFwidXNlclwiLFxuICAvKiogQ2xpZW50IHJvbGUgdHlwaWNhbGx5IHVzZWQgZm9yIFNESy1iYXNlZCBpbnRlcmFjdGlvbnMgYW5kIHNlcnZpY2UgYWNjb3VudHMgKi9cbiAgQ0xJRU5UID0gXCJjbGllbnRcIixcbn1cbiIsImltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRGYWJyaWNDbGllbnRGbGFnczogRmFicmljQ2xpZW50RmxhZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgZXZhbHVhdGVUaW1lb3V0OiA1LFxuICBlbmRvcnNlVGltZW91dDogMTUsXG4gIHN1Ym1pdFRpbWVvdXQ6IDUsXG4gIGNvbW1pdFRpbWVvdXQ6IDYwLFxuICBsZWdhY3k6IGZhbHNlLFxuICBhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3M6IGZhbHNlLFxuICBhbGxvd0dhdGV3YXlPdmVycmlkZTogZmFsc2UsXG4gIHJlYnVpbGRXaXRoVHJhbnNpZW50OiB0cnVlLFxuICBlbmNyeXB0VHJhbnNpZW50OiBmYWxzZSxcbiAgc3ludGhldGljRXZlbnRzOiB0cnVlLFxufSkgYXMgYW55O1xuIiwiaW1wb3J0IHsgaXNCcm93c2VyLCBNaW5pTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVJbXBvcnQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuY29uc3QgbG9nID0gbmV3IE1pbmlMb2dnZXIoXCJmYWJyaWMtZnNcIik7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIExvYWRzIGNvbnRlbnQgZnJvbSBhIGZpbGUgb3IgcmV0dXJucyB0aGUgY29udGVudCBpZiBhbHJlYWR5IGxvYWRlZFxuICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiB0aGUgaW5wdXQgaXMgYWxyZWFkeSBjb250ZW50IG9yIGEgcGF0aCB0byBhIGZpbGUsIGFuZCBsb2FkcyB0aGUgZmlsZSBpZiBuZWVkZWRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudE9yUGF0aCAtIFRoZSBjb250ZW50IG9yIHBhdGggdG8gbG9hZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZmlsZVJlYWRlciAtIEZ1bmN0aW9uIHRvIHJlYWQgdGhlIGZpbGUgaWYgY29udGVudE9yUGF0aCBpcyBhIHBhdGhcbiAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nIHwgVWludDhBcnJheSB8IEJ1ZmZlcj59IFRoZSBjb250ZW50XG4gKiBAZnVuY3Rpb24gY29udGVudE9mTG9hZEZpbGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbnRlbnRPZkxvYWRGaWxlKFxuICBjb250ZW50T3JQYXRoOiBzdHJpbmcgfCBVaW50OEFycmF5LFxuICBmaWxlUmVhZGVyOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+XG4pIHtcbiAgaWYgKGNvbnRlbnRPclBhdGggaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgaWYgKFxuICAgIGNvbnRlbnRPclBhdGgubWF0Y2goXG4gICAgICAvLS0tLS1CRUdJTiAoQ0VSVElGSUNBVEV8S0VZfFBSSVZBVEUgS0VZKS0tLS0tLis/LS0tLS1FTkQgXFwxLS0tLS0kL2dtc1xuICAgIClcbiAgKVxuICAgIHJldHVybiBjb250ZW50T3JQYXRoO1xuICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBmaWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtXG4gKiBAc3VtbWFyeSBMb2FkcyBhIGZpbGUgdXNpbmcgdGhlIE5vZGUuanMgZmlsZSBzeXN0ZW0gbW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZyB8IEJ1ZmZlcn0gY29udGVudE9yUGF0aCAtIFRoZSBjb250ZW50IG9yIHBhdGggdG8gbG9hZFxuICogQHJldHVybiB7UHJvbWlzZTxCdWZmZXI+fSBUaGUgZmlsZSBjb250ZW50IGFzIGEgQnVmZmVyXG4gKiBAZnVuY3Rpb24gcmVhZEZpbGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRGaWxlKGNvbnRlbnRPclBhdGg6IHN0cmluZyB8IEJ1ZmZlcikge1xuICBpZiAodHlwZW9mIGNvbnRlbnRPclBhdGggIT09IFwic3RyaW5nXCIpIHJldHVybiBjb250ZW50T3JQYXRoO1xuXG4gIGNvbnN0IGZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUocGF0aCk7XG4gIH07XG5cbiAgcmV0dXJuIGF3YWl0IGZpbGVSZWFkZXIoY29udGVudE9yUGF0aCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgdXNlclxuICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSB1c2VyIHdpdGggdGhlIGdpdmVuIGNyZWRlbnRpYWxzIGZvciBpbnRlcmFjdGluZyB3aXRoIGEgRmFicmljIENBXG4gKiBAcGFyYW0ge3N0cmluZ30gdXNlck5hbWUgLSBUaGUgdXNlciBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJpdmF0ZUtleSAtIFRoZSBwcml2YXRlIGtleSBhcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IGNlcnRpZmljYXRlIC0gVGhlIGNlcnRpZmljYXRlIGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNwSWQgLSBUaGUgTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gKiBAcmV0dXJuIHtQcm9taXNlPFVzZXI+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCB1c2VyXG4gKiBAZnVuY3Rpb24gZ2V0Q0FVc2VyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDQVVzZXIoXG4gIHVzZXJOYW1lOiBzdHJpbmcsXG4gIHByaXZhdGVLZXk6IHN0cmluZyxcbiAgY2VydGlmaWNhdGU6IHN0cmluZyxcbiAgbXNwSWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxVc2VyPiB7XG4gIGxvZy5kZWJ1ZyhcbiAgICBgQ3JlYXRpbmcgYSBDQSAke21zcElkfSB1c2VyICR7dXNlck5hbWV9IHdpdGggY2VydGlmaWNhdGUgJHtjZXJ0aWZpY2F0ZX1gXG4gICk7XG4gIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih1c2VyTmFtZSk7XG4gIGNvbnN0IGNyeXB0b1N1aXRlID0gVXNlci5uZXdDcnlwdG9TdWl0ZSgpO1xuICB1c2VyLnNldENyeXB0b1N1aXRlKGNyeXB0b1N1aXRlKTtcbiAgY29uc3QgaW1wb3J0ZWRLZXkgPSBjcnlwdG9TdWl0ZS5jcmVhdGVLZXlGcm9tUmF3KHByaXZhdGVLZXkpO1xuICBhd2FpdCB1c2VyLnNldEVucm9sbG1lbnQoaW1wb3J0ZWRLZXksIGNlcnRpZmljYXRlLCBtc3BJZCk7XG4gIHJldHVybiB1c2VyO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIGFuIGlkZW50aXR5IGZyb20gYSBjZXJ0aWZpY2F0ZSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IExvYWRzIGEgY2VydGlmaWNhdGUgZnJvbSBhIGRpcmVjdG9yeSBhbmQgY3JlYXRlcyBhbiBJZGVudGl0eSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc3BJZCAtIFRoZSBNZW1iZXJzaGlwIFNlcnZpY2UgUHJvdmlkZXIgSURcbiAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZVxuICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBpZGVudGl0eVxuICogQGZ1bmN0aW9uIGdldElkZW50aXR5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRJZGVudGl0eShcbiAgbXNwSWQ6IHN0cmluZyxcbiAgY2VydERpcmVjdG9yeVBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICBjb25zdCBpZGVudGl0eUZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCBjZXJ0UGF0aCA9IGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShjZXJ0UGF0aCk7XG4gICAgcmV0dXJuIGNyZWRlbnRpYWxzO1xuICB9O1xuXG4gIGNvbnN0IGNyZWRlbnRpYWxzOiBVaW50OEFycmF5ID0gKGF3YWl0IGNvbnRlbnRPZkxvYWRGaWxlKFxuICAgIGNlcnREaXJlY3RvcnlQYXRoLFxuICAgIGlkZW50aXR5RmlsZVJlYWRlclxuICApKSBhcyBVaW50OEFycmF5O1xuXG4gIHJldHVybiB7IG1zcElkLCBjcmVkZW50aWFscyB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBmdWxsIHBhdGggb2YgdGhlIGZpcnN0IGZpbGUgaW4gYSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZGlyZWN0b3J5IGFuZCByZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBmaXJzdCBmaWxlIGZvdW5kXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyUGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeVxuICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZnVsbCBwYXRoIG9mIHRoZSBmaXJzdCBmaWxlXG4gKiBAZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBwcm9taXNlcy5yZWFkZGlyKGRpclBhdGgpO1xuICByZXR1cm4gam9pbihkaXJQYXRoLCBmaWxlc1swXSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGZpcnN0IGZpbGUgaW4gYSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZGlyZWN0b3J5LCBmaW5kcyB0aGUgZmlyc3QgZmlsZSwgYW5kIHJldHVybnMgaXRzIGNvbnRlbnQgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXJQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjb250ZW50IG9mIHRoZSBmaXJzdCBmaWxlXG4gKiBAZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KFxuICBkaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcInBhdGhcIikpO1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gIHJldHVybiAoYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoam9pbihkaXJQYXRoLCBmaWxlc1swXSkpKS50b1N0cmluZygpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgc2lnbmVyIGZyb20gYSBrZXkgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBMb2FkcyBhIHByaXZhdGUga2V5IGZyb20gYSBkaXJlY3RvcnkgYW5kIGNyZWF0ZXMgYSBTaWduZXIgZm9yIEZhYnJpYyB0cmFuc2FjdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlEaXJlY3RvcnlQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHByaXZhdGUga2V5XG4gKiBAcmV0dXJuIHtQcm9taXNlPFNpZ25lcj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBzaWduZXJcbiAqIEBmdW5jdGlvbiBnZXRTaWduZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNpZ25lcihrZXlEaXJlY3RvcnlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFNpZ25lcj4ge1xuICBjb25zdCBzaWduZXJGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgY29uc3Qga2V5UGF0aCA9IGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGtleVBhdGgpO1xuICB9O1xuXG4gIGNvbnN0IHByaXZhdGVLZXlQZW0gPSAoYXdhaXQgY29udGVudE9mTG9hZEZpbGUoXG4gICAga2V5RGlyZWN0b3J5UGF0aCxcbiAgICBzaWduZXJGaWxlUmVhZGVyXG4gICkpIGFzIEJ1ZmZlcjtcbiAgLy8gTm9kZSBiYXNlZCBpbXBsZW1lbnRhdGlvblxuICAvLyBwcml2YXRlS2V5ID0gY3JlYXRlUHJpdmF0ZUtleShwcml2YXRlS2V5UGVtKTtcbiAgLy8gLS1cblxuICAvLyB3ZWIgYmFzZWQgaW1wbGVtZW50YXRpb25cbiAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IGV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhwcml2YXRlS2V5KTtcbiAgY29uc3QgayA9IChwcml2YXRlS2V5IGFzIGFueSlba2V5c1swXV07XG4gIC8vIC0tXG5cbiAgcmV0dXJuIHNpZ25lcnMubmV3UHJpdmF0ZUtleVNpZ25lcihrIGFzIGFueSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV4dHJhY3RzIGEgcHJpdmF0ZSBrZXkgZnJvbSBhIFBFTSBidWZmZXJcbiAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXkgdG8gYSBDcnlwdG9LZXkgb2JqZWN0XG4gKiBAcGFyYW0ge0J1ZmZlcn0gcGVtIC0gVGhlIFBFTS1lbmNvZGVkIHByaXZhdGUga2V5XG4gKiBAcmV0dXJuIHtQcm9taXNlPENyeXB0b0tleT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBDcnlwdG9LZXlcbiAqIEBmdW5jdGlvbiBleHRyYWN0UHJpdmF0ZUtleVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgRXh0cmFjdFByaXZhdGVLZXlcbiAqICAgcGFydGljaXBhbnQgU3VidGxlQ3J5cHRvXG4gKlxuICogICBDYWxsZXItPj5FeHRyYWN0UHJpdmF0ZUtleTogZXh0cmFjdFByaXZhdGVLZXkocGVtKVxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PkV4dHJhY3RQcml2YXRlS2V5OiBHZXQgU3VidGxlQ3J5cHRvIGltcGxlbWVudGF0aW9uXG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+RXh0cmFjdFByaXZhdGVLZXk6IFBhcnNlIFBFTSBmb3JtYXRcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5FeHRyYWN0UHJpdmF0ZUtleTogQ29udmVydCB0byBiaW5hcnkgREVSXG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+U3VidGxlQ3J5cHRvOiBpbXBvcnRLZXkocGtjczgsIGJpbmFyeURlciwgb3B0aW9ucylcbiAqICAgU3VidGxlQ3J5cHRvLS0+PkV4dHJhY3RQcml2YXRlS2V5OiBDcnlwdG9LZXlcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktLT4+Q2FsbGVyOiBDcnlwdG9LZXlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyKSB7XG4gIGNvbnN0IGxpYk5hbWUgPSBcImNyeXB0b1wiO1xuICBsZXQgc3VidGxlO1xuICBpZiAoaXNCcm93c2VyKCkpIHtcbiAgICBzdWJ0bGUgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmNyeXB0by5zdWJ0bGU7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbGliID0gKGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQobGliTmFtZSkpKSBhcyBhbnk7XG4gICAgc3VidGxlID0gbGliLnN1YnRsZSB8fCBsaWIud2ViY3J5cHRvLnN1YnRsZTtcbiAgfVxuXG4gIGlmICghc3VidGxlKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBTdWJ0bGVDcnlwdG8gbW9kdWxlXCIpO1xuXG4gIGZ1bmN0aW9uIHN0cjJhYihzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihzdHIubGVuZ3RoKTtcbiAgICBjb25zdCBidWZWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICBmb3IgKGxldCBpID0gMCwgc3RyTGVuID0gc3RyLmxlbmd0aDsgaSA8IHN0ckxlbjsgaSsrKSB7XG4gICAgICBidWZWaWV3W2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICBjb25zdCBzdHIgPSBwZW1cbiAgICAudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgLnJlcGxhY2UoXCItLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cIiwgXCJcIilcbiAgICAucmVwbGFjZUFsbChcIlxcblwiLCBcIlwiKVxuICAgIC5yZXBsYWNlKFwiLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLVwiLCBcIlwiKTtcbiAgY29uc3QgZGVjb2RlZCA9IEJ1ZmZlci5mcm9tKHN0ciwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJiaW5hcnlcIik7XG4gIGNvbnN0IGJpbmFyeURlciA9IHN0cjJhYihkZWNvZGVkKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICBcInBrY3M4XCIsXG4gICAgICBiaW5hcnlEZXIsXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgbmFtZWRDdXJ2ZTogXCJQLTI1NlwiLFxuICAgICAgfSxcbiAgICAgIHRydWUsXG4gICAgICBbXCJzaWduXCJdXG4gICAgKTtcblxuICAgIHJldHVybiBrZXk7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyRmxhZ3MsXG4gIENvbmRpdGlvbixcbiAgQ29udGV4dCxcbiAgR3JvdXBPcGVyYXRvcixcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBPcGVyYXRvcixcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUHJlcGFyZWRTdGF0ZW1lbnQsXG4gIFByZXBhcmVkU3RhdGVtZW50S2V5cyxcbiAgUXVlcnlDbGF1c2UsXG4gIFF1ZXJ5RXJyb3IsXG4gIFJlcG9zaXRvcnksXG4gIFNlbGVjdFNlbGVjdG9yLFxuICBTZXF1ZW5jZSxcbiAgU3RhdGVtZW50LFxuICBTdGF0ZW1lbnRFeGVjdXRvcixcbiAgVmlld0tpbmQsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHtcbiAgQ291Y2hEQktleXMsXG4gIENvdWNoREJPcGVyYXRvcixcbiAgQ291Y2hEQkdyb3VwT3BlcmF0b3IsXG4gIENvdWNoREJRdWVyeUxpbWl0LFxuICBNYW5nb1F1ZXJ5LFxuICBNYW5nb09wZXJhdG9yLFxuICBNYW5nb1NlbGVjdG9yLFxuICB0cmFuc2xhdGVPcGVyYXRvcnMsXG4gIGdlbmVyYXRlRGVzaWduRG9jTmFtZSxcbiAgZ2VuZXJhdGVWaWV3TmFtZSxcbiAgZmluZFZpZXdNZXRhZGF0YSxcbiAgQ291Y2hEQlZpZXdNZXRhZGF0YSxcbiAgVmlld1Jlc3BvbnNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB0b0NhbWVsQ2FzZSB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgREJLZXlzLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG50eXBlIEZhYnJpY1ZpZXdEZXNjcmlwdG9yID0ge1xuICBkZG9jOiBzdHJpbmc7XG4gIHZpZXc6IHN0cmluZztcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55Pjtcbn07XG5cbnR5cGUgRmFicmljQWdncmVnYXRlSW5mbyA9XG4gIHwge1xuICAgICAga2luZDogVmlld0tpbmQ7XG4gICAgICBtZXRhOiBDb3VjaERCVmlld01ldGFkYXRhO1xuICAgICAgZGVzY3JpcHRvcjogRmFicmljVmlld0Rlc2NyaXB0b3I7XG4gICAgICBjb3VudERpc3RpbmN0PzogYm9vbGVhbjtcbiAgICB9XG4gIHwge1xuICAgICAga2luZDogXCJhdmdcIjtcbiAgICAgIGF0dHJpYnV0ZTogc3RyaW5nO1xuICAgICAgc3VtRGVzY3JpcHRvcjogRmFicmljVmlld0Rlc2NyaXB0b3I7XG4gICAgICBjb3VudERlc2NyaXB0b3I6IEZhYnJpY1ZpZXdEZXNjcmlwdG9yO1xuICAgIH07XG5cbmNvbnN0IGVzY2FwZVJlZ0V4cCA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+XG4gIHZhbHVlLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBcIlxcXFwkJlwiKTtcblxuZnVuY3Rpb24gbmV4dExleGljb2dyYXBoaWNTdHJpbmcodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIlxcdTAwMDBcIjtcbiAgY29uc3QgY2hhcnMgPSBBcnJheS5mcm9tKHZhbHVlKTtcbiAgZm9yIChsZXQgaSA9IGNoYXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgY29uc3QgY29kZSA9IGNoYXJzW2ldLmNvZGVQb2ludEF0KDApO1xuICAgIGlmIChjb2RlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmIChjb2RlIDwgMHgxMGZmZmYpIHtcbiAgICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZSArIDEpO1xuICAgICAgcmV0dXJuIGNoYXJzLnNsaWNlKDAsIGkgKyAxKS5qb2luKFwiXCIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYCR7dmFsdWV9XFx1MDAwMGA7XG59XG5cbmZ1bmN0aW9uIHByZWZpeFJhbmdlKHByZWZpeDogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHByZWZpeCxcbiAgICBlbmQ6IG5leHRMZXhpY29ncmFwaGljU3RyaW5nKHByZWZpeCksXG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnRTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsLCBSPiBleHRlbmRzIFN0YXRlbWVudDxcbiAgTSxcbiAgRmFicmljQ2xpZW50QWRhcHRlcixcbiAgUixcbiAgTWFuZ29RdWVyeVxuPiB7XG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IEZhYnJpY0NsaWVudEFkYXB0ZXIsIG92ZXJyaWRlcz86IFBhcnRpYWw8QWRhcHRlckZsYWdzPikge1xuICAgIHN1cGVyKGFkYXB0ZXIsIG92ZXJyaWRlcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3F1YXNoKFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc3F1YXNoZWQ6IFByZXBhcmVkU3RhdGVtZW50PE0+IHwgdW5kZWZpbmVkID0gc3VwZXIuc3F1YXNoKFxuICAgICAgY3R4IGFzIG5ldmVyXG4gICAgKTtcbiAgICBpZiAoIXNxdWFzaGVkKSByZXR1cm4gc3F1YXNoZWQ7XG5cbiAgICBjb25zdCB7IG1ldGhvZCwgcGFyYW1zLCBhcmdzIH0gPSBzcXVhc2hlZDtcbiAgICBjb25zdCB7IGRpcmVjdGlvbiwgbGltaXQgfSA9IHBhcmFtcztcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORDpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uLCBsaW1pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWTpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5MSVNUX0JZOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFX0JZOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uLCBsaW1pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQlk6XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIG1ldGhvZCAke21ldGhvZH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3F1YXNoZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZXhlY3V0ZVByZXBhcmVkKFxuICAgIC4uLmFyZ3o6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgcmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwodGhpcy5mcm9tU2VsZWN0b3IsIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgY29uc3QgeyBtZXRob2QsIGFyZ3MgfSA9IHRoaXMucHJlcGFyZWQgYXMgUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PjtcbiAgICByZXR1cm4gcmVwby5zdGF0ZW1lbnQobWV0aG9kLCAuLi5hcmdzLCAuLi5hcmd6KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHByZXBhcmUoXG4gICAgY3R4PzogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogUHJvbWlzZTxTdGF0ZW1lbnRFeGVjdXRvcjxNLCBSPj4ge1xuICAgIGN0eCA9XG4gICAgICBjdHggfHxcbiAgICAgIChhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgUGVyc2lzdGVuY2VLZXlzLlFVRVJZLFxuICAgICAgICB0aGlzLm92ZXJyaWRlcyB8fCB7fSxcbiAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICkpO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1NpbXBsZVF1ZXJ5KCkgJiZcbiAgICAgIChjdHggYXMgQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4pLmdldChcImZvcmNlUHJlcGFyZVNpbXBsZVF1ZXJpZXNcIilcbiAgICApIHtcbiAgICAgIGNvbnN0IHNxdWFzaGVkID0gdGhpcy5zcXVhc2goY3R4IGFzIENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+KTtcbiAgICAgIGlmIChzcXVhc2hlZCkge1xuICAgICAgICB0aGlzLnByZXBhcmVkID0gc3F1YXNoZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW107XG4gICAgY29uc3QgcGFyYW1zOiBhbnkgPSB7fSBhcyBhbnk7XG5cbiAgICBjb25zdCBwcmVwYXJlZDogUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PiA9IHtcbiAgICAgIGNsYXNzOiB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIGFyZ3MsXG4gICAgICBwYXJhbXMsXG4gICAgfSBhcyBhbnk7XG5cbiAgICBjb25zdCBtZXRob2Q6IHN0cmluZ1tdID0gW1F1ZXJ5Q2xhdXNlLkZJTkRfQlldO1xuXG4gICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucHJlcGFyZUNvbmRpdGlvbih0aGlzLndoZXJlQ29uZGl0aW9uLCBjdHggYXMgbmV2ZXIpO1xuICAgICAgbWV0aG9kLnB1c2gocGFyc2VkLm1ldGhvZCk7XG4gICAgICBpZiAocGFyc2VkLmFyZ3MgJiYgcGFyc2VkLmFyZ3MubGVuZ3RoKVxuICAgICAgICBhcmdzLnB1c2goLi4uKHBhcnNlZC5hcmdzIGFzIChzdHJpbmcgfCBudW1iZXIpW10pKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0U2VsZWN0b3IpXG4gICAgICBtZXRob2QucHVzaChcbiAgICAgICAgUXVlcnlDbGF1c2UuU0VMRUNULFxuICAgICAgICB0aGlzLnNlbGVjdFNlbGVjdG9yLmpvaW4oYCAke1F1ZXJ5Q2xhdXNlLkFORC50b0xvd2VyQ2FzZSgpfSBgKVxuICAgICAgKTtcbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3JzPy5sZW5ndGgpIHtcbiAgICAgIG1ldGhvZC5wdXNoKFF1ZXJ5Q2xhdXNlLk9SREVSX0JZLCB0aGlzLm9yZGVyQnlTZWxlY3RvcnNbMF1bMF0gYXMgc3RyaW5nKTtcbiAgICAgIGFyZ3MucHVzaCh0aGlzLm9yZGVyQnlTZWxlY3RvcnNbMF1bMV0gYXMgYW55KTtcbiAgICB9XG4gICAgcHJlcGFyZWQubWV0aG9kID0gdG9DYW1lbENhc2UobWV0aG9kLmpvaW4oXCIgXCIpKTtcbiAgICBwcmVwYXJlZC5wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5wcmVwYXJlZCA9IHByZXBhcmVkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgYSByZWNvcmQgZnJvbSBDb3VjaERCL0ZhYnJpY1xuICAgKiBAc3VtbWFyeSBFeHRyYWN0cyB0aGUgSUQgZnJvbSBhIENvdWNoREIgZG9jdW1lbnQgYW5kIHJldmVydHMgaXQgdG8gYSBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHByb2Nlc3NSZWNvcmQoXG4gICAgcmVjb3JkOiBhbnksXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBNIHtcbiAgICBjb25zdCBwa0F0dHIgPSBNb2RlbC5wayh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgY29uc3QgdHlwZSA9IE1ldGFkYXRhLmdldChcbiAgICAgIHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgTWV0YWRhdGEua2V5KERCS2V5cy5JRCwgcGtBdHRyIGFzIHN0cmluZylcbiAgICApPy50eXBlO1xuXG4gICAgaWYgKHJlY29yZFtDb3VjaERCS2V5cy5JRF0pIHtcbiAgICAgIGNvbnN0IFssIC4uLmtleUFyZ3NdID0gcmVjb3JkW0NvdWNoREJLZXlzLklEXS5zcGxpdChDb3VjaERCS2V5cy5TRVBBUkFUT1IpO1xuICAgICAgY29uc3QgaWQgPSBrZXlBcmdzLmpvaW4oXCJfXCIpO1xuICAgICAgcmVjb3JkW3BrQXR0cl0gPSBTZXF1ZW5jZS5wYXJzZVZhbHVlKHR5cGUgYXMgYW55LCBpZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NSZWNvcmQocmVjb3JkLCBjdHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBNYW5nbyBxdWVyeVxuICAgKiBAc3VtbWFyeSBTZW5kcyBhIHJhdyBNYW5nbyBxdWVyeSB0byBGYWJyaWMgYW5kIHByb2Nlc3NlcyB0aGUgcmVzdWx0c1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmF3PFI+KHJhd0lucHV0OiBNYW5nb1F1ZXJ5LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJhdyk7XG4gICAgY29uc3QgYWdncmVnYXRvciA9IChyYXdJbnB1dCBhcyBhbnkpPy5hZ2dyZWdhdGVJbmZvO1xuICAgIGlmICgocmF3SW5wdXQgYXMgYW55KT8uYWdncmVnYXRlICYmIGFnZ3JlZ2F0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBZ2dyZWdhdGU8Uj4oYWdncmVnYXRvciwgY3R4KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0czogYW55W10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KFxuICAgICAgcmF3SW5wdXQsXG4gICAgICB0cnVlLFxuICAgICAgdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICBjdHhcbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLnNlbGVjdFNlbGVjdG9yKSB7XG4gICAgICBjb25zdCBwcm9jZXNzZWQgPSByZXN1bHRzLm1hcCgocikgPT4gdGhpcy5wcm9jZXNzUmVjb3JkKHIsIGN0eCkpO1xuICAgICAgaWYgKCFjdHguZ2V0T3JVbmRlZmluZWQoXCJhZnRlclF1ZXJ5SGFuZGxlcnNcIikpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZCBhcyB1bmtub3duIGFzIFI7XG4gICAgICB9XG4gICAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXBwbHlBZnRlckhhbmRsZXJzVG9SZXN1bHQocHJvY2Vzc2VkLCBjdHgpKSBhcyBSO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cyBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgYSBDb3VjaERCIE1hbmdvIHF1ZXJ5IGZyb20gdGhlIHN0YXRlbWVudFxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyB0aGUgc3RhdGVtZW50J3MgY29uZGl0aW9ucywgc2VsZWN0b3JzLCBhbmQgb3B0aW9ucyBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkKCk6IE1hbmdvUXVlcnkge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkKTtcbiAgICBjb25zdCBhZ2dyZWdhdGVRdWVyeSA9IHRoaXMuYnVpbGRBZ2dyZWdhdGVRdWVyeSgpO1xuICAgIGlmIChhZ2dyZWdhdGVRdWVyeSkgcmV0dXJuIGFnZ3JlZ2F0ZVF1ZXJ5O1xuICAgIGNvbnN0IHNlbGVjdG9yczogTWFuZ29TZWxlY3RvciA9IHt9O1xuICAgIHNlbGVjdG9yc1tDb3VjaERCS2V5cy5UQUJMRV0gPSB7fTtcbiAgICBzZWxlY3RvcnNbQ291Y2hEQktleXMuVEFCTEVdID0gTW9kZWwudGFibGVOYW1lKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCBxdWVyeTogTWFuZ29RdWVyeSA9IHsgc2VsZWN0b3I6IHNlbGVjdG9ycyB9O1xuICAgIGlmICh0aGlzLnNlbGVjdFNlbGVjdG9yKSBxdWVyeS5maWVsZHMgPSB0aGlzLnNlbGVjdFNlbGVjdG9yIGFzIHN0cmluZ1tdO1xuXG4gICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbjogTWFuZ29TZWxlY3RvciA9IHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgIENvbmRpdGlvbi5hbmQoXG4gICAgICAgICAgdGhpcy53aGVyZUNvbmRpdGlvbixcbiAgICAgICAgICBDb25kaXRpb24uYXR0cmlidXRlPE0+KENvdWNoREJLZXlzLlRBQkxFIGFzIGtleW9mIE0pLmVxKFxuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3JbQ291Y2hEQktleXMuVEFCTEVdXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApLnNlbGVjdG9yO1xuICAgICAgY29uc3Qgc2VsZWN0b3JLZXlzID0gT2JqZWN0LmtleXMoY29uZGl0aW9uKSBhcyBNYW5nb09wZXJhdG9yW107XG4gICAgICBpZiAoXG4gICAgICAgIHNlbGVjdG9yS2V5cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhDb3VjaERCR3JvdXBPcGVyYXRvcikuaW5kZXhPZihzZWxlY3RvcktleXNbMF0pICE9PSAtMVxuICAgICAgKVxuICAgICAgICBzd2l0Y2ggKHNlbGVjdG9yS2V5c1swXSkge1xuICAgICAgICAgIGNhc2UgQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EOlxuICAgICAgICAgICAgY29uZGl0aW9uW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gPSBbXG4gICAgICAgICAgICAgIC4uLk9iamVjdC52YWx1ZXMoXG4gICAgICAgICAgICAgICAgY29uZGl0aW9uW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gYXMgTWFuZ29TZWxlY3RvclxuICAgICAgICAgICAgICApLnJlZHVjZSgoYWNjdW06IE1hbmdvU2VsZWN0b3JbXSwgdmFsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5cy5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiVG9vIG1hbnkga2V5cyBpbiBxdWVyeSBzZWxlY3Rvci4gc2hvdWxkIGJlIG9uZVwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGsgPSBrZXlzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChrID09PSBDb3VjaERCR3JvdXBPcGVyYXRvci5BTkQpXG4gICAgICAgICAgICAgICAgICBhY2N1bS5wdXNoKC4uLih2YWxba10gYXMgYW55W10pKTtcbiAgICAgICAgICAgICAgICBlbHNlIGFjY3VtLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgICAgICAgIH0sIFtdKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvciA9IGNvbmRpdGlvbjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgQ291Y2hEQkdyb3VwT3BlcmF0b3IuT1I6IHtcbiAgICAgICAgICAgIGNvbnN0IHM6IFJlY29yZDxhbnksIGFueT4gPSB7fTtcbiAgICAgICAgICAgIHNbQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSA9IFtcbiAgICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgICAuLi5PYmplY3QuZW50cmllcyhxdWVyeS5zZWxlY3RvcikubWFwKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8YW55LCBhbnk+ID0ge307XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3IgPSBzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlXCIpO1xuICAgICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY29uZGl0aW9uKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgaWYgKHF1ZXJ5LnNlbGVjdG9yW2tleV0pXG4gICAgICAgICAgICBsb2cud2FybihcbiAgICAgICAgICAgICAgYEEgJHtrZXl9IHF1ZXJ5IHBhcmFtIGlzIGFib3V0IHRvIGJlIG92ZXJyaWRkZW46ICR7cXVlcnkuc2VsZWN0b3Jba2V5XX0gYnkgJHt2YWx9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBxdWVyeS5zZWxlY3RvcltrZXldID0gdmFsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3JzPy5sZW5ndGgpIHtcbiAgICAgIHF1ZXJ5LnNvcnQgPSBxdWVyeS5zb3J0IHx8IFtdO1xuICAgICAgcXVlcnkuc2VsZWN0b3IgPSBxdWVyeS5zZWxlY3RvciB8fCAoe30gYXMgTWFuZ29TZWxlY3Rvcik7XG4gICAgICBmb3IgKGNvbnN0IFtzZWxlY3RvcktleSwgZGlyZWN0aW9uXSBvZiB0aGlzLm9yZGVyQnlTZWxlY3RvcnMpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzZWxlY3RvcktleSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IHJlYzogUmVjb3JkPHN0cmluZywgT3JkZXJEaXJlY3Rpb24+ID0ge307XG4gICAgICAgIHJlY1tzZWxlY3Rvcl0gPSBkaXJlY3Rpb24gYXMgT3JkZXJEaXJlY3Rpb247XG4gICAgICAgIChxdWVyeS5zb3J0IGFzIFJlY29yZDxzdHJpbmcsIE9yZGVyRGlyZWN0aW9uPltdKS5wdXNoKHJlYyk7XG4gICAgICAgIGlmICghcXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdKSB7XG4gICAgICAgICAgcXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgICAgICAocXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5CSUdHRVJdID1cbiAgICAgICAgICAgIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5saW1pdFNlbGVjdG9yKSB7XG4gICAgICBxdWVyeS5saW1pdCA9IHRoaXMubGltaXRTZWxlY3RvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4oXG4gICAgICAgIGBObyBsaW1pdCBzZWxlY3RvciBkZWZpbmVkLiBVc2luZyBkZWZhdWx0IGNvdWNoZGIgbGltaXQgb2YgJHtDb3VjaERCUXVlcnlMaW1pdH1gXG4gICAgICApO1xuICAgICAgcXVlcnkubGltaXQgPSBDb3VjaERCUXVlcnlMaW1pdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vZmZzZXRTZWxlY3RvcikgcXVlcnkuc2tpcCA9IHRoaXMub2Zmc2V0U2VsZWN0b3I7XG5cbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGNvbmRpdGlvbiBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeSBzZWxlY3RvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIENvbmRpdGlvbiBvYmplY3QgaW50byBhIENvdWNoREIgTWFuZ28gcXVlcnkgc2VsZWN0b3Igc3RydWN0dXJlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGFyc2VDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb248TT4pOiBNYW5nb1F1ZXJ5IHtcbiAgICBmdW5jdGlvbiBtZXJnZShcbiAgICAgIG9wOiBNYW5nb09wZXJhdG9yLFxuICAgICAgb2JqMTogTWFuZ29TZWxlY3RvcixcbiAgICAgIG9iajI6IE1hbmdvU2VsZWN0b3JcbiAgICApOiBNYW5nb1F1ZXJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdDogTWFuZ29RdWVyeSA9IHsgc2VsZWN0b3I6IHt9IGFzIE1hbmdvU2VsZWN0b3IgfTtcbiAgICAgIHJlc3VsdC5zZWxlY3RvcltvcF0gPSBbb2JqMSwgb2JqMl07XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHsgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uIH0gPSBjb25kaXRpb24gYXMgdW5rbm93biBhcyB7XG4gICAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+O1xuICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcjtcbiAgICAgIGNvbXBhcmlzb246IGFueTtcbiAgICB9O1xuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5TVEFSVFNfV0lUSCkge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyMSAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJTVEFSVFNfV0lUSCByZXF1aXJlcyBhbiBhdHRyaWJ1dGUgbmFtZVwiKTtcbiAgICAgIGlmICh0eXBlb2YgY29tcGFyaXNvbiAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJTVEFSVFNfV0lUSCByZXF1aXJlcyBhIHN0cmluZyBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3QgcmFuZ2UgPSBwcmVmaXhSYW5nZShjb21wYXJpc29uKTtcbiAgICAgIGNvbnN0IHNlbGVjdG9yOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHNlbGVjdG9yW2F0dHIxXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAoc2VsZWN0b3JbYXR0cjFdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5CSUdHRVJfRVFdID0gcmFuZ2Uuc3RhcnQ7XG4gICAgICAoc2VsZWN0b3JbYXR0cjFdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5TTUFMTEVSXSA9IHJhbmdlLmVuZDtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yIH07XG4gICAgfVxuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5FTkRTX1dJVEgpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cjEgIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiRU5EU19XSVRIIHJlcXVpcmVzIGFuIGF0dHJpYnV0ZSBuYW1lXCIpO1xuICAgICAgaWYgKHR5cGVvZiBjb21wYXJpc29uICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkVORFNfV0lUSCByZXF1aXJlcyBhIHN0cmluZyBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3Qgc2VsZWN0b3I6IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgc2VsZWN0b3JbYXR0cjFdID0ge1xuICAgICAgICBbQ291Y2hEQk9wZXJhdG9yLlJFR0VYUF06IGAke2VzY2FwZVJlZ0V4cChjb21wYXJpc29uKX0kYCxcbiAgICAgIH0gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yIH07XG4gICAgfVxuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5CRVRXRUVOKSB7XG4gICAgICBjb25zdCBhdHRyID0gYXR0cjEgYXMgc3RyaW5nO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbXBhcmlzb24pIHx8IGNvbXBhcmlzb24ubGVuZ3RoICE9PSAyKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkJFVFdFRU4gb3BlcmF0b3IgcmVxdWlyZXMgW21pbiwgbWF4XSBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3QgW21pbiwgbWF4XSA9IGNvbXBhcmlzb247XG4gICAgICBjb25zdCBvcEJldHdlZW46IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgb3BCZXR3ZWVuW2F0dHJdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcEJldHdlZW5bYXR0cl0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgIHRyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5CSUdHRVJfRVEpXG4gICAgICBdID0gbWluO1xuICAgICAgKG9wQmV0d2VlblthdHRyXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLlNNQUxMRVJfRVEpXG4gICAgICBdID0gbWF4O1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3I6IG9wQmV0d2VlbiB9O1xuICAgIH1cblxuICAgIGxldCBvcDogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgaWYgKFxuICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICkgPT09IC0xXG4gICAgKSB7XG4gICAgICBvcFthdHRyMSBhcyBzdHJpbmddID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcFthdHRyMSBhcyBzdHJpbmddIGFzIE1hbmdvU2VsZWN0b3IpW3RyYW5zbGF0ZU9wZXJhdG9ycyhvcGVyYXRvcildID1cbiAgICAgICAgY29tcGFyaXNvbjtcbiAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgIG9wID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yIGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBvcFt0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuTk9UKV0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wW3RyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5OT1QpXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgKGF0dHIxIGFzIHVua25vd24gYXMgeyBhdHRyMTogc3RyaW5nIH0pLmF0dHIxXG4gICAgICBdID0gY29tcGFyaXNvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3AxOiBhbnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGF0dHIxIGFzIENvbmRpdGlvbjxNPikuc2VsZWN0b3I7XG4gICAgICBjb25zdCBvcDI6IGFueSA9IHRoaXMucGFyc2VDb25kaXRpb24oY29tcGFyaXNvbiBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yO1xuICAgICAgb3AgPSBtZXJnZSh0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpLCBvcDEsIG9wMikuc2VsZWN0b3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc2VsZWN0b3I6IG9wIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhbiBhZ2dyZWdhdGUgcXVlcnkgaWYgYWdncmVnYXRpb24gaXMgcmVxdWVzdGVkXG4gICAqIEBzdW1tYXJ5IENoZWNrcyBmb3IgYWdncmVnYXRlIG9wZXJhdGlvbnMgYW5kIHJldHVybnMgYSBzcGVjaWFsIE1hbmdvUXVlcnkgZm9yIHRoZW1cbiAgICovXG4gIHByaXZhdGUgYnVpbGRBZ2dyZWdhdGVRdWVyeSgpOiBNYW5nb1F1ZXJ5IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuZnJvbVNlbGVjdG9yKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmF2Z1NlbGVjdG9yKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBTdHJpbmcodGhpcy5hdmdTZWxlY3Rvcik7XG4gICAgICBjb25zdCBzdW1JbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFwic3VtXCIsIGF0dHJpYnV0ZSk7XG4gICAgICBjb25zdCBjb3VudEluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXCJjb3VudFwiLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKCFzdW1JbmZvIHx8ICFjb3VudEluZm8pXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICAgIGBBdmcgb3BlcmF0aW9uIHJlcXVpcmVzIHN1bSBhbmQgY291bnQgdmlld3MgZm9yIGF0dHJpYnV0ZSAke2F0dHJpYnV0ZX1gXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeSh7XG4gICAgICAgIGtpbmQ6IFwiYXZnXCIsXG4gICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgc3VtRGVzY3JpcHRvcjogc3VtSW5mby5kZXNjcmlwdG9yLFxuICAgICAgICBjb3VudERlc2NyaXB0b3I6IGNvdW50SW5mby5kZXNjcmlwdG9yLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvdW50RGlzdGluY3RTZWxlY3RvciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3QgYXR0cmlidXRlID1cbiAgICAgICAgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgPT0gbnVsbFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBTdHJpbmcodGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IpO1xuICAgICAgY29uc3QgaW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcImRpc3RpbmN0XCIsIGF0dHJpYnV0ZSk7XG4gICAgICBpZiAoaW5mbykge1xuICAgICAgICBpbmZvLmNvdW50RGlzdGluY3QgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeShpbmZvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhZ2dyZWdhdG9yVXNlZCA9XG4gICAgICB0eXBlb2YgdGhpcy5jb3VudFNlbGVjdG9yICE9PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICB0eXBlb2YgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgIT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICEhdGhpcy5taW5TZWxlY3RvciB8fFxuICAgICAgISF0aGlzLm1heFNlbGVjdG9yIHx8XG4gICAgICAhIXRoaXMuc3VtU2VsZWN0b3IgfHxcbiAgICAgICEhdGhpcy5kaXN0aW5jdFNlbGVjdG9yO1xuXG4gICAgY29uc3QgYWdncmVnYXRvckNoZWNrczogQXJyYXk8W1ZpZXdLaW5kLCBTZWxlY3RTZWxlY3RvcjxNPiB8IHVuZGVmaW5lZF0+ID0gW1xuICAgICAgW1xuICAgICAgICBcImNvdW50XCIsXG4gICAgICAgICh0aGlzLmNvdW50U2VsZWN0b3IgPz8gdW5kZWZpbmVkKSBhcyBTZWxlY3RTZWxlY3RvcjxNPiB8IHVuZGVmaW5lZCxcbiAgICAgIF0sXG4gICAgICBbXCJtYXhcIiwgdGhpcy5tYXhTZWxlY3Rvcl0sXG4gICAgICBbXCJtaW5cIiwgdGhpcy5taW5TZWxlY3Rvcl0sXG4gICAgICBbXCJzdW1cIiwgdGhpcy5zdW1TZWxlY3Rvcl0sXG4gICAgICBbXCJkaXN0aW5jdFwiLCB0aGlzLmRpc3RpbmN0U2VsZWN0b3JdLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IFtraW5kLCBzZWxlY3Rvcl0gb2YgYWdncmVnYXRvckNoZWNrcykge1xuICAgICAgY29uc3QgYXR0cmlidXRlID0gc2VsZWN0b3IgPyBTdHJpbmcoc2VsZWN0b3IpIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihraW5kLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKGluZm8pIHJldHVybiB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KGluZm8pO1xuICAgIH1cblxuICAgIGlmIChhZ2dyZWdhdG9yVXNlZCkge1xuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgIGBObyBDb3VjaERCIHZpZXcgbWV0YWRhdGEgZm91bmQgZm9yIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKFxuICAgICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yXG4gICAgICAgICl9IGFnZ3JlZ2F0b3JgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGFnZ3JlZ2F0ZSBkZXNjcmlwdG9yIGZvciBhIHZpZXctYmFzZWQgYWdncmVnYXRpb25cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcbiAgICBraW5kOiBWaWV3S2luZCxcbiAgICBhdHRyaWJ1dGU/OiBzdHJpbmdcbiAgKTogRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuZnJvbVNlbGVjdG9yKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1ldGFzID0gZmluZFZpZXdNZXRhZGF0YSh0aGlzLmZyb21TZWxlY3Rvciwga2luZCwgYXR0cmlidXRlKTtcbiAgICBpZiAoIW1ldGFzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtZXRhID0gbWV0YXNbMF07XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCB2aWV3TmFtZSA9IGdlbmVyYXRlVmlld05hbWUodGFibGVOYW1lLCBtZXRhLmF0dHJpYnV0ZSwga2luZCwgbWV0YSk7XG4gICAgY29uc3QgZGRvYyA9IG1ldGEuZGRvYyB8fCBnZW5lcmF0ZURlc2lnbkRvY05hbWUodGFibGVOYW1lLCB2aWV3TmFtZSk7XG4gICAgY29uc3Qgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIHJlZHVjZTogbWV0YS5yZWR1Y2UgIT09IHVuZGVmaW5lZCA/IHRydWUgOiAhbWV0YS5yZXR1cm5Eb2NzLFxuICAgIH07XG4gICAgaWYgKGtpbmQgPT09IFwiZGlzdGluY3RcIiB8fCBraW5kID09PSBcImdyb3VwQnlcIikgb3B0aW9ucy5ncm91cCA9IHRydWU7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQsXG4gICAgICBtZXRhLFxuICAgICAgZGVzY3JpcHRvcjoge1xuICAgICAgICBkZG9jLFxuICAgICAgICB2aWV3OiB2aWV3TmFtZSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyB0aGUgc3BlY2lhbCBhZ2dyZWdhdGUgTWFuZ29RdWVyeSBtYXJrZXJcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRlUXVlcnkoXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mb1xuICApOiBNYW5nb1F1ZXJ5ICYgeyBhZ2dyZWdhdGU6IHRydWU7IGFnZ3JlZ2F0ZUluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8gfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdG9yOiB7fSxcbiAgICAgIGFnZ3JlZ2F0ZTogdHJ1ZSxcbiAgICAgIGFnZ3JlZ2F0ZUluZm86IGluZm8sXG4gICAgfSBhcyBNYW5nb1F1ZXJ5ICYgeyBhZ2dyZWdhdGU6IHRydWU7IGFnZ3JlZ2F0ZUluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgYWRhcHRlciBjYXN0IHRvIEZhYnJpY0NsaWVudEFkYXB0ZXIgZm9yIHZpZXcgYWNjZXNzXG4gICAqL1xuICBwcml2YXRlIGdldEZhYnJpY0FkYXB0ZXIoKTogRmFicmljQ2xpZW50QWRhcHRlciB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlciBhcyBGYWJyaWNDbGllbnRBZGFwdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhbiBhZ2dyZWdhdGUgcXVlcnkgdmlhIGFkYXB0ZXIncyB2aWV3IG1ldGhvZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlQWdncmVnYXRlPFI+KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8sXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcm9taXNlPFI+IHtcbiAgICBpZiAoIXRoaXMuaXNWaWV3QWdncmVnYXRlKGluZm8pKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVBdmVyYWdlPFI+KGluZm8sIGN0eCk7XG4gICAgfVxuICAgIGNvbnN0IGZhYnJpY0FkYXB0ZXIgPSB0aGlzLmdldEZhYnJpY0FkYXB0ZXIoKTtcbiAgICBjb25zdCB2aWV3SW5mbyA9IGluZm8gYXMgRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+O1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLmRkb2MsXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLnZpZXcsXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLm9wdGlvbnMsXG4gICAgICBjdHhcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NWaWV3UmVzcG9uc2U8Uj4oaW5mbywgcmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGF2ZXJhZ2UgY2FsY3VsYXRpb24gZnJvbSBzdW0gYW5kIGNvdW50IHZpZXdzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZUF2ZXJhZ2U8Uj4oXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mbyxcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IFByb21pc2U8Uj4ge1xuICAgIGlmIChpbmZvLmtpbmQgIT09IFwiYXZnXCIpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkF2ZXJhZ2UgZGVzY3JpcHRvciBpcyBub3QgdmFsaWRcIik7XG4gICAgY29uc3QgZmFicmljQWRhcHRlciA9IHRoaXMuZ2V0RmFicmljQWRhcHRlcigpO1xuICAgIGNvbnN0IFtzdW1EZXNjLCBjb3VudERlc2NdID0gW2luZm8uc3VtRGVzY3JpcHRvciwgaW5mby5jb3VudERlc2NyaXB0b3JdO1xuICAgIGNvbnN0IFtzdW1SZXNwb25zZSwgY291bnRSZXNwb25zZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmYWJyaWNBZGFwdGVyLnZpZXc8Vmlld1Jlc3BvbnNlPihcbiAgICAgICAgc3VtRGVzYy5kZG9jLFxuICAgICAgICBzdW1EZXNjLnZpZXcsXG4gICAgICAgIHN1bURlc2Mub3B0aW9ucyxcbiAgICAgICAgY3R4XG4gICAgICApLFxuICAgICAgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICAgIGNvdW50RGVzYy5kZG9jLFxuICAgICAgICBjb3VudERlc2MudmlldyxcbiAgICAgICAgY291bnREZXNjLm9wdGlvbnMsXG4gICAgICAgIGN0eFxuICAgICAgKSxcbiAgICBdKTtcbiAgICBjb25zdCBzdW0gPSBzdW1SZXNwb25zZS5yb3dzPy5bMF0/LnZhbHVlID8/IDA7XG4gICAgY29uc3QgY291bnQgPSBjb3VudFJlc3BvbnNlLnJvd3M/LlswXT8udmFsdWUgPz8gMDtcbiAgICBpZiAoIWNvdW50KSByZXR1cm4gMCBhcyB1bmtub3duIGFzIFI7XG4gICAgcmV0dXJuIChzdW0gLyBjb3VudCkgYXMgdW5rbm93biBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgdGhlIHZpZXcgcmVzcG9uc2UgYmFzZWQgb24gYWdncmVnYXRlIGtpbmRcbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1ZpZXdSZXNwb25zZTxSPihcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvLFxuICAgIHJlc3BvbnNlOiBWaWV3UmVzcG9uc2VcbiAgKTogUiB7XG4gICAgaWYgKGluZm8ua2luZCA9PT0gXCJhdmdcIilcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICBcIkF2ZXJhZ2UgcmVzdWx0cyBzaG91bGQgYmUgaGFuZGxlZCBiZWZvcmUgcHJvY2Vzc2luZyByb3dzXCJcbiAgICAgICk7XG4gICAgY29uc3Qgcm93cyA9IHJlc3BvbnNlLnJvd3MgfHwgW107XG4gICAgY29uc3Qgdmlld0luZm8gPSBpbmZvIGFzIEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PjtcbiAgICBjb25zdCBtZXRhID0gdmlld0luZm8ubWV0YTtcbiAgICBpZiAodmlld0luZm8uY291bnREaXN0aW5jdCkge1xuICAgICAgcmV0dXJuIChyb3dzLmxlbmd0aCB8fCAwKSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmICh2aWV3SW5mby5raW5kID09PSBcImRpc3RpbmN0XCIgfHwgdmlld0luZm8ua2luZCA9PT0gXCJncm91cEJ5XCIpIHtcbiAgICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiByb3cua2V5ID8/IHJvdy52YWx1ZSkgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICBpZiAobWV0YS5yZXR1cm5Eb2NzKSB7XG4gICAgICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4gcm93LnZhbHVlID8/IHJvdy5kb2MgPz8gcm93KSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmICghcm93cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAodmlld0luZm8ua2luZCA9PT0gXCJjb3VudFwiID8gMCA6IG51bGwpIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgcmV0dXJuIChyb3dzWzBdLnZhbHVlID8/IHJvd3NbMF0ua2V5ID8/IG51bGwpIGFzIHVua25vd24gYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVHlwZSBndWFyZCB0byBjaGVjayBpZiBpbmZvIGlzIGEgdmlldy1iYXNlZCBhZ2dyZWdhdGVcbiAgICovXG4gIHByaXZhdGUgaXNWaWV3QWdncmVnYXRlKFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm9cbiAgKTogaW5mbyBpcyBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT4ge1xuICAgIHJldHVybiBpbmZvLmtpbmQgIT09IFwiYXZnXCI7XG4gIH1cbn1cbiIsImltcG9ydCBcIi4uL3NoYXJlZC9vdmVycmlkZXNcIjtcbmltcG9ydCB7XG4gIENvdWNoREJLZXlzLFxuICB0eXBlIE1hbmdvUXVlcnksXG4gIHR5cGUgVmlld1Jlc3BvbnNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0ICogYXMgZ3JwYyBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHtcbiAgTW9kZWwsXG4gIHR5cGUgTW9kZWxDb25zdHJ1Y3RvcixcbiAgdHlwZSBTZXJpYWxpemVyLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBkZWJ1ZywgZmluYWwsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7XG4gIHR5cGUgUGVlckNvbmZpZyxcbiAgdHlwZSBTZWdyZWdhdGVkTW9kZWwsXG4gIHR5cGUgTXNwRGV0YWlscyxcbn0gZnJvbSBcIi4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgY29ubmVjdCxcbiAgdHlwZSBDb25uZWN0T3B0aW9ucyxcbiAgR2F0ZXdheSxcbiAgTmV0d29yayxcbiAgUHJvcG9zYWxPcHRpb25zLFxuICBDb250cmFjdCBhcyBDb250cmFrdCxcbiAgdHlwZSBTaWduZXIsXG4gIEdhdGV3YXlFcnJvcixcbiAgRW5kb3JzZUVycm9yLFxufSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBHYXRld2F5IGFzIExlZ2FjeUdhdGV3YXksIFdhbGxldHMgfSBmcm9tIFwiZmFicmljLW5ldHdvcmtcIjtcbmltcG9ydCB0eXBlIHsgRW5kb3JzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHtcbiAgZ2V0SWRlbnRpdHksXG4gIGdldFNpZ25lcixcbiAgZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQsXG4gIHJlYWRGaWxlIGFzIHJlYWRGc0ZpbGUsXG59IGZyb20gXCIuL2ZhYnJpYy1mc1wiO1xuaW1wb3J0IHtcbiAgQmFzZUVycm9yLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxuICBTZXJpYWxpemF0aW9uRXJyb3IsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgTm90Rm91bmRFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgQmFkUmVxdWVzdEVycm9yLFxuICB0eXBlIFByaW1hcnlLZXlUeXBlLFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgQWRhcHRlcixcbiAgdHlwZSBBZGFwdGVyRmxhZ3MsXG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBGb3JiaWRkZW5FcnJvcixcbiAgTWlncmF0aW9uRXJyb3IsXG4gIE9ic2VydmVyRXJyb3IsXG4gIFBhZ2luZ0Vycm9yLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFF1ZXJ5RXJyb3IsXG4gIFJlcG9zaXRvcnksXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIFN0YXRlbWVudCxcbiAgdHlwZSBQcmVwYXJlZFN0YXRlbWVudCxcbiAgUGFnaW5hdG9yLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIENvbnRleHR1YWxBcmdzLFxuICB0eXBlIFByZXBhcmVkTW9kZWwsXG4gIEFsbE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRmFicmljRmxhdm91ciB9IGZyb20gXCIuLi9zaGFyZWQvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDbGllbnRTZXJpYWxpemVyIH0gZnJvbSBcIi4uL3NoYXJlZC9DbGllbnRTZXJpYWxpemVyXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnREaXNwYXRjaCB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudERpc3BhdGNoXCI7XG4vLyBpbXBvcnQgeyBIU01TaWduZXJGYWN0b3J5Q3VzdG9tIH0gZnJvbSBcIi4vZmFicmljLWhzbVwiO1xuaW1wb3J0IHsgdHlwZSBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50U3RhdGVtZW50IH0gZnJvbSBcIi4vRmFicmljQ2xpZW50U3RhdGVtZW50XCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRQYWdpbmF0b3IgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRQYWdpbmF0b3JcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRSZXBvc2l0b3J5XCI7XG5pbXBvcnQge1xuICBFbmRvcnNlbWVudEVycm9yLFxuICBFbmRvcnNlbWVudFBvbGljeUVycm9yLFxuICBNdmNjUmVhZENvbmZsaWN0RXJyb3IsXG4gIFBoYW50b21SZWFkQ29uZmxpY3RFcnJvcixcbiAgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IsXG59IGZyb20gXCIuLi9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWZhdWx0RmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IENyeXB0b1V0aWxzIH0gZnJvbSBcIi4vY3J5cHRvXCI7XG5pbXBvcnQgeyBleHRyYWN0SWRzIH0gZnJvbSBcIi4vaWRzL2lkLWV4dHJhY3Rpb25cIjtcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSBcIi4uL3NoYXJlZC9pbmRleFwiO1xuXG50eXBlIExlZ2FjeVBlZXJUYXJnZXQgPSB7XG4gIG1zcElkOiBzdHJpbmc7XG4gIHBlZXJFbmRwb2ludDogc3RyaW5nO1xuICBwZWVySG9zdEFsaWFzPzogc3RyaW5nO1xuICB0bHNDZXJ0Pzogc3RyaW5nIHwgQnVmZmVyO1xufTtcblxudHlwZSBMZWdhY3lQZWVyV2l0aE5hbWUgPSBMZWdhY3lQZWVyVGFyZ2V0ICYgeyBuYW1lOiBzdHJpbmcgfTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWRhcHRlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya3NcbiAqIEBzdW1tYXJ5IFRoZSBGYWJyaWNBZGFwdGVyIGV4dGVuZHMgQ291Y2hEQkFkYXB0ZXIgdG8gcHJvdmlkZSBhIHNlYW1sZXNzIGludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya3MuXG4gKiBJdCBoYW5kbGVzIGNvbm5lY3Rpb24gbWFuYWdlbWVudCwgdHJhbnNhY3Rpb24gc3VibWlzc2lvbiwgYW5kIENSVUQgb3BlcmF0aW9ucyBhZ2FpbnN0IEZhYnJpYyBjaGFpbmNvZGUuXG4gKiBAdGVtcGxhdGUgUGVlckNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdHlwZSBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAdGVtcGxhdGUgRmFicmljRmxhZ3MgLSBGbGFncyBzcGVjaWZpYyB0byBGYWJyaWMgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIENvbnRleHQ8RmFicmljRmxhZ3M+IC0gQ29udGV4dCB0eXBlIGNvbnRhaW5pbmcgRmFicmljLXNwZWNpZmljIGZsYWdzXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAcGFyYW0gYWxpYXMgLSBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGFkYXB0ZXIgaW5zdGFuY2VcbiAqIEBjbGFzcyBGYWJyaWNDbGllbnRBZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IEZhYnJpY0FkYXB0ZXIgaW5zdGFuY2VcbiAqIGNvbnN0IGNvbmZpZzogUGVlckNvbmZpZyA9IHtcbiAqICAgbXNwSWQ6ICdPcmcxTVNQJyxcbiAqICAgcGVlckVuZHBvaW50OiAnbG9jYWxob3N0OjcwNTEnLFxuICogICBjaGFubmVsTmFtZTogJ215Y2hhbm5lbCcsXG4gKiAgIGNoYWluY29kZU5hbWU6ICdteWNjJyxcbiAqICAgY29udHJhY3ROYW1lOiAnbXljb250cmFjdCcsXG4gKiAgIHRsc0NlcnRQYXRoOiAnL3BhdGgvdG8vdGxzL2NlcnQnLFxuICogICBjZXJ0RGlyZWN0b3J5UGF0aDogJy9wYXRoL3RvL2NlcnQvZGlyJyxcbiAqICAga2V5RGlyZWN0b3J5UGF0aDogJy9wYXRoL3RvL2tleS9kaXInXG4gKiB9O1xuICpcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgRmFicmljQWRhcHRlcihjb25maWcsICdvcmcxLWFkYXB0ZXInKTtcbiAqXG4gKiAvLyBVc2UgdGhlIGFkYXB0ZXIgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgRmFicmljIG5ldHdvcmtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFkYXB0ZXIucmVhZCgndXNlcnMnLCAndXNlcjEnLCBteVNlcmlhbGl6ZXIpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAqICAgcGFydGljaXBhbnQgTmV0d29ya1xuICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAqXG4gKiAgIENsaWVudC0+PkZhYnJpY0FkYXB0ZXI6IGNyZWF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbCwgdHJhbnNpZW50LCBzZXJpYWxpemVyKVxuICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogc3VibWl0VHJhbnNhY3Rpb24oT3BlcmF0aW9uS2V5cy5DUkVBVEUsIFtzZXJpYWxpemVkTW9kZWxdLCB0cmFuc2llbnQpXG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KClcbiAqICAgR2F0ZXdheS0+Pk5ldHdvcms6IGdldE5ldHdvcmsoY2hhbm5lbE5hbWUpXG4gKiAgIE5ldHdvcmstPj5Db250cmFjdDogZ2V0Q29udHJhY3QoY2hhaW5jb2RlTmFtZSwgY29udHJhY3ROYW1lKVxuICogICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IHN1Ym1pdChhcGksIHByb3Bvc2FsT3B0aW9ucylcbiAqICAgQ29udHJhY3QtPj5DaGFpbmNvZGU6IGludm9rZVxuICogICBDaGFpbmNvZGUtLT4+Q29udHJhY3Q6IHJlc3BvbnNlXG4gKiAgIENvbnRyYWN0LS0+PkZhYnJpY0FkYXB0ZXI6IHJlc3VsdFxuICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogZGVjb2RlKHJlc3VsdClcbiAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGVjb2RlZFJlc3VsdClcbiAqICAgRmFicmljQWRhcHRlci0tPj5DbGllbnQ6IGRlc2VyaWFsaXplZFJlc3VsdFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50QWRhcHRlciBleHRlbmRzIEFkYXB0ZXI8XG4gIFBlZXJDb25maWcsXG4gIENsaWVudCxcbiAgTWFuZ29RdWVyeSxcbiAgQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyB0ZXh0IGRlY29kZXIgZm9yIGNvbnZlcnRpbmcgVWludDhBcnJheSB0byBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIHByaXZhdGUgc3RhdGljIHNlcmlhbGl6ZXIgPSBuZXcgQ2xpZW50U2VyaWFsaXplcigpO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgbG9nID0gTG9nZ2luZy5mb3IoRmFicmljQ2xpZW50QWRhcHRlcik7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXI8YW55PiA9XG4gICAgRmFicmljQ2xpZW50QWRhcHRlci5zZXJpYWxpemVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBGYWJyaWNBZGFwdGVyIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IGFkYXB0ZXIgZm9yIGludGVyYWN0aW5nIHdpdGggYSBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya1xuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIE9wdGlvbmFsIGFsaWFzIGZvciB0aGUgYWRhcHRlciBpbnN0YW5jZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnOiBQZWVyQ29uZmlnLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzLCBjb25maWcpLFxuICAgICAgRmFicmljRmxhdm91cixcbiAgICAgIGFsaWFzXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG92ZXJyaWRlcz86IFBhcnRpYWw8QWRhcHRlckZsYWdzPlxuICApOiBTdGF0ZW1lbnQ8TSwgRmFicmljQ2xpZW50QWRhcHRlciwgYW55LCBNYW5nb1F1ZXJ5PiB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRTdGF0ZW1lbnQodGhpcywgb3ZlcnJpZGVzKTtcbiAgfVxuXG4gIFBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHF1ZXJ5OiBQcmVwYXJlZFN0YXRlbWVudDxhbnk+IHwgTWFuZ29RdWVyeSxcbiAgICBzaXplOiBudW1iZXIsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICk6IFBhZ2luYXRvcjxNLCBhbnksIE1hbmdvUXVlcnk+IHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY0NsaWVudFBhZ2luYXRvcih0aGlzLCBxdWVyeSwgc2l6ZSwgY2xhenopO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiB8IENvbnN0cnVjdG9yPE0+W10gfCB1bmRlZmluZWQsXG4gICAgZmxhZ3M6IFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8RmFicmljQ2xpZW50RmxhZ3M+IHtcbiAgICBjb25zdCBtZXJnZWRGbGFncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY29uZmlnLCBmbGFncyk7XG4gICAgY29uc3QgZiA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBhd2FpdCBzdXBlci5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBtZXJnZWRGbGFncywgLi4uYXJncylcbiAgICApO1xuICAgIHJldHVybiBmO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgY29udGV4dDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IEFsbE9wZXJhdGlvbktleXMsXG4gICAgb3ZlcnJpZGVzOiBQYXJ0aWFsPEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4gfCBDb25zdHJ1Y3RvcjxNPltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PGFueT4+XG4gICk6IFByb21pc2U8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jb250ZXh0KTtcbiAgICBsb2cuc2lsbHkoXG4gICAgICBgY3JlYXRpbmcgbmV3IGNvbnRleHQgZm9yICR7b3BlcmF0aW9ufSBvcGVyYXRpb24gb24gJHttb2RlbCA/IChBcnJheS5pc0FycmF5KG1vZGVsKSA/IG1vZGVsLm1hcCgobSkgPT4gTW9kZWwudGFibGVOYW1lKG0pKSA6IE1vZGVsLnRhYmxlTmFtZShtb2RlbCkpIDogXCJub1wifSB0YWJsZSAke292ZXJyaWRlcyAmJiBPYmplY3Qua2V5cyhvdmVycmlkZXMpID8gT2JqZWN0LmtleXMob3ZlcnJpZGVzKS5sZW5ndGggOiBcIm5vXCJ9IHdpdGggZmxhZyBvdmVycmlkZXNgXG4gICAgKTtcbiAgICBsZXQgY3R4ID0gYXJncy5wb3AoKTtcbiAgICBpZiAodHlwZW9mIGN0eCAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhKGN0eCBpbnN0YW5jZW9mIENvbnRleHQpKSB7XG4gICAgICBhcmdzLnB1c2goY3R4KTtcbiAgICAgIGN0eCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBvdmVycmlkZXMgPSBjdHhcbiAgICAgID8gT2JqZWN0LmFzc2lnbih7fSwgY3R4LnRvT3ZlcnJpZGVzKCksIG92ZXJyaWRlcylcbiAgICAgIDogb3ZlcnJpZGVzO1xuICAgIGNvbnN0IGZsYWdzID0gYXdhaXQgdGhpcy5mbGFncyhcbiAgICAgIHR5cGVvZiBvcGVyYXRpb24gPT09IFwic3RyaW5nXCIgPyBvcGVyYXRpb24gOiBvcGVyYXRpb24ubmFtZSxcbiAgICAgIG1vZGVsLFxuICAgICAgb3ZlcnJpZGVzIGFzIFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgICAgLi4uWy4uLmFyZ3MsIGN0eF0uZmlsdGVyKEJvb2xlYW4pXG4gICAgKTtcblxuICAgIGlmIChjdHgpIHtcbiAgICAgIGlmICghKGN0eCBpbnN0YW5jZW9mIHRoaXMuQ29udGV4dCkpIHtcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgICAgIC4uLmN0eFtcImNhY2hlXCJdLFxuICAgICAgICAgIC4uLmZsYWdzLFxuICAgICAgICAgIHBhcmVudENvbnRleHQ6IGN0eCxcbiAgICAgICAgfSkgYXMgYW55O1xuICAgICAgICBjdHguYWNjdW11bGF0ZSh7XG4gICAgICAgICAgY2hpbGRDb250ZXh0czogW1xuICAgICAgICAgICAgLi4uKGN0eC5nZXRPclVuZGVmaW5lZChcImNoaWxkQ29udGV4dHNcIikgfHwgW10pLFxuICAgICAgICAgICAgbmV3Q3R4LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3Q3R4O1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudE9wID0gY3R4LmdldE9yVW5kZWZpbmVkKFwib3BlcmF0aW9uXCIpO1xuICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gY3R4LmdldE9yVW5kZWZpbmVkKFwiYWZmZWN0ZWRUYWJsZXNcIik7XG4gICAgICBpZiAoXG4gICAgICAgICFjdXJyZW50T3AgfHxcbiAgICAgICAgY3VycmVudE9wICE9PSBvcGVyYXRpb24gfHxcbiAgICAgICAgKG1vZGVsICYmIG1vZGVsICE9PSBjdXJyZW50TW9kZWwpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgICAgIC4uLmN0eFtcImNhY2hlXCJdLFxuICAgICAgICAgIC4uLmZsYWdzLFxuICAgICAgICAgIHBhcmVudENvbnRleHQ6IGN0eCxcbiAgICAgICAgfSkgYXMgYW55O1xuXG4gICAgICAgIGN0eC5hY2N1bXVsYXRlKHtcbiAgICAgICAgICBjaGlsZENvbnRleHRzOiBbXG4gICAgICAgICAgICAuLi4oY3R4LmdldE9yVW5kZWZpbmVkKFwiY2hpbGRDb250ZXh0c1wiKSB8fCBbXSksXG4gICAgICAgICAgICBuZXdDdHgsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXdDdHg7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3R4LmFjY3VtdWxhdGUoZmxhZ3MpIGFzIGFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgLi4uZmxhZ3MsXG4gICAgfSkgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWNvZGVzIGEgVWludDhBcnJheSB0byBhIHN0cmluZ1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBiaW5hcnkgZGF0YSByZWNlaXZlZCBmcm9tIEZhYnJpYyB0byBhIHN0cmluZyB1c2luZyBVVEYtOCBlbmNvZGluZ1xuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGEgLSBUaGUgYmluYXJ5IGRhdGEgdG8gZGVjb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRlY29kZWQgc3RyaW5nXG4gICAqL1xuICBkZWNvZGUoZGF0YTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuZGVjb2Rlci5kZWNvZGUoZGF0YSk7XG4gIH1cblxuICBvdmVycmlkZSByZXBvc2l0b3J5PFxuICAgIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PFxuICAgICAgYW55LFxuICAgICAgQWRhcHRlcjxQZWVyQ29uZmlnLCBDbGllbnQsIE1hbmdvUXVlcnksIENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICAgID4sXG4gID4oKTogQ29uc3RydWN0b3I8Uj4ge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8Uj47XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFtDb25zdHJ1Y3RvcjxNPiwgUHJpbWFyeUtleVR5cGUsIFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmFueVtdLCBDb250ZXh0XSB7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZVByZWZpeCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbCk7XG4gICAgcmV0dXJuIFtjbGF6eiwgaWQsIHJlY29yZCwgLi4uY3R4QXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIG11bHRpcGxlIHJlY29yZHMgZm9yIGNyZWF0aW9uXG4gICAqIEBzdW1tYXJ5IEFkZHMgbmVjZXNzYXJ5IENvdWNoREIgZmllbGRzIHRvIG11bHRpcGxlIHJlY29yZHMgYmVmb3JlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0gaWRzIC0gVGhlIElEcyBvZiB0aGUgcmVjb3Jkc1xuICAgKiBAcGFyYW0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byBwcmVwYXJlXG4gICAqIEByZXR1cm4gQSB0dXBsZSBjb250YWluaW5nIHRoZSB0YWJsZU5hbWUsIGlkcywgYW5kIHByZXBhcmVkIHJlY29yZHNcbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgaWRzIGFuZCBtb2RlbHMgYXJyYXlzIGhhdmUgZGlmZmVyZW50IGxlbmd0aHNcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVBbGxQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuY3JlYXRlQWxsUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmRzID0gaWRzLm1hcCgoaWQsIGNvdW50KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWxzW2NvdW50XSk7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH0pO1xuICAgIHJldHVybiBbY2xhenosIGlkcywgcmVjb3JkcywgLi4uY3R4QXJnc107XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQWxsUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICkge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZUFsbFByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkcyA9IGlkcy5tYXAoKCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9KTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZHMsIHJlY29yZHMsIC4uLmN0eEFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGNyZWF0ZSBtdWx0aXBsZSByZWNvcmRzIGluIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVyc1xuICAgKiBAcGFyYW0ge0FycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+fSBtb2RlbHMgLSBBcnJheSBvZiByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgLy9IRVJFIVxuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHRyYW5zaWVudCA9IGN0eEFyZ3Muc2hpZnQoKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4sXG4gICAgICB0aGlzLmNyZWF0ZUFsbFxuICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxvZy5pbmZvKGBhZGRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudCA9IHRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyh0cmFuc2llbnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBoYXNUcmFuc2llbnQgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBjb25zdCB0cmFuc2llbnRQYXlsb2FkID0gaGFzVHJhbnNpZW50ID8geyBbdGFibGVOYW1lXTogdHJhbnNpZW50IH0gOiB7fTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCxcbiAgICAgIFtcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShtLCBjbGF6ei5uYW1lKSlcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICB0cmFuc2llbnRQYXlsb2FkIGFzIGFueSxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG5cbiAgICBsZXQgcmVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W107XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzdWx0KSkubWFwKChyOiBhbnkpID0+IEpTT04ucGFyc2UocikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShcbiAgICAgICAgY2xhenosXG4gICAgICAgIGN0eCxcbiAgICAgICAgbmVlZHNGdWxsUGF5bG9hZCxcbiAgICAgICAgcmVzWzBdW01vZGVsLnBrKGNsYXp6KSBhcyBzdHJpbmddIHx8IGlkc1swXVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZEFsbChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgbW9kZWxzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgICAgIE1vZGVsLm1lcmdlKE9iamVjdC5hc3NpZ24oe30sIG0gYXMgYW55LCB0cmFuc2llbnRbaV0gfHwge30pLCByZXNbaV0pXG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZHNcbiAgICAgICAgKSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHJlYWQgbXVsdGlwbGUgcmVjb3JkcyBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVycyB0byByZWFkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmV0cmlldmVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZEFsbCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cuaW5mbyhgcmVhZGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlJFQURfQUxMLFxuICAgICAgW0pTT04uc3RyaW5naWZ5KGlkcyldLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlc3VsdCkpLm1hcCgocjogYW55KSA9PiBKU09OLnBhcnNlKHIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byB1cGRhdGUgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnNcbiAgICogQHBhcmFtIHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gbW9kZWxzIC0gQXJyYXkgb2YgdXBkYXRlZCByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB1cGRhdGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgY3R4QXJncyA9IFsuLi4oYXJncyBhcyB1bmtub3duIGFzIGFueVtdKV07XG4gICAgY29uc3QgdHJhbnNpZW50ID0gY3R4QXJncy5zaGlmdCgpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoXG4gICAgICBjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PixcbiAgICAgIHRoaXMudXBkYXRlQWxsXG4gICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy5pbmZvKGB1cGRhdGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHRyYW5zaWVudFBheWxvYWQgPSBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHt9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICAgICAgW1xuICAgICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBtb2RlbHMubWFwKChtKSA9PiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG0sIGNsYXp6Lm5hbWUpKVxuICAgICAgICApLFxuICAgICAgXSxcbiAgICAgIHRyYW5zaWVudFBheWxvYWQgYXMgYW55LFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcblxuICAgIGxldCByZXM6IGFueTtcbiAgICB0cnkge1xuICAgICAgcmVzID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShjbGF6eiwgY3R4LCBuZWVkc0Z1bGxQYXlsb2FkLCBpZHNbMF0pKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQWxsKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICAgICAgTW9kZWwubWVyZ2UoT2JqZWN0LmFzc2lnbih7fSwgbSBhcyBhbnksIHRyYW5zaWVudFtpXSB8fCB7fSksIHJlc1tpXSlcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkc1xuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gZGVsZXRlIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+fSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnMgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7U2VyaWFsaXplcjxhbnk+fSBzZXJpYWxpemVyIC0gU2VyaWFsaXplciBmb3IgdGhlIG1vZGVsIGRhdGFcbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCwgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGVBbGwpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIE1vZGVsLmlzVHJhbnNpZW50KGNsYXp6KSB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICBjb25zdCBzaG91bGRIeWRyYXRlID0gdGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShcbiAgICAgIGNsYXp6LFxuICAgICAgY3R4LFxuICAgICAgbmVlZHNGdWxsUGF5bG9hZCxcbiAgICAgIGlkc1swXVxuICAgICk7XG4gICAgaWYgKHNob3VsZEh5ZHJhdGUpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMucmVhZEFsbChjbGF6eiwgaWRzLCAuLi5jdHhBcmdzKTtcbiAgICB9XG5cbiAgICBsb2cuaW5mbyhgZGVsZXRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCxcbiAgICAgIFtKU09OLnN0cmluZ2lmeShpZHMpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzaG91bGRIeWRyYXRlXG4gICAgICAgID8gcmVzdWx0XG4gICAgICAgIDogSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXMpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIHBlcnNpc3RlbmNlXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgbW9kZWwgaW5zdGFuY2UgaW50byBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgZGF0YWJhc2Ugc3RvcmFnZSxcbiAgICogaGFuZGxpbmcgY29sdW1uIG1hcHBpbmcgYW5kIHNlcGFyYXRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByZXBhcmVcbiAgICogQHBhcmFtIHBrIC0gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgZGF0YVxuICAgKi9cbiAgb3ZlcnJpZGUgcHJlcGFyZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBTZWdyZWdhdGVkTW9kZWw8TT4gJiBQcmVwYXJlZE1vZGVsIHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnByZXBhcmUpO1xuICAgIGNvbnN0IHNwbGl0ID0gTW9kZWwuc2VncmVnYXRlKG1vZGVsKTtcbiAgICBpZiAoKG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXSkge1xuICAgICAgbG9nLnNpbGx5KFxuICAgICAgICBgUGFzc2luZyBhbG9uZyBwZXJzaXN0ZW5jZSBtZXRhZGF0YSBmb3IgJHsobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BsaXQubW9kZWwsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgbWlycm9yTWV0YSA9IE1vZGVsLm1pcnJvcmVkQXQobW9kZWwpO1xuICAgIGlmIChtaXJyb3JNZXRhKSB7XG4gICAgICBjb25zdCBtaXJyb3JNc3AgPSBtaXJyb3JNZXRhLm1zcElkO1xuICAgICAgaWYgKCFtaXJyb3JNc3ApIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBtaXJyb3IgTVNQIGNvdWxkIGJlIGZvdW5kYCk7XG4gICAgICBsZXQgbXNwcyA9IHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpIHx8IFtdO1xuICAgICAgbXNwcyA9IEFycmF5LmlzQXJyYXkobXNwcykgPyBtc3BzIDogW21zcHNdO1xuICAgICAgY29uc3QgbWVyZ2VkID0gWy4uLm5ldyBTZXQoWy4uLm1zcHMsIG1pcnJvck1zcF0pXTtcbiAgICAgIGN0eC5hY2N1bXVsYXRlKHtcbiAgICAgICAgZW5kb3JzaW5nT3JnczogbWVyZ2VkLFxuICAgICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zOiBtZXJnZWQsXG4gICAgICAgIGxlZ2FjeTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByZWNvcmQ6IHNwbGl0Lm1vZGVsLFxuICAgICAgbW9kZWw6IHNwbGl0Lm1vZGVsLFxuICAgICAgaWQ6IG1vZGVsW01vZGVsLnBrKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KV0gYXMgc3RyaW5nLFxuICAgICAgdHJhbnNpZW50OiBzcGxpdC50cmFuc2llbnQsXG4gICAgICBwcml2YXRlczogc3BsaXQucHJpdmF0ZXMsXG4gICAgICBzaGFyZWQ6IHNwbGl0LnNoYXJlZCxcbiAgICB9O1xuICB9XG5cbiAgb3ZlcnJpZGUgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogTSB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZXZlcnQpO1xuICAgIGlmIChcbiAgICAgIHRyYW5zaWVudCAmJlxuICAgICAgdGhpcy5zaG91bGRSZWJ1aWxkV2l0aFRyYW5zaWVudChcbiAgICAgICAgY3R4LFxuICAgICAgICBjdHguZ2V0T3JVbmRlZmluZWQoXCJvcGVyYXRpb25cIikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICApXG4gICAgKSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYHJlLWFkZGluZyB0cmFuc2llbnQgcHJvcGVydGllczogJHtPYmplY3Qua2V5cyh0cmFuc2llbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmVudHJpZXModHJhbnNpZW50IGFzIFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgICAgIC5maWx0ZXIoKFssIHZdKSA9PiB0eXBlb2YgdiAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAoa2V5IGluIG9iaiAmJiAob2JqIGFzIGFueSlba2V5XSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgICAgIGBvdmVyd3JpdGluZyBleGlzdGluZyAke2tleX0uIGlmIHRoaXMgaXMgbm90IGEgZGVmYXVsdCB2YWx1ZSwgdGhpcyBtYXkgcG9zZSBhIHByb2JsZW1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIChvYmogYXMgTSlba2V5IGFzIGtleW9mIE1dID0gdmFsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KShvYmopO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBvcGVyYXRpb24/OiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjdHgpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY3R4LmdldE9yVW5kZWZpbmVkKFwicmVidWlsZFdpdGhUcmFuc2llbnRcIikpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGNoaWxkUmVidWlsZCA9XG4gICAgICB0eXBlb2YgKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbihcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmIChjaGlsZFJlYnVpbGQpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHJlc29sdmVkT3AgPSB0aGlzLnJlc29sdmVPcGVyYXRpb24oY3R4LCBvcGVyYXRpb24pO1xuICAgIGlmICghcmVzb2x2ZWRPcCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IG9wID0gcmVzb2x2ZWRPcC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIG9wLmluY2x1ZGVzKFwicmVhZFwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJmaW5kXCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcInF1ZXJ5XCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcInN0YXRlbWVudFwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJwYWdlXCIpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZU9wZXJhdGlvbihcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIG9wZXJhdGlvbj86IHN0cmluZ1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChvcGVyYXRpb24pIHJldHVybiBvcGVyYXRpb247XG4gICAgaWYgKHR5cGVvZiAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuKFwib3BlcmF0aW9uXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGhhc1RyYW5zaWVudDogYm9vbGVhbixcbiAgICBpZD86IFByaW1hcnlLZXlUeXBlXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghaGFzVHJhbnNpZW50KSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcGsgPSBNb2RlbC5wayhjbGF6eik7XG4gICAgY29uc3QgY29tcG9zZWQgPSBNb2RlbC5jb21wb3NlZChjbGF6eiwgcGspO1xuICAgIGNvbnN0IGdlbmVyYXRlZCA9IE1vZGVsLmdlbmVyYXRlZChjbGF6eiwgcGspO1xuICAgIGNvbnN0IGhhc0lkID0gaWQgIT09IHVuZGVmaW5lZCAmJiBpZCAhPT0gbnVsbDtcbiAgICBpZiAoIWhhc0lkICYmIGNvbXBvc2VkKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIWhhc0lkICYmIGdlbmVyYXRlZCkge1xuICAgICAgY3R4LmxvZ2dlci53YXJuKFxuICAgICAgICBgQ2Fubm90IHJlZnJlc2ggcmVjb3JkIHdpdGggcHJpdmF0ZSBnZW5lcmF0ZWQgcHJpbWFyeSBrZXlgXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzSWQ7XG4gIH1cblxuICBwcml2YXRlIGdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGlyZWN0ID1cbiAgICAgIGN0eC5nZXRPclVuZGVmaW5lZChcImVuZG9yc2luZ09yZ3NcIikgfHxcbiAgICAgIChjdHguZ2V0T3JVbmRlZmluZWQoXCJlbmRvcnNpbmdPcmdzXCIpIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKTtcbiAgICBpZiAoZGlyZWN0ICYmIGRpcmVjdC5sZW5ndGgpIHJldHVybiBkaXJlY3Q7XG4gICAgcmV0dXJuIChcbiAgICAgIChjdHguZ2V0RnJvbUNoaWxkcmVuKFwiZW5kb3JzaW5nT3Jnc1wiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgfHxcbiAgICAgIChjdHguZ2V0RnJvbUNoaWxkcmVuKFwiZW5kb3JzaW5nT3Jnc1wiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jb25maWcuYWxsb3dHYXRld2F5T3ZlcnJpZGU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byBjcmVhdGUgYSByZWNvcmQgaW4gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgdHJhbnNpZW50OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4sXG4gICAgICB0aGlzLmNyZWF0ZVxuICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cudmVyYm9zZShgYWRkaW5nIGVudHJ5IHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGs6ICR7aWR9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHRyYW5zaWVudFBheWxvYWQgPSBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHt9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIFt0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG1vZGVsLCBjbGF6ei5uYW1lKV0sXG4gICAgICB0cmFuc2llbnRQYXlsb2FkIGFzIGFueSxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgY29uc3QgZGVzZXJpYWxpemVkID0gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRoaXMuZGVjb2RlKHJlc3VsdCkpO1xuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKGNsYXp6LCBjdHgsIG5lZWRzRnVsbFBheWxvYWQsIGlkKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgTW9kZWwubWVyZ2UoXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCwgdHJhbnNpZW50IHx8IHt9KSxcbiAgICAgICAgICAgIGRlc2VyaWFsaXplZCxcbiAgICAgICAgICAgIGNsYXp6XG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZFxuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkZXNlcmlhbGl6ZWQ7XG4gIH1cblxuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyBoZWFsdGhjaGVjazxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5oZWFsdGhjaGVjayk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxvZy52ZXJib3NlKGByZWFkaW5nIGVudHJ5IGZyb20gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJoZWFsdGhjaGVja1wiLFxuICAgICAgW10sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIHRvIHJlYWQgYSByZWNvcmQgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyByZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgbG9nLnZlcmJvc2UoYHJlYWRpbmcgZW50cnkgZnJvbSAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrOiAke2lkfWApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIFtpZC50b1N0cmluZygpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gIH1cblxuICB1cGRhdGVQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgIC8vIHJlY29yZFtDb3VjaERCS2V5cy5JRF0gPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsKTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZCwgcmVjb3JkLCAuLi5jdHhBcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHVwZGF0ZSBhIHJlY29yZCBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgdXBkYXRlZCByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHVwZGF0ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyB1cGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHRyYW5zaWVudDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBjdHhBcmdzID0gWy4uLihhcmdzIGFzIHVua25vd24gYXMgYW55W10pXTtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChcbiAgICAgIGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+LFxuICAgICAgdGhpcy51cGRhdGVcbiAgICApO1xuICAgIGxvZy5pbmZvKGBDTElFTlQgVVBEQVRFIGNsYXNzIDogJHt0eXBlb2YgY2xhenp9YCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cudmVyYm9zZShgdXBkYXRpbmcgZW50cnkgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCBoYXNUcmFuc2llbnQgPSB0cmFuc2llbnQgJiYgT2JqZWN0LmtleXModHJhbnNpZW50KS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgaGFzVHJhbnNpZW50IHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgY29uc3QgdHJhbnNpZW50UGF5bG9hZCA9IGhhc1RyYW5zaWVudCA/IHsgW3RhYmxlTmFtZV06IHRyYW5zaWVudCB9IDoge307XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgW3RoaXMuc2VyaWFsaXplci5zZXJpYWxpemUobW9kZWwsIGNsYXp6Lm5hbWUgfHwgY2xhenopXSwgLy8gVE9ETyBzaG91bGQgYmUgcmVjZXZpbmcgY2xhc3MgYnV0IGlzIHJlY2VpdmluZyBzdHJpbmdcbiAgICAgIHRyYW5zaWVudFBheWxvYWQgYXMgYW55LFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICBjb25zdCBkZXNlcmlhbGl6ZWQgPSB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gICAgaWYgKHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoY2xhenosIGN0eCwgbmVlZHNGdWxsUGF5bG9hZCwgaWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBNb2RlbC5tZXJnZShcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oe30sIG1vZGVsLCB0cmFuc2llbnQgfHwge30pLFxuICAgICAgICAgICAgZGVzZXJpYWxpemVkLFxuICAgICAgICAgICAgY2xhenpcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkXG4gICAgICAgICksXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGRlbGV0ZSBhIHJlY29yZCBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXIgdG8gZGVsZXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIHJlY29yZFxuICAgKi9cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGUpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBNb2RlbC5pc1RyYW5zaWVudChjbGF6eikgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBsZXQgcmVzdWx0OiBhbnk7XG4gICAgY29uc3Qgc2hvdWxkSHlkcmF0ZSA9IHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoXG4gICAgICBjbGF6eixcbiAgICAgIGN0eCxcbiAgICAgIG5lZWRzRnVsbFBheWxvYWQsXG4gICAgICBpZFxuICAgICk7XG4gICAgaWYgKHNob3VsZEh5ZHJhdGUpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMucmVhZChjbGF6eiwgaWQsIGN0eCk7XG4gICAgfVxuXG4gICAgbG9nLnZlcmJvc2UoYGRlbGV0aW5nIGVudHJ5IGZyb20gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICBbaWQudG9TdHJpbmcoKV0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIHJldHVybiBzaG91bGRIeWRyYXRlXG4gICAgICA/IHJlc3VsdFxuICAgICAgOiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IHF1ZXJ5IGFnYWluc3QgdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHN1bW1hcnkgRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gdG8gcGVyZm9ybSBhIHF1ZXJ5IHVzaW5nIE1hbmdvIFF1ZXJ5IHN5bnRheFxuICAgKiBAdGVtcGxhdGUgViAtIFRoZSByZXR1cm4gdHlwZVxuICAgKiBAcGFyYW0ge01hbmdvUXVlcnl9IHJhd0lucHV0IC0gVGhlIE1hbmdvIFF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHtib29sZWFufSBwcm9jZXNzIC0gV2hldGhlciB0byBwcm9jZXNzIHRoZSByZXN1bHRcbiAgICogQHJldHVybiB7UHJvbWlzZTxWPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHF1ZXJ5IHJlc3VsdFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAgICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAgICpcbiAgICogICBDbGllbnQtPj5GYWJyaWNBZGFwdGVyOiByYXcocmF3SW5wdXQsIHByb2Nlc3MpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IEpTT04uc3RyaW5naWZ5KHJhd0lucHV0KVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBldmFsdWF0ZVRyYW5zYWN0aW9uKFwicXVlcnlcIiwgW2lucHV0XSlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IGV2YWx1YXRlKFwicXVlcnlcIiwgcHJvcG9zYWxPcHRpb25zKVxuICAgKiAgIENvbnRyYWN0LT4+Q2hhaW5jb2RlOiBpbnZva2VcbiAgICogICBDaGFpbmNvZGUtLT4+Q29udHJhY3Q6IHJlc3BvbnNlXG4gICAqICAgQ29udHJhY3QtLT4+RmFicmljQWRhcHRlcjogcmVzdWx0XG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IEpTT04ucGFyc2UoZGVjb2RlKHJlc3VsdCkpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IFByb2Nlc3MgcmVzdWx0IGJhc2VkIG9uIHR5cGVcbiAgICogICBGYWJyaWNBZGFwdGVyLS0+PkNsaWVudDogcHJvY2Vzc2VkIHJlc3VsdFxuICAgKi9cbiAgQGRlYnVnKClcbiAgYXN5bmMgcmF3PFYsIEQgZXh0ZW5kcyBib29sZWFuPihcbiAgICByYXdJbnB1dDogTWFuZ29RdWVyeSxcbiAgICBkb2NzT25seTogRCA9IHRydWUgYXMgRCxcbiAgICBjbGF6ejogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFY+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJhdyk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gY2xhenoubmFtZTtcbiAgICBsb2cuaW5mbyhgUGVyZm9ybWluZyByYXcgc3RhdGVtZW50IG9uIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKGNsYXp6KX1gKTtcbiAgICBsZXQgdHJhbnNhY3Rpb25SZXN1bHQ6IGFueTtcbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgIGN0eCxcbiAgICAgICAgXCJyYXdcIixcbiAgICAgICAgW0pTT04uc3RyaW5naWZ5KHJhd0lucHV0KSwgZG9jc09ubHldLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdGFibGVOYW1lXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHRyYW5zYWN0aW9uUmVzdWx0KSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyByZXN1bHQ6ICR7ZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZVJlY29yZCA9IChyZWNvcmQ6IFJlY29yZDxhbnksIGFueT4pID0+IHtcbiAgICAgIGlmIChNb2RlbC5pc01vZGVsKHJlY29yZCkpIHJldHVybiBNb2RlbC5idWlsZChyZWNvcmQpO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoKSByZXR1cm4gcmVzdWx0IGFzIFY7XG4gICAgICBjb25zdCBlbCA9IHJlc3VsdFswXTtcbiAgICAgIGlmIChNb2RlbC5pc01vZGVsKGVsKSlcbiAgICAgICAgLy8gaWYgdGhlIGZpcnN0IG9uZSBpcyBhIG1vZGVsLCBhbGwgYXJlIG1vZGVsc1xuICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcCgoZWwpID0+IE1vZGVsLmJ1aWxkKGVsKSkgYXMgVjtcbiAgICAgIHJldHVybiByZXN1bHQgYXMgVjtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VSZWNvcmQocmVzdWx0IGFzIGFueSkgYXMgVjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSBDb3VjaERCIHZpZXcgcXVlcnkgYWdhaW5zdCB0aGUgRmFicmljIGNoYWluY29kZVxuICAgKiBAc3VtbWFyeSBFdmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiB0byBxdWVyeSBhIGRlc2lnbiBkb2N1bWVudCB2aWV3XG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHZpZXcgcmVzcG9uc2UgdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGRvYyAtIERlc2lnbiBkb2N1bWVudCBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2aWV3TmFtZSAtIFZpZXcgbmFtZVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9wdGlvbnMgLSBWaWV3IHF1ZXJ5IG9wdGlvbnNcbiAgICogQHBhcmFtIHsuLi5Db250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj59IGFyZ3MgLSBPcHRpb25hbCBjb250ZXh0dWFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPFZpZXdSZXNwb25zZTxSPj59IFRoZSB2aWV3IHJlc3BvbnNlXG4gICAqL1xuICBAZGVidWcoKVxuICBhc3luYyB2aWV3PFI+KFxuICAgIGRkb2M6IHN0cmluZyxcbiAgICB2aWV3TmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8Vmlld1Jlc3BvbnNlPFI+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy52aWV3KTtcbiAgICBsb2cuaW5mbyhgUXVlcnlpbmcgdmlldyAke2Rkb2N9LyR7dmlld05hbWV9YCk7XG4gICAgbGV0IHRyYW5zYWN0aW9uUmVzdWx0OiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHRyYW5zYWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICBjdHgsXG4gICAgICAgIFwidmlld1wiLFxuICAgICAgICBbZGRvYywgdmlld05hbWUsIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpXSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGxldCByZXN1bHQ6IFZpZXdSZXNwb25zZTxSPjtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZSh0cmFuc2FjdGlvblJlc3VsdCkpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgdmlldyByZXN1bHQ6ICR7ZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBvciBjcmVhdGVzIGEgZ1JQQyBjbGllbnQgZm9yIHRoZSBGYWJyaWMgcGVlclxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgY2FjaGVkIGNsaWVudCBvciBjcmVhdGVzIGEgbmV3IG9uZSBpZiBub25lIGV4aXN0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPENsaWVudD59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBnUlBDIGNsaWVudFxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0Q2xpZW50KCk6IENsaWVudCB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnQpXG4gICAgICB0aGlzLl9jbGllbnQgPSBGYWJyaWNDbGllbnRBZGFwdGVyLmdldENsaWVudCh0aGlzLmNvbmZpZyk7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIEdhdGV3YXkgaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IEdhdGV3YXkgaW5zdGFuY2UgdXNpbmcgdGhlIGN1cnJlbnQgY2xpZW50XG4gICAqIEByZXR1cm4ge1Byb21pc2U8R2F0ZXdheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgR2F0ZXdheShjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+KTogUHJvbWlzZTxHYXRld2F5PiB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0R2F0ZXdheShjdHgsIHRoaXMuY29uZmlnLCB0aGlzLmNsaWVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRyYWN0TmFtZShjbGFzc05hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAoIWNsYXNzTmFtZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYCR7Y2xhc3NOYW1lfUNvbnRyYWN0YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIENvbnRyYWN0IGluc3RhbmNlIGZvciB0aGUgRmFicmljIGNoYWluY29kZVxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IENvbnRyYWN0IGluc3RhbmNlIHVzaW5nIHRoZSBjdXJyZW50IEdhdGV3YXlcbiAgICogQHJldHVybiB7UHJvbWlzZTxDb250cmFrdD59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBDb250cmFjdCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIENvbnRyYWN0KFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgY29udHJhY3ROYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8Q29udHJha3Q+IHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5nZXRDb250cmFjdChcbiAgICAgIGF3YWl0IHRoaXMuR2F0ZXdheShjdHgpLFxuICAgICAgdGhpcy5jb25maWcsXG4gICAgICBjb250cmFjdE5hbWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBTdWJtaXRzIG9yIGV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgY2hhaW5jb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcGkgLSBUaGUgY2hhaW5jb2RlIGZ1bmN0aW9uIHRvIGNhbGxcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWJtaXQgLSBXaGV0aGVyIHRvIHN1Ym1pdCAodHJ1ZSkgb3IgZXZhbHVhdGUgKGZhbHNlKSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdIC0gQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNoYWluY29kZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFt0cmFuc2llbnREYXRhXSAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbZW5kb3JzaW5nT3JnYW5pemF0aW9uc10gLSBPcmdhbml6YXRpb25zIHRoYXQgbXVzdCBlbmRvcnNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFVpbnQ4QXJyYXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdHJhbnNhY3Rpb24gcmVzdWx0XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gICAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAgICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAgICpcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY29ubmVjdCgpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBnZXRDb250cmFjdCgpXG4gICAqICAgYWx0IHN1Ym1pdCB0cmFuc2FjdGlvblxuICAgKiAgICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBzdWJtaXQoYXBpLCBwcm9wb3NhbE9wdGlvbnMpXG4gICAqICAgZWxzZSBldmFsdWF0ZSB0cmFuc2FjdGlvblxuICAgKiAgICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBldmFsdWF0ZShhcGksIHByb3Bvc2FsT3B0aW9ucylcbiAgICogICBlbmRcbiAgICogICBDb250cmFjdC0+PkNoYWluY29kZTogaW52b2tlXG4gICAqICAgQ2hhaW5jb2RlLS0+PkNvbnRyYWN0OiByZXNwb25zZVxuICAgKiAgIENvbnRyYWN0LS0+PkZhYnJpY0FkYXB0ZXI6IHJlc3VsdFxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjbG9zZSgpXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgdHJhbnNhY3Rpb24oXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBhcGk6IHN0cmluZyxcbiAgICBzdWJtaXQgPSB0cnVlLFxuICAgIGFyZ3M/OiBhbnlbXSxcbiAgICB0cmFuc2llbnREYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IHN0cmluZ1tdLFxuICAgIGNsYXNzTmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy50cmFuc2FjdGlvbik7XG4gICAgY29uc3QgZ2F0ZXdheSA9IGF3YWl0IHRoaXMuR2F0ZXdheShjdHgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250cmFjdCA9IGF3YWl0IHRoaXMuQ29udHJhY3QoXG4gICAgICAgIGN0eCxcbiAgICAgICAgdGhpcy5nZXRDb250cmFjdE5hbWUoY2xhc3NOYW1lKVxuICAgICAgKTtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgJHtzdWJtaXQgPyBcIlN1Ym1pdFwiIDogXCJFdmFsdWF0ZVwifXRpbmcgdHJhbnNhY3Rpb24gJHt0aGlzLmdldENvbnRyYWN0TmFtZShjbGFzc05hbWUpIHx8IHRoaXMuY29uZmlnLmNvbnRyYWN0TmFtZX0uJHthcGl9YFxuICAgICAgKTtcbiAgICAgIGxvZy5kZWJ1ZyhgYXJnczogJHthcmdzPy5tYXAoKGEpID0+IGEudG9TdHJpbmcoKSkuam9pbihcIlxcblwiKSB8fCBcIm5vbmVcIn1gKTtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IHN1Ym1pdCA/IGNvbnRyYWN0LnN1Ym1pdCA6IGNvbnRyYWN0LmV2YWx1YXRlO1xuXG4gICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zID0gZW5kb3JzaW5nT3JnYW5pemF0aW9ucz8ubGVuZ3RoXG4gICAgICAgID8gZW5kb3JzaW5nT3JnYW5pemF0aW9uc1xuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHByb3Bvc2FsT3B0aW9uczogUHJvcG9zYWxPcHRpb25zID0ge1xuICAgICAgICBhcmd1bWVudHM6IGFyZ3MgfHwgW10sXG4gICAgICAgIHRyYW5zaWVudERhdGE6IE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudERhdGEpLnJlZHVjZShcbiAgICAgICAgICAoYWNjLCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IEpTT04uc3RyaW5naWZ5KHZhbCk7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sXG4gICAgICAgICAge30gYXMgdHlwZW9mIHRyYW5zaWVudERhdGFcbiAgICAgICAgKSxcbiAgICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9uczogY3R4LmdldE9yVW5kZWZpbmVkKFwiYWxsb3dNYW51YWxFbmRvcnNpbmdPcmdzXCIpXG4gICAgICAgICAgPyBlbmRvcnNpbmdPcmdhbml6YXRpb25zIHx8IHVuZGVmaW5lZFxuICAgICAgICAgIDogdW5kZWZpbmVkLCAvLyBtc3BJZCBsaXN0XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gYXdhaXQgbWV0aG9kLmNhbGwoY29udHJhY3QsIGFwaSwgcHJvcG9zYWxPcHRpb25zKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYENsb3NpbmcgJHt0aGlzLmNvbmZpZy5tc3BJZH0gZ2F0ZXdheSBjb25uZWN0aW9uYCk7XG4gICAgICBnYXRld2F5LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRVc2VMZWdhY3lHYXRld2F5KGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFjdHguZ2V0T3JVbmRlZmluZWQoXCJsZWdhY3lcIikgJiYgISF0aGlzLmNvbmZpZy5hbGxvd0dhdGV3YXlPdmVycmlkZTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZUxlZ2FjeUFyZ3MoYXJncz86IGFueVtdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiAoYXJncyB8fCBbXSkubWFwKChhcmcpID0+XG4gICAgICB0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiID8gYXJnIDogSlNPTi5zdHJpbmdpZnkoYXJnKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTGVnYWN5VHJhbnNpZW50KFxuICAgIHRyYW5zaWVudERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICk6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gfCB1bmRlZmluZWQge1xuICAgIGlmICghdHJhbnNpZW50RGF0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModHJhbnNpZW50RGF0YSk7XG4gICAgaWYgKCFlbnRyaWVzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICBtYXBba2V5XSA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVMZWdhY3lNc3BDb3VudCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvbmZpZ3VyZWQgPSB0aGlzLmNvbmZpZy5sZWdhY3lNc3BDb3VudCA/PyAxO1xuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcihjb25maWd1cmVkKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShwYXJzZWQpIHx8IHBhcnNlZCA8IDEpIHJldHVybiAxO1xuICAgIHJldHVybiBNYXRoLmZsb29yKHBhcnNlZCk7XG4gIH1cblxuICBwcml2YXRlIHBpY2tMZWdhY3lDYW5kaWRhdGVzKFxuICAgIGNhbmRpZGF0ZXM6IE1zcERldGFpbHNbXSxcbiAgICBsaW1pdDogbnVtYmVyXG4gICk6IE1zcERldGFpbHNbXSB7XG4gICAgaWYgKCFjYW5kaWRhdGVzLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgYXZhaWxhYmxlID0gWy4uLmNhbmRpZGF0ZXNdO1xuICAgIGNvbnN0IHRhcmdldCA9IE1hdGgubWluKGxpbWl0LCBhdmFpbGFibGUubGVuZ3RoKTtcbiAgICBjb25zdCBwaWNrZWQ6IE1zcERldGFpbHNbXSA9IFtdO1xuICAgIHdoaWxlIChwaWNrZWQubGVuZ3RoIDwgdGFyZ2V0ICYmIGF2YWlsYWJsZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGlkeCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGF2YWlsYWJsZS5sZW5ndGgpO1xuICAgICAgY29uc3QgW3NlbGVjdGlvbl0gPSBhdmFpbGFibGUuc3BsaWNlKGlkeCwgMSk7XG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgIHBpY2tlZC5wdXNoKHNlbGVjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwaWNrZWQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBMZWdhY3lQZWVyVGFyZ2V0W10ge1xuICAgIGNvbnN0IHBlZXJzOiBMZWdhY3lQZWVyVGFyZ2V0W10gPSBbXG4gICAgICB7XG4gICAgICAgIG1zcElkOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgICAgcGVlckVuZHBvaW50OiB0aGlzLmNvbmZpZy5wZWVyRW5kcG9pbnQsXG4gICAgICAgIHBlZXJIb3N0QWxpYXM6IHRoaXMuY29uZmlnLnBlZXJIb3N0QWxpYXMsXG4gICAgICAgIHRsc0NlcnQ6IHRoaXMuY29uZmlnLnRsc0NlcnQsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBsZXQgZW5kb3JzaW5nT3JncyA9IHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpIHx8IFtdO1xuICAgIGVuZG9yc2luZ09yZ3MgPSBBcnJheS5pc0FycmF5KGVuZG9yc2luZ09yZ3MpXG4gICAgICA/IGVuZG9yc2luZ09yZ3NcbiAgICAgIDogW2VuZG9yc2luZ09yZ3NdO1xuICAgIGNvbnN0IGVuZG9yc2VycyA9XG4gICAgICBlbmRvcnNpbmdPcmdzLmZpbHRlcigob3JnKTogb3JnIGlzIHN0cmluZyA9PiBCb29sZWFuKG9yZykpIHx8IFtdO1xuICAgIGNvbnN0IGV4dHJhcyA9IGVuZG9yc2Vycy5maWx0ZXIoKG9yZykgPT4gb3JnICE9PSB0aGlzLmNvbmZpZy5tc3BJZCk7XG4gICAgaWYgKCFleHRyYXMubGVuZ3RoKSByZXR1cm4gcGVlcnM7XG5cbiAgICBjb25zdCBtYXAgPSB0aGlzLmNvbmZpZy5tc3BNYXA7XG4gICAgY29uc3QgbGVnYWN5Q291bnQgPSB0aGlzLnJlc29sdmVMZWdhY3lNc3BDb3VudCgpO1xuICAgIGZvciAoY29uc3QgbXNwIG9mIGV4dHJhcykge1xuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IG1hcD8uW21zcF07XG4gICAgICBpZiAoIWNhbmRpZGF0ZXM/Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICBgTm8gcGVlciBtYXBwaW5nIGF2YWlsYWJsZSBmb3IgTVNQICR7bXNwfS4gUHJvdmlkZSBpdCB2aWEgY29uZmlnLm1zcE1hcGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnBpY2tMZWdhY3lDYW5kaWRhdGVzKGNhbmRpZGF0ZXMsIGxlZ2FjeUNvdW50KTtcbiAgICAgIGlmICghc2VsZWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgYE5vIHZhbGlkIHBlZXIgbWFwcGluZyBhdmFpbGFibGUgZm9yIE1TUCAke21zcH0uIFByb3ZpZGUgaXQgdmlhIGNvbmZpZy5tc3BNYXBgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNob2ljZSBvZiBzZWxlY3Rpb25zKSB7XG4gICAgICAgIGlmICghY2hvaWNlLmVuZHBvaW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgICBgSW52YWxpZCBwZWVyIG1hcHBpbmcgZm9yIE1TUCAke21zcH06IG1pc3NpbmcgZW5kcG9pbnRgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBwZWVycy5wdXNoKHtcbiAgICAgICAgICBtc3BJZDogbXNwLFxuICAgICAgICAgIHBlZXJFbmRwb2ludDogY2hvaWNlLmVuZHBvaW50LFxuICAgICAgICAgIHBlZXJIb3N0QWxpYXM6IGNob2ljZS5hbGlhcyxcbiAgICAgICAgICB0bHNDZXJ0OiBjaG9pY2UudGxzQ2VydCB8fCB0aGlzLmNvbmZpZy50bHNDZXJ0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGVlcnM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyhcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGZjbjogc3RyaW5nLFxuICAgIGFyZ3M6IHN0cmluZ1tdLFxuICAgIHRyYW5zaWVudE1hcDogUmVjb3JkPHN0cmluZywgQnVmZmVyPiB8IHVuZGVmaW5lZCxcbiAgICBwZWVyQ29uZmlnczogTGVnYWN5UGVlclRhcmdldFtdLFxuICAgIGNsYXNzTmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5zdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMpO1xuICAgIGNvbnN0IHBlZXJzID0gdGhpcy5ub3JtYWxpemVMZWdhY3lQZWVycyhwZWVyQ29uZmlncyk7XG4gICAgY29uc3QgaWRlbnRpdHlNYXRlcmlhbCA9IGF3YWl0IHRoaXMucmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwoKTtcbiAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCBXYWxsZXRzLm5ld0luTWVtb3J5V2FsbGV0KCk7XG4gICAgY29uc3QgaWRlbnRpdHlMYWJlbCA9IGAke3RoaXMuY29uZmlnLm1zcElkfS1sZWdhY3lgO1xuICAgIGF3YWl0IHdhbGxldC5wdXQoaWRlbnRpdHlMYWJlbCwge1xuICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgY2VydGlmaWNhdGU6IGlkZW50aXR5TWF0ZXJpYWwuY2VydGlmaWNhdGUsXG4gICAgICAgIHByaXZhdGVLZXk6IGlkZW50aXR5TWF0ZXJpYWwucHJpdmF0ZUtleSxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICB0eXBlOiBcIlguNTA5XCIsXG4gICAgfSBhcyBJZGVudGl0eSk7XG5cbiAgICBjb25zdCBjb25uZWN0aW9uUHJvZmlsZSA9IGF3YWl0IHRoaXMuYnVpbGRMZWdhY3lDb25uZWN0aW9uUHJvZmlsZShwZWVycyk7XG4gICAgY29uc3QgZ2F0ZXdheSA9IG5ldyBMZWdhY3lHYXRld2F5KCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZ2F0ZXdheS5jb25uZWN0KGNvbm5lY3Rpb25Qcm9maWxlLCB7XG4gICAgICAgIGlkZW50aXR5OiBpZGVudGl0eUxhYmVsLFxuICAgICAgICB3YWxsZXQsXG4gICAgICAgIGRpc2NvdmVyeToge1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgYXNMb2NhbGhvc3Q6IHRoaXMuc2hvdWxkVHJlYXRQZWVyc0FzTG9jYWxob3N0KHBlZXJzKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGxzSW5mbzoge1xuICAgICAgICAgIGNlcnRpZmljYXRlOiBpZGVudGl0eU1hdGVyaWFsLmNlcnRpZmljYXRlLFxuICAgICAgICAgIGtleTogaWRlbnRpdHlNYXRlcmlhbC5wcml2YXRlS2V5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG5ldHdvcmsgPSBhd2FpdCBnYXRld2F5LmdldE5ldHdvcmsodGhpcy5jb25maWcuY2hhbm5lbCk7XG4gICAgICBjb25zdCBjb250cmFjdCA9IG5ldHdvcmsuZ2V0Q29udHJhY3QoXG4gICAgICAgIHRoaXMuY29uZmlnLmNoYWluY29kZU5hbWUsXG4gICAgICAgIHRoaXMuZ2V0Q29udHJhY3ROYW1lKGNsYXNzTmFtZSlcbiAgICAgICk7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGNvbnRyYWN0LmNyZWF0ZVRyYW5zYWN0aW9uKGZjbik7XG5cbiAgICAgIGlmICh0cmFuc2llbnRNYXApIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNpZW50KHRyYW5zaWVudE1hcCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVuZG9yc2VycyA9IHBlZXJzXG4gICAgICAgIC5tYXAoKHBlZXIpID0+IG5ldHdvcmsuZ2V0Q2hhbm5lbCgpLmdldEVuZG9yc2VyKHBlZXIubmFtZSkpXG4gICAgICAgIC5maWx0ZXIoKGVuZG9yc2VyKTogZW5kb3JzZXIgaXMgRW5kb3JzZXIgPT4gQm9vbGVhbihlbmRvcnNlcikpO1xuICAgICAgaWYgKGVuZG9yc2Vycy5sZW5ndGgpIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0RW5kb3JzaW5nUGVlcnMoZW5kb3JzZXJzKTtcbiAgICAgIH1cblxuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGBMZWdhY3kgc3VibWl0dGluZyAke3RoaXMuZ2V0Q29udHJhY3ROYW1lKGNsYXNzTmFtZSkgfHwgdGhpcy5jb25maWcuY29udHJhY3ROYW1lfS4ke2Zjbn0gdmlhIHBlZXJzICR7cGVlcnMubWFwKChwKSA9PiBwLnBlZXJFbmRwb2ludCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zYWN0aW9uLnN1Ym1pdCguLi5hcmdzKTtcbiAgICAgIHJldHVybiBVaW50OEFycmF5LmZyb20ocmVzdWx0KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZ2F0ZXdheS5kaXNjb25uZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVMZWdhY3lQZWVycyhcbiAgICBwZWVyczogTGVnYWN5UGVlclRhcmdldFtdXG4gICk6IExlZ2FjeVBlZXJXaXRoTmFtZVtdIHtcbiAgICBjb25zdCBkZWR1cGVkID0gbmV3IE1hcDxzdHJpbmcsIExlZ2FjeVBlZXJXaXRoTmFtZT4oKTtcbiAgICBjb25zdCBhZGRQZWVyID0gKHBlZXI6IExlZ2FjeVBlZXJUYXJnZXQpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGAke3BlZXIucGVlckVuZHBvaW50fXwke3BlZXIucGVlckhvc3RBbGlhcyB8fCBcIlwifWA7XG4gICAgICBpZiAoZGVkdXBlZC5oYXMoa2V5KSkgcmV0dXJuO1xuICAgICAgY29uc3QgbmFtZSA9IGBwZWVyLSR7cGVlci5tc3BJZH0tJHtkZWR1cGVkLnNpemV9YDtcbiAgICAgIGRlZHVwZWQuc2V0KGtleSwge1xuICAgICAgICAuLi5wZWVyLFxuICAgICAgICBuYW1lLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHBlZXJzLmZvckVhY2goYWRkUGVlcik7XG4gICAgYWRkUGVlcih7XG4gICAgICBtc3BJZDogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICBwZWVyRW5kcG9pbnQ6IHRoaXMuY29uZmlnLnBlZXJFbmRwb2ludCxcbiAgICAgIHBlZXJIb3N0QWxpYXM6IHRoaXMuY29uZmlnLnBlZXJIb3N0QWxpYXMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShkZWR1cGVkLnZhbHVlcygpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwoKTogUHJvbWlzZTx7XG4gICAgY2VydGlmaWNhdGU6IHN0cmluZztcbiAgICBwcml2YXRlS2V5OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGF3YWl0IHRoaXMucmVhZFBlbUlucHV0KFxuICAgICAgdGhpcy5jb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGhcbiAgICApO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLnJlYWRQZW1JbnB1dChcbiAgICAgIHRoaXMuY29uZmlnLmtleUNlcnRPckRpcmVjdG9yeVBhdGhcbiAgICApO1xuICAgIHJldHVybiB7IGNlcnRpZmljYXRlLCBwcml2YXRlS2V5IH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkTGVnYWN5Q29ubmVjdGlvblByb2ZpbGUocGVlcnM6IExlZ2FjeVBlZXJXaXRoTmFtZVtdKSB7XG4gICAgY29uc3QgcGVlckVudHJpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBjaGFubmVsUGVlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBvcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgZm9yIChjb25zdCBwZWVyIG9mIHBlZXJzKSB7XG4gICAgICBjb25zdCB0bHNQZW0gPSBhd2FpdCB0aGlzLnJlYWRQZW1JbnB1dChcbiAgICAgICAgcGVlci50bHNDZXJ0IHx8IHRoaXMuY29uZmlnLnRsc0NlcnRcbiAgICAgICk7XG4gICAgICBjb25zdCBob3N0bmFtZSA9XG4gICAgICAgIHBlZXIucGVlckhvc3RBbGlhcyB8fCB0aGlzLmV4dHJhY3RIb3N0KHBlZXIucGVlckVuZHBvaW50KTtcbiAgICAgIHBlZXJFbnRyaWVzW3BlZXIubmFtZV0gPSB7XG4gICAgICAgIHVybDogdGhpcy5lbnN1cmVHcnBjVXJsKHBlZXIucGVlckVuZHBvaW50KSxcbiAgICAgICAgdGxzQ0FDZXJ0czogeyBwZW06IHRsc1BlbSB9LFxuICAgICAgICBncnBjT3B0aW9uczoge1xuICAgICAgICAgIFwic3NsLXRhcmdldC1uYW1lLW92ZXJyaWRlXCI6IGhvc3RuYW1lLFxuICAgICAgICAgIGhvc3RuYW1lT3ZlcnJpZGU6IGhvc3RuYW1lLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNoYW5uZWxQZWVyc1twZWVyLm5hbWVdID0ge1xuICAgICAgICBlbmRvcnNpbmdQZWVyOiB0cnVlLFxuICAgICAgICBjaGFpbmNvZGVRdWVyeTogdHJ1ZSxcbiAgICAgICAgbGVkZ2VyUXVlcnk6IHRydWUsXG4gICAgICAgIGV2ZW50U291cmNlOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIG9yZ3NbcGVlci5tc3BJZF0gPSBvcmdzW3BlZXIubXNwSWRdIHx8IHtcbiAgICAgICAgbXNwaWQ6IHBlZXIubXNwSWQsXG4gICAgICAgIHBlZXJzOiBbXSxcbiAgICAgIH07XG4gICAgICBvcmdzW3BlZXIubXNwSWRdLnBlZXJzLnB1c2gocGVlci5uYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogXCJsZWdhY3ktbWFudWFsXCIsXG4gICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgICBjbGllbnQ6IHtcbiAgICAgICAgb3JnYW5pemF0aW9uOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgIH0sXG4gICAgICBvcmdhbml6YXRpb25zOiBvcmdzLFxuICAgICAgcGVlcnM6IHBlZXJFbnRyaWVzLFxuICAgICAgb3JkZXJlcnM6IHt9LFxuICAgICAgY2hhbm5lbHM6IHtcbiAgICAgICAgW3RoaXMuY29uZmlnLmNoYW5uZWxdOiB7XG4gICAgICAgICAgcGVlcnM6IGNoYW5uZWxQZWVycyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkVHJlYXRQZWVyc0FzTG9jYWxob3N0KHBlZXJzOiBMZWdhY3lQZWVyV2l0aE5hbWVbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwZWVycy5ldmVyeSgocGVlcikgPT4gdGhpcy5pc0xvY2FsRW5kcG9pbnQocGVlci5wZWVyRW5kcG9pbnQpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNMb2NhbEVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5leHRyYWN0SG9zdChlbmRwb2ludCkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gaG9zdCA9PT0gXCJsb2NhbGhvc3RcIiB8fCBob3N0ID09PSBcIjEyNy4wLjAuMVwiO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0SG9zdChlbmRwb2ludDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzYW5pdGl6ZWQgPSBlbmRwb2ludC5yZXBsYWNlKC9eZ3JwY3M/OlxcL1xcLy8sIFwiXCIpO1xuICAgIHJldHVybiBzYW5pdGl6ZWQuc3BsaXQoXCI6XCIpWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVHcnBjVXJsKGVuZHBvaW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICgvXmdycGNzPzpcXC9cXC8vaS50ZXN0KGVuZHBvaW50KSkgcmV0dXJuIGVuZHBvaW50O1xuICAgIHJldHVybiBgZ3JwY3M6Ly8ke2VuZHBvaW50fWA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWRQZW1JbnB1dChzb3VyY2U/OiBzdHJpbmcgfCBCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghc291cmNlKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgY2VydGlmaWNhdGUgb3Iga2V5IG1hdGVyaWFsXCIpO1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoc291cmNlKSkgcmV0dXJuIHNvdXJjZS50b1N0cmluZyhcInV0ZjhcIik7XG4gICAgY29uc3QgdHJpbW1lZCA9IHNvdXJjZS50cmltKCk7XG4gICAgaWYgKC8tLS0tLUJFR0lOIFtBLVogXSstLS0tLS8udGVzdCh0cmltbWVkKSkgcmV0dXJuIHRyaW1tZWQ7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHNvdXJjZSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBpZiAoc3RhdHM/LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHJldHVybiBhd2FpdCBnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChzb3VyY2UpO1xuICAgIH1cbiAgICByZXR1cm4gKGF3YWl0IHJlYWRGc0ZpbGUoc291cmNlKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuIGVycm9yIGludG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYW55IGVycm9yIGludG8gYSBzdGFuZGFyZGl6ZWQgQmFzZUVycm9yXG4gICAqIEBwYXJhbSB7RXJyb3IgfCBzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3JcbiAgICovXG4gIG92ZXJyaWRlIHBhcnNlRXJyb3I8RSBleHRlbmRzIEJhc2VFcnJvcj4oZXJyOiBFcnJvciB8IHN0cmluZyk6IEUge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLnBhcnNlRXJyb3I8RT4oZXJyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIHRoYXQgbW9kaWZpZXMgdGhlIGxlZGdlciBzdGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIGNoYWluY29kZSBmdW5jdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjaGFpbmNvZGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbdHJhbnNpZW50RGF0YV0gLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2VuZG9yc2luZ09yZ2FuaXphdGlvbnNdIC0gT3JnYW5pemF0aW9ucyB0aGF0IG11c3QgZW5kb3JzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBhcGk6IHN0cmluZyxcbiAgICBhcmdzPzogYW55W10sXG4gICAgdHJhbnNpZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IEFycmF5PHN0cmluZz4sXG4gICAgY2xhc3NOYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGlmICh0aGlzLnNob3VsZFVzZUxlZ2FjeUdhdGV3YXkoY3R4KSkge1xuICAgICAgY29uc3QgbGVnYWN5QXJncyA9IHRoaXMucHJlcGFyZUxlZ2FjeUFyZ3MoYXJncyk7XG4gICAgICBjb25zdCB0cmFuc2llbnRNYXAgPSB0aGlzLmJ1aWxkTGVnYWN5VHJhbnNpZW50KHRyYW5zaWVudERhdGEpO1xuICAgICAgY29uc3QgcGVlckNvbmZpZ3MgPSB0aGlzLmJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MoY3R4KTtcbiAgICAgIHJldHVybiB0aGlzLnN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyhcbiAgICAgICAgY3R4LFxuICAgICAgICBhcGksXG4gICAgICAgIGxlZ2FjeUFyZ3MsXG4gICAgICAgIHRyYW5zaWVudE1hcCxcbiAgICAgICAgcGVlckNvbmZpZ3MsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBhcGksXG4gICAgICB0cnVlLFxuICAgICAgYXJncyxcbiAgICAgIHRyYW5zaWVudERhdGEsXG4gICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zLFxuICAgICAgY2xhc3NOYW1lXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gb24gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIGEgdHJhbnNhY3Rpb24gdGhhdCBkb2VzIG5vdCBtb2RpZnkgdGhlIGxlZGdlciBzdGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIGNoYWluY29kZSBmdW5jdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjaGFpbmNvZGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbdHJhbnNpZW50RGF0YV0gLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2VuZG9yc2luZ09yZ2FuaXphdGlvbnNdIC0gT3JnYW5pemF0aW9ucyB0aGF0IG11c3QgZW5kb3JzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGFwaTogc3RyaW5nLFxuICAgIGFyZ3M/OiBhbnlbXSxcbiAgICB0cmFuc2llbnREYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zPzogQXJyYXk8c3RyaW5nPixcbiAgICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBhcGksXG4gICAgICBmYWxzZSxcbiAgICAgIGFyZ3MsXG4gICAgICB0cmFuc2llbnREYXRhLFxuICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucyxcbiAgICAgIGNsYXNzTmFtZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNodXRzIGRvd24gdGhlIGNvbm5lY3Rpb24gdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENsb3NlcyB0aGUgYWN0aXZlIGRpc3BhdGNoICh3aGljaCBpbiB0dXJuIGNsb3NlcyBhbnkgZ2F0ZXdheVxuICAgKiBldmVudCBzdWJzY3JpcHRpb24pIHZpYSB0aGUgYmFzZSBjbGFzcywgdGhlbiBjbG9zZXMgdGhlIGdSUEMgY2xpZW50LlxuICAgKiBXb3JrcyBjb3JyZWN0bHkgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGBzeW50aGV0aWNFdmVudHNgIGlzIGVuYWJsZWQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBjb25uZWN0aW9ucyBhcmUgY2xvc2VkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBzaHV0ZG93biguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQmFzZSBjbGFzcyBoYW5kbGVzIGRpc3BhdGNoLmNsb3NlKCkgaW50ZXJuYWxseS5cbiAgICBhd2FpdCBzdXBlci5zaHV0ZG93biguLi5hcmdzKTtcbiAgICBpZiAodGhpcy5jbGllbnQpIHtcbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoYENsb3NpbmcgJHt0aGlzLmNvbmZpZy5tc3BJZH0gZ2F0ZXdheSBjbGllbnRgKTtcbiAgICAgIHRoaXMuY2xpZW50LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgQ29udHJhY3QgaW5zdGFuY2UgZnJvbSBhIEdhdGV3YXlcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgY2hhaW5jb2RlIGNvbnRyYWN0IGZyb20gdGhlIHNwZWNpZmllZCBuZXR3b3JrXG4gICAqIEBwYXJhbSB7R2F0ZXdheX0gZ2F0ZXdheSAtIFRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtDb250cmFrdH0gVGhlIENvbnRyYWN0IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZ2V0Q29udHJhY3QoXG4gICAgZ2F0ZXdheTogR2F0ZXdheSxcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgY29udHJhY3ROYW1lPzogc3RyaW5nXG4gICk6IENvbnRyYWt0IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRDb250cmFjdCk7XG4gICAgY29uc3QgbmV0d29yayA9IHRoaXMuZ2V0TmV0d29yayhnYXRld2F5LCBjb25maWcuY2hhbm5lbCk7XG4gICAgbGV0IGNvbnRyYWN0OiBDb250cmFrdDtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgUmV0cmlldmluZyBjaGFpbmNvZGUgJHtjb25maWcuY2hhaW5jb2RlTmFtZX0gY29udHJhY3QgJHtjb250cmFjdE5hbWUgfHwgY29uZmlnLmNvbnRyYWN0TmFtZX0gZnJvbSBuZXR3b3JrICR7Y29uZmlnLmNoYW5uZWx9YFxuICAgICAgKTtcbiAgICAgIGNvbnRyYWN0TmFtZSA9IGNvbnRyYWN0TmFtZSA/IGNvbnRyYWN0TmFtZSA6IGNvbmZpZy5jb250cmFjdE5hbWU7XG4gICAgICBjb250cmFjdCA9IG5ldHdvcmsuZ2V0Q29udHJhY3QoY29uZmlnLmNoYWluY29kZU5hbWUsIGNvbnRyYWN0TmFtZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiBjb250cmFjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIE5ldHdvcmsgaW5zdGFuY2UgZnJvbSBhIEdhdGV3YXlcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdG8gYSBzcGVjaWZpYyBjaGFubmVsIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAcGFyYW0ge0dhdGV3YXl9IGdhdGV3YXkgLSBUaGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2hhbm5lbCB0byBjb25uZWN0IHRvXG4gICAqIEByZXR1cm4ge05ldHdvcmt9IFRoZSBOZXR3b3JrIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZ2V0TmV0d29yayhnYXRld2F5OiBHYXRld2F5LCBjaGFubmVsTmFtZTogc3RyaW5nKTogTmV0d29yayB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5nZXROZXR3b3JrKTtcbiAgICBsZXQgbmV0d29yazogTmV0d29yaztcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvIGNoYW5uZWwgJHtjaGFubmVsTmFtZX1gKTtcbiAgICAgIG5ldHdvcmsgPSBnYXRld2F5LmdldE5ldHdvcmsoY2hhbm5lbE5hbWUpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXR3b3JrO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgR2F0ZXdheSBpbnN0YW5jZSBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIEdhdGV3YXkgdXNpbmcgdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24gYW5kIGNsaWVudFxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIHtDbGllbnR9IFtjbGllbnRdIC0gT3B0aW9uYWwgZ1JQQyBjbGllbnQsIHdpbGwgYmUgY3JlYXRlZCBpZiBub3QgcHJvdmlkZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxHYXRld2F5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRHYXRld2F5KFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIGNsaWVudD86IENsaWVudFxuICApIHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGlvbihcbiAgICAgIGNsaWVudCB8fCAoYXdhaXQgdGhpcy5nZXRDbGllbnQoY29uZmlnKSksXG4gICAgICBjb25maWcsXG4gICAgICBjdHhcbiAgICApKSBhcyBHYXRld2F5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIGNsaWVudCB3aXRoIFRMUyBjcmVkZW50aWFscyBmb3Igc2VjdXJlIGNvbW11bmljYXRpb25cbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm4ge0NsaWVudH0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGdSUEMgY2xpZW50XG4gICAqL1xuICBzdGF0aWMgZ2V0Q2xpZW50KGNvbmZpZzogUGVlckNvbmZpZyk6IENsaWVudCB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0Q2xpZW50KTtcbiAgICBsb2cuZGVidWcoYGdlbmVyYXRpbmcgVExTIGNyZWRlbnRpYWxzIGZvciBtc3AgJHtjb25maWcubXNwSWR9YCk7XG4gICAgbGV0IHBhdGhPckNlcnQ6IHN0cmluZyB8IEJ1ZmZlciA9IGNvbmZpZy50bHNDZXJ0IGFzIHN0cmluZyB8IEJ1ZmZlcjtcblxuICAgIGlmICh0eXBlb2YgcGF0aE9yQ2VydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKFxuICAgICAgICBwYXRoT3JDZXJ0Lm1hdGNoKFxuICAgICAgICAgIC8tLS0tLUJFR0lOIChDRVJUSUZJQ0FURXxLRVl8UFJJVkFURSBLRVkpLS0tLS0uKz8tLS0tLUVORCBcXDEtLS0tLSQvZ21zXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBwYXRoT3JDZXJ0ID0gQnVmZmVyLmZyb20ocGF0aE9yQ2VydCwgXCJ1dGY4XCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXRoT3JDZXJ0ID0gQnVmZmVyLmZyb20oZnMucmVhZEZpbGVTeW5jKHBhdGhPckNlcnQsIFwidXRmOFwiKSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVhZCB0aGUgdGxzIGNlcnRpZmljYXRlIGZyb20gJHtwYXRoT3JDZXJ0fTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGxzQ3JlZGVudGlhbHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZVNzbChwYXRoT3JDZXJ0KTtcbiAgICBsb2cuZGVidWcoYGdlbmVyYXRpbmcgR2F0ZXdheSBDbGllbnQgZm9yIHVybCAke2NvbmZpZy5wZWVyRW5kcG9pbnR9YCk7XG4gICAgcmV0dXJuIG5ldyBDbGllbnQoY29uZmlnLnBlZXJFbmRwb2ludCwgdGxzQ3JlZGVudGlhbHMsIHtcbiAgICAgIFwiZ3JwYy5tYXhfcmVjZWl2ZV9tZXNzYWdlX2xlbmd0aFwiOiAoY29uZmlnLnNpemVMaW1pdCB8fCAxNSkgKiAxMDI0ICogMTAyNCxcbiAgICAgIFwiZ3JwYy5tYXhfc2VuZF9tZXNzYWdlX2xlbmd0aFwiOiAoY29uZmlnLnNpemVMaW1pdCB8fCAxNSkgKiAxMDI0ICogMTAyNCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXN0YWJsaXNoZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgR2F0ZXdheSBjb25uZWN0aW9uIHdpdGggaWRlbnRpdHkgYW5kIHNpZ25lclxuICAgKiBAcGFyYW0ge0NsaWVudH0gY2xpZW50IC0gVGhlIGdSUEMgY2xpZW50XG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEdhdGV3YXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY29ubmVjdGVkIEdhdGV3YXlcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IElkZW50aXR5XG4gICAqICAgcGFydGljaXBhbnQgU2lnbmVyXG4gICAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICAgKlxuICAgKiAgIENhbGxlci0+PkZhYnJpY0FkYXB0ZXI6IGdldENvbm5lY3Rpb24oY2xpZW50LCBjb25maWcpXG4gICAqICAgRmFicmljQWRhcHRlci0+PklkZW50aXR5OiBnZXRJZGVudGl0eShtc3BJZCwgY2VydERpcmVjdG9yeVBhdGgpXG4gICAqICAgSWRlbnRpdHktLT4+RmFicmljQWRhcHRlcjogaWRlbnRpdHlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+U2lnbmVyOiBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aClcbiAgICogICBTaWduZXItLT4+RmFicmljQWRhcHRlcjogc2lnbmVyXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IENyZWF0ZSBDb25uZWN0T3B0aW9uc1xuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KG9wdGlvbnMpXG4gICAqICAgR2F0ZXdheS0tPj5GYWJyaWNBZGFwdGVyOiBnYXRld2F5XG4gICAqICAgRmFicmljQWRhcHRlci0tPj5DYWxsZXI6IGdhdGV3YXlcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRDb25uZWN0aW9uKFxuICAgIGNsaWVudDogQ2xpZW50LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICkge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMuZ2V0Q29ubmVjdGlvbik7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYFJldHJpZXZpbmcgUGVlciBJZGVudGl0eSBmb3IgJHtjb25maWcubXNwSWR9IHVuZGVyICR7Y29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRofWBcbiAgICApO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgZ2V0SWRlbnRpdHkoXG4gICAgICBjb25maWcubXNwSWQsXG4gICAgICBjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55XG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgcHJlcGFyaW5nIHRyYW5zYWN0aW9uIHNpZ25lciBmb3IgJHtDcnlwdG9VdGlscy5mYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZShpZGVudGl0eS5jcmVkZW50aWFscy50b1N0cmluZygpKX1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGV4dHJhY3QgRmFicmljIElEIGZyb20gY2VydGlmaWNhdGVgLCBlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgc2lnbmVyOiBTaWduZXI7XG4gICAgY29uc3QgY2xvc2UgPSAoKSA9PiB7fTtcbiAgICBpZiAoIWNvbmZpZy5oc20pIHtcbiAgICAgIHNpZ25lciA9IGF3YWl0IGdldFNpZ25lcihjb25maWcua2V5Q2VydE9yRGlyZWN0b3J5UGF0aCBhcyBhbnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb25zdCBoc20gPSBuZXcgSFNNU2lnbmVyRmFjdG9yeUN1c3RvbShjb25maWcuaHNtLmxpYnJhcnkpO1xuICAgICAgLy8gY29uc3QgaWRlbnRpZmllciA9IGhzbS5nZXRTS0lGcm9tQ2VydGlmaWNhdGVQYXRoKFxuICAgICAgLy8gICBjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55XG4gICAgICAvLyApO1xuICAgICAgLy8gY29uc3QgcGtjczExU2lnbmVyID0gaHNtLm5ld1NpZ25lcih7XG4gICAgICAvLyAgIGxhYmVsOiBjb25maWcuaHNtLnRva2VuTGFiZWwgYXMgc3RyaW5nLFxuICAgICAgLy8gICBwaW46IFN0cmluZyhjb25maWcuaHNtLnBpbikgYXMgc3RyaW5nLFxuICAgICAgLy8gICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgLy8gICAvLyB1c2VyVHlwZTogMSAvKkNLVV9VU0VSICovLFxuICAgICAgLy8gfSk7XG4gICAgICAvLyBzaWduZXIgPSBwa2NzMTFTaWduZXIuc2lnbmVyO1xuICAgICAgLy8gY2xvc2UgPSBwa2NzMTFTaWduZXIuY2xvc2U7XG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcIkhTTSBOT1QgSU1QTEVNRU5URURcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGNsaWVudCxcbiAgICAgIGlkZW50aXR5OiBpZGVudGl0eSxcbiAgICAgIHNpZ25lcjogc2lnbmVyLFxuICAgICAgLy8gRGVmYXVsdCB0aW1lb3V0cyBmb3IgZGlmZmVyZW50IGdSUEMgY2FsbHNcbiAgICAgIGV2YWx1YXRlT3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwiZXZhbHVhdGVUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDUgc2Vjb25kc1xuICAgICAgfSxcbiAgICAgIGVuZG9yc2VPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJlbmRvcnNlVGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byAxNSBzZWNvbmRzXG4gICAgICB9LFxuICAgICAgc3VibWl0T3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwic3VibWl0VGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byA1IHNlY29uZHNcbiAgICAgIH0sXG4gICAgICBjb21taXRTdGF0dXNPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJjb21taXRUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDEgbWludXRlXG4gICAgICB9LFxuICAgIH0gYXMgQ29ubmVjdE9wdGlvbnM7XG5cbiAgICBsb2cuZGVidWcoYENvbm5lY3RpbmcgdG8gJHtjb25maWcubXNwSWR9YCk7XG4gICAgY29uc3QgZ2F0ZXdheSA9IGNvbm5lY3Qob3B0aW9ucyk7XG5cbiAgICAvLyBUT0RPOiByZXBsYWNlP1xuICAgIGlmIChjb25maWcuaHNtKSB7XG4gICAgICBnYXRld2F5LmNsb3NlID0gbmV3IFByb3h5KGdhdGV3YXkuY2xvc2UsIHtcbiAgICAgICAgYXBwbHkodGFyZ2V0OiAoKSA9PiB2b2lkLCB0aGlzQXJnOiBhbnksIGFyZ0FycmF5OiBhbnlbXSk6IGFueSB7XG4gICAgICAgICAgUmVmbGVjdC5hcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ0FycmF5KTtcbiAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdhdGV3YXk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgY2xpZW50LlxuICAgKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIG5ldyBGYWJyaWNDbGllbnREaXNwYXRjaCBpbnN0YW5jZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrLlxuICAgKiBAcmV0dXJucyB7RGlzcGF0Y2h9IEEgbmV3IERpc3BhdGNoIGluc3RhbmNlIGNvbmZpZ3VyZWQgZm9yIHRoZSBGYWJyaWMgY2xpZW50LlxuICAgKiBAcmVtYXJrcyBUaGUgRGlzcGF0Y2ggaW5zdGFuY2UgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgbG9naWMgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrLCBzdWNoIGFzIHN1Ym1pdHRpbmcgdHJhbnNhY3Rpb25zIG9yIHF1ZXJ5aW5nIGRhdGEuXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGZhYnJpY0Rpc3BhdGNoID0gZmFicmljQ2xpZW50QWRhcHRlci5EaXNwYXRjaCgpO1xuICAgKiBmYWJyaWNEaXNwYXRjaC5zdWJtaXRUcmFuc2FjdGlvbignY3JlYXRlUHJvZHVjdCcsIHsgbmFtZTogJ1Byb2R1Y3QgQScsIHByaWNlOiAxMDAgfSk7XG4gICAqL1xuICBvdmVycmlkZSBEaXNwYXRjaCgpOiBGYWJyaWNDbGllbnREaXNwYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRBZGFwdGVyW1wiX2Jhc2VEaXNwYXRjaFwiXSh0aGlzLmNsaWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbiBlcnJvciBpbnRvIGEgQmFzZUVycm9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGFueSBlcnJvciBpbnRvIGEgc3RhbmRhcmRpemVkIEJhc2VFcnJvciB1c2luZyB0aGUgcGFyZW50IGNsYXNzIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7RXJyb3IgfCBzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3JcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgcGFyc2VFcnJvcjxFIGV4dGVuZHMgQmFzZUVycm9yPihcbiAgICBlcnI6IEVycm9yIHwgc3RyaW5nIHwgR2F0ZXdheUVycm9yXG4gICk6IEUge1xuICAgIC8vIGlmIChcbiAgICAvLyAgIE1JU1NJTkdfUFJJVkFURV9EQVRBX1JFR0VYLnRlc3QoXG4gICAgLy8gICAgIHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIgPyBlcnIgOiBlcnIubWVzc2FnZVxuICAgIC8vICAgKVxuICAgIC8vIClcbiAgICAvLyAgIHJldHVybiBuZXcgVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MoZXJyKSBhcyBFO1xuXG4gICAgbGV0IG1zZyA9IHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIgPyBlcnIgOiBlcnIubWVzc2FnZTtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgR2F0ZXdheUVycm9yICYmIGVyci5kZXRhaWxzLmxlbmd0aCAmJiBlcnIuY29kZSA9PT0gMTApIHtcbiAgICAgIG1zZyA9IGAke2Vyci5kZXRhaWxzWzBdLm1lc3NhZ2V9YDtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBlcnIgaW5zdGFuY2VvZiBFbmRvcnNlRXJyb3IgJiZcbiAgICAgIGVyci5kZXRhaWxzLmxlbmd0aCAmJlxuICAgICAgZXJyLmNvZGUgPT09IDEwICYmXG4gICAgICBlcnIuZGV0YWlsc1swXS5tZXNzYWdlPy5pbmNsdWRlcyhVbnN1cHBvcnRlZEVycm9yLm5hbWUpXG4gICAgKSB7XG4gICAgICBtc2cgPSBgJHtlcnIuZGV0YWlsc1swXS5tZXNzYWdlfWA7XG4gICAgfVxuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIk1WQ0NfUkVBRF9DT05GTElDVFwiKSlcbiAgICAgIHJldHVybiBuZXcgTXZjY1JlYWRDb25mbGljdEVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJERUFETElORV9FWENFRURFRFwiKSlcbiAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIkVORE9SU0VNRU5UX1BPTElDWV9GQUlMVVJFXCIpKVxuICAgICAgcmV0dXJuIG5ldyBFbmRvcnNlbWVudFBvbGljeUVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJQSEFOVE9NX1JFQURfQ09ORkxJQ1RcIikpXG4gICAgICByZXR1cm4gbmV3IFBoYW50b21SZWFkQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgKGVyciBhcyBhbnkpLmNvZGUpIHtcbiAgICAgIHN3aXRjaCAoKGVyciBhcyBhbnkpLmNvZGUpIHtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIHJldHVybiBuZXcgRW5kb3JzZW1lbnRFcnJvcihlcnIpIGFzIEU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhWYWxpZGF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhOb3RGb3VuZEVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQ29uZmxpY3RFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEJhZFJlcXVlc3RFcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQmFkUmVxdWVzdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFF1ZXJ5RXJyb3IubmFtZSkpIHJldHVybiBuZXcgUXVlcnlFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhQYWdpbmdFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBQYWdpbmdFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhVbnN1cHBvcnRlZEVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBVbnN1cHBvcnRlZEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE1pZ3JhdGlvbkVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE1pZ3JhdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE9ic2VydmVyRXJyb3IubmFtZSkpIHJldHVybiBuZXcgT2JzZXJ2ZXJFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhBdXRob3JpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhGb3JiaWRkZW5FcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBGb3JiaWRkZW5FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhDb25uZWN0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhTZXJpYWxpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKGVycikgYXMgRTtcbiAgfVxufVxuXG5GYWJyaWNDbGllbnRBZGFwdGVyLmRlY29yYXRpb24oKTtcbkFkYXB0ZXIuc2V0Q3VycmVudChGYWJyaWNGbGF2b3VyKTtcbiIsImltcG9ydCB7XG4gIEFkYXB0ZXIsXG4gIENvbnRleHR1YWxBcmdzLFxuICBEaXNwYXRjaCxcbiAgRXZlbnRJZHMsXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIENvbnRleHQsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgUGVyc2lzdGVuY2VLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFBlZXJDb25maWcgfSBmcm9tIFwiLi4vc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDaGFpbmNvZGVFdmVudCxcbiAgQ2xvc2VhYmxlQXN5bmNJdGVyYWJsZSxcbn0gZnJvbSBcIkBoeXBlcmxlZGdlci9mYWJyaWMtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgcGFyc2VFdmVudE5hbWUgfSBmcm9tIFwiLi4vc2hhcmVkL2V2ZW50c1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFdmVudCBkaXNwYXRjaGVyIGZvciBIeXBlcmxlZGdlciBGYWJyaWMgY2hhaW5jb2RlIGV2ZW50c1xuICogQHN1bW1hcnkgTGlzdGVucyBmb3IgYW5kIHByb2Nlc3NlcyBldmVudHMgZW1pdHRlZCBieSBGYWJyaWMgY2hhaW5jb2RlLCBkaXNwYXRjaGluZyB0aGVtIHRvIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gKiBAdGVtcGxhdGUgUGVlckNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdHlwZSBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAcGFyYW0gY2xpZW50IC0gZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gKiBAY2xhc3MgRmFicmljQ2xpZW50RGlzcGF0Y2hcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgRmFicmljRGlzcGF0Y2ggaW5zdGFuY2VcbiAqIGNvbnN0IGNsaWVudCA9IGF3YWl0IEZhYnJpY0FkYXB0ZXIuZ2V0Q2xpZW50KHBlZXJDb25maWcpO1xuICogY29uc3QgZGlzcGF0Y2ggPSBuZXcgRmFicmljRGlzcGF0Y2goY2xpZW50KTtcbiAqXG4gKiAvLyBDb25maWd1cmUgdGhlIGRpc3BhdGNoIHdpdGggcGVlciBjb25maWd1cmF0aW9uXG4gKiBkaXNwYXRjaC5jb25maWd1cmUocGVlckNvbmZpZyk7XG4gKlxuICogLy8gUmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgZm9yIGEgc3BlY2lmaWMgdGFibGUgYW5kIGV2ZW50XG4gKiBkaXNwYXRjaC5vYnNlcnZlKCd1c2VycycsICdjcmVhdGUnLCAoaWQpID0+IHtcbiAqICAgY29uc29sZS5sb2coYFVzZXIgY3JlYXRlZDogJHtpZH1gKTtcbiAqIH0pO1xuICpcbiAqIC8vIFN0YXJ0IGxpc3RlbmluZyBmb3IgZXZlbnRzXG4gKiBhd2FpdCBkaXNwYXRjaC5zdGFydCgpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBGYWJyaWNEaXNwYXRjaFxuICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gKiAgIHBhcnRpY2lwYW50IE5ldHdvcmtcbiAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gKlxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogbmV3IEZhYnJpY0Rpc3BhdGNoKGNsaWVudClcbiAqICAgQ2xpZW50LT4+RmFicmljRGlzcGF0Y2g6IGNvbmZpZ3VyZShwZWVyQ29uZmlnKVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogb2JzZXJ2ZSh0YWJsZSwgZXZlbnQsIGNhbGxiYWNrKVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogc3RhcnQoKVxuICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBpbml0aWFsaXplKClcbiAqICAgRmFicmljRGlzcGF0Y2gtPj5HYXRld2F5OiBnZXRHYXRld2F5KGNvbmZpZywgY2xpZW50KVxuICogICBHYXRld2F5LT4+TmV0d29yazogZ2V0TmV0d29yayhjaGFubmVsKVxuICogICBOZXR3b3JrLT4+TmV0d29yazogZ2V0Q2hhaW5jb2RlRXZlbnRzKGNoYWluY29kZU5hbWUpXG4gKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IGhhbmRsZUV2ZW50cygpXG4gKiAgIGxvb3AgRm9yIGVhY2ggZXZlbnRcbiAqICAgICBDaGFpbmNvZGUtLT4+RmFicmljRGlzcGF0Y2g6IENoYWluY29kZUV2ZW50XG4gKiAgICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogcGFyc2VFdmVudE5hbWUoZXZlbnROYW1lKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHBhcnNlUGF5bG9hZChwYXlsb2FkKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgZXZlbnQsIGlkKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLS0+PkNsaWVudDogY2FsbGJhY2soaWQpXG4gKiAgIGVuZFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50RGlzcGF0Y2ggZXh0ZW5kcyBEaXNwYXRjaDxGYWJyaWNDbGllbnRBZGFwdGVyPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgbGlzdGVuaW5nIHN0YWNrIGZvciBjaGFpbmNvZGUgZXZlbnRzXG4gICAqL1xuICBwcml2YXRlIGxpc3RlbmluZ1N0YWNrPzogQ2xvc2VhYmxlQXN5bmNJdGVyYWJsZTxDaGFpbmNvZGVFdmVudD47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZXh0IGRlY29kZXIgZm9yIGNvbnZlcnRpbmcgZXZlbnQgcGF5bG9hZHMgZnJvbSBieXRlcyB0byBzdHJpbmdzXG4gICAqL1xuICBwcml2YXRlIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBGYWJyaWNEaXNwYXRjaCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIGRpc3BhdGNoZXIgZm9yIEZhYnJpYyBjaGFpbmNvZGUgZXZlbnRzXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgLSBnUlBDIGNsaWVudCBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjbGllbnQ6IENsaWVudCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsb3NlcyB0aGUgZXZlbnQgbGlzdGVuaW5nIGNvbm5lY3Rpb25cbiAgICogQHN1bW1hcnkgU3RvcHMgbGlzdGVuaW5nIGZvciBjaGFpbmNvZGUgZXZlbnRzIGFuZCByZWxlYXNlcyByZXNvdXJjZXNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjbG9zZShcbiAgICAuLi5jdHhBcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3M6IGxvZ2dlZEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGN0eEFyZ3MsIFBlcnNpc3RlbmNlS2V5cy5TSFVURE9XTiwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmNsb3NlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc3VwZXIuY2xvc2UoLi4ubG9nZ2VkQXJncyk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY2xvc2UgRmFicmljIHByb3hpZXMgZXZlbnQgbGlzdGVuZXJgLCBlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGlzdGVuaW5nU3RhY2spIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubGlzdGVuaW5nU3RhY2suY2xvc2UoKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY2xvc2UgRmFicmljIGV2ZW50IGxpc3RlbmVyYCwgZSBhcyBFcnJvcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmxpc3RlbmluZ1N0YWNrID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGV2ZW50IHBheWxvYWQgZnJvbSBiaW5hcnkgZm9ybWF0XG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgVWludDhBcnJheSBjb250YWluaW5nIEpTT04gdG8gYW4gb2JqZWN0IHdpdGggYW4gaWQgcHJvcGVydHlcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBqc29uQnl0ZXMgLSBUaGUgYmluYXJ5IHBheWxvYWQgZnJvbSB0aGUgY2hhaW5jb2RlIGV2ZW50XG4gICAqIEByZXR1cm4ge3sgaWQ6IHN0cmluZyB9fSBUaGUgcGFyc2VkIHBheWxvYWQgY29udGFpbmluZyB0aGUgcmVjb3JkIElEXG4gICAqL1xuICBwcml2YXRlIHBhcnNlUGF5bG9hZChqc29uQnl0ZXM6IFVpbnQ4QXJyYXkpOiB7IGlkOiBzdHJpbmc7IHJlc3VsdD86IGFueSB9IHtcbiAgICBjb25zdCBqc29uID0gdGhpcy5kZWNvZGVyLmRlY29kZShqc29uQnl0ZXMpO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgb2JzZXJ2aW5nIGFuIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdGhpcyBkaXNwYXRjaCB0byBhbiBhZGFwdGVyIHRvIG1vbml0b3IgaXRzIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIHtBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT59IG9ic2VydmVyIC0gVGhlIGFkYXB0ZXIgdG8gb2JzZXJ2ZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgb3ZlcnJpZGUgb2JzZXJ2ZShvYnNlcnZlcjogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+KTogKCkgPT4gdm9pZCB7XG4gICAgaWYgKCEob2JzZXJ2ZXIgaW5zdGFuY2VvZiBGYWJyaWNDbGllbnRBZGFwdGVyKSlcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBcIk9ubHkgRmFicmljQ2xpZW50QWRhcHRlciBjYW4gYmUgb2JzZXJ2ZWQgYnkgZGlzcGF0Y2hcIlxuICAgICAgKTtcbiAgICBzdXBlci5vYnNlcnZlKG9ic2VydmVyIGFzIEZhYnJpY0NsaWVudEFkYXB0ZXIpO1xuICAgIHJldHVybiAoKSA9PiB0aGlzLnVuT2JzZXJ2ZShvYnNlcnZlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgb2JzZXJ2ZXJzIGFib3V0IGEgZGF0YWJhc2UgZXZlbnRcbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGEgY2hhbmdlIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGNoYW5nZSBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gdGhhdCBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge2FueX0gcGF5bG9hZCAtIFRoZSBldmVudCBwYXlsb2FkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8YW55PiB8IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSBBZGFwdGVyLmxvZ0N0eDxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4oXG4gICAgICB0aGlzLnVwZGF0ZU9ic2VydmVycyxcbiAgICAgIGV2ZW50LFxuICAgICAgZmFsc2UsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaDsgc2tpcHBpbmcgb2JzZXJ2ZXIgdXBkYXRlIGZvciAke3R5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIiA/IG1vZGVsIDogTW9kZWwudGFibGVOYW1lKG1vZGVsKX06JHtldmVudH1gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLnJlZnJlc2gobW9kZWwsIGV2ZW50LCBpZCwgLi4uY3R4QXJncyk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIGRpc3BhdGNoOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgaW5jb21pbmcgY2hhaW5jb2RlIGV2ZW50c1xuICAgKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBldmVudHMgZnJvbSB0aGUgY2hhaW5jb2RlIGFuZCBkaXNwYXRjaGVzIHRoZW0gdG8gcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZXZlbnQgaGFuZGxpbmcgc3RvcHNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljRGlzcGF0Y2hcbiAgICogICBwYXJ0aWNpcGFudCBFdmVudFN0YWNrXG4gICAqICAgcGFydGljaXBhbnQgRXZlbnRQYXJzZXJcbiAgICogICBwYXJ0aWNpcGFudCBPYnNlcnZlcnNcbiAgICpcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBoYW5kbGVFdmVudHMoKVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RXZlbnRTdGFjazogZm9yIGF3YWl0IChjb25zdCBldnQgb2YgbGlzdGVuaW5nU3RhY2spXG4gICAqICAgRXZlbnRTdGFjay0tPj5GYWJyaWNEaXNwYXRjaDogQ2hhaW5jb2RlRXZlbnRcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkV2ZW50UGFyc2VyOiBwYXJzZUV2ZW50TmFtZShldnQuZXZlbnROYW1lKVxuICAgKiAgIEV2ZW50UGFyc2VyLS0+PkZhYnJpY0Rpc3BhdGNoOiB7IHRhYmxlLCBldmVudCwgb3duZXIgfVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IENoZWNrIGlmIGV2ZW50IGlzIGZvciB0aGlzIE1TUFxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHBhcnNlUGF5bG9hZChldnQucGF5bG9hZClcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+Pk9ic2VydmVyczogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgcGF5bG9hZC5pZClcbiAgICogICBPYnNlcnZlcnMtLT4+RmFicmljRGlzcGF0Y2g6IENhbGxiYWNrcyBleGVjdXRlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZUV2ZW50cyhcbiAgICBjdHhBcmc/OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMubGlzdGVuaW5nU3RhY2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEV2ZW50IHN0YWNrIG5vdCBpbml0aWFsaXplZC4gRW5zdXJlIHRoYXQgXCJzdGFydExpc3RlbmluZ1wiIGlzIGNhbGxlZCBiZWZvcmUgYXR0ZW1wdGluZyB0aGlzIG9wZXJhdGlvbi5gXG4gICAgICApO1xuXG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIgfHwgIXRoaXMuYWRhcHRlci5jb25maWcpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBmb3VuZC4gc2hvdWxkIGJlIGltcG9zc2libGVgKTtcblxuICAgIGNvbnN0IGN0eCA9XG4gICAgICBjdHhBcmcgfHxcbiAgICAgIChhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgICAodGhpcy5tb2RlbHMgJiYgdGhpcy5tb2RlbHNbMF0pIHx8IChNb2RlbCBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yKVxuICAgICAgKSk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuaGFuZGxlRXZlbnRzKTtcblxuICAgIGxvZy5pbmZvKFxuICAgICAgYExpc3RlbmluZyBmb3IgaW5jb21pbmcgZXZlbnRzIG9uIGNoYWluY29kZSBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lfVwiIG9uIGNoYW5uZWwgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhbm5lbH1cIi4uLmBcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgZXZ0IG9mIHRoaXMubGlzdGVuaW5nU3RhY2spIHtcbiAgICAgICAgY29uc3QgeyB0YWJsZSwgZXZlbnQsIG93bmVyIH0gPSBwYXJzZUV2ZW50TmFtZShldnQuZXZlbnROYW1lKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuYWRhcHRlci5jb25maWc/Lm1zcEV2ZW50T25seSAmJlxuICAgICAgICAgIG93bmVyICYmXG4gICAgICAgICAgb3duZXIgIT09IHRoaXMuYWRhcHRlci5jb25maWc/Lm1zcElkXG4gICAgICAgIClcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogeyBpZDogc3RyaW5nOyByZXN1bHQ/OiBhbnkgfSA9IHRoaXMucGFyc2VQYXlsb2FkKFxuICAgICAgICAgIGV2dC5wYXlsb2FkXG4gICAgICAgICk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0TW9kZWwgPSB0YWJsZVxuICAgICAgICAgICAgPyBNb2RlbC5nZXQodGFibGUpXG4gICAgICAgICAgICA6IE1vZGVsLmdldCh0aGlzLm1vZGVsc1swXS5uYW1lKTtcbiAgICAgICAgICBjb25zdCBtb2RlbFJlZiA9IHRhcmdldE1vZGVsID8/ICh0YWJsZSB8fCB0aGlzLm1vZGVsc1swXT8ubmFtZSk7XG4gICAgICAgICAgY29uc3Qgb2JzZXJ2ZXJBcmdzID0gcGF5bG9hZC5yZXN1bHQgPyBbcGF5bG9hZC5yZXN1bHQsIGN0eF0gOiBbY3R4XTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgICAgICAgIG1vZGVsUmVmIGFzIENvbnN0cnVjdG9yIHwgc3RyaW5nLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBwYXlsb2FkLmlkIGFzIHN0cmluZyxcbiAgICAgICAgICAgIC4uLihvYnNlcnZlckFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8YW55PilcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB1cGRhdGUgb2JzZXJ2YWJsZXMgZm9yIHRhYmxlICR7dGFibGV9IGV2ZW50ICR7ZXZlbnR9IGlkOiAke3BheWxvYWQuaWR9OiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZWFkIGV2ZW50IGZvciBjaGFpbmNvZGUgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZX1cIiBvbiBjaGFubmVsIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWx9XCI6ICR7ZX1gXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5jbG9zZShjdHgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGV2ZW50IGxpc3RlbmVyXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgZXZlbnQgZGlzcGF0Y2hpbmcgZm9yIHRoZSBvYnNlcnZlZCBhZGFwdGVyLiBXaGVuXG4gICAqIGBzeW50aGV0aWNFdmVudHNgIGlzIHRydWUgKHRoZSBkZWZhdWx0KSBubyBnYXRld2F5IGNvbm5lY3Rpb24gaXMgb3BlbmVkO1xuICAgKiBpbnN0ZWFkIGV2ZXJ5IENSVUQgb3BlcmF0aW9uIGlzIHdyYXBwZWQgd2l0aCBhIFByb3h5IHRoYXQgZmlyZXNcbiAgICogYHVwZGF0ZU9ic2VydmVyc2AgZm9yICoqYWxsKiogbW9kZWxzLiBXaGVuIGBzeW50aGV0aWNFdmVudHNgIGlzIGZhbHNlIHRoZVxuICAgKiBleGlzdGluZyBnYXRld2F5LWJhc2VkIGNoYWluY29kZS1ldmVudCBzdWJzY3JpcHRpb24gaXMgZXN0YWJsaXNoZWQgYW5kIHRoZVxuICAgKiBsb2NhbCBQcm94eSBmYWxsYmFjayBpcyBsaW1pdGVkIHRvIGZ1bGx5LXNlZ3JlZ2F0ZWQgKHRyYW5zaWVudCkgbW9kZWxzIG9ubHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIG9yIGNvbmZpZyBvYnNlcnZlZCBmb3IgZGlzcGF0Y2hgKTtcblxuICAgIGNvbnN0IHN5bnRoZXRpY0V2ZW50cyA9IHRoaXMuYWRhcHRlci5jb25maWcuc3ludGhldGljRXZlbnRzICE9PSBmYWxzZTtcblxuICAgIGlmICghc3ludGhldGljRXZlbnRzKSB7XG4gICAgICAvLyBHYXRld2F5LWJhc2VkIGNoYWluY29kZS1ldmVudCBzdWJzY3JpcHRpb24gKG5vbi1zeW50aGV0aWMgcGF0aClcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgXCJkaXNwYXRjaFwiLFxuICAgICAgICB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgICBNb2RlbCBhcyBhbnlcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLmluaXRpYWxpemUpO1xuICAgICAgY29uc3QgZ2F0ZXdheSA9IGF3YWl0IEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0R2F0ZXdheShcbiAgICAgICAgY3R4LFxuICAgICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnIGFzIFBlZXJDb25maWcsXG4gICAgICAgIHRoaXMuY2xpZW50XG4gICAgICApO1xuICAgICAgY29uc3QgbmV0d29yayA9IGdhdGV3YXkuZ2V0TmV0d29yayh0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWwpO1xuICAgICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaGApO1xuICAgICAgdGhpcy5saXN0ZW5pbmdTdGFjayA9IGF3YWl0IG5ldHdvcmsuZ2V0Q2hhaW5jb2RlRXZlbnRzKFxuICAgICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWVcbiAgICAgICk7XG4gICAgICB0aGlzLmhhbmRsZUV2ZW50cyhjdHgpO1xuICAgIH1cblxuICAgIC8vIFByb3h5IENSVUQgbWV0aG9kcy5cbiAgICAvLyDigKIgc3ludGhldGljRXZlbnRzID0gdHJ1ZSAg4oaSIG5vdGlmeSBmb3IgQUxMIG1vZGVscyAocmVwbGFjZXMgZ2F0ZXdheSBldmVudHMgZW50aXJlbHkpXG4gICAgLy8g4oCiIHN5bnRoZXRpY0V2ZW50cyA9IGZhbHNlIOKGkiBub3RpZnkgb25seSBmb3IgZnVsbHktc2VncmVnYXRlZCAodHJhbnNpZW50KSBtb2RlbHNcbiAgICAvLyAgICh0aGUgZ2F0ZXdheSBzdWJzY3JpcHRpb24gaGFuZGxlcyBwdWJsaWMgbW9kZWxzKVxuICAgIChcbiAgICAgIFtcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEwsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCxcbiAgICAgIF0gYXMgKGtleW9mIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PilbXVxuICAgICkuZm9yRWFjaCgodG9XcmFwKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlcilcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE5vIGFkYXB0ZXIgcHJvdmlkZWQgZm9yIHRoZSBmYWxsYmFjayBvZiBmdWxseSBzZWdyZWdhdGVkIG1vZGVsc2BcbiAgICAgICAgKTtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyW3RvV3JhcF0pXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNZXRob2QgJHt0b1dyYXB9IG5vdCBmb3VuZCBpbiAke3RoaXMuYWRhcHRlci5hbGlhc30gYWRhcHRlciB0byBiaW5kIE9ic2VydmFibGVzIERpc3BhdGNoYFxuICAgICAgICApO1xuXG4gICAgICBsZXQgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcy5hZGFwdGVyLCB0b1dyYXApO1xuICAgICAgbGV0IHByb3RvOiBhbnkgPSB0aGlzLmFkYXB0ZXI7XG4gICAgICB3aGlsZSAoIWRlc2NyaXB0b3IgJiYgcHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgICAgICBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgdG9XcmFwKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkZXNjcmlwdG9yIHx8ICFkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBtZXRob2QgJHt0b1dyYXB9IHRvIGJpbmQgT2JzZXJ2YWJsZXMgRGlzcGF0Y2hgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGJ1bGtUb1NpbmdsZShtZXRob2Q6IHN0cmluZykge1xuICAgICAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5DUkVBVEU7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLlVQREFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuREVMRVRFO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYmVjYXVzZSB0aGVyZSBhcmUgcmVhZCBvbmx5IHByb3BlcnRpZXNcbiAgICAgIHRoaXMuYWRhcHRlclt0b1dyYXBdID0gbmV3IFByb3h5KHRoaXMuYWRhcHRlclt0b1dyYXBdLCB7XG4gICAgICAgIGFwcGx5OiBhc3luYyAoXG4gICAgICAgICAgdGFyZ2V0OiBhbnksXG4gICAgICAgICAgdGhpc0FyZzogRmFicmljQ2xpZW50QWRhcHRlcixcbiAgICAgICAgICBhcmdBcnJheTogYW55W11cbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgLy8gUnVuIHRoZSBvcmlnaW5hbCBtZXRob2QgdW5jaGFuZ2VkIHNvIHRyYW5zaWVudCBkYXRhIGlzIHByZXNlcnZlZFxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhcmdldC5hcHBseSh0aGlzQXJnLCBhcmdBcnJheSk7XG5cbiAgICAgICAgICBjb25zdCBjbGF6ejogQ29uc3RydWN0b3I8YW55PiA9IGFyZ0FycmF5WzBdO1xuICAgICAgICAgIC8vIFdoZW4gc3ludGhldGljRXZlbnRzIGlzIGZhbHNlLCBwdWJsaWMgbW9kZWxzIGVtaXQgYSBjaGFpbmNvZGUgZXZlbnRcbiAgICAgICAgICAvLyBvbiB0aGUgY29udHJhY3Qgc2lkZTsgc2tpcCB0aGUgbG9jYWwgZmFsbGJhY2sgdG8gYXZvaWRcbiAgICAgICAgICAvLyBkb3VibGUtbm90aWZpY2F0aW9uLiBXaGVuIHN5bnRoZXRpY0V2ZW50cyBpcyB0cnVlIHdlIGhhbmRsZSBhbGwgbW9kZWxzLlxuICAgICAgICAgIGlmICghc3ludGhldGljRXZlbnRzICYmICFNb2RlbC5pc1RyYW5zaWVudChjbGF6eikpIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgICAvLyBDb250ZXh0IGlzIGFsd2F5cyB0aGUgbGFzdCBlbGVtZW50IG9mIGFyZ0FycmF5XG4gICAgICAgICAgY29uc3QgeyBsb2csIGN0eEFyZ3MsIGN0eCB9ID0gdGhpc0FyZ1tcImxvZ0N0eFwiXShcbiAgICAgICAgICAgIGFyZ0FycmF5LnNsaWNlKGFyZ0FycmF5Lmxlbmd0aCAtIDEpLFxuICAgICAgICAgICAgdGFyZ2V0XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBpZHMgPSBhcmdBcnJheVsxXTtcbiAgICAgICAgICBjb25zdCByZXN1bHRBcmdzOiBhbnlbXSA9IFtjbGF6eiwgYnVsa1RvU2luZ2xlKHRvV3JhcCksIGlkc107XG5cbiAgICAgICAgICBpZiAoY3R4LmdldE9yVW5kZWZpbmVkKFwib2JzZXJ2ZUZ1bGxSZXN1bHRcIikpIHtcbiAgICAgICAgICAgIHJlc3VsdEFyZ3MucHVzaChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgICAgICAgIC4uLihyZXN1bHRBcmdzIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHRoaXMudXBkYXRlT2JzZXJ2ZXJzPiksXG4gICAgICAgICAgICAuLi5jdHhBcmdzXG4gICAgICAgICAgKS5jYXRjaCgoZTogdW5rbm93bikgPT5cbiAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBkaXNwYXRjaCBvYnNlcnZlciByZWZyZXNoIGZvciAke3RvV3JhcH0gb24gJHtjbGF6ei5uYW1lIHx8IGNsYXp6fSBmb3IgJHtpZHN9OiAke2V9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5cbmlmIChGYWJyaWNDbGllbnRBZGFwdGVyKVxuICBGYWJyaWNDbGllbnRBZGFwdGVyW1wiX2Jhc2VEaXNwYXRjaFwiXSA9IEZhYnJpY0NsaWVudERpc3BhdGNoO1xuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0UjI1wiO1xuXG5NZXRhZGF0YS5yZWdpc3RlckxpYnJhcnkoUEFDS0FHRV9OQU1FLCBWRVJTSU9OKTtcbiJdLCJuYW1lcyI6WyJlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UiLCJmaWxlUGF0aCIsImZzIiwicmVxdWlyZSIsInBhdGgiLCJkaXJuYW1lIiwiZXhpc3RzU3luYyIsIm1rZGlyU3luYyIsImdlbmVyYXRlTW9kZWxJbmRleGVzIiwibSIsImdlbmVyYXRlSW5kZXhlcyIsImdlbmVyYXRlTW9kZWxEZXNpZ25Eb2NzIiwiYWNjdW0iLCJ2aWV3cyIsImdlbmVyYXRlVmlld3MiLCJzdG9yYWdlIiwiZm9yRWFjaCIsImRvYyIsIl9pZCIsInJlYWRNb2RlbEZpbGUiLCJmaWxlIiwiZXhwb3J0cyIsImpvaW4iLCJwcm9jZXNzIiwiY3dkIiwicGFyZW50UGF0aCIsIm5hbWUiLCJ2YWx1ZXMiLCJPYmplY3QiLCJmaWx0ZXIiLCJlIiwiTW9kZWwiLCJhc3luYyIsInJlYWRNb2RlbEZvbGRlcnMiLCJmb2xkZXJzIiwicmVzdWx0IiwiZm9sZGVyIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsIndpdGhGaWxlVHlwZXMiLCJyZWN1cnNpdmUiLCJmIiwiaXNGaWxlIiwiZW5kc1dpdGgiLCJwdXNoIiwid3JpdGVJbmRleGVzIiwiaW5kZXhlcyIsInAiLCJjb2xsZWN0aW9uIiwiaW5kZXgiLCJyZXNvbHZlIiwid3JpdGVGaWxlU3luYyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bmRlZmluZWQiLCJ3cml0ZURlc2lnbkRvY3MiLCJkZXNpZ25Eb2NzIiwibGVuZ3RoIiwiZG9jSWQiLCJyZXBsYWNlIiwicGF5bG9hZCIsIl9yZXYiLCJjb2xsZWN0aW9uRm9yIiwiY29sbGVjdGlvbk5hbWUiLCJwb2xpY3kiLCJyZXF1aXJlZFBlZXJDb3VudCIsIm1heFBlZXJDb3VudCIsImJsb2NrVG9MaXZlIiwibWVtYmVyT25seVJlYWQiLCJtZW1iZXJPbmx5V3JpdGUiLCJwcml2YXRlQ29sbGVjdGlvbkZvciIsIm1zcElkIiwiYyIsImVuZG9yc2VtZW50UG9saWN5Iiwic2lnbmF0dXJlUG9saWN5Iiwic2hhcmVkQ29sbGVjdGlvbkZvciIsIm1zcElkcyIsIm1hcCIsImV4dHJhY3RDb2xsZWN0aW9ucyIsIm92ZXJyaWRlcyIsIm1pcnJvciIsInByaXZhdGVDb2xzIiwic2hhcmVkQ29scyIsImNvbGxlY3Rpb25zRm9yIiwicmVzb2x2ZUNvbGxlY3Rpb24iLCJhcmciLCJJbnRlcm5hbEVycm9yIiwicHJpdmF0ZURlZmF1bHRzIiwiYXNzaWduIiwic2hhcmVkRGVmYXVsdHMiLCJtaXJyb3JNZXRhIiwibWlycm9yZWRBdCIsInByaXZhdGVzIiwiZmxhdCIsInJlc29sdmVkIiwicmVzb2x2ZXIiLCJzb21lIiwiaW5jbHVkZXMiLCJzaGFyZWQiLCJ3cml0ZUNvbGxlY3Rpb25zIiwiY29scyIsImZpbGVOYW1lIiwid3JpdGVDb2xsZWN0aW9uRGVzaWduRG9jcyIsImRvY3MiLCJGYWJyaWNDbGllbnRQYWdpbmF0b3IiLCJQYWdpbmF0b3IiLCJjb25zdHJ1Y3RvciIsImFkYXB0ZXIiLCJxdWVyeSIsInNpemUiLCJjbGF6eiIsInN1cGVyIiwicHJlcGFyZSIsInJhd1N0YXRlbWVudCIsIlVuc3VwcG9ydGVkRXJyb3IiLCJwYWdlIiwiYXJncyIsImlzU2VyaWFsaXplZFBhZ2UiLCJvYmoiLCJBcnJheSIsImlzQXJyYXkiLCJkYXRhIiwiRmFicmljQ2xpZW50UmVwb3NpdG9yeSIsIlJlcG9zaXRvcnkiLCJmb3JjZSIsInRoaXMiLCJfb3ZlcnJpZGVzIiwiaWdub3JlVmFsaWRhdGlvbiIsImlnbm9yZUhhbmRsZXJzIiwiYWxsb3dSYXdTdGF0ZW1lbnRzIiwiZm9yY2VQcmVwYXJlU2ltcGxlUXVlcmllcyIsImZvcmNlUHJlcGFyZUNvbXBsZXhRdWVyaWVzIiwiYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUiLCJyZWJ1aWxkV2l0aFRyYW5zaWVudCIsIm92ZXJyaWRlIiwiZmxhZ3MiLCJmb3IiLCJPYnNlcnZlckhhbmRsZXIiLCJwYWdpbmF0ZUJ5Iiwia2V5Iiwib3JkZXIiLCJyZWYiLCJvZmZzZXQiLCJsaW1pdCIsImxvZyIsImN0eEFyZ3MiLCJsb2dDdHgiLCJQcmVwYXJlZFN0YXRlbWVudEtleXMiLCJQQUdFX0JZIiwidmVyYm9zZSIsInRhYmxlTmFtZSIsImNsYXNzIiwic3RhdGVtZW50IiwiYm9va21hcmsiLCJsaXN0QnkiLCJMSVNUX0JZIiwiZmluZEJ5IiwidmFsdWUiLCJGSU5EX0JZIiwiZmluZE9uZUJ5IiwiRklORF9PTkVfQlkiLCJmaW5kIiwiT3JkZXJEaXJlY3Rpb24iLCJBU0MiLCJGSU5EIiwiZGlyZWN0aW9uIiwiUEFHRSIsImN0eCIsIlBlcnNpc3RlbmNlS2V5cyIsIlNUQVRFTUVOVCIsImNhbGxBcmdzIiwic2xpY2UiLCJwYXJzZSIsImRlY29kZSIsImV2YWx1YXRlVHJhbnNhY3Rpb24iLCJoeWRyYXRlZCIsInIiLCJDb3VjaERCS2V5cyIsIlRBQkxFIiwiZCIsImFwcGx5QWZ0ZXJSZWFkIiwiZ2V0T3JVbmRlZmluZWQiLCJlbmZvcmNlREJEZWNvcmF0b3JzIiwiT3BlcmF0aW9uS2V5cyIsIlJFQUQiLCJBRlRFUiIsIlByb21pc2UiLCJhbGwiLCJlbnRyeSIsImNvdW50T2YiLCJDT1VOVF9PRiIsInN0bXRBcmdzIiwibWF4T2YiLCJNQVhfT0YiLCJtaW5PZiIsIk1JTl9PRiIsImF2Z09mIiwiQVZHX09GIiwic3VtT2YiLCJTVU1fT0YiLCJkaXN0aW5jdE9mIiwiRElTVElOQ1RfT0YiLCJncm91cE9mIiwiR1JPVVBfT0YiLCJoZWFsdGhjaGVjayIsImNyZWF0ZSIsIm1vZGVsIiwiZGVidWciLCJlbnN1cmVMZWdhY3lNaXJyb3JGbGFnIiwicHJlcGFyZWQiLCJyZWNvcmQiLCJpZCIsInRyYW5zaWVudCIsInJldmVydCIsInVwZGF0ZSIsImNyZWF0ZUFsbFByZWZpeCIsIm1vZGVscyIsIkNSRUFURSIsImdldCIsImlnbm9yZVZhbGlkYXRlIiwiT04iLCJpZ25vcmVkUHJvcHMiLCJlcnJvcnMiLCJoYXNFcnJvcnMiLCJlcnJvck1lc3NhZ2VzIiwicmVkdWNlRXJyb3JzVG9QcmludCIsIlZhbGlkYXRpb25FcnJvciIsImNyZWF0ZUFsbCIsImlkcyIsInBheWxvYWRzIiwidHJhbnNpZW50cyIsImNyZWF0ZWQiLCJpIiwicmVhZEFsbCIsImtleXMiLCJyZWNvcmRzIiwidXBkYXRlQWxsIiwidXBkYXRlZCIsInUiLCJhY2N1bXVsYXRlIiwibGVnYWN5IiwiRVJDMjBUb2tlbiIsIkJhc2VNb2RlbCIsIl9fZGVjb3JhdGUiLCJwayIsInR5cGUiLCJTdHJpbmciLCJwcm90b3R5cGUiLCJjb2x1bW4iLCJyZXF1aXJlZCIsInRhYmxlIiwiRVJDMjBXYWxsZXQiLCJBbGxvd2FuY2UiLCJDbGllbnRTZXJpYWxpemVyIiwiSlNPTlNlcmlhbGl6ZXIiLCJwcmVTZXJpYWxpemUiLCJtb2RlbE5hbWUiLCJ0b1NlcmlhbGl6ZSIsIm1ldGFkYXRhIiwiTWV0YWRhdGEiLCJTZXJpYWxpemF0aW9uRXJyb3IiLCJNb2RlbEtleXMiLCJBTkNIT1IiLCJkZXNlcmlhbGl6ZSIsInN0ciIsImRlc2VyaWFsaXphdGlvbiIsImNsYXNzTmFtZSIsIkVycm9yIiwiYnVpbGQiLCJzZXJpYWxpemUiLCJGYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnkiLCJzZXJpYWxpemVyIiwiZGVjb2RlciIsIlRleHREZWNvZGVyIiwidXBkYXRlT2JzZXJ2ZXJzIiwiZXZlbnQiLCJvYnNlcnZlckhhbmRsZXIiLCJjb3VudCIsInBhcnNlZElkIiwiU2VxdWVuY2UiLCJwYXJzZVZhbHVlIiwic2VxdWVuY2VGb3IiLCJ0b2tlbk5hbWUiLCJzeW1ib2wiLCJkZWNpbWFscyIsIk51bWJlciIsInRvdGFsU3VwcGx5IiwidG90YWwiLCJiYWxhbmNlT2YiLCJvd25lciIsImJhbGFuY2UiLCJ0cmFuc2ZlciIsInRvIiwidHJhbnNmZXJyZWQiLCJzdWJtaXRUcmFuc2FjdGlvbiIsInRvU3RyaW5nIiwidHJhbnNmZXJGcm9tIiwiZnJvbSIsImNvbnRleHRBcmdzIiwiQ29udGV4dCIsImFwcHJvdmUiLCJzcGVuZGVyIiwiYXBwcm92ZWQiLCJhbGxvd2FuY2UiLCJpbml0aWFsaXplIiwidG9rZW4iLCJpbml0aWxpYXplZCIsImNoZWNrSW5pdGlhbGl6ZWQiLCJtaW50IiwiYW1vdW50IiwiYnVybiIsImJ1cm5Gcm9tIiwiYWNjb3VudCIsImNsaWVudEFjY291bnRCYWxhbmNlIiwic2VyaWFsaXplZEFjY291bnRCYWxhbmNlIiwiY2xpZW50QWNjb3VudElEIiwiZXh0cmFjdElkcyIsImNvbXBvc2VkIiwicGtQcm9wcyIsImV4dHJhY3RJZCIsImNvbXBvc2VBdHRyaWJ1dGVWYWx1ZSIsIklkZW50aXR5Q3JlZGVudGlhbHMiLCJkZXNjcmlwdGlvbiIsIkZhYnJpY01vZGVsS2V5cyIsIklkZW50aXR5VHlwZSIsIkZhYnJpY0ZsYXZvdXIiLCJJZGVudGl0eSIsIlg1MDkiLCJvbmVUb09uZSIsIkNhc2NhZGUiLCJDQVNDQURFIiwiZGVsZXRlIiwiQ29yZVV0aWxzIiwibG9nZ2VyIiwiTWluaUxvZ2dlciIsImNvbnRlbnRPZkxvYWRGaWxlIiwiY29udGVudE9yUGF0aCIsImZpbGVSZWFkZXIiLCJVaW50OEFycmF5IiwibWF0Y2giLCJyZWFkRmlsZSIsInByb21pc2VzIiwibm9ybWFsaXplSW1wb3J0IiwiaW1wb3J0IiwiZ2V0Q0FVc2VyIiwidXNlck5hbWUiLCJwcml2YXRlS2V5IiwiY2VydGlmaWNhdGUiLCJvcHRpb25zIiwic3RyaW5nRm9ybWF0IiwidXNlciIsIlVzZXIiLCJjb25maWciLCJoc20iLCJzb2Z0d2FyZSIsImxpYiIsImxpYnJhcnkiLCJzbG90IiwibGFiZWwiLCJ0b2tlbkxhYmVsIiwicGluIiwiY3J5cHRvU3VpdGUiLCJnZXRDcnlwdG9TdWl0ZSIsInNldENyeXB0b1N1aXRlIiwiZW5yb2xsbWVudEtleSIsImdldEhTTUVucm9sbG1lbnRLZXkiLCJnZXRTb2Z0d2FyZUVucm9sbG1lbnRLZXkiLCJzZXRFbnJvbGxtZW50IiwibmV3Q3J5cHRvU3VpdGUiLCJjcmVhdGVLZXlGcm9tUmF3Iiwic2tpIiwia2V5SWRIZXgiLCJ0cmltIiwiQnVmZmVyIiwiZ2V0Q2VydGlmaWNhdGVTS0kiLCJnZXRLZXkiLCJpc1ByaXZhdGUiLCJ4NTA5IiwiWDUwOUNlcnRpZmljYXRlIiwiandrIiwicHVibGljS2V5IiwiZXhwb3J0IiwiZm9ybWF0IiwicHJlZml4IiwieCIsInkiLCJjcnlwdG8iLCJjcmVhdGVIYXNoIiwiY29uY2F0IiwiZGlnZXN0IiwiZ2V0SWRlbnRpdHkiLCJjZXJ0RGlyZWN0b3J5UGF0aCIsImlkZW50aXR5RmlsZVJlYWRlciIsImNlcnRQYXRoIiwiZ2V0Rmlyc3REaXJGaWxlTmFtZSIsImNyZWRlbnRpYWxzIiwiZGlyUGF0aCIsInJlYWRkaXIiLCJnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudCIsImdldEZpbGVDb250ZW50IiwiZ2V0U2lnbmVyIiwia2V5RGlyZWN0b3J5UGF0aCIsInNpZ25lckZpbGVSZWFkZXIiLCJrZXlQYXRoIiwicHJpdmF0ZUtleVBlbSIsImV4dHJhY3RQcml2YXRlS2V5IiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiayIsInNpZ25lcnMiLCJuZXdQcml2YXRlS2V5U2lnbmVyIiwicGVtIiwibGliTmFtZSIsInN1YnRsZSIsImdsb2JhbFRoaXMiLCJ3aW5kb3ciLCJDcnlwdG8iLCJ3ZWJjcnlwdG8iLCJzdHIyYWIiLCJidWYiLCJBcnJheUJ1ZmZlciIsImJ1ZlZpZXciLCJzdHJMZW4iLCJjaGFyQ29kZUF0IiwicmVwbGFjZUFsbCIsImRlY29kZWQiLCJiaW5hcnlEZXIiLCJpbXBvcnRLZXkiLCJuYW1lZEN1cnZlIiwiZ2V0QWtpQW5kU2VyaWFsRnJvbUNlcnQiLCJjZXJ0IiwieDUwOUNlcnRpZmljYXRlIiwiWDUwOUNlcnQiLCJha2lFeHQiLCJleHRlbnNpb25zIiwiYWtpIiwidG9VcHBlckNhc2UiLCJzdGFydHNXaXRoIiwic2VyaWFsIiwic2VyaWFsTnVtYmVyIiwiY3J5cHRvUHJvdmlkZXIiLCJzZXQiLCJCQVNFX0FMUEhBQkVUIiwiQ1JZUFRPIiwiQmFzZUVuY29kZXIiLCJhbHBoYWJldCIsImJhc2VNYXAiLCJqIiwiY2hhckF0IiwieGMiLCJiYXNlIiwibGVhZGVyIiwiZmFjdG9yIiwiTWF0aCIsImlGYWN0b3IiLCJlbmNvZGUiLCJzb3VyY2UiLCJpc1ZpZXciLCJidWZmZXIiLCJieXRlT2Zmc2V0IiwiYnl0ZUxlbmd0aCIsInplcm9lcyIsInBiZWdpbiIsInBlbmQiLCJiNTgiLCJjYXJyeSIsIml0MSIsIml0MiIsInJlcGVhdCIsImRlY29kZVVuc2FmZSIsInBzeiIsImIyNTYiLCJpdDMiLCJpdDQiLCJ2Y2giLCJDcnlwdG9VdGlscyIsImI1OGVuY29kZXIiLCJCQVNFNTgiLCJmYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZSIsInN1YmplY3QiLCJpc3N1ZXIiLCJzdHJpbmdUb0FycmF5QnVmZmVyIiwiZXh0cmFjdEtleSIsInVzYWdlcyIsIlJlZ0V4cCIsImV4dHJhY3RQdWJsaWNLZXkiLCJzaWduIiwiYnVmZiIsImhhc2giLCJiIiwicGFkU3RhcnQiLCJ2ZXJpZnkiLCJzaWduYXR1cmUiLCJlbmNyeXB0IiwiZ2V0U3VidGxlQ3J5cHRvIiwiaXNCcm93c2VyIiwiZGVjcnlwdCIsImdldE1hc3RlciIsInRleHRFbmNvZGVyIiwiVGV4dEVuY29kZXIiLCJnZW5HZW5lc2lzIiwicmFuZG9tVVVJRCIsImltcG9ydGVkS2V5IiwiS0VZX0FMR09SWVRITSIsIml2IiwiZ2V0RGVyaXZhdGlvbktleSIsInNhbHQiLCJzYWx0QnVmZmVyIiwic2FsdEhhc2hlZCIsInBhcmFtcyIsIkhBU0giLCJpdGVyYXRpb25zIiwiSVRFUkFUSU9OUyIsImRlcml2YXRpb24iLCJkZXJpdmVCaXRzIiwiS0VZTEVOR1RIIiwiaXZsZW4iLCJrZXlsZW4iLCJkZXJpdmVkS2V5IiwiaW1wb3J0ZWRFbmNyeXB0aW9uS2V5IiwiQUxHT1JZVEhNIiwiZW5jcnlwdFBpbiIsInRleHQiLCJrZXlPYmplY3QiLCJ0ZXh0QnVmZmVyIiwiZW5jcnlwdGVkVGV4dCIsImRlY3J5cHRQaW4iLCJ0ZXh0RGVjb2RlciIsImRlY3J5cHRlZFRleHQiLCJPdmVyZmxvd0Vycm9yIiwibXNnIiwiQmFsYW5jZUVycm9yIiwiQWxsb3dhbmNlRXJyb3IiLCJSZWdpc3RyYXRpb25FcnJvciIsIkF1dGhvcml6YXRpb25FcnJvciIsIk1pc3NpbmdDb250ZXh0RXJyb3IiLCJVbmF1dGhvcml6ZWRQcml2YXRlRGF0YUFjY2VzcyIsIkJhc2VFcnJvciIsIk5vdEluaXRpYWxpemVkRXJyb3IiLCJNaXNzaW5nUEtDU1MxMUxpYiIsIkVuZG9yc2VtZW50RXJyb3IiLCJtZXNzYWdlIiwiTXZjY1JlYWRDb25mbGljdEVycm9yIiwiUGhhbnRvbVJlYWRDb25mbGljdEVycm9yIiwiRW5kb3JzZW1lbnRQb2xpY3lFcnJvciIsIlRyYW5zYWN0aW9uTGltaXRzRXJyb3IiLCJjb2RlIiwiVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IiLCJUcmFuc2FjdGlvbkJ1ZmZlclNpemVFcnJvciIsIkhGQ0FJZGVudGl0eVR5cGUiLCJIRkNBSWRlbnRpdHlBdHRyaWJ1dGVzIiwiRmFicmljRW5yb2xsbWVudFNlcnZpY2UiLCJMb2dnZWRDbGFzcyIsImNhQ29uZmlnIiwiY2FOYW1lIiwiY2FDZXJ0IiwiY2FLZXkiLCJ1cmwiLCJDQSIsImNhIiwidGxzIiwidHJ1c3RlZFJvb3RzIiwicm9vdCIsIkZhYnJpY0NBU2VydmljZXMiLCJDbGllbnQiLCJjbGllbnQiLCJDZXJ0aWZpY2F0ZSIsImNlcnRpZmljYXRlU2VydmljZSIsIm5ld0NlcnRpZmljYXRlU2VydmljZSIsIkFmZmlsaWF0aW9ucyIsImFmZmlsaWF0aW9uU2VydmljZSIsIm5ld0FmZmlsaWF0aW9uU2VydmljZSIsIklkZW50aXRpZXMiLCJpZGVudGl0eVNlcnZpY2UiLCJuZXdJZGVudGl0eVNlcnZpY2UiLCJnZXRDZXJ0aWZpY2F0ZXMiLCJyZXF1ZXN0IiwiZG9NYXAiLCJyZXNwb25zZSIsImNlcnRzIiwiUEVNIiwiZ2V0SWRlbnRpdGllcyIsImlkZW50aXRpZXNTZXJ2aWNlIiwiZ2V0QWxsIiwiaWRlbnRpdGllcyIsInBhcnNlRXJyb3IiLCJyZWdleHAiLCJleGVjIiwiQ29uZmxpY3RFcnJvciIsImdldEFmZmlsaWF0aW9ucyIsImEiLCJyZWFkIiwiZW5yb2xsbWVudElkIiwiZ2V0T25lIiwiTm90Rm91bmRFcnJvciIsInN1Y2Nlc3MiLCJyZWdpc3RlciIsImlzU3VwZXJVc2VyIiwiYWZmaWxpYXRpb24iLCJ1c2VyUm9sZSIsImF0dHJzIiwibWF4RW5yb2xsbWVudHMiLCJyZWdpc3RyYXRpb24iLCJwYXNzd29yZCIsInByb3BzIiwiZW5yb2xsbWVudElEIiwiZW5yb2xsbWVudFNlY3JldCIsImluZm8iLCJpZGVudGl0eUZyb21FbnJvbGxtZW50IiwiZW5yb2xsbWVudCIsInJvb3RDZXJ0aWZpY2F0ZSIsIkxvZ2dpbmciLCJjbGllbnRJZCIsIm5vdyIsIkRhdGUiLCJ0b0J5dGVzIiwiY3JlYXRlZE9uIiwidXBkYXRlZE9uIiwiZW5yb2xsIiwiaWRlbnRpdHkiLCJyZWdpc3RlckFuZEVucm9sbCIsInJldm9rZSIsInJlYXNvbiIsIlJlZ2lzdHJhdGlvblJlcXVlc3RCdWlsZGVyIiwiZXJycyIsInJvbGUiLCJzZXRBZmZpbGlhdGlvbiIsImFkZEF0dHIiLCJhdHRyIiwic2V0QXR0cnMiLCJzZXRFbnJvbGxtZW50SUQiLCJzZXRFbnJvbGxtZW50U2VjcmV0Iiwic2V0TWF4RW5yb2xsbWVudHMiLCJzZXRSb2xlIiwibWlubGVuZ3RoIiwibWluIiwiRVJDMjBFdmVudHMiLCJGYWJyaWNCYXNlTW9kZWwiLCJjcmVhdGVkQXQiLCJ1cGRhdGVkQXQiLCJ2ZXJzaW9uIiwidXNlcyIsIkZhYnJpY0lkZW50aWZpZWRCYXNlTW9kZWwiLCJjcmVhdGVkQnkiLCJ1cGRhdGVkQnkiLCJpc1NoYXJlZCIsInNlZ3JlZ2F0ZSIsImlzVHJhbnNpZW50IiwiZGVjb3JhdGVkUHJvcGVydGllcyIsImdldEF0dHJpYnV0ZXMiLCJ0cmFuc2llbnRQcm9wcyIsIkRCS2V5cyIsIlRSQU5TSUVOVCIsInByaXZhdGVQcm9wZXJ0aWVzIiwiUFJJVkFURSIsInNoYXJlZFByb3BlcnRpZXMiLCJTSEFSRUQiLCJwdWJsaWMiLCJ0cmFuc2llbnRLZXlzIiwicHJpdmF0ZUtleXMiLCJzaGFyZWRLZXlzIiwiaXNQdWJsaWMiLCJiaW5kIiwibWlycm9yZWQiLCJGQUJSSUMiLCJNSVJST1IiLCJvd25lck9mIiwibWV0YSIsIk9XTkVEX0JZIiwic2hhcmVkS2V5IiwiY29uc3RyIiwicHJpdmF0ZU1ldGEiLCJzaGFyZWRNZXRhIiwiY29sbGVjdGlvbnMiLCJleHRyYWN0TXNwSWQiLCJnZXRNU1BJRCIsIk93bmVyIiwidGFyZ2V0IiwicHJvcGVydHlLZXkiLCJkZXNjcmlwdG9yIiwib3JpZ2luYWxNZXRob2QiLCJhY291bnRJZCIsImNsaWVudElkZW50aXR5IiwiZ2V0SUQiLCJzZWxlY3QiLCJ0b2tlbnMiLCJleGVjdXRlIiwiYXBwbHkiLCJvd25lZEJ5T25DcmVhdGUiLCJjb250ZXh0Iiwic3R1YiIsImNyZWF0b3IiLCJnZXRDcmVhdG9yIiwibXNwaWQiLCJzZXRPd25lZEJ5S2V5VmFsdWUiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsIm93bmVkQnkiLCJhdHRyaWJ1dGUiLCJnZW5lcmF0ZWQiLCJyZWFkb25seSIsIm9uQ3JlYXRlIiwicHJvcE1ldGFkYXRhIiwiRGVjb3JhdGlvbiIsImRlZmluZSIsImRlY29yYXRvciIsInRyYW5zYWN0aW9uSWRPbkNyZWF0ZSIsImdldFR4SUQiLCJ0cmFuc2FjdGlvbklkIiwib25VcGRhdGUiLCJUUkFOU0FDVElPTl9JRCIsImV2YWxNaXJyb3JNZXRhZGF0YSIsImNyZWF0ZU1pcnJvckhhbmRsZXIiLCJmYWJyaWNDdHgiLCJzb3VyY2VNb2RlbCIsInB1dCIsInJlcG8iLCJtaXJyb3JDb2xsZWN0aW9uIiwidXBkYXRlTWlycm9ySGFuZGxlciIsImFwcGx5VXBkYXRlVmFsaWRhdGlvbiIsIm1lcmdlRm9yVXBkYXRlIiwiZGVsZXRlTWlycm9ySGFuZGxlciIsInBrUHJvcCIsInNlZ3JlZ2F0ZWQiLCJtaXJyb3JXcml0ZUd1YXJkIiwibXNwIiwiY29uZGl0aW9uIiwicmVhZE1pcnJvckhhbmRsZXIiLCJtYXRjaGVzIiwicmVhZEZyb20iLCJtc3BJZE9yQ29uZGl0aW9uIiwiaXNDb25kaXRpb25Pbmx5IiwiQm9vbGVhbiIsImNvbmQiLCJvblJlYWQiLCJwcmlvcml0eSIsIm9uRGVsZXRlIiwiTW9kZWxDb2xsZWN0aW9uIiwib3JnTmFtZSIsInRvUGFzY2FsQ2FzZSIsIk5hbWVzcGFjZUNvbGxlY3Rpb24iLCJuYW1lc3BhY2UiLCJJbXBsaWNpdFByaXZhdGVDb2xsZWN0aW9uIiwiU0VHUkVHQVRFRF9DT0xMRUNUSU9OX0VYVFJBQ1RJT05fUFJJT1JJVFkiLCJhcHBseVNlZ3JlZ2F0aW9uRmxhZ3MiLCJpc0Z1bGx5U2VncmVnYXRlZCIsImhhc1B1YmxpY1Byb3BlcnRpZXMiLCJtYXJrRnVsbHlTZWdyZWdhdGVkIiwiYXBwbHlNaXJyb3JGbGFncyIsImF0dHJpYnV0ZXMiLCJ0cmFuc2llbnRNZXRhIiwiZXh0cmFjdFNlZ3JlZ2F0ZWRDb2xsZWN0aW9ucyIsImRhdGFBcnJheSIsImNvbGxlY3Rpb25SZXNvbHZlciIsInNlcU5hbWUiLCJzZXF1ZW5jZU5hbWUiLCJzZXRTZXF1ZW5jZVNlZ3JlZ2F0aW9uIiwic2VncmVnYXRlZERhdGFPbkNyZWF0ZSIsImtleUFycmF5IiwiX2siLCJrZXlTdHJpbmdzIiwid3JpdGVUbyIsInNlZ3JlZ2F0ZWREYXRhT25SZWFkIiwic2VncmVnYXRlZERhdGFPblVwZGF0ZSIsIm9sZE1vZGVsIiwic2VncmVnYXRlZERhdGFPbkRlbGV0ZSIsImlubmVyU2VncmVnYXRlZCIsInNlZ3JlZ2F0ZWREZWMiLCJTZXQiLCJhZGQiLCJjb25zdHJNZXRhIiwiY29uc3RyQ29sbGVjdGlvbnMiLCJ1cGRhdGVkVHJhbnNpZW50TWV0YSIsImRlY3MiLCJwcm9wZXJ0aWVzIiwiZ3JvdXBOYW1lIiwiZXh0cmFjdEdyb3VwTmFtZSIsImRhdGFHcm91cE5hbWUiLCJlYXJseUV4dHJhY3Rpb25NZXRhIiwiZWFybHlFeHRyYWN0aW9uR3JvdXBTb3J0IiwiZ3JvdXAiLCJwcm9wIiwib24iLCJEQk9wZXJhdGlvbnMiLCJBTEwiLCJwcml2YXRlRGF0YSIsInNoYXJlZERhdGEiLCJzb3J0S2V5c09ubHlSZWN1cnNpdmUiLCJzb3J0IiwicmVkdWNlIiwiYWNjIiwiRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIiLCJlcnJvciIsInNlbGYiLCJvIiwiY2FsbCIsInJlbGF0aW9ucyIsImdlbmVyYXRlRmFicmljRXZlbnROYW1lIiwicGFyc2VFdmVudE5hbWUiLCJwYXJ0cyIsInNwbGl0Iiwic3ViIiwic2FmZVBhcnNlSW50Iiwic3RyaW5nIiwiZGlnaXRSZWdleCIsInRlc3QiLCJwYXJzZWRpbnQiLCJwYXJzZUludCIsImlzTmFOIiwiU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIiLCJwdXRBbmNob3IiLCJwcmVTZXJpYWxpemF0aW9uIiwiRmFicmljSWRlbnRpdHlTZXJ2aWNlIiwiQ2xpZW50QmFzZWRTZXJ2aWNlIiwicm9vdENsaWVudCIsIl91c2VyIiwiY2VydGlmaWNhdGVzIiwiYWZmaWxpYXRpb25zIiwiZ2V0VXNlciIsImNmZyIsIklOSVRJQUxJWkFUSU9OIiwiZ2V0TmFtZSIsInVwZGF0ZUlkZW50aXR5IiwiaWRlbnRpdHlSZXF1ZXN0IiwiY2FVc2VySWRlbnRpdHkiLCJyZWVucm9sbFVzZXIiLCJjcmVhdGVVc2VyIiwiZ2V0TXNwaWQiLCJlbnJvbGxtZW50QXR0cnMiLCJvcHRpb25hbCIsInJlZW5yb2xsIiwicmVuZXdlZElkZW50aXR5IiwicmV2b2tlT3B0aW9ucyIsInJldm9rZVJlcXVlc3QiLCJDQV9ST0xFIiwiRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzIiwiZXZhbHVhdGVUaW1lb3V0IiwiZW5kb3JzZVRpbWVvdXQiLCJzdWJtaXRUaW1lb3V0IiwiY29tbWl0VGltZW91dCIsImFsbG93TWFudWFsRW5kb3JzaW5nT3JncyIsImFsbG93R2F0ZXdheU92ZXJyaWRlIiwiZW5jcnlwdFRyYW5zaWVudCIsInN5bnRoZXRpY0V2ZW50cyIsImVzY2FwZVJlZ0V4cCIsIm5leHRMZXhpY29ncmFwaGljU3RyaW5nIiwiY2hhcnMiLCJjb2RlUG9pbnRBdCIsImZyb21Db2RlUG9pbnQiLCJwcmVmaXhSYW5nZSIsInN0YXJ0IiwiZW5kIiwiRmFicmljQ2xpZW50U3RhdGVtZW50IiwiU3RhdGVtZW50Iiwic3F1YXNoIiwic3F1YXNoZWQiLCJtZXRob2QiLCJleGVjdXRlUHJlcGFyZWQiLCJhcmd6IiwiZm9yTW9kZWwiLCJmcm9tU2VsZWN0b3IiLCJhbGlhcyIsIlFVRVJZIiwiaXNTaW1wbGVRdWVyeSIsIlF1ZXJ5Q2xhdXNlIiwid2hlcmVDb25kaXRpb24iLCJwYXJzZWQiLCJwcmVwYXJlQ29uZGl0aW9uIiwic2VsZWN0U2VsZWN0b3IiLCJTRUxFQ1QiLCJBTkQiLCJ0b0xvd2VyQ2FzZSIsIm9yZGVyQnlTZWxlY3RvcnMiLCJPUkRFUl9CWSIsInRvQ2FtZWxDYXNlIiwicHJvY2Vzc1JlY29yZCIsInBrQXR0ciIsIklEIiwia2V5QXJncyIsIlNFUEFSQVRPUiIsInJhdyIsInJhd0lucHV0IiwiYWdncmVnYXRvciIsImFnZ3JlZ2F0ZUluZm8iLCJhZ2dyZWdhdGUiLCJleGVjdXRlQWdncmVnYXRlIiwicmVzdWx0cyIsInByb2Nlc3NlZCIsImFwcGx5QWZ0ZXJIYW5kbGVyc1RvUmVzdWx0IiwiYWdncmVnYXRlUXVlcnkiLCJidWlsZEFnZ3JlZ2F0ZVF1ZXJ5Iiwic2VsZWN0b3JzIiwic2VsZWN0b3IiLCJmaWVsZHMiLCJwYXJzZUNvbmRpdGlvbiIsIkNvbmRpdGlvbiIsImFuZCIsImVxIiwic2VsZWN0b3JLZXlzIiwiQ291Y2hEQkdyb3VwT3BlcmF0b3IiLCJpbmRleE9mIiwidmFsIiwiT1IiLCJzIiwiZW50cmllcyIsIndhcm4iLCJzZWxlY3RvcktleSIsInJlYyIsIkNvdWNoREJPcGVyYXRvciIsIkJJR0dFUiIsImxpbWl0U2VsZWN0b3IiLCJDb3VjaERCUXVlcnlMaW1pdCIsIm9mZnNldFNlbGVjdG9yIiwic2tpcCIsIm1lcmdlIiwib3AiLCJvYmoxIiwib2JqMiIsImF0dHIxIiwib3BlcmF0b3IiLCJjb21wYXJpc29uIiwiT3BlcmF0b3IiLCJTVEFSVFNfV0lUSCIsIlF1ZXJ5RXJyb3IiLCJyYW5nZSIsIkJJR0dFUl9FUSIsIlNNQUxMRVIiLCJFTkRTX1dJVEgiLCJSRUdFWFAiLCJCRVRXRUVOIiwibWF4Iiwib3BCZXR3ZWVuIiwidHJhbnNsYXRlT3BlcmF0b3JzIiwiU01BTExFUl9FUSIsIkdyb3VwT3BlcmF0b3IiLCJOT1QiLCJvcDEiLCJvcDIiLCJhdmdTZWxlY3RvciIsInN1bUluZm8iLCJjcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yIiwiY291bnRJbmZvIiwiY3JlYXRlQWdncmVnYXRlUXVlcnkiLCJraW5kIiwic3VtRGVzY3JpcHRvciIsImNvdW50RGVzY3JpcHRvciIsImNvdW50RGlzdGluY3RTZWxlY3RvciIsImNvdW50RGlzdGluY3QiLCJhZ2dyZWdhdG9yVXNlZCIsImNvdW50U2VsZWN0b3IiLCJtaW5TZWxlY3RvciIsIm1heFNlbGVjdG9yIiwic3VtU2VsZWN0b3IiLCJkaXN0aW5jdFNlbGVjdG9yIiwiYWdncmVnYXRvckNoZWNrcyIsIm1ldGFzIiwiZmluZFZpZXdNZXRhZGF0YSIsInZpZXdOYW1lIiwiZ2VuZXJhdGVWaWV3TmFtZSIsImRkb2MiLCJnZW5lcmF0ZURlc2lnbkRvY05hbWUiLCJyZXR1cm5Eb2NzIiwidmlldyIsImdldEZhYnJpY0FkYXB0ZXIiLCJpc1ZpZXdBZ2dyZWdhdGUiLCJoYW5kbGVBdmVyYWdlIiwiZmFicmljQWRhcHRlciIsInZpZXdJbmZvIiwicHJvY2Vzc1ZpZXdSZXNwb25zZSIsInN1bURlc2MiLCJjb3VudERlc2MiLCJzdW1SZXNwb25zZSIsImNvdW50UmVzcG9uc2UiLCJzdW0iLCJyb3dzIiwicm93IiwiRmFicmljQ2xpZW50QWRhcHRlciIsIkFkYXB0ZXIiLCJvcGVyYXRpb24iLCJtZXJnZWRGbGFncyIsInNpbGx5IiwicG9wIiwidG9PdmVycmlkZXMiLCJuZXdDdHgiLCJwYXJlbnRDb250ZXh0IiwiY2hpbGRDb250ZXh0cyIsImN1cnJlbnRPcCIsImN1cnJlbnRNb2RlbCIsInJlcG9zaXRvcnkiLCJjcmVhdGVQcmVmaXgiLCJ1cGRhdGVBbGxQcmVmaXgiLCJzaGlmdCIsImhhc1RyYW5zaWVudCIsIm5lZWRzRnVsbFBheWxvYWQiLCJzaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24iLCJ0cmFuc2llbnRQYXlsb2FkIiwiQnVsa0NydWRPcGVyYXRpb25LZXlzIiwiQ1JFQVRFX0FMTCIsImdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMiLCJyZXMiLCJzaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZSIsIlJFQURfQUxMIiwiVVBEQVRFX0FMTCIsImRlbGV0ZUFsbCIsInNob3VsZEh5ZHJhdGUiLCJERUxFVEVfQUxMIiwiTUVUQURBVEEiLCJtaXJyb3JNc3AiLCJtc3BzIiwibWVyZ2VkIiwiZW5kb3JzaW5nT3JncyIsImVuZG9yc2luZ09yZ2FuaXphdGlvbnMiLCJzaG91bGRSZWJ1aWxkV2l0aFRyYW5zaWVudCIsInYiLCJjaGlsZFJlYnVpbGQiLCJnZXRGcm9tQ2hpbGRyZW4iLCJyZXNvbHZlZE9wIiwicmVzb2x2ZU9wZXJhdGlvbiIsImhhc0lkIiwiZGlyZWN0IiwiZGVzZXJpYWxpemVkIiwidXBkYXRlUHJlZml4IiwiVVBEQVRFIiwiREVMRVRFIiwiZG9jc09ubHkiLCJ0cmFuc2FjdGlvblJlc3VsdCIsInBhcnNlUmVjb3JkIiwiaXNNb2RlbCIsImVsIiwiZ2V0Q2xpZW50IiwiX2NsaWVudCIsIkdhdGV3YXkiLCJnZXRHYXRld2F5IiwiZ2V0Q29udHJhY3ROYW1lIiwiQ29udHJhY3QiLCJjb250cmFjdE5hbWUiLCJnZXRDb250cmFjdCIsInRyYW5zYWN0aW9uIiwiYXBpIiwic3VibWl0IiwidHJhbnNpZW50RGF0YSIsImdhdGV3YXkiLCJjb250cmFjdCIsImV2YWx1YXRlIiwicHJvcG9zYWxPcHRpb25zIiwiYXJndW1lbnRzIiwiY2xvc2UiLCJzaG91bGRVc2VMZWdhY3lHYXRld2F5IiwicHJlcGFyZUxlZ2FjeUFyZ3MiLCJidWlsZExlZ2FjeVRyYW5zaWVudCIsInJlc29sdmVMZWdhY3lNc3BDb3VudCIsImNvbmZpZ3VyZWQiLCJsZWdhY3lNc3BDb3VudCIsImlzRmluaXRlIiwiZmxvb3IiLCJwaWNrTGVnYWN5Q2FuZGlkYXRlcyIsImNhbmRpZGF0ZXMiLCJhdmFpbGFibGUiLCJwaWNrZWQiLCJpZHgiLCJyYW5kb20iLCJzZWxlY3Rpb24iLCJzcGxpY2UiLCJidWlsZExlZ2FjeVBlZXJDb25maWdzIiwicGVlcnMiLCJwZWVyRW5kcG9pbnQiLCJwZWVySG9zdEFsaWFzIiwidGxzQ2VydCIsImVuZG9yc2VycyIsIm9yZyIsImV4dHJhcyIsIm1zcE1hcCIsImxlZ2FjeUNvdW50Iiwic2VsZWN0aW9ucyIsImNob2ljZSIsImVuZHBvaW50Iiwic3VibWl0TGVnYWN5V2l0aEV4cGxpY2l0RW5kb3JzZXJzIiwiZmNuIiwidHJhbnNpZW50TWFwIiwicGVlckNvbmZpZ3MiLCJub3JtYWxpemVMZWdhY3lQZWVycyIsImlkZW50aXR5TWF0ZXJpYWwiLCJyZXNvbHZlTGVnYWN5SWRlbnRpdHlNYXRlcmlhbCIsIndhbGxldCIsIldhbGxldHMiLCJuZXdJbk1lbW9yeVdhbGxldCIsImlkZW50aXR5TGFiZWwiLCJjb25uZWN0aW9uUHJvZmlsZSIsImJ1aWxkTGVnYWN5Q29ubmVjdGlvblByb2ZpbGUiLCJMZWdhY3lHYXRld2F5IiwiY29ubmVjdCIsImRpc2NvdmVyeSIsImVuYWJsZWQiLCJhc0xvY2FsaG9zdCIsInNob3VsZFRyZWF0UGVlcnNBc0xvY2FsaG9zdCIsInRsc0luZm8iLCJuZXR3b3JrIiwiZ2V0TmV0d29yayIsImNoYW5uZWwiLCJjaGFpbmNvZGVOYW1lIiwiY3JlYXRlVHJhbnNhY3Rpb24iLCJzZXRUcmFuc2llbnQiLCJwZWVyIiwiZ2V0Q2hhbm5lbCIsImdldEVuZG9yc2VyIiwiZW5kb3JzZXIiLCJzZXRFbmRvcnNpbmdQZWVycyIsImRpc2Nvbm5lY3QiLCJkZWR1cGVkIiwiTWFwIiwiYWRkUGVlciIsImhhcyIsInJlYWRQZW1JbnB1dCIsImNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRoIiwia2V5Q2VydE9yRGlyZWN0b3J5UGF0aCIsInBlZXJFbnRyaWVzIiwiY2hhbm5lbFBlZXJzIiwib3JncyIsInRsc1BlbSIsImhvc3RuYW1lIiwiZXh0cmFjdEhvc3QiLCJlbnN1cmVHcnBjVXJsIiwidGxzQ0FDZXJ0cyIsImdycGNPcHRpb25zIiwiaG9zdG5hbWVPdmVycmlkZSIsImVuZG9yc2luZ1BlZXIiLCJjaGFpbmNvZGVRdWVyeSIsImxlZGdlclF1ZXJ5IiwiZXZlbnRTb3VyY2UiLCJvcmdhbml6YXRpb24iLCJvcmdhbml6YXRpb25zIiwib3JkZXJlcnMiLCJjaGFubmVscyIsImV2ZXJ5IiwiaXNMb2NhbEVuZHBvaW50IiwiaG9zdCIsInNhbml0aXplZCIsImlzQnVmZmVyIiwidHJpbW1lZCIsInN0YXRzIiwic3RhdCIsImNhdGNoIiwiaXNEaXJlY3RvcnkiLCJyZWFkRnNGaWxlIiwiZXJyIiwibGVnYWN5QXJncyIsInNodXRkb3duIiwiY2hhbm5lbE5hbWUiLCJnZXRDb25uZWN0aW9uIiwicGF0aE9yQ2VydCIsInJlYWRGaWxlU3luYyIsInRsc0NyZWRlbnRpYWxzIiwiZ3JwYyIsImNyZWF0ZVNzbCIsInNpemVMaW1pdCIsInNpZ25lciIsImV2YWx1YXRlT3B0aW9ucyIsImRlYWRsaW5lIiwiZW5kb3JzZU9wdGlvbnMiLCJzdWJtaXRPcHRpb25zIiwiY29tbWl0U3RhdHVzT3B0aW9ucyIsIlByb3h5IiwidGhpc0FyZyIsImFyZ0FycmF5IiwiUmVmbGVjdCIsIkRpc3BhdGNoIiwiR2F0ZXdheUVycm9yIiwiZGV0YWlscyIsIkVuZG9yc2VFcnJvciIsIkJhZFJlcXVlc3RFcnJvciIsIlBhZ2luZ0Vycm9yIiwiTWlncmF0aW9uRXJyb3IiLCJPYnNlcnZlckVycm9yIiwiRm9yYmlkZGVuRXJyb3IiLCJDb25uZWN0aW9uRXJyb3IiLCJmaW5hbCIsIkQiLCJfYSIsImRlY29yYXRpb24iLCJzZXRDdXJyZW50IiwiRmFicmljQ2xpZW50RGlzcGF0Y2giLCJsb2dnZWRBcmdzIiwiU0hVVERPV04iLCJsaXN0ZW5pbmdTdGFjayIsInBhcnNlUGF5bG9hZCIsImpzb25CeXRlcyIsImpzb24iLCJvYnNlcnZlIiwib2JzZXJ2ZXIiLCJ1bk9ic2VydmUiLCJyZWZyZXNoIiwiaGFuZGxlRXZlbnRzIiwiY3R4QXJnIiwiY29ycmVsYXRpb25JZCIsImV2dCIsImV2ZW50TmFtZSIsIm1zcEV2ZW50T25seSIsInRhcmdldE1vZGVsIiwibW9kZWxSZWYiLCJvYnNlcnZlckFyZ3MiLCJnZXRDaGFpbmNvZGVFdmVudHMiLCJ0b1dyYXAiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJwcm90byIsImdldFByb3RvdHlwZU9mIiwiYnVsa1RvU2luZ2xlIiwicmVzdWx0QXJncyIsIlZFUlNJT04iLCJQQUNLQUdFX05BTUUiLCJyZWdpc3RlckxpYnJhcnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVdBLFNBQVNBLHlCQUF5QkM7SUFFaEMsTUFBTUMsS0FBS0MsUUFBUTtJQUVuQixNQUFNQyxPQUFPRCxRQUFRO0lBQ3JCLE1BQU1FLFVBQWtCRCxLQUFLQyxR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
3881
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWZhYnJpYy5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC9pbmRleGVzL2dlbmVyYXRpb24udHMiLCIuLi9zcmMvY2xpZW50L2NvbGxlY3Rpb25zL2dlbmVyYXRpb24udHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudFBhZ2luYXRvci50cyIsIi4uL3NyYy9jbGllbnQvRmFicmljQ2xpZW50UmVwb3NpdG9yeS50cyIsIi4uL3NyYy9jb250cmFjdHMvZXJjMjAvbW9kZWxzLnRzIiwiLi4vc3JjL3NoYXJlZC9DbGllbnRTZXJpYWxpemVyLnRzIiwiLi4vc3JjL2NsaWVudC9lcmMyMC9GYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnkudHMiLCIuLi9zcmMvY2xpZW50L2lkcy9pZC1leHRyYWN0aW9uLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9JZGVudGl0eUNyZWRlbnRpYWxzLnRzIiwiLi4vc3JjL3NoYXJlZC9jb25zdGFudHMudHMiLCIuLi9zcmMvc2hhcmVkL21vZGVsL0lkZW50aXR5LnRzIiwiLi4vc3JjL2NsaWVudC91dGlscy50cyIsIi4uL3NyYy9jbGllbnQvY3J5cHRvLnRzIiwiLi4vc3JjL3NoYXJlZC9lcnJvcnMudHMiLCIuLi9zcmMvY2xpZW50L3NlcnZpY2VzL0ZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9SZWdpc3RyYXRpb25SZXF1ZXN0QnVpbGRlci50cyIsIi4uL3NyYy9zaGFyZWQvZXJjMjAvZXJjMjAtY29uc3RhbnRzLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9GYWJyaWNCYXNlTW9kZWwudHMiLCIuLi9zcmMvc2hhcmVkL21vZGVsL0ZhYnJpY0lkZW50aWZpZWRCYXNlTW9kZWwudHMiLCIuLi9zcmMvc2hhcmVkL292ZXJyaWRlcy9vdmVycmlkZXMudHMiLCIuLi9zcmMvc2hhcmVkL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvc2hhcmVkL0RldGVybWluaXN0aWNTZXJpYWxpemVyLnRzIiwiLi4vc3JjL3NoYXJlZC9ldmVudHMudHMiLCIuLi9zcmMvc2hhcmVkL21hdGgudHMiLCIuLi9zcmMvc2hhcmVkL1NpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GYWJyaWNJZGVudGl0eVNlcnZpY2UudHMiLCIuLi9zcmMvY2xpZW50L3NlcnZpY2VzL2NvbnN0YW50cy50cyIsIi4uL3NyYy9jbGllbnQvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2NsaWVudC9mYWJyaWMtZnMudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudFN0YXRlbWVudC50cyIsIi4uL3NyYy9jbGllbnQvRmFicmljQ2xpZW50QWRhcHRlci50cyIsIi4uL3NyYy9jbGllbnQvRmFicmljQ2xpZW50RGlzcGF0Y2gudHMiLCIuLi9zcmMvdmVyc2lvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHtcbiAgQ3JlYXRlSW5kZXhSZXF1ZXN0LFxuICBDb3VjaERCRGVzaWduRG9jLFxuICBnZW5lcmF0ZUluZGV4ZXMsXG4gIGdlbmVyYXRlVmlld3MsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7IE1vZGVsLCBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG5leHBvcnQgdHlwZSBJbmRleCA9IENyZWF0ZUluZGV4UmVxdWVzdDtcblxuZnVuY3Rpb24gZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbiAgY29uc3QgZGlybmFtZTogc3RyaW5nID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoZGlybmFtZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZGlybmFtZSk7XG4gIGZzLm1rZGlyU3luYyhkaXJuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTW9kZWxJbmRleGVzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG06IENvbnN0cnVjdG9yPE0+XG4pOiBJbmRleFtdIHtcbiAgcmV0dXJuIGdlbmVyYXRlSW5kZXhlcyhbbV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNb2RlbERlc2lnbkRvY3M8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIGFjY3VtPzogUmVjb3JkPHN0cmluZywgQ291Y2hEQkRlc2lnbkRvYz5cbik6IENvdWNoREJEZXNpZ25Eb2NbXSB7XG4gIGNvbnN0IHZpZXdzID0gZ2VuZXJhdGVWaWV3cyhbbV0pO1xuICBjb25zdCBzdG9yYWdlOiBSZWNvcmQ8c3RyaW5nLCBDb3VjaERCRGVzaWduRG9jPiA9IGFjY3VtIHx8IHt9O1xuICB2aWV3cy5mb3JFYWNoKChkb2MpID0+IHtcbiAgICBzdG9yYWdlW2RvYy5faWRdID0gZG9jO1xuICB9KTtcbiAgcmV0dXJuIHZpZXdzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZE1vZGVsRmlsZShmaWxlOiBhbnkpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBleHBvcnRzID0gcmVxdWlyZShwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgZmlsZS5wYXJlbnRQYXRoLCBmaWxlLm5hbWUpKTtcblxuICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKGV4cG9ydHMpLmZpbHRlcigoZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtID0gbmV3IChlIGFzIENvbnN0cnVjdG9yKSgpO1xuICAgICAgcmV0dXJuIG0gaW5zdGFuY2VvZiBNb2RlbDtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KSBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT5bXTtcbiAgcmV0dXJuIHZhbHVlcztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRNb2RlbEZvbGRlcnMoXG4gIC4uLmZvbGRlcnM6IHN0cmluZ1tdXG4pOiBQcm9taXNlPE1vZGVsQ29uc3RydWN0b3I8YW55PltdPiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuXG4gIGNvbnN0IHJlc3VsdDogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGZvbGRlciBvZiBmb2xkZXJzKSB7XG4gICAgY29uc3QgZmlsZXMgPSBmc1xuICAgICAgLnJlYWRkaXJTeW5jKGZvbGRlciwge1xuICAgICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlLFxuICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZjogYW55KSA9PiBmLmlzRmlsZSgpICYmIGYubmFtZS5lbmRzV2l0aChcImpzXCIpKTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLnJlYWRNb2RlbEZpbGUoZmlsZSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVJbmRleGVzKFxuICBpbmRleGVzOiBJbmRleFtdLFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBjb2xsZWN0aW9uPzogc3RyaW5nXG4pIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcblxuICBpbmRleGVzLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgY29uc3QgZmlsZSA9IHBhdGgucmVzb2x2ZShcbiAgICAgIHBhdGguam9pbihcbiAgICAgICAgcCxcbiAgICAgICAgYC4vTUVUQS1JTkYvc3RhdGVkYi9jb3VjaGRiLyR7Y29sbGVjdGlvbiA/IGBjb2xsZWN0aW9ucy8ke2NvbGxlY3Rpb259L2AgOiBcIlwifWluZGV4ZXMvJHtpbmRleC5uYW1lfS5qc29uYFxuICAgICAgKVxuICAgICk7XG4gICAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGUpO1xuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZSwgSlNPTi5zdHJpbmdpZnkoaW5kZXgsIHVuZGVmaW5lZCwgMikpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlRGVzaWduRG9jcyhcbiAgZGVzaWduRG9jczogQ291Y2hEQkRlc2lnbkRvY1tdLFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBjb2xsZWN0aW9uPzogc3RyaW5nXG4pIHtcbiAgaWYgKCFkZXNpZ25Eb2NzLmxlbmd0aCkgcmV0dXJuO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG4gIGRlc2lnbkRvY3MuZm9yRWFjaCgoZG9jKSA9PiB7XG4gICAgY29uc3QgZG9jSWQgPSBkb2MuX2lkLnJlcGxhY2UoL15fZGVzaWduXFwvLywgXCJcIik7XG4gICAgY29uc3QgZmlsZSA9IHBhdGgucmVzb2x2ZShcbiAgICAgIHBhdGguam9pbihcbiAgICAgICAgcCxcbiAgICAgICAgYC4vTUVUQS1JTkYvc3RhdGVkYi9jb3VjaGRiLyR7Y29sbGVjdGlvbiA/IGBjb2xsZWN0aW9ucy8ke2NvbGxlY3Rpb259L2AgOiBcIlwifWRlc2lnbl9kb2NzLyR7ZG9jSWR9Lmpzb25gXG4gICAgICApXG4gICAgKTtcbiAgICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZSk7XG4gICAgY29uc3QgcGF5bG9hZCA9IHsgLi4uZG9jIH07XG4gICAgZGVsZXRlIHBheWxvYWQuX3JldjtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGUsIEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIHVuZGVmaW5lZCwgMikpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBDb3VjaERCRGVzaWduRG9jIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb2xsZWN0aW9uUmVzb2x2ZXIgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2luZGV4XCI7XG5pbXBvcnQgeyB3cml0ZURlc2lnbkRvY3MgfSBmcm9tIFwiLi4vaW5kZXhlcy9nZW5lcmF0aW9uXCI7XG5cbi8vXG4vLyBleHBvcnQgdHlwZSBGYWJyaWNDb2xsZWN0aW9uID0ge1xuLy8gICBuYW1lOiBcImNvbGxlY3Rpb25NYXJibGVzXCI7XG4vLyAgIHBvbGljeTogXCJPUignT3JnMU1TUC5tZW1iZXInLCAnT3JnMk1TUC5tZW1iZXInKVwiO1xuLy8gICByZXF1aXJlZFBlZXJDb3VudDogMDtcbi8vICAgbWF4UGVlckNvdW50OiAzO1xuLy8gICBibG9ja1RvTGl2ZTogMDtcbi8vICAgbWVtYmVyT25seVJlYWQ6IHRydWU7XG4vLyAgIG1lbWJlck9ubHlXcml0ZTogdHJ1ZTtcbi8vICAgZW5kb3JzZW1lbnRQb2xpY3k6IHtcbi8vICAgICBpZGVudGl0aWVzOiBbXG4vLyAgICAgICB7IHJvbGU6IHsgbmFtZTogXCJtZW1iZXJcIjsgbXNwSWQ6IFwiT3JnMU1TUFwiIH0gfSxcbi8vICAgICAgIHsgcm9sZTogeyBuYW1lOiBcIm1lbWJlclwiOyBtc3BJZDogXCJPcmcyTVNQXCIgfSB9LFxuLy8gICAgIF07XG4vLyAgICAgcnVsZTogXCJPUignT3JnMU1TUC5tZW1iZXInLCAnT3JnMk1TUC5tZW1iZXInKVwiO1xuLy8gICB9O1xuLy8gfTtcblxuZXhwb3J0IHR5cGUgRmFicmljUG9saWN5SWRlbnRpdHkgPSB7XG4gIHJvbGU6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgbXNwSWQ6IHN0cmluZztcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIEZhYnJpY0NvbGxlY3Rpb24gPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgcG9saWN5OiBzdHJpbmc7XG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXI7XG4gIG1heFBlZXJDb3VudDogbnVtYmVyO1xuICBibG9ja1RvTGl2ZTogbnVtYmVyO1xuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbjtcbiAgbWVtYmVyT25seVdyaXRlOiBib29sZWFuO1xuICBlbmRvcnNlbWVudFBvbGljeToge1xuICAgIGlkZW50aXRpZXM6IEZhYnJpY1BvbGljeUlkZW50aXR5W107XG4gICAgcnVsZTogc3RyaW5nO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgUHJpdmF0ZUNvbGxlY3Rpb24gPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgcG9saWN5OiBzdHJpbmc7XG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXI7XG4gIG1heFBlZXJDb3VudDogbnVtYmVyO1xuICBibG9ja1RvTGl2ZTogbnVtYmVyO1xuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbjtcbiAgbWVtYmVyT25seVdyaXRlOiBib29sZWFuO1xuICBlbmRvcnNlbWVudFBvbGljeT86IHtcbiAgICBzaWduYXR1cmVQb2xpY3k6IHN0cmluZztcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0aW9uRm9yKFxuICBjb2xsZWN0aW9uTmFtZTogc3RyaW5nLFxuICBwb2xpY3k6IHN0cmluZyxcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlcixcbiAgbWF4UGVlckNvdW50OiBudW1iZXIsXG4gIGJsb2NrVG9MaXZlOiBudW1iZXIsXG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuLFxuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW5cbik6IFByaXZhdGVDb2xsZWN0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBjb2xsZWN0aW9uTmFtZSxcbiAgICBwb2xpY3k6IHBvbGljeSxcbiAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICBtYXhQZWVyQ291bnQsXG4gICAgYmxvY2tUb0xpdmUsXG4gICAgbWVtYmVyT25seVJlYWQsXG4gICAgbWVtYmVyT25seVdyaXRlLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUNvbGxlY3Rpb25Gb3IoXG4gIG1zcElkOiBzdHJpbmcsXG4gIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcgPSBgJHttc3BJZH1Qcml2YXRlYCxcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlciA9IDAsXG4gIG1heFBlZXJDb3VudDogbnVtYmVyID0gMCxcbiAgYmxvY2tUb0xpdmU6IG51bWJlciA9IDAsXG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuID0gdHJ1ZSxcbiAgbWVtYmVyT25seVdyaXRlOiBib29sZWFuID0gdHJ1ZVxuKTogUHJpdmF0ZUNvbGxlY3Rpb24ge1xuICBjb25zdCBjID0gY29sbGVjdGlvbkZvcihcbiAgICBjb2xsZWN0aW9uTmFtZSxcbiAgICBgT1IoJyR7bXNwSWR9Lm1lbWJlcicpYCxcbiAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICBtYXhQZWVyQ291bnQsXG4gICAgYmxvY2tUb0xpdmUsXG4gICAgbWVtYmVyT25seVJlYWQsXG4gICAgbWVtYmVyT25seVdyaXRlXG4gICk7XG5cbiAgYy5lbmRvcnNlbWVudFBvbGljeSA9IHtcbiAgICBzaWduYXR1cmVQb2xpY3k6IGBPUignJHttc3BJZH0ucGVlcicpYCxcbiAgfTtcbiAgcmV0dXJuIGM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGFyZWRDb2xsZWN0aW9uRm9yKFxuICBtc3BJZHM6IHN0cmluZ1tdLFxuICBjb2xsZWN0aW9uTmFtZTogc3RyaW5nLFxuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyID0gMSxcbiAgbWF4UGVlckNvdW50OiBudW1iZXIgPSAyLFxuICBibG9ja1RvTGl2ZTogbnVtYmVyID0gMCxcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW4gPSB0cnVlLFxuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW4gPSB0cnVlXG4pOiBQcml2YXRlQ29sbGVjdGlvbiB7XG4gIGNvbnN0IGMgPSBjb2xsZWN0aW9uRm9yKFxuICAgIGNvbGxlY3Rpb25OYW1lLFxuICAgIGBPUigke21zcElkcy5tYXAoKG0pID0+IGAnJHttfS5tZW1iZXInYCkuam9pbihcIixcIil9KWAsXG4gICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgbWF4UGVlckNvdW50LFxuICAgIGJsb2NrVG9MaXZlLFxuICAgIG1lbWJlck9ubHlSZWFkLFxuICAgIG1lbWJlck9ubHlXcml0ZVxuICApO1xuICBjLmVuZG9yc2VtZW50UG9saWN5ID0ge1xuICAgIHNpZ25hdHVyZVBvbGljeTogYEFORCgke21zcElkcy5tYXAoKG0pID0+IGAnJHttfS5wZWVyJ2ApLmpvaW4oXCIsXCIpfSlgLFxuICB9O1xuICByZXR1cm4gYztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RDb2xsZWN0aW9uczxNIGV4dGVuZHMgTW9kZWw+KFxuICBtOiBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwSWRzOiBzdHJpbmdbXSxcbiAgb3ZlcnJpZGVzOiB7XG4gICAgcHJpdmF0ZUNvbHM/OiBQYXJ0aWFsPFByaXZhdGVDb2xsZWN0aW9uPjtcbiAgICBzaGFyZWRDb2xzPzogUGFydGlhbDxQcml2YXRlQ29sbGVjdGlvbj47XG4gIH0gPSB7fSxcbiAgbWlycm9yOiBib29sZWFuID0gZmFsc2Vcbikge1xuICBsZXQgeyBwcml2YXRlQ29scywgc2hhcmVkQ29scyB9ID0gTW9kZWwuY29sbGVjdGlvbnNGb3IobSk7XG5cbiAgZnVuY3Rpb24gcmVzb2x2ZUNvbGxlY3Rpb24oYXJnOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIGFyZyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFyZztcbiAgICAgIHJldHVybiBhcmcobSwgbXNwSWRzWzBdKSBhcyBzdHJpbmc7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZUNvbHMgPSBwcml2YXRlQ29scy5tYXAocmVzb2x2ZUNvbGxlY3Rpb24pO1xuICBzaGFyZWRDb2xzID0gc2hhcmVkQ29scy5tYXAocmVzb2x2ZUNvbGxlY3Rpb24pO1xuXG4gIGNvbnN0IHByaXZhdGVEZWZhdWx0cyA9IE9iamVjdC5hc3NpZ24oXG4gICAge30sXG4gICAge1xuICAgICAgcmVxdWlyZWRQZWVyQ291bnQ6IDAsXG4gICAgICBtYXhQZWVyQ291bnQ6IDAsXG4gICAgICBibG9ja1RvTGl2ZTogMCxcbiAgICAgIG1lbWJlck9ubHlSZWFkOiB0cnVlLFxuICAgICAgbWVtYmVyT25seVdyaXRlOiB0cnVlLFxuICAgIH0sXG4gICAgb3ZlcnJpZGVzPy5wcml2YXRlQ29scyB8fCB7fVxuICApO1xuICBjb25zdCBzaGFyZWREZWZhdWx0cyA9IE9iamVjdC5hc3NpZ24oXG4gICAge30sXG4gICAge1xuICAgICAgcmVxdWlyZWRQZWVyQ291bnQ6IDEsXG4gICAgICBtYXhQZWVyQ291bnQ6IDIsXG4gICAgICBibG9ja1RvTGl2ZTogMCxcbiAgICAgIG1lbWJlck9ubHlSZWFkOiB0cnVlLFxuICAgICAgbWVtYmVyT25seVdyaXRlOiB0cnVlLFxuICAgIH0sXG4gICAgb3ZlcnJpZGVzPy5zaGFyZWRDb2xzIHx8IHt9XG4gICk7XG5cbiAgY29uc3QgbWlycm9yTWV0YSA9IG1pcnJvciA/IE1vZGVsLm1pcnJvcmVkQXQobSkgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgcHJpdmF0ZXMgPSBtc3BJZHNcbiAgICAubWFwKChtc3BJZCkgPT5cbiAgICAgIChwcml2YXRlQ29scyBhcyBzdHJpbmdbXSkubWFwKChwKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcmVxdWlyZWRQZWVyQ291bnQsIG1heFBlZXJDb3VudCwgYmxvY2tUb0xpdmUsIG1lbWJlck9ubHlSZWFkIH0gPVxuICAgICAgICAgIHByaXZhdGVEZWZhdWx0cztcbiAgICAgICAgcmV0dXJuIHByaXZhdGVDb2xsZWN0aW9uRm9yKFxuICAgICAgICAgIG1zcElkLFxuICAgICAgICAgIHAsXG4gICAgICAgICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgICAgICAgbWF4UGVlckNvdW50LFxuICAgICAgICAgIGJsb2NrVG9MaXZlLFxuICAgICAgICAgIG1lbWJlck9ubHlSZWFkLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgIClcbiAgICAuZmxhdCgpO1xuXG4gIGlmIChtaXJyb3JNZXRhICYmIG1pcnJvck1ldGEubXNwSWQpIHtcbiAgICBjb25zdCByZXNvbHZlZCA9XG4gICAgICB0eXBlb2YgbWlycm9yTWV0YS5yZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IG1pcnJvck1ldGEucmVzb2x2ZXJcbiAgICAgICAgOiBtaXJyb3JNZXRhLnJlc29sdmVyKG0sIG1pcnJvck1ldGEubXNwSWQpO1xuICAgIGlmIChcbiAgICAgIHJlc29sdmVkICYmXG4gICAgICAhcHJpdmF0ZXMuc29tZShcbiAgICAgICAgKHApID0+IHAubmFtZSA9PT0gcmVzb2x2ZWQgJiYgcC5wb2xpY3kuaW5jbHVkZXMobWlycm9yTWV0YS5tc3BJZClcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcmVxdWlyZWRQZWVyQ291bnQsIG1heFBlZXJDb3VudCwgYmxvY2tUb0xpdmUsIG1lbWJlck9ubHlSZWFkIH0gPVxuICAgICAgICBwcml2YXRlRGVmYXVsdHM7XG4gICAgICBwcml2YXRlcy5wdXNoKFxuICAgICAgICBwcml2YXRlQ29sbGVjdGlvbkZvcihcbiAgICAgICAgICBtaXJyb3JNZXRhLm1zcElkLFxuICAgICAgICAgIHJlc29sdmVkLFxuICAgICAgICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgICAgICAgIG1heFBlZXJDb3VudCxcbiAgICAgICAgICBibG9ja1RvTGl2ZSxcbiAgICAgICAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICAgICAgICBmYWxzZVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNoYXJlZCA9IChzaGFyZWRDb2xzIGFzIHN0cmluZ1tdKS5tYXAoKHApID0+IHtcbiAgICBjb25zdCB7XG4gICAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICAgIG1heFBlZXJDb3VudCxcbiAgICAgIGJsb2NrVG9MaXZlLFxuICAgICAgbWVtYmVyT25seVJlYWQsXG4gICAgICBtZW1iZXJPbmx5V3JpdGUsXG4gICAgfSA9IHNoYXJlZERlZmF1bHRzO1xuICAgIHJldHVybiBzaGFyZWRDb2xsZWN0aW9uRm9yKFxuICAgICAgbXNwSWRzLFxuICAgICAgcCxcbiAgICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgICAgbWF4UGVlckNvdW50LFxuICAgICAgYmxvY2tUb0xpdmUsXG4gICAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICAgIG1lbWJlck9ubHlXcml0ZVxuICAgICk7XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcHJpdmF0ZXMsXG4gICAgc2hhcmVkLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVDb2xsZWN0aW9ucyhcbiAgY29sczogUHJpdmF0ZUNvbGxlY3Rpb25bXSxcbiAgcDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgZmlsZU5hbWUgPSBcImNvbGxlY3Rpb25zX2NvbmZpZ1wiXG4pIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcblxuICBmdW5jdGlvbiBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIGNvbnN0IGRpcm5hbWU6IHN0cmluZyA9IHBhdGguZGlybmFtZShmaWxlUGF0aCkgYXMgc3RyaW5nO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpcm5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGRpcm5hbWUpO1xuICAgIGZzLm1rZGlyU3luYyhkaXJuYW1lKTtcbiAgfVxuXG4gIGNvbnN0IGZpbGUgPSBwYXRoLnJlc29sdmUocGF0aC5qb2luKHAsIGAuL01FVEEtSU5GLyR7ZmlsZU5hbWV9Lmpzb25gKSk7XG4gIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlKTtcbiAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCBKU09OLnN0cmluZ2lmeShjb2xzLCB1bmRlZmluZWQsIDIpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQ29sbGVjdGlvbkRlc2lnbkRvY3MoXG4gIGRvY3M6IENvdWNoREJEZXNpZ25Eb2NbXSxcbiAgcDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgY29sbGVjdGlvbj86IHN0cmluZ1xuKSB7XG4gIGlmICghZG9jcz8ubGVuZ3RoKSByZXR1cm47XG4gIHdyaXRlRGVzaWduRG9jcyhkb2NzLCBwLCBjb2xsZWN0aW9uKTtcbn1cbiIsImltcG9ydCB7XG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgUGFnaW5hdG9yLFxuICBQcmVwYXJlZFN0YXRlbWVudCxcbiAgU2VyaWFsaXplZFBhZ2UsXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7IE1hbmdvUXVlcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnRQYWdpbmF0b3I8TSBleHRlbmRzIE1vZGVsPiBleHRlbmRzIFBhZ2luYXRvcjxcbiAgTSxcbiAgTVtdLFxuICBNYW5nb1F1ZXJ5XG4+IHtcbiAgYm9va21hcms/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYWRhcHRlcjogRmFicmljQ2xpZW50QWRhcHRlcixcbiAgICBxdWVyeTogTWFuZ29RdWVyeSB8IFByZXBhcmVkU3RhdGVtZW50PGFueT4sXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPlxuICApIHtcbiAgICBzdXBlcihhZGFwdGVyLCBxdWVyeSwgc2l6ZSwgY2xhenopO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBwcm90ZWN0ZWQgcHJlcGFyZShyYXdTdGF0ZW1lbnQ6IE1hbmdvUXVlcnkpOiBNYW5nb1F1ZXJ5IHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIGBSYXcgcXVlcnkgYWNjZXNzIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcy4gb25seSBwcmVwYXJlZCBzdGF0ZW1lbnRzIGFyZSBuYXRpdmVseSBhdmFpbGFibGVgXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHBhZ2UoXG4gICAgcGFnZTogbnVtYmVyID0gMSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIHJldHVybiBzdXBlci5wYWdlKHBhZ2UsIC4uLmFyZ3MpOyAvLyB0aGlzIHdpbGwgZmFpbCBmb3Igbm9uLXByZXBhcmVkIHN0YXRlbWVudHNcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBpc1NlcmlhbGl6ZWRQYWdlKG9iajogU2VyaWFsaXplZFBhZ2U8YW55PiB8IGFueSkge1xuICAgIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiBBcnJheS5pc0FycmF5KG9iai5kYXRhKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBNYXliZUNvbnRleHR1YWxBcmcgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIENvbnRleHRPZixcbiAgRGlyZWN0aW9uTGltaXRPZmZzZXQsXG4gIEZsYWdzT2YsXG4gIE9ic2VydmVySGFuZGxlcixcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBhZ2luYXRvcixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBQcmVwYXJlZFN0YXRlbWVudEtleXMsXG4gIFJlcG9zaXRvcnksXG4gIFNlcmlhbGl6ZWRQYWdlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IHR5cGUgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgZW5mb3JjZURCRGVjb3JhdG9ycyxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgUHJpbWFyeUtleVR5cGUsXG4gIHJlZHVjZUVycm9yc1RvUHJpbnQsXG4gIFZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb3VjaERCS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudFBhZ2luYXRvciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudFBhZ2luYXRvclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIGZvciBGYWJyaWMgY2xpZW50IG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IEV4dGVuZHMgdGhlIGdlbmVyaWMgUmVwb3NpdG9yeSB0byBwcmVwYXJlIGNvbnRleHQgYW5kIGFyZ3VtZW50cyBmb3IgQ1JVRCBvcGVyYXRpb25zIGV4ZWN1dGVkIHZpYSBhIEZhYnJpYyBjbGllbnQgQWRhcHRlciwgd2lyaW5nIFJlcG9zaXRvcnlGbGFncyBhbmQgRmFicmljLXNwZWNpZmljIG92ZXJyaWRlcy5cbiAqIEB0ZW1wbGF0ZSBNIGV4dGVuZHMgTW9kZWwgLSBUaGUgbW9kZWwgdHlwZSBoYW5kbGVkIGJ5IHRoaXMgcmVwb3NpdG9yeVxuICogQHBhcmFtIHtBZGFwdGVyPGFueSwgTWFuZ29RdWVyeSwgRmFicmljRmxhZ3MsIENvbnRleHQ8RmFicmljRmxhZ3M+Pn0gW2FkYXB0ZXJdIC0gT3B0aW9uYWwgYWRhcHRlciBpbnN0YW5jZSB1c2VkIHRvIGV4ZWN1dGUgb3BlcmF0aW9uc1xuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gW2NsYXp6XSAtIE9wdGlvbmFsIG1vZGVsIGNvbnN0cnVjdG9yIHVzZWQgYnkgdGhlIHJlcG9zaXRvcnlcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgRmFicmljQ2xpZW50UmVwb3NpdG9yeVxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbiAqIGltcG9ydCB7IEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1mYWJyaWNcIjtcbiAqXG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgTW9kZWwgeyBpZCE6IHN0cmluZzsgbmFtZSE6IHN0cmluZzsgfVxuICogY29uc3QgcmVwbyA9IG5ldyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5PFVzZXI+KCk7XG4gKiBjb25zdCBjcmVhdGVkID0gYXdhaXQgcmVwby5jcmVhdGUobmV3IFVzZXIoeyBpZDogXCIxXCIsIG5hbWU6IFwiQWxpY2VcIiB9KSk7XG4gKiBjb25zdCBsb2FkZWQgPSBhd2FpdCByZXBvLnJlYWQoXCIxXCIpO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG8gYXMgRmFicmljQ2xpZW50UmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gKiAgIEFwcC0+PlJlcG86IGNyZWF0ZShtb2RlbClcbiAqICAgUmVwby0+PlJlcG86IGNyZWF0ZVByZWZpeChtb2RlbCwgLi4uYXJncylcbiAqICAgUmVwby0+PkFkYXB0ZXI6IGNyZWF0ZSh0YWJsZSwgaWQsIG1vZGVsLCBmbGFncylcbiAqICAgQWRhcHRlci0tPj5SZXBvOiByZXN1bHRcbiAqICAgUmVwby0tPj5BcHA6IG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5PFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIEEgZXh0ZW5kcyBGYWJyaWNDbGllbnRBZGFwdGVyID0gRmFicmljQ2xpZW50QWRhcHRlcixcbj4gZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIEE+IHtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIF9vdmVycmlkZXMgPSBPYmplY3QuYXNzaWduKHt9LCBzdXBlcltcIl9vdmVycmlkZXNcIl0sIHtcbiAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgIGFsbG93UmF3U3RhdGVtZW50czogZmFsc2UsXG4gICAgZm9yY2VQcmVwYXJlU2ltcGxlUXVlcmllczogdHJ1ZSxcbiAgICBmb3JjZVByZXBhcmVDb21wbGV4UXVlcmllczogdHJ1ZSxcbiAgICBhbGxvd0dlbmVyYXRpb25PdmVycmlkZTogZmFsc2UsXG4gICAgcmVidWlsZFdpdGhUcmFuc2llbnQ6IGZhbHNlLFxuICB9KTtcblxuICBjb25zdHJ1Y3RvcihhZGFwdGVyPzogQSwgY2xheno/OiBDb25zdHJ1Y3RvcjxNPiwgZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIGNsYXp6LCBmb3JjZSk7XG4gIH1cblxuICBvdmVycmlkZSBvdmVycmlkZShmbGFnczogUGFydGlhbDxGbGFnc09mPENvbnRleHRPZjxBPj4+KTogdGhpcyB7XG4gICAgcmV0dXJuIHN1cGVyXG4gICAgICAub3ZlcnJpZGUoT2JqZWN0LmFzc2lnbih7fSwgZmxhZ3MsIHRoaXMuX292ZXJyaWRlcykpXG4gICAgICAuZm9yKGZsYWdzIGFzIGFueSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgT2JzZXJ2ZXJIYW5kbGVyKCk6IE9ic2VydmVySGFuZGxlciB7XG4gICAgcmV0dXJuIHN1cGVyLk9ic2VydmVySGFuZGxlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcGFnaW5hdGVCeShcbiAgICBrZXk6IGtleW9mIE0sXG4gICAgb3JkZXI6IE9yZGVyRGlyZWN0aW9uLFxuICAgIHJlZjogT21pdDxEaXJlY3Rpb25MaW1pdE9mZnNldCwgXCJkaXJlY3Rpb25cIj4gPSB7XG4gICAgICBvZmZzZXQ6IDEsXG4gICAgICBsaW1pdDogMTAsXG4gICAgfSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPFNlcmlhbGl6ZWRQYWdlPE0+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFX0JZLCB0cnVlKVxuICAgICkuZm9yKHRoaXMucGFnaW5hdGVCeSk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgcGFnaW5hdGluZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gd2l0aCBwYWdlIHNpemUgJHtyZWYubGltaXR9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFxuICAgICAgdGhpcy5wYWdpbmF0ZUJ5Lm5hbWUsXG4gICAgICBrZXksXG4gICAgICBvcmRlcixcbiAgICAgIHsgbGltaXQ6IHJlZi5saW1pdCwgb2Zmc2V0OiByZWYub2Zmc2V0LCBib29rbWFyazogcmVmLmJvb2ttYXJrIH0sXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGxpc3RCeShcbiAgICBrZXk6IGtleW9mIE0sXG4gICAgb3JkZXI6IE9yZGVyRGlyZWN0aW9uLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5MSVNUX0JZLCB0cnVlKVxuICAgICkuZm9yKHRoaXMubGlzdEJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBsaXN0aW5nICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBieSAke2tleSBhcyBzdHJpbmd9ICR7b3JkZXJ9YFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMubGlzdEJ5Lm5hbWUsXG4gICAgICBrZXksXG4gICAgICBvcmRlcixcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kQnkoXG4gICAga2V5OiBrZXlvZiBNLFxuICAgIHZhbHVlOiBhbnksXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5maW5kQnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgYWxsICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoICR7a2V5IGFzIHN0cmluZ30gJHt2YWx1ZX1gXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuc3RhdGVtZW50KFxuICAgICAgdGhpcy5maW5kQnkubmFtZSxcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICkpIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpbmRPbmVCeShcbiAgICBrZXk6IGtleW9mIE0sXG4gICAgdmFsdWU6IGFueSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZmluZE9uZUJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBmaW5kaW5nIE9uZSAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gd2l0aCAke2tleSBhcyBzdHJpbmd9ICR7dmFsdWV9YFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMuZmluZE9uZUJ5Lm5hbWUsXG4gICAgICBrZXksXG4gICAgICB2YWx1ZSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3JkZXI6IE9yZGVyRGlyZWN0aW9uID0gT3JkZXJEaXJlY3Rpb24uQVNDLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZmluZCk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgZGVmYXVsdCBxdWVyeSBhdHRyaWJ1dGVzYFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMuZmluZC5uYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBvcmRlcixcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBwYWdlKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgZGlyZWN0aW9uOiBPcmRlckRpcmVjdGlvbiA9IE9yZGVyRGlyZWN0aW9uLkFTQyxcbiAgICByZWY6IE9taXQ8RGlyZWN0aW9uTGltaXRPZmZzZXQsIFwiZGlyZWN0aW9uXCI+ID0ge1xuICAgICAgb2Zmc2V0OiAxLFxuICAgICAgbGltaXQ6IDEwLFxuICAgIH0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxTZXJpYWxpemVkUGFnZTxNPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLnBhZ2UpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYHBhZ2luZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgZGVmYXVsdCBxdWVyeSBhdHRyaWJ1dGVzYFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMucGFnZS5uYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBkaXJlY3Rpb24sXG4gICAgICByZWYsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgc3RhdGVtZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHgsIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFBlcnNpc3RlbmNlS2V5cy5TVEFURU1FTlQsIHRydWUpXG4gICAgKS5mb3IodGhpcy5zdGF0ZW1lbnQpO1xuICAgIGxvZy52ZXJib3NlKGBFeGVjdXRpbmcgcHJlcGFyZWQgc3RhdGVtZW50ICR7bmFtZX1gKTtcbiAgICBjb25zdCBjYWxsQXJncyA9IGN0eEFyZ3Muc2xpY2UoMCwgLTEpO1xuICAgIGNvbnN0IHJlc3VsdCA9IEpTT04ucGFyc2UoXG4gICAgICB0aGlzLmFkYXB0ZXIuZGVjb2RlKFxuICAgICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICBjdHgsXG4gICAgICAgICAgUGVyc2lzdGVuY2VLZXlzLlNUQVRFTUVOVCxcbiAgICAgICAgICBbbmFtZSwgSlNPTi5zdHJpbmdpZnkoY2FsbEFyZ3MpXSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHRoaXMuY2xhc3MubmFtZVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcblxuICAgIGxldCBoeWRyYXRlZDogYW55O1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgIGh5ZHJhdGVkID0gcmVzdWx0Lm1hcCgocjogYW55KSA9PlxuICAgICAgICAociBhcyBhbnkpW0NvdWNoREJLZXlzLlRBQkxFXSAmJlxuICAgICAgICAociBhcyBhbnkpW0NvdWNoREJLZXlzLlRBQkxFXSA9PT0gTW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpXG4gICAgICAgICAgPyAobmV3IHRoaXMuY2xhc3MocikgYXMgTSlcbiAgICAgICAgICA6IHJcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIChyZXN1bHQgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gJiZcbiAgICAgIChyZXN1bHQgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gPT09IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKVxuICAgICkge1xuICAgICAgaHlkcmF0ZWQgPSBuZXcgdGhpcy5jbGFzcyhyZXN1bHQpIGFzIE07XG4gICAgfSBlbHNlIGlmIChGYWJyaWNDbGllbnRQYWdpbmF0b3IuaXNTZXJpYWxpemVkUGFnZShyZXN1bHQpKSB7XG4gICAgICBoeWRyYXRlZCA9IE9iamVjdC5hc3NpZ24ocmVzdWx0LCB7XG4gICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhLm1hcCgoZDogYW55KSA9PiBuZXcgdGhpcy5jbGFzcyhkKSBhcyBNKSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBoeWRyYXRlZCA9IHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUFmdGVyUmVhZChoeWRyYXRlZCwgY3R4KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXBwbHlBZnRlclJlYWQodmFsdWU6IGFueSwgY3R4OiBDb250ZXh0T2Y8QT4pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghY3R4LmdldE9yVW5kZWZpbmVkKFwiYWZ0ZXJRdWVyeUhhbmRsZXJzXCIpKSByZXR1cm4gdmFsdWU7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTW9kZWwpIHtcbiAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgUmVwb3NpdG9yeTxNLCBBPiwgYW55PihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgY3R4LFxuICAgICAgICB2YWx1ZSBhcyBNLFxuICAgICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICAgIE9wZXJhdGlvbktleXMuQUZURVJcbiAgICAgICk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodmFsdWUubWFwKChlbnRyeSkgPT4gdGhpcy5hcHBseUFmdGVyUmVhZChlbnRyeSwgY3R4KSkpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoRmFicmljQ2xpZW50UGFnaW5hdG9yLmlzU2VyaWFsaXplZFBhZ2UodmFsdWUpKSB7XG4gICAgICBhd2FpdCB0aGlzLmFwcGx5QWZ0ZXJSZWFkKHZhbHVlLmRhdGEsIGN0eCk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNvdW50T2YoXG4gICAga2V5Pzoga2V5b2YgTSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5jb3VudE9mKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBjb3VudGluZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0ke2tleSA/IGAgYnkgJHtrZXkgYXMgc3RyaW5nfWAgOiBcIlwifWBcbiAgICApO1xuICAgIGNvbnN0IHN0bXRBcmdzID0ga2V5ID8gW2tleSwgLi4uY3R4QXJnc10gOiBjdHhBcmdzO1xuICAgIHJldHVybiB0aGlzLnN0YXRlbWVudChQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0YsIC4uLnN0bXRBcmdzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIG1heE9mPEsgZXh0ZW5kcyBrZXlvZiBNPihcbiAgICBrZXk6IEssXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW0tdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5tYXhPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyBtYXggb2YgJHtrZXkgYXMgc3RyaW5nfSBpbiAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1BWF9PRiwga2V5LCAuLi5jdHhBcmdzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIG1pbk9mPEsgZXh0ZW5kcyBrZXlvZiBNPihcbiAgICBrZXk6IEssXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW0tdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5taW5PZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyBtaW4gb2YgJHtrZXkgYXMgc3RyaW5nfSBpbiAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1JTl9PRiwga2V5LCAuLi5jdHhBcmdzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGF2Z09mPEsgZXh0ZW5kcyBrZXlvZiBNPihcbiAgICBrZXk6IEssXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRiwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmF2Z09mKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBjYWxjdWxhdGluZyBhdmcgb2YgJHtrZXkgYXMgc3RyaW5nfSBpbiAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRiwga2V5LCAuLi5jdHhBcmdzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHN1bU9mPEsgZXh0ZW5kcyBrZXlvZiBNPihcbiAgICBrZXk6IEssXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRiwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLnN1bU9mKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBjYWxjdWxhdGluZyBzdW0gb2YgJHtrZXkgYXMgc3RyaW5nfSBpbiAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRiwga2V5LCAuLi5jdHhBcmdzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGRpc3RpbmN0T2Y8SyBleHRlbmRzIGtleW9mIE0+KFxuICAgIGtleTogSyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bS11bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuRElTVElOQ1RfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5kaXN0aW5jdE9mKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBmaW5kaW5nIGRpc3RpbmN0IHZhbHVlcyBvZiAke2tleSBhcyBzdHJpbmd9IGluICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfWBcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnN0YXRlbWVudChQcmVwYXJlZFN0YXRlbWVudEtleXMuRElTVElOQ1RfT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBncm91cE9mPEsgZXh0ZW5kcyBrZXlvZiBNPihcbiAgICBrZXk6IEssXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBNW10+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5HUk9VUF9PRiwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmdyb3VwT2YpO1xuICAgIGxvZy52ZXJib3NlKGBncm91cGluZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgJHtrZXkgYXMgc3RyaW5nfWApO1xuICAgIHJldHVybiB0aGlzLnN0YXRlbWVudChQcmVwYXJlZFN0YXRlbWVudEtleXMuR1JPVVBfT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBhc3luYyBoZWFsdGhjaGVjayguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+Pikge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5oZWFsdGhjaGVjayk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuaGVhbHRoY2hlY2sodGhpcy5jbGFzcywgLi4uY3R4QXJncyk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlKFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IHsgY3R4LCBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuY3JlYXRlKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ3JlYXRpbmcgbmV3ICR7dGhpcy5jbGFzcy5uYW1lfSBpbiB0YWJsZSAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX1gXG4gICAgKTtcbiAgICB0aGlzLmVuc3VyZUxlZ2FjeU1pcnJvckZsYWcoY3R4LCBtb2RlbCk7XG4gICAgY29uc3QgcHJlcGFyZWQgPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgY3R4KTtcbiAgICBjb25zdCB7IHJlY29yZCwgaWQsIHRyYW5zaWVudCB9ID0gcHJlcGFyZWQ7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZShcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBpZCxcbiAgICAgIHJlY29yZCxcbiAgICAgIHRyYW5zaWVudCxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHJlc3VsdCwgdGhpcy5jbGFzcywgaWQsIHRyYW5zaWVudCwgY3R4KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCB7IGN0eEFyZ3MsIGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZSk7XG4gICAgdGhpcy5lbnN1cmVMZWdhY3lNaXJyb3JGbGFnKGN0eCwgbW9kZWwpO1xuICAgIGNvbnN0IHByZXBhcmVkID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIGN0eCk7XG4gICAgY29uc3QgeyBpZCwgdHJhbnNpZW50IH0gPSBwcmVwYXJlZDtcbiAgICBsZXQgcmVjb3JkID0gcHJlcGFyZWQucmVjb3JkO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGB1cGRhdGluZyAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IHdpdGggaWQgJHtpZH1gXG4gICAgKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIudXBkYXRlKFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGlkLFxuICAgICAgcmVjb3JkLFxuICAgICAgdHJhbnNpZW50LFxuICAgICAgLi4uY3R4QXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4ocmVjb3JkLCB0aGlzLmNsYXNzLCBpZCwgdHJhbnNpZW50LCBjdHgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbFByZWZpeChcbiAgICBtb2RlbHM6IE1bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPFtNW10sIC4uLmFueVtdLCBDb250ZXh0T2Y8QT5dPiB7XG4gICAgY29uc3QgeyBjdHgsIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIE9wZXJhdGlvbktleXMuQ1JFQVRFLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuY3JlYXRlQWxsUHJlZml4KTtcbiAgICBjb25zdCBpZ25vcmVIYW5kbGVycyA9IGN0eC5nZXQoXCJpZ25vcmVIYW5kbGVyc1wiKTtcbiAgICBjb25zdCBpZ25vcmVWYWxpZGF0ZSA9IGN0eC5nZXQoXCJpZ25vcmVWYWxpZGF0aW9uXCIpO1xuICAgIGlmICghbW9kZWxzLmxlbmd0aCkgcmV0dXJuIFttb2RlbHMsIC4uLmN0eEFyZ3NdIGFzIGFueTtcblxuICAgIG1vZGVscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIGlmICghaWdub3JlSGFuZGxlcnMpXG4gICAgICAgICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9yczxNLCBSZXBvc2l0b3J5PE0sIEE+LCBhbnk+KFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIGN0eCxcbiAgICAgICAgICAgIG0sXG4gICAgICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGlmICghaWdub3JlVmFsaWRhdGUpIHtcbiAgICAgIGNvbnN0IGlnbm9yZWRQcm9wcyA9IGN0eC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW107XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBtb2RlbHMubWFwKChtKSA9PiBQcm9taXNlLnJlc29sdmUobS5oYXNFcnJvcnMoLi4uaWdub3JlZFByb3BzKSkpXG4gICAgICApO1xuXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2VzID0gcmVkdWNlRXJyb3JzVG9QcmludChlcnJvcnMpO1xuXG4gICAgICBpZiAoZXJyb3JNZXNzYWdlcykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvck1lc3NhZ2VzKTtcbiAgICB9XG4gICAgcmV0dXJuIFttb2RlbHMsIC4uLmN0eEFyZ3NdIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbChcbiAgICBtb2RlbHM6IE1bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGlmICghbW9kZWxzLmxlbmd0aCkgcmV0dXJuIG1vZGVscztcbiAgICBjb25zdCB7IGN0eCwgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZUFsbCk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENyZWF0aW5nICR7bW9kZWxzLmxlbmd0aH0gbmV3ICR7dGhpcy5jbGFzcy5uYW1lfSBpbiB0YWJsZSAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX1gXG4gICAgKTtcblxuICAgIG1vZGVscy5mb3JFYWNoKChtb2RlbCkgPT4gdGhpcy5lbnN1cmVMZWdhY3lNaXJyb3JGbGFnKGN0eCwgbW9kZWwpKTtcbiAgICBjb25zdCBwcmVwYXJlZCA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIGN0eCkpO1xuICAgIGNvbnN0IGlkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5pZCk7XG4gICAgY29uc3QgcGF5bG9hZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAucmVjb3JkKTtcbiAgICBjb25zdCB0cmFuc2llbnRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLnRyYW5zaWVudCk7XG4gICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGVBbGwoXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgaWRzIGFzIFByaW1hcnlLZXlUeXBlW10sXG4gICAgICBwYXlsb2FkcyxcbiAgICAgIHRyYW5zaWVudHMsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBjcmVhdGVkLm1hcChhc3luYyAociwgaSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IGlkc1tpXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4ociwgdGhpcy5jbGFzcywgaWQsIHRyYW5zaWVudHNbaV0sIGN0eCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyByZWFkQWxsKFxuICAgIGtleXM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKSB7XG4gICAgY29uc3QgeyBjdHgsIGxvZywgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkQWxsKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgcmVhZGluZyAke2tleXMubGVuZ3RofSAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkQWxsKHRoaXMuY2xhc3MsIGtleXMsIC4uLmN0eEFyZ3MpO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywga2V5c1tpXSwge30sIGN0eClcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKFxuICAgIG1vZGVsczogTVtdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgeyBjdHgsIGxvZywgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGVBbGwpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBVcGRhdGluZyAke21vZGVscy5sZW5ndGh9IG5ldyAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG5cbiAgICBtb2RlbHMuZm9yRWFjaCgobW9kZWwpID0+IHRoaXMuZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHgsIG1vZGVsKSk7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCBjdHgpKTtcbiAgICBjb25zdCBpZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAuaWQpO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIudXBkYXRlQWxsKFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGlkcyBhcyBQcmltYXJ5S2V5VHlwZVtdLFxuICAgICAgcHJlcGFyZWQubWFwKChyKSA9PiByLnJlY29yZCksXG4gICAgICBwcmVwYXJlZC5tYXAoKHIpID0+IHIudHJhbnNpZW50KSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIHVwZGF0ZWQubWFwKGFzeW5jICh1LCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gaWRzW2ldO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihcbiAgICAgICAgICB1LFxuICAgICAgICAgIHRoaXMuY2xhc3MsXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgcHJlcGFyZWRbaV0udHJhbnNpZW50LFxuICAgICAgICAgIGN0eFxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVMZWdhY3lNaXJyb3JGbGFnKGN0eDogQ29udGV4dE9mPEE+LCBtb2RlbDogTSk6IHZvaWQge1xuICAgIGlmIChNb2RlbC5taXJyb3JlZEF0KG1vZGVsKSkge1xuICAgICAgY3R4LmFjY3VtdWxhdGUoeyBsZWdhY3k6IHRydWUgfSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWwsIGNvbHVtbiwgcGssIHRhYmxlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgdHlwZSBNb2RlbEFyZywgcmVxdWlyZWQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVSQzIwIHRva2VuIG1ldGFkYXRhIG1vZGVsXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFuIEVSQzIwIHRva2VuIGRlZmluaXRpb24gd2l0aGluIHRoZSBGYWJyaWMgRVJDMjAgc2FtcGxlLCBpbmNsdWRpbmcgbmFtZSwgc3ltYm9sLCBkZWNpbWFscywgYW5kIHRoZSBvd25pbmcgaWRlbnRpdHkuIFVzZWQgdG8gZGVmaW5lIHRoZSB1bmlxdWUgdG9rZW4gbWFuYWdlZCBieSB0aGUgY29udHJhY3QuXG4gKiBAcGFyYW0ge01vZGVsQXJnPEVSQzIwVG9rZW4+fSBbbV0gLSBPcHRpb25hbCBwYXJ0aWFsIGRhdGEgb3IgYW5vdGhlciBpbnN0YW5jZSB0byBpbml0aWFsaXplIHRoZSBtb2RlbFxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBFUkMyMFRva2VuXG4gKiBAZXhhbXBsZVxuICogY29uc3QgdG9rZW4gPSBuZXcgRVJDMjBUb2tlbih7IG5hbWU6IFwiTXlUb2tlblwiLCBzeW1ib2w6IFwiTVRLXCIsIGRlY2ltYWxzOiAxOCwgb3duZXI6IFwieDUwOTo6Li4uXCIgfSk7XG4gKiAvLyBQZXJzaXN0IHRocm91Z2ggYSByZXBvc2l0b3J5OiBhd2FpdCByZXBvLmNyZWF0ZSh0b2tlbiwgY3R4KVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgUmVwb1xuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gKiAgIEFwcC0+PlJlcG86IGNyZWF0ZShuZXcgRVJDMjBUb2tlbih7Li4ufSksIGN0eClcbiAqICAgUmVwby0+PkFkYXB0ZXI6IGNyZWF0ZSh0YWJsZSwgaWQ9bmFtZSwgcmVjb3JkLCBmbGFncylcbiAqICAgQWRhcHRlci0tPj5SZXBvOiBzdG9yZWRcbiAqICAgUmVwby0tPj5BcHA6IG1vZGVsXG4gKi9cbkB0YWJsZShcImVyYzIwX3Rva2Vuc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBFUkMyMFRva2VuIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVG9rZW4gdW5pcXVlIG5hbWVcbiAgICogQHN1bW1hcnkgU2VydmVzIGFzIHRoZSBwcmltYXJ5IGtleSBmb3IgdGhlIEVSQzIwIHRva2VuIGRlZmluaXRpb247IHR5cGljYWxseSBhIGh1bWFuLXJlYWRhYmxlIGlkZW50aWZpZXJcbiAgICovXG4gIG5hbWUhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gT3duaW5nIGlkZW50aXR5IG9mIHRoZSB0b2tlblxuICAgKiBAc3VtbWFyeSBYLjUwOSBzdWJqZWN0IG9yIE1TUCBpZGVudGl0eSBzdHJpbmcgdGhhdCBkZW5vdGVzIHdobyBvd25zL2NvbnRyb2xzIHRoZSB0b2tlbiBkZWZpbml0aW9uXG4gICAqL1xuICBvd25lciE6IHN0cmluZztcbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVG9rZW4gc3ltYm9sXG4gICAqIEBzdW1tYXJ5IFNob3J0IHRpY2tlci1saWtlIHN5bWJvbCB1c2VkIHRvIHJlcHJlc2VudCB0aGUgdG9rZW4gKGUuZy4sIE1USylcbiAgICovXG4gIHN5bWJvbCE6IHN0cmluZztcbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVjaW1hbCBwcmVjaXNpb24gZm9yIHRva2VuIGFtb3VudHNcbiAgICogQHN1bW1hcnkgTnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBzZXBhcmF0b3IgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdG9rZW4gYmFsYW5jZXNcbiAgICovXG4gIGRlY2ltYWxzITogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKG0/OiBNb2RlbEFyZzxFUkMyMFdhbGxldD4pIHtcbiAgICBzdXBlcihtKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFUkMyMCB3YWxsZXQgbW9kZWxcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBob2xkZXIgYWNjb3VudCBmb3IgYW4gRVJDMjAgdG9rZW4gd2l0aGluIHRoZSBGYWJyaWMgbmV0d29yaywgdHJhY2tpbmcgYmFsYW5jZSBhbmQgdG9rZW4gYXNzb2NpYXRpb24uXG4gKiBAcGFyYW0ge01vZGVsQXJnPEVSQzIwV2FsbGV0Pn0gW21dIC0gT3B0aW9uYWwgcGFydGlhbCBkYXRhIG9yIGFub3RoZXIgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kZWxcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgRVJDMjBXYWxsZXRcbiAqIEBleGFtcGxlXG4gKiBjb25zdCB3YWxsZXQgPSBuZXcgRVJDMjBXYWxsZXQoeyBpZDogXCJhY2N0MVwiLCB0b2tlbjogXCJNeVRva2VuXCIsIGJhbGFuY2U6IDEwMDAgfSk7XG4gKiAvLyBVcGRhdGUgYmFsYW5jZSB2aWEgcmVwb3NpdG9yeTogYXdhaXQgcmVwby51cGRhdGUod2FsbGV0LCBjdHgpXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBSZXBvXG4gKiAgIEFwcC0+PlJlcG86IHJlYWQoXCJhY2N0MVwiLCBjdHgpXG4gKiAgIFJlcG8tLT4+QXBwOiBFUkMyMFdhbGxldFxuICovXG5AdGFibGUoXCJlcmMyMF93YWxsZXRzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEVSQzIwV2FsbGV0IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gV2FsbGV0IHVuaXF1ZSBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFByaW1hcnkga2V5IGZvciB0aGUgd2FsbGV0OyBjb21tb25seSByZWZlcmVuY2VzIGFuIGFjY291bnQgb3IgaWRlbnRpdHlcbiAgICovXG4gIGlkITogc3RyaW5nO1xuXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFzc29jaWF0ZWQgdG9rZW4gbmFtZVxuICAgKiBAc3VtbWFyeSBSZWZlcmVuY2VzIHRoZSBFUkMyMFRva2VuIHRoaXMgd2FsbGV0IGhvbGRzOyBtYWludGFpbmVkIGFzIGEgcmVsYXRpb25zaGlwIGZvciBjYXNjYWRpbmcgdXBkYXRlcy9kZWxldGVzXG4gICAqL1xuICB0b2tlbiE6IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUb2tlbiBiYWxhbmNlIGZvciB0aGlzIHdhbGxldFxuICAgKiBAc3VtbWFyeSBDdXJyZW50IGFtb3VudCBvZiB0aGUgYXNzb2NpYXRlZCB0b2tlbiBoZWxkIGJ5IHRoaXMgd2FsbGV0XG4gICAqL1xuICBiYWxhbmNlITogbnVtYmVyO1xuXG4gIEBjb2x1bW4oKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENhcHRpdmUgZmxhZyBvciBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IE9wdGlvbmFsIGZpZWxkIHVzZWQgYnkgc29tZSBmbG93cyB0byBtYXJrIG5vbi10cmFuc2ZlcmFibGUgZnVuZHMgb3IgbWFuYWdlZCBjdXN0b2R5XG4gICAqL1xuICBjYXB0aXZlITogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG0/OiBNb2RlbEFyZzxFUkMyMFdhbGxldD4pIHtcbiAgICBzdXBlcihtKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFUkMyMCBhbGxvd2FuY2UgbW9kZWxcbiAqIEBzdW1tYXJ5IENhcHR1cmVzIGFuIGFwcHJvdmFsIHJlbGF0aW9uc2hpcCB3aGVyZSBhbiBvd25lciBhbGxvd3MgYSBzcGVuZGVyIHRvIHRyYW5zZmVyIHVwIHRvIGEgY2VydGFpbiB2YWx1ZSBmcm9tIHRoZSBvd25lcidzIHdhbGxldC5cbiAqIEBwYXJhbSB7TW9kZWxBcmc8QWxsb3dhbmNlPn0gW21dIC0gT3B0aW9uYWwgcGFydGlhbCBkYXRhIG9yIGFub3RoZXIgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kZWxcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgQWxsb3dhbmNlXG4gKiBAZXhhbXBsZVxuICogY29uc3QgYWxsb3dhbmNlID0gbmV3IEFsbG93YW5jZSh7IG93bmVyOiBcImFjY3QxXCIsIHNwZW5kZXI6IFwiYWNjdDJcIiwgdmFsdWU6IDUwIH0pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgQXBwLT4+QXBwOiBuZXcgQWxsb3dhbmNlKHsgb3duZXIsIHNwZW5kZXIsIHZhbHVlIH0pXG4gKi9cbkB0YWJsZShcImVyYzIwX2FsbG93YW5jZXNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgQWxsb3dhbmNlIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWxsb3dhbmNlIHVuaXF1ZSBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFByaW1hcnkga2V5IGZvciB0aGUgYWxsb3dhbmNlOyB0eXBpY2FsbHkgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFwcHJvdmFsIHJlbGF0aW9uc2hpcFxuICAgKi9cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gT3duZXIgd2FsbGV0IGlkZW50aWZpZXJcbiAgICogQHN1bW1hcnkgV2FsbGV0IHRoYXQgYXV0aG9yaXplcyB0aGUgYWxsb3dhbmNlXG4gICAqL1xuICBvd25lciE6IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTcGVuZGVyIHdhbGxldCBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFdhbGxldCBhbGxvd2VkIHRvIHNwZW5kIHVwIHRvIHRoZSBhcHByb3ZlZCB2YWx1ZSBmcm9tIHRoZSBvd25lclxuICAgKi9cbiAgc3BlbmRlciE6IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHByb3ZlZCB2YWx1ZVxuICAgKiBAc3VtbWFyeSBNYXhpbXVtIHRva2VuIGFtb3VudCB0aGUgc3BlbmRlciBtYXkgdHJhbnNmZXIgb24gYmVoYWxmIG9mIHRoZSBvd25lclxuICAgKi9cbiAgdmFsdWUhOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IobT86IE1vZGVsQXJnPEFsbG93YW5jZT4pIHtcbiAgICBzdXBlcihtKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgSlNPTlNlcmlhbGl6ZXIsXG4gIE1vZGVsLFxuICBNb2RlbEtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENsaWVudC1zaWRlIEpTT04gc2VyaWFsaXplciBmb3IgRGVjYWYgbW9kZWxzIHRhcmdldGluZyBIeXBlcmxlZGdlciBGYWJyaWNcbiAqIEBzdW1tYXJ5IEV4dGVuZHMgdGhlIGJhc2UgSlNPTlNlcmlhbGl6ZXIgdG8gZW1iZWQgbW9kZWwgbWV0YWRhdGEgKGFuY2hvcikgcmVxdWlyZWQgdG8gcmVjb25zdHJ1Y3QgaW5zdGFuY2VzIG9uIHRoZSBjbGllbnQsIGFuZCB0byBzYWZlbHkgc2VyaWFsaXplL2Rlc2VyaWFsaXplIEZhYnJpYy1ib3VuZCBtb2RlbHMuXG4gKiBAdGVtcGxhdGUgTSBleHRlbmRzIE1vZGVsIC0gVGhlIERlY2FmIG1vZGVsIHR5cGUgaGFuZGxlZCBieSB0aGlzIHNlcmlhbGl6ZXJcbiAqIEBwYXJhbSB7dm9pZH0gW2NvbnN0cnVjdG9yXSBObyBwdWJsaWMgY29uc3RydWN0b3IgYXJndW1lbnRzOyBwcm92aWRlZCBmb3IgZG9jdW1lbnRhdGlvbiBjb21wbGV0ZW5lc3NcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgQ2xpZW50U2VyaWFsaXplclxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgQ2xpZW50U2VyaWFsaXplcjxVc2VyPigpO1xuICogY29uc3QganNvbiA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKG5ldyBVc2VyKHsgaWQ6IFwiMVwiLCBuYW1lOiBcIkFsaWNlXCIgfSkpO1xuICogY29uc3QgdXNlciA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoanNvbik7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBTZXJpYWxpemVyIGFzIENsaWVudFNlcmlhbGl6ZXJcbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgQXBwLT4+U2VyaWFsaXplcjogc2VyaWFsaXplKG1vZGVsKVxuICogICBTZXJpYWxpemVyLT4+U2VyaWFsaXplcjogcHJlU2VyaWFsaXplKG1vZGVsKVxuICogICBTZXJpYWxpemVyLS0+PkFwcDogSlNPTiBzdHJpbmdcbiAqICAgQXBwLT4+U2VyaWFsaXplcjogZGVzZXJpYWxpemUoanNvbilcbiAqICAgU2VyaWFsaXplci0+PlNlcmlhbGl6ZXI6IEpTT04ucGFyc2UoanNvbilcbiAqICAgU2VyaWFsaXplci0+Pk1vZGVsOiBNb2RlbC5idWlsZChwYXJzZWQsIGFuY2hvcilcbiAqICAgTW9kZWwtLT4+QXBwOiBpbnN0YW5jZVxuICovXG5leHBvcnQgY2xhc3MgQ2xpZW50U2VyaWFsaXplcjxNIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZSBhIG1vZGVsIGZvciBKU09OIHNlcmlhbGl6YXRpb24gZW1iZWRkaW5nIGNsYXNzIGFuY2hvclxuICAgKiBAc3VtbWFyeSBDbG9uZXMgdGhlIG1vZGVsIGFuZCBpbmplY3RzIHRoZSBjbGFzcyBtZXRhZGF0YSBhbmNob3Igc28gaXQgY2FuIGJlIHJlY29uc3RydWN0ZWQgZHVyaW5nIGRlc2VyaWFsaXphdGlvbi4gRmFsbHMgYmFjayB0byBwcm92aWRlZCB0YWJsZSBuYW1lIGlmIG1ldGFkYXRhIGlzIG5vdCBhdmFpbGFibGUuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gTW9kZWwgdHlwZSBoYW5kbGVkIGJ5IHRoaXMgc2VyaWFsaXplclxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHNlcmlhbGl6ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW21vZGVsTmFtZV0gLSBPcHRpb25hbCB0YWJsZSBuYW1lIHRvIHVzZSB3aGVuIG1ldGFkYXRhIGNhbm5vdCBiZSBkZXJpdmVkXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIGFueT59IEEgcGxhaW4gb2JqZWN0IHJlYWR5IHRvIGJlIEpTT04uc3RyaW5naWZ5J2RcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0sIG1vZGVsTmFtZT86IHN0cmluZykge1xuICAgIC8vIFRPRE86IG5lc3RlZCBwcmVzZXJpYWxpemF0aW9uIChzbyBpbmNyZWFzZSBwZXJmb3JtYW5jZSB3aGVuIGRlc2VyaWFsaXppbmcpXG4gICAgY29uc3QgdG9TZXJpYWxpemU6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCk7XG4gICAgbGV0IG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KTtcblxuICAgIGlmICghbWV0YWRhdGEgfHwgbWV0YWRhdGEgPT09IFwiT2JqZWN0XCIpXG4gICAgICBpZiAobW9kZWxOYW1lKSBtZXRhZGF0YSA9IG1vZGVsTmFtZTtcbiAgICAgIGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGZpbmQgbWV0YWRhdGEgZm9yICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgICAgICk7XG4gICAgdG9TZXJpYWxpemVbTW9kZWxLZXlzLkFOQ0hPUl0gPSBtZXRhZGF0YTtcbiAgICByZXR1cm4gdG9TZXJpYWxpemU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYnVpbGRzIGEgbW9kZWwgZnJvbSBpdHMgSlNPTiBzZXJpYWxpemF0aW9uXG4gICAqIEBzdW1tYXJ5IFBhcnNlcyB0aGUgSlNPTiBzdHJpbmcsIHJldHJpZXZlcyB0aGUgZW1iZWRkZWQgbW9kZWwgYW5jaG9yLCBhbmQgdXNlcyBNb2RlbC5idWlsZCB0byByZWNvbnN0cnVjdCB0aGUgb3JpZ2luYWwgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFRoZSBKU09OIHN0cmluZyBwcmV2aW91c2x5IHByb2R1Y2VkIGJ5IHNlcmlhbGl6ZVxuICAgKiBAcmV0dXJuIHtNfSBUaGUgcmVjb25zdHJ1Y3RlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgb3ZlcnJpZGUgZGVzZXJpYWxpemUoc3RyOiBzdHJpbmcpOiBNIHtcbiAgICBjb25zdCBkZXNlcmlhbGl6YXRpb24gPSBKU09OLnBhcnNlKHN0cik7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gZGVzZXJpYWxpemF0aW9uW01vZGVsS2V5cy5BTkNIT1JdO1xuICAgIGlmICghY2xhc3NOYW1lKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgY2xhc3MgcmVmZXJlbmNlIGluIHNlcmlhbGl6ZWQgbW9kZWxcIik7XG4gICAgY29uc3QgbW9kZWw6IE0gPSBNb2RlbC5idWlsZChkZXNlcmlhbGl6YXRpb24sIGNsYXNzTmFtZSkgYXMgdW5rbm93biBhcyBNO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2VyaWFsaXplcyBhIG1vZGVsIHRvIGEgSlNPTiBzdHJpbmdcbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIG1vZGVsIHZpYSBwcmVTZXJpYWxpemUsIGVtYmVkZGluZyBtZXRhZGF0YSBuZWVkZWQgZm9yIHJlY29uc3RydWN0aW9uLCBhbmQgcmV0dXJucyBhIEpTT04gc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gc2VyaWFsaXplXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFibGVdIC0gT3B0aW9uYWwgdGFibGUgbmFtZSB0byBpbmNsdWRlIGFzIGFuY2hvciB3aGVuIG1ldGFkYXRhIGlzIHVuYXZhaWxhYmxlXG4gICAqIEByZXR1cm4ge3N0cmluZ30gQSBKU09OIHN0cmluZyBjb250YWluaW5nIHRoZSBzZXJpYWxpemVkIG1vZGVsIHdpdGggYW5jaG9yIG1ldGFkYXRhXG4gICAqL1xuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0sIG1vZGVsTmFtZT86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMucHJlU2VyaWFsaXplKG1vZGVsLCBtb2RlbE5hbWUpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRmFicmljQ2xpZW50UmVwb3NpdG9yeSB9IGZyb20gXCIuLi9GYWJyaWNDbGllbnRSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBFUkMyMFRva2VuLCBFUkMyMFdhbGxldCB9IGZyb20gXCIuLi8uLi9jb250cmFjdHMvZXJjMjAvbW9kZWxzXCI7XG5pbXBvcnQgeyBNb2RlbCwgU2VyaWFsaXplciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHsgQ2xpZW50U2VyaWFsaXplciB9IGZyb20gXCIuLi8uLi9zaGFyZWQvQ2xpZW50U2VyaWFsaXplclwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgQ29udGV4dE9mLFxuICBDb250ZXh0dWFsQXJncyxcbiAgRXZlbnRJZHMsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgU2VxdWVuY2UsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG4vKipcbiAqIFJlcG9zaXRvcnkgZm9yIGludGVyYWN0aW5nIHdpdGggRVJDMjAgY29udHJhY3RzIG9uIGEgSHlwZXJsZWRnZXIgRmFicmljIG5ldHdvcmsuXG4gKiBFeHRlbmRzIHRoZSBiYXNlIEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgY2xhc3MgYW5kIHV0aWxpemVzIHRoZSBDbGllbnRTZXJpYWxpemVyIGZvciBkYXRhIHNlcmlhbGl6YXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnk8XG4gIEEgZXh0ZW5kcyBGYWJyaWNDbGllbnRBZGFwdGVyLFxuPiBleHRlbmRzIEZhYnJpY0NsaWVudFJlcG9zaXRvcnk8RVJDMjBXYWxsZXQsIEE+IHtcbiAgcHJpdmF0ZSBzdGF0aWMgc2VyaWFsaXplciA9IG5ldyBDbGllbnRTZXJpYWxpemVyKCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXI8YW55PiA9XG4gICAgRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LnNlcmlhbGl6ZXI7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIG9mIGFuIGV2ZW50LlxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIGFsbCByZWdpc3RlcmVkIG9ic2VydmVycyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGEgZGF0YWJhc2UgZXZlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSB0YWJsZSBuYW1lIHdoZXJlIHRoZSBldmVudCBvY2N1cnJlZC5cbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2YgZXZlbnQgdGhhdCBvY2N1cnJlZC5cbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgSUQgb3IgSURzIG9mIHRoZSBhZmZlY3RlZCByZWNvcmRzLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWQuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBvYnNlcnZlciBoYW5kbGVyIGlzIG5vdCBpbml0aWFsaXplZC5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZU9ic2VydmVyczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhYmxlOiBDb25zdHJ1Y3RvcjxNPiB8IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiT2JzZXJ2ZXJIYW5kbGVyIG5vdCBpbml0aWFsaXplZC4gRGlkIHlvdSByZWdpc3RlciBhbnkgb2JzZXJ2YWJsZXM/XCJcbiAgICAgICk7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBVcGRhdGluZyAke3RoaXMub2JzZXJ2ZXJIYW5kbGVyLmNvdW50KCl9IG9ic2VydmVycyBmb3IgJHt0aGlzfWBcbiAgICApO1xuXG4gICAgdGFibGUgPSAoXG4gICAgICB0eXBlb2YgdGFibGUgPT09IFwic3RyaW5nXCIgPyBNb2RlbC5nZXQodGFibGUpIDogdGFibGVcbiAgICApIGFzIENvbnN0cnVjdG9yPE0+O1xuICAgIGxldCBwYXJzZWRJZDogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyc2VkSWQgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlkKSkge1xuICAgICAgcGFyc2VkSWQgPSBpZC5tYXAoXG4gICAgICAgIChpKSA9PiBTZXF1ZW5jZS5wYXJzZVZhbHVlKE1vZGVsLnNlcXVlbmNlRm9yKHRhYmxlKS50eXBlLCBpKSBhcyBzdHJpbmdcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnNlZElkID0gU2VxdWVuY2UucGFyc2VWYWx1ZShcbiAgICAgICAgTW9kZWwuc2VxdWVuY2VGb3IodGFibGUpLnR5cGUsXG4gICAgICAgIGlkXG4gICAgICApIGFzIHN0cmluZztcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5vYnNlcnZlckhhbmRsZXIudXBkYXRlT2JzZXJ2ZXJzKFxuICAgICAgdGFibGUsXG4gICAgICBldmVudCxcbiAgICAgIHBhcnNlZElkISxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgYSBVaW50OEFycmF5IGludG8gYSBzdHJpbmcgdXNpbmcgdGhlIFRleHREZWNvZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBVaW50OEFycmF5IHRvIGRlY29kZS5cbiAgICogQHJldHVybnMgVGhlIGRlY29kZWQgc3RyaW5nLlxuICAgKi9cbiAgZGVjb2RlKGRhdGE6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIHJldHVybiBGYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnkuZGVjb2Rlci5kZWNvZGUoZGF0YSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihhZGFwdGVyPzogQSkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIEVSQzIwV2FsbGV0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWUgb2YgdGhlIEVSQzIwIHRva2VuLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBuYW1lIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiVG9rZW5OYW1lXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IGFuZCBkZWNvZGVzIHRoZSByZXR1cm5lZCBkYXRhLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBuYW1lIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHRva2VuTmFtZSguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+Pik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInRva2VuTmFtZVwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy50b2tlbk5hbWVcbiAgICApO1xuICAgIGNvbnN0IG5hbWUgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihjdHgsIFwiVG9rZW5OYW1lXCIpO1xuICAgIHJldHVybiB0aGlzLmRlY29kZShuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHN5bWJvbCBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgc3ltYm9sIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiU3ltYm9sXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IGFuZCBkZWNvZGVzIHRoZSByZXR1cm5lZCBkYXRhLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBzeW1ib2wgb2YgdGhlIEVSQzIwIHRva2VuLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgc3ltYm9sKC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwic3ltYm9sXCIsIHRydWUpKS5mb3IodGhpcy5zeW1ib2wpO1xuICAgIGNvbnN0IHN5bWJvbCA9IGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKGN0eCwgXCJTeW1ib2xcIik7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKHN5bWJvbCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgZm9yIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgZm9yIHRoZSBFUkMyMCB0b2tlbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiRGVjaW1hbHNcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QgYW5kIGRlY29kZXMgdGhlIHJldHVybmVkIGRhdGEuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyBmb3IgdGhlIEVSQzIwIHRva2VuLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgZGVjaW1hbHMoLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj4pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJkZWNpbWFsc1wiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5kZWNpbWFsc1xuICAgICk7XG4gICAgY29uc3QgZGVjaW1hbHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihjdHgsIFwiRGVjaW1hbHNcIik7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmRlY29kZShkZWNpbWFscykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgdG90YWwgc3VwcGx5IG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSB0b3RhbCBzdXBwbHkgb2YgdGhlIEVSQzIwIHRva2VuLlxuICAgKiBJdCBjYWxscyB0aGUgXCJUb3RhbFN1cHBseVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCBhbmQgZGVjb2RlcyB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdG90YWwgc3VwcGx5IG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHRvdGFsU3VwcGx5KFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInRvdGFsU3VwcGx5XCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLnRvdGFsU3VwcGx5XG4gICAgKTtcbiAgICBjb25zdCB0b3RhbCA9IGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKGN0eCwgXCJUb3RhbFN1cHBseVwiKTtcbiAgICByZXR1cm4gTnVtYmVyKHRoaXMuZGVjb2RlKHRvdGFsKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBiYWxhbmNlIG9mIHRoZSBFUkMyMCB0b2tlbiBmb3IgYSBzcGVjaWZpZWQgb3duZXIuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gZmV0Y2ggdGhlIGJhbGFuY2Ugb2YgdGhlIEVSQzIwIHRva2VuIGZvciBhIGdpdmVuIG93bmVyLlxuICAgKiBJdCBjYWxscyB0aGUgXCJCYWxhbmNlT2ZcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgcHJvdmlkZWQgb3duZXIncyBhZGRyZXNzIGFzIGEgcGFyYW1ldGVyLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNvbnZlcnRlZCB0byBhIG51bWJlci5cbiAgICpcbiAgICogQHBhcmFtIG93bmVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIEVSQzIwIHRva2VuIG93bmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBiYWxhbmNlIG9mIHRoZSBFUkMyMCB0b2tlbiBmb3IgdGhlIHNwZWNpZmllZCBvd25lci5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIGJhbGFuY2VPZihcbiAgICBvd25lcjogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcImJhbGFuY2VcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMuYmFsYW5jZU9mXG4gICAgKTtcbiAgICBjb25zdCBiYWxhbmNlID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oY3R4LCBcIkJhbGFuY2VPZlwiLCBbXG4gICAgICBvd25lcixcbiAgICBdKTtcbiAgICByZXR1cm4gTnVtYmVyKHRoaXMuZGVjb2RlKGJhbGFuY2UpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2ZlcnMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBhIHJlY2lwaWVudC5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byB0cmFuc2ZlciBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIGEgcmVjaXBpZW50LlxuICAgKiBJdCBjYWxscyB0aGUgXCJUcmFuc2ZlclwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSByZWNpcGllbnQncyBhZGRyZXNzIGFuZCB0aGUgdHJhbnNmZXIgYW1vdW50IGFzIHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY2hlY2tlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gdG8gLSBUaGUgYWRkcmVzcyBvZiB0aGUgcmVjaXBpZW50LlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byB0cmFuc2Zlci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYHRydWVgIGlmIHRoZSB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bCwgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgdHJhbnNmZXIoXG4gICAgdG86IHN0cmluZyxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJ0cmFuc2ZlclwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy50cmFuc2ZlclxuICAgICk7XG4gICAgY29uc3QgdHJhbnNmZXJyZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIlRyYW5zZmVyXCIsIFtcbiAgICAgIHRvLFxuICAgICAgdmFsdWUudG9TdHJpbmcoKSxcbiAgICBdKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvZGUodHJhbnNmZXJyZWQpID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2ZlcnMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyBmcm9tIG9uZSBhY2NvdW50IHRvIGFub3RoZXIuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gdHJhbnNmZXIgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyBmcm9tIG9uZSBhY2NvdW50IHRvIGFub3RoZXIuXG4gICAqIEZvciB0aGlzIHRyYW5zZmVyIHRvIHdvcmsgdGhlIHNwZW5kZXIgKCBhY2NvdW50IHRoYXQgd2lsbCB0cmlnZ2VyIHRoaXMgZnVuY3Rpb24gKSBuZWVkIHRvIGhhdmUgdGhlIHZhbHVlIGFwcHJvdmVkIGFzIGFuIGFsbG93YW5jZSBieSB0aGUgc2VuZGVyLlxuICAgKiBJdCBjYWxscyB0aGUgXCJUcmFuc2ZlckZyb21cIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgc2VuZGVyJ3MgYWRkcmVzcywgcmVjaXBpZW50J3MgYWRkcmVzcywgYW5kIHRoZSB0cmFuc2ZlciBhbW91bnQgYXMgcGFyYW1ldGVycy5cbiAgICogVGhlIHJldHVybmVkIGRhdGEgaXMgdGhlbiBkZWNvZGVkIGFuZCBjaGVja2VkIHRvIGRldGVybWluZSBpZiB0aGUgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWwuXG4gICAqXG4gICAqIEBwYXJhbSBmcm9tIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHNlbmRlci5cbiAgICogQHBhcmFtIHRvIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gdHJhbnNmZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWwsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyRnJvbShcbiAgICBmcm9tOiBzdHJpbmcsXG4gICAgdG86IHN0cmluZyxcbiAgICB2YWx1ZTogbnVtYmVyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJ0cmFuc2ZlckZyb21cIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMudHJhbnNmZXJGcm9tKTtcbiAgICBjb25zdCB0cmFuc2ZlcnJlZCA9IGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIFwiVHJhbnNmZXJGcm9tXCIsXG4gICAgICBbZnJvbSwgdG8sIHZhbHVlLnRvU3RyaW5nKCldXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLmRlY29kZSh0cmFuc2ZlcnJlZCkgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcHJvdmVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYmUgc3BlbnQgYnkgYSBzcGVjaWZpZWQgc3BlbmRlci5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGFwcHJvdmUgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBiZSBzcGVudCBieSBhIHNwZWNpZmllZCBzcGVuZGVyLlxuICAgKiBJdCBjYWxscyB0aGUgXCJBcHByb3ZlXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIHNwZW5kZXIncyBhZGRyZXNzIGFuZCB0aGUgYXBwcm92YWwgYW1vdW50IGFzIHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY2hlY2tlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGFwcHJvdmFsIHdhcyBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gc3BlbmRlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzcGVuZGVyLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBhcHByb3ZlIGZvciB0aGUgc3BlbmRlci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYHRydWVgIGlmIHRoZSBhcHByb3ZhbCB3YXMgc3VjY2Vzc2Z1bCwgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgYXBwcm92ZShzcGVuZGVyOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYXBwcm92ZVwiLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoY29udGV4dEFyZ3MuYXJncywgdGhpcy5hcHByb3ZlKTtcbiAgICBjb25zdCBhcHByb3ZlZCA9IGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiQXBwcm92ZVwiLCBbXG4gICAgICBzcGVuZGVyLFxuICAgICAgdmFsdWUudG9TdHJpbmcoKSxcbiAgICBdKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvZGUoYXBwcm92ZWQpID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGFsbG93YW5jZSBvZiBFUkMyMCB0b2tlbnMgdGhhdCB0aGUgc3BlY2lmaWVkIG93bmVyIGhhcyBhcHByb3ZlZCBmb3IgYSBzcGVuZGVyLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBhbGxvd2FuY2Ugb2YgRVJDMjAgdG9rZW5zIHRoYXQgdGhlIHNwZWNpZmllZCBvd25lciBoYXMgYXBwcm92ZWQgZm9yIGEgc3BlbmRlci5cbiAgICogSXQgY2FsbHMgdGhlIFwiQWxsb3dhbmNlXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIG93bmVyJ3MgYWRkcmVzcyBhbmQgdGhlIHNwZW5kZXIncyBhZGRyZXNzIGFzIHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY29udmVydGVkIHRvIGEgbnVtYmVyLlxuICAgKlxuICAgKiBAcGFyYW0gb3duZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgRVJDMjAgdG9rZW4gb3duZXIuXG4gICAqIEBwYXJhbSBzcGVuZGVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHNwZW5kZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGFsbG93YW5jZSBvZiBFUkMyMCB0b2tlbnMgdGhhdCB0aGUgc3BlY2lmaWVkIG93bmVyIGhhcyBhcHByb3ZlZCBmb3IgdGhlIHNwZW5kZXIuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBhbGxvd2FuY2Uob3duZXI6IHN0cmluZywgc3BlbmRlcjogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYWxsb3dhbmNlXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmFsbG93YW5jZSk7XG4gICAgY29uc3QgYWxsb3dhbmNlID0gYXdhaXQgdGhpcy5hZGFwdGVyLnN1Ym1pdFRyYW5zYWN0aW9uKGN0eCwgXCJBbGxvd2FuY2VcIiwgW1xuICAgICAgb3duZXIsXG4gICAgICBzcGVuZGVyLFxuICAgIF0pO1xuICAgIHJldHVybiBOdW1iZXIodGhpcy5kZWNvZGUoYWxsb3dhbmNlKSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIEVSQzIwIGNvbnRyYWN0IHdpdGggdGhlIHByb3ZpZGVkIHRva2VuIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGluaXRpYWxpemUgdGhlIEVSQzIwIGNvbnRyYWN0IHdpdGggdGhlIGdpdmVuIHRva2VuIGluZm9ybWF0aW9uLlxuICAgKiBJdCBjYWxscyB0aGUgXCJJbml0aWFsaXplXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIHNlcmlhbGl6ZWQgdG9rZW4gZGF0YSBhcyBhIHBhcmFtZXRlci5cbiAgICogVGhlIHJldHVybmVkIGRhdGEgaXMgdGhlbiBkZWNvZGVkIGFuZCBjaGVja2VkIHRvIGRldGVybWluZSBpZiB0aGUgaW5pdGlhbGl6YXRpb24gd2FzIHN1Y2Nlc3NmdWwuXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBFUkMyMCB0b2tlbiBpbmZvcm1hdGlvbiB0byBpbml0aWFsaXplIHRoZSBjb250cmFjdCB3aXRoLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBgdHJ1ZWAgaWYgdGhlIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplKHRva2VuOiBFUkMyMFRva2VuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImluaXRpYWxpemVcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgY29uc3QgaW5pdGlsaWF6ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIkluaXRpYWxpemVcIixcbiAgICAgIFtGYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnkuc2VyaWFsaXplci5zZXJpYWxpemUodG9rZW4pXVxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5kZWNvZGUoaW5pdGlsaWF6ZWQpID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIEVSQzIwIGNvbnRyYWN0IGhhcyBiZWVuIGluaXRpYWxpemVkLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gdmVyaWZ5IGlmIHRoZSBFUkMyMCBjb250cmFjdCBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiAgICogSXQgY2FsbHMgdGhlIFwiQ2hlY2tJbml0aWFsaXplZFwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCwgd2hpY2ggZG9lcyBub3QgcmVxdWlyZSBhbnkgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGluaXRpYWxpemF0aW9uIGNoZWNrIGlzIGNvbXBsZXRlZC5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscy5cbiAgICovXG4gIGFzeW5jIGNoZWNrSW5pdGlhbGl6ZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImNoZWNrSW5pdGlhbGl6ZWRcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuY2hlY2tJbml0aWFsaXplZCk7XG4gICAgYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oY3R4LCBcIkNoZWNrSW5pdGlhbGl6ZWRcIik7XG4gIH1cblxuICAvKipcbiAgICogTWludHMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2Vucy5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBtaW50IGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMuXG4gICAqIEl0IGNhbGxzIHRoZSBcIk1pbnRcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgbWludGluZyBhbW91bnQgYXMgYSBwYXJhbWV0ZXIuXG4gICAqIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYW55IHZhbHVlLCBidXQgaXQgdXBkYXRlcyB0aGUgbWludGVyJ3MgbnVtYmVyIG9mIHRva2Vucy5cbiAgICpcbiAgICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIG1pbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBtaW50aW5nIHByb2Nlc3MgaXMgY29tcGxldGVkLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgbWludChhbW91bnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJtaW50XCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLm1pbnQpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiTWludFwiLCBbYW1vdW50LnRvU3RyaW5nKCldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdXJucyBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIGZyb20gdGhlIG1pbnRlcidzIGFjY291bnQuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBidXJuIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkJ1cm5cIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgYnVybmluZyBhbW91bnQgYXMgYSBwYXJhbWV0ZXIuXG4gICAqIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYW55IHZhbHVlLCBidXQgaXQgZGVjcmVhc2VzIHRoZSBtaW50ZXIncyBudW1iZXIgb2YgdG9rZW5zLlxuICAgKlxuICAgKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYnVybi5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJ1cm5pbmcgcHJvY2VzcyBpcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gICAqL1xuICBhc3luYyBidXJuKGFtb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImJ1cm5cIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuYnVybik7XG4gICAgYXdhaXQgdGhpcy5hZGFwdGVyLnN1Ym1pdFRyYW5zYWN0aW9uKGN0eCwgXCJCdXJuXCIsIFthbW91bnQudG9TdHJpbmcoKV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1cm5zIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgZnJvbSBhIHNwZWNpZmllZCBhY2NvdW50LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gYnVybiBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIGZyb20gYSBnaXZlbiBhY2NvdW50LlxuICAgKiBJdCBjYWxscyB0aGUgXCJCdXJuRnJvbVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBhY2NvdW50J3MgYWRkcmVzcyBhbmQgdGhlIGJ1cm5pbmcgYW1vdW50IGFzIHBhcmFtZXRlcnMuXG4gICAqIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYW55IHZhbHVlLCBidXQgaXQgZGVjcmVhc2VzIHRoZSBzcGVjaWZpZWQgYWNjb3VudCdzIG51bWJlciBvZiB0b2tlbnMuXG4gICAqXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gVGhlIGFkZHJlc3Mgb2YgdGhlIGFjY291bnQgZnJvbSB3aGljaCB0byBidXJuIHRoZSBFUkMyMCB0b2tlbnMuXG4gICAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBidXJuLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYnVybmluZyBwcm9jZXNzIGlzIGNvbXBsZXRlZC5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscy5cbiAgICovXG4gIGFzeW5jIGJ1cm5Gcm9tKGFjY291bnQ6IHN0cmluZywgYW1vdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYnVybkZyb21cIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuYnVybkZyb20pO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiQnVybkZyb21cIiwgW1xuICAgICAgYWNjb3VudCxcbiAgICAgIGFtb3VudC50b1N0cmluZygpLFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgYmFsYW5jZSBvZiBFUkMyMCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGllbnQncyBhY2NvdW50LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gZmV0Y2ggdGhlIGJhbGFuY2Ugb2YgRVJDMjAgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2xpZW50J3MgYWNjb3VudC5cbiAgICogSXQgY2FsbHMgdGhlIFwiQ2xpZW50QWNjb3VudEJhbGFuY2VcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QsIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYW55IHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY29udmVydGVkIHRvIGEgbnVtYmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBiYWxhbmNlIG9mIEVSQzIwIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIGNsaWVudCdzIGFjY291bnQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBjbGllbnRBY2NvdW50QmFsYW5jZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJhY2NvdW50QmFsYW5jZVwiLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoY29udGV4dEFyZ3MuYXJncywgdGhpcy5jbGllbnRBY2NvdW50QmFsYW5jZSk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEFjY291bnRCYWxhbmNlID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIkNsaWVudEFjY291bnRCYWxhbmNlXCJcbiAgICApO1xuXG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmRlY29kZShzZXJpYWxpemVkQWNjb3VudEJhbGFuY2UpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGNsaWVudCdzIGFjY291bnQgSUQgZnJvbSB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gZmV0Y2ggdGhlIGNsaWVudCdzIGFjY291bnQgSUQuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkNsaWVudEFjY291bnRJRFwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCwgd2hpY2ggZG9lcyBub3QgcmVxdWlyZSBhbnkgcGFyYW1ldGVycy5cbiAgICogVGhlIHJldHVybmVkIGRhdGEgaXMgdGhlbiBkZWNvZGVkIGFuZCByZXR1cm5lZCBhcyBhIHN0cmluZy5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY2xpZW50J3MgYWNjb3VudCBJRC5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIGNsaWVudEFjY291bnRJRCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJhY2NvdW50SWRcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuY2xpZW50QWNjb3VudElEKTtcbiAgICBjb25zdCBjbGllbnRBY2NvdW50SUQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIFwiQ2xpZW50QWNjb3VudElEXCJcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKGNsaWVudEFjY291bnRJRCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgUHJpbWFyeUtleVR5cGUgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGNvbXBvc2VBdHRyaWJ1dGVWYWx1ZSB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdElkczxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gIG1vZGVsczogTSB8IE1bXSB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gIGlkczogUHJpbWFyeUtleVR5cGUgfCBQcmltYXJ5S2V5VHlwZVtdXG4pIHtcbiAgbGV0IHBrOiBrZXlvZiBNO1xuICBsZXQgY29tcG9zZWQ6IGFueTtcbiAgbGV0IHBrUHJvcHM6IFNlcXVlbmNlT3B0aW9ucztcblxuICBmdW5jdGlvbiBleHRyYWN0SWQobTogTSB8IFJlY29yZDxzdHJpbmcsIGFueT4sIGlkczogUHJpbWFyeUtleVR5cGUpIHtcbiAgICBwayA9IHBrIHx8IE1vZGVsLnBrKGNsYXp6KTtcbiAgICBwa1Byb3BzID0gcGtQcm9wcyB8fCBNb2RlbC5zZXF1ZW5jZUZvcihjbGF6eik7XG4gICAgY29tcG9zZWQgPSBjb21wb3NlZCB8fCBNb2RlbC5jb21wb3NlZChjbGF6eiwgcGspO1xuXG4gICAgaWYgKGNvbXBvc2VkKSB7XG4gICAgICByZXR1cm4gY29tcG9zZUF0dHJpYnV0ZVZhbHVlKG0gYXMgYW55LCBjb21wb3NlZCk7XG4gICAgfVxuXG4gICAgY29uc3QgaWQgPSAobSBhcyBhbnkpW3BrXSB8fCBpZHM7XG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBjb3VsZCBub3QgcmVidWlsZCBpZCBmb3IgJHttLmNvbnN0cnVjdG9yLm5hbWV9YCk7XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkobW9kZWxzKSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShpZHMpIHx8IGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJpbmNvbnNpc3RlbnQgcGFyYW1ldGVycy4gYm90aCBtdXN0IGJlIGFycmF5cyBvZiBlcXVhbCBsZW5ndGhcIlxuICAgICAgKTtcbiAgICByZXR1cm4gbW9kZWxzLm1hcCgobSwgaSkgPT4gZXh0cmFjdElkKG0sIGlkc1tpXSkpO1xuICB9XG4gIHJldHVybiBleHRyYWN0SWQobW9kZWxzLCBpZHMgYXMgUHJpbWFyeUtleVR5cGUpO1xufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsLCBjb2x1bW4sIHBrIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgdHlwZSBNb2RlbEFyZywgcmVxdWlyZWQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJZGVudGl0eSBjcmVkZW50aWFsIG1vZGVsIHN0b3JpbmcgY3J5cHRvZ3JhcGhpYyBtYXRlcmlhbHNcbiAqIEBzdW1tYXJ5IEhvbGRzIGNlcnRpZmljYXRlIGNoYWluIGFuZCBwcml2YXRlIGtleSBpbmZvcm1hdGlvbiBmb3IgYSBGYWJyaWMgaWRlbnRpdHksIG1hbmFnZWQgYXMgYSBzZXBhcmF0ZSBlbnRpdHkgbGlua2VkIGZyb20gSWRlbnRpdHlcbiAqIEBwYXJhbSB7TW9kZWxBcmc8SWRlbnRpdHlDcmVkZW50aWFscz59IFthcmddIC0gT3B0aW9uYWwgaW5pdGlhbGl6YXRpb24gb2JqZWN0IHVzZWQgdG8gcG9wdWxhdGUgbW9kZWwgZmllbGRzXG4gKiBAY2xhc3MgSWRlbnRpdHlDcmVkZW50aWFsc1xuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBjcmVkZW50aWFscyBlbnRyeVxuICogY29uc3QgY3JlZHMgPSBuZXcgSWRlbnRpdHlDcmVkZW50aWFscyh7IGlkOiBcImNyZWRzMVwiLCBjZXJ0aWZpY2F0ZTogXCIuLi5cIiwgcm9vdENlcnRpZmljYXRlOiBcIi4uLlwiLCBwcml2YXRlS2V5OiBcIi4uLlwiIH0pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgTW9kZWwgYXMgSWRlbnRpdHlDcmVkZW50aWFsc1xuICogICBBcHAtPj5Nb2RlbDogbmV3IElkZW50aXR5Q3JlZGVudGlhbHMoeyBpZCwgY2VydGlmaWNhdGUsIHJvb3RDZXJ0aWZpY2F0ZSwgcHJpdmF0ZUtleSB9KVxuICogICBNb2RlbC0tPj5BcHA6IGluc3RhbmNlXG4gKiBAc2VlIG1vZGVsXG4gKi9cbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlDcmVkZW50aWFscyBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNyZWRlbnRpYWxzIHJlY29yZFxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSBmb3IgcmVmZXJlbmNpbmcgdGhpcyBjcmVkZW50aWFscyBlbnRyeVxuICAgKi9cbiAgQGRlc2NyaXB0aW9uKFwiVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNyZWRlbnRpYWxzIHJlY29yZFwiKVxuICBAY29sdW1uKClcbiAgQHBrKClcbiAgaWQhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQRU0tZW5jb2RlZCBYLjUwOSBjZXJ0aWZpY2F0ZSBmb3IgdGhlIGlkZW50aXR5XG4gICAqIEBzdW1tYXJ5IExlYWYgY2VydGlmaWNhdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBpZGVudGl0eVxuICAgKi9cbiAgQGRlc2NyaXB0aW9uKFwiUEVNLWVuY29kZWQgWC41MDkgY2VydGlmaWNhdGUgZm9yIHRoZSBpZGVudGl0eVwiKVxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgY2VydGlmaWNhdGUhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQRU0tZW5jb2RlZCByb290IG9yIGludGVybWVkaWF0ZSBjZXJ0aWZpY2F0ZVxuICAgKiBAc3VtbWFyeSBSb290IG9mIHRydXN0IHVzZWQgdG8gdmFsaWRhdGUgdGhlIGxlYWYgY2VydGlmaWNhdGVcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlBFTS1lbmNvZGVkIHJvb3Qgb3IgaW50ZXJtZWRpYXRlIGNlcnRpZmljYXRlXCIpXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICByb290Q2VydGlmaWNhdGUhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQRU0tZW5jb2RlZCBwcml2YXRlIGtleSBtYXRlcmlhbFxuICAgKiBAc3VtbWFyeSBQcml2YXRlIGtleSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpZGVudGl0eSBjZXJ0aWZpY2F0ZVxuICAgKi9cbiAgQGRlc2NyaXB0aW9uKFwiUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXlcIilcbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIHByaXZhdGVLZXkhOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoYXJnPzogTW9kZWxBcmc8SWRlbnRpdHlDcmVkZW50aWFscz4pIHtcbiAgICBzdXBlcihhcmcpO1xuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBLZXlzIHVzZWQgdG8gbWFyayBGYWJyaWMtc3BlY2lmaWMgbW9kZWwgbWV0YWRhdGFcbiAqIEBzdW1tYXJ5IEVudW1lcmF0aW9uIG9mIHNwZWNpYWwga2V5cyB1c2VkIGJ5IHRoZSBzZXJpYWxpemF0aW9uIGxheWVyIHRvIHBlcnNpc3QgRmFicmljLXJlbGF0ZWQgZmxhZ3Mgb24gbW9kZWxzXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBlbnVtIEZhYnJpY01vZGVsS2V5cyB7XG4gIC8qKiBQcml2YXRlIGRhdGEgbWFya2VyIHVzZWQgdG8gdGFnIHByb3BlcnRpZXMgb3IgbW9kZWxzIGZvciBGYWJyaWMgcHJpdmF0ZSBjb2xsZWN0aW9ucyAqL1xuICBQUklWQVRFID0gXCJwcml2YXRlXCIsXG4gIFNIQVJFRCA9IFwic2hhcmVkXCIsXG4gIC8qKiBOYW1lc3BhY2UgcHJlZml4IHVzZWQgZm9yIEZhYnJpYy1zcGVjaWZpYyBtZXRhZGF0YSBrZXlzICovXG4gIEZBQlJJQyA9IFwiZmFicmljXCIsXG4gIE9XTkVEX0JZID0gXCJvd25lZC1ieVwiLFxuICBUUkFOU0FDVElPTl9JRCA9IFwidHJhbnNhY3Rpb24taWRcIixcbiAgTUlSUk9SID0gXCJtaXJyb3JcIixcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN1cHBvcnRlZCBpZGVudGl0eSB0eXBlcyBmb3IgRmFicmljIGNyZWRlbnRpYWxzXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGlvbiBvZiBpZGVudGl0eSBmb3JtYXRzIHJlY29nbml6ZWQgYnkgdGhpcyBsaWJyYXJ5XG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBlbnVtIElkZW50aXR5VHlwZSB7XG4gIC8qKiBTdGFuZGFyZCBYLjUwOSBpZGVudGl0eSBmb3JtYXQgdXNlZCBieSBIeXBlcmxlZGdlciBGYWJyaWMgKi9cbiAgWDUwOSA9IFwiWC41MDlcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RyaW5nIGlkZW50aWZpZXIgZm9yIHRoZSBGYWJyaWMgYWRhcHRlciBmbGF2b3VyXG4gKiBAc3VtbWFyeSBVc2VkIHRvIHRhZyBhZGFwdGVycy9yZXBvc2l0b3JpZXMgdGhhdCBvcGVyYXRlIGFnYWluc3QgSHlwZXJsZWRnZXIgRmFicmljXG4gKiBAY29uc3QgRmFicmljRmxhdm91clxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgY29uc3QgRmFicmljRmxhdm91ciA9IFwiaGxmLWZhYnJpY1wiO1xuIiwiaW1wb3J0IHtcbiAgQmFzZU1vZGVsLFxuICBDYXNjYWRlLFxuICBjb2x1bW4sXG4gIGluZGV4LFxuICBvbmVUb09uZSxcbiAgcGssXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSWRlbnRpdHlDcmVkZW50aWFscyB9IGZyb20gXCIuL0lkZW50aXR5Q3JlZGVudGlhbHNcIjtcbmltcG9ydCB7IElkZW50aXR5VHlwZSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGRlc2NyaXB0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIElkZW50aXR5IG1vZGVsIHJlcHJlc2VudGluZyBhIEZhYnJpYyB3YWxsZXQgZW50cnlcbiAqIEBzdW1tYXJ5IEVuY2Fwc3VsYXRlcyBhbiBpZGVudGl0eSBzdG9yZWQgaW4gYSBGYWJyaWMgd2FsbGV0LCBpbmNsdWRpbmcgaXRzIE1TUCBpZGVudGlmaWVyLCBjcmVkZW50aWFsIGxpbmthZ2UsIGFuZCB0eXBlIGluZm9ybWF0aW9uLiBCdWlsdCBvbiBCYXNlTW9kZWwgZm9yIGludGVncmF0aW9uIHdpdGggRGVjYWYgdmFsaWRhdGlvbiBhbmQgcGVyc2lzdGVuY2UuXG4gKiBAcGFyYW0ge01vZGVsQXJnPElkZW50aXR5Pn0gW2FyZ10gLSBPcHRpb25hbCBpbml0aWFsaXphdGlvbiBvYmplY3QgdXNlZCB0byBwb3B1bGF0ZSBtb2RlbCBmaWVsZHNcbiAqIEBjbGFzcyBJZGVudGl0eVxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIG5ldyBpZGVudGl0eSByZWZlcmVuY2luZyBleGlzdGluZyBjcmVkZW50aWFsc1xuICogY29uc3QgaWQgPSBuZXcgSWRlbnRpdHkoeyBpZDogXCJ1c2VyMVwiLCBtc3BJZDogXCJPcmcxTVNQXCIsIHR5cGU6IElkZW50aXR5VHlwZS5YNTA5IH0pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgTW9kZWwgYXMgSWRlbnRpdHlcbiAqICAgQXBwLT4+TW9kZWw6IG5ldyBJZGVudGl0eSh7IGlkLCBtc3BJZCwgdHlwZSB9KVxuICogICBNb2RlbC0tPj5BcHA6IGluc3RhbmNlXG4gKi9cbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgSWRlbnRpdHkgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpZGVudGl0eSBpbiB0aGUgd2FsbGV0XG4gICAqIEBzdW1tYXJ5IFByaW1hcnkga2V5IHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgaWRlbnRpdHkgcmVjb3JkXG4gICAqL1xuICBAZGVzY3JpcHRpb24oXCJVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaWRlbnRpdHlcIilcbiAgQHBrKClcbiAgaWQhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaW5rIHRvIHRoZSBpZGVudGl0eSBjcmVkZW50aWFscyBzdG9yZWQgc2VwYXJhdGVseVxuICAgKiBAc3VtbWFyeSBPbmUtdG8tb25lIHJlbGF0aW9uc2hpcCB0byB0aGUgY3JlZGVudGlhbHMgZW50aXR5OyBjYXNjYWRlcyBvbiB1cGRhdGUgYW5kIGRlbGV0ZVxuICAgKi9cbiAgQG9uZVRvT25lKElkZW50aXR5Q3JlZGVudGlhbHMsIHtcbiAgICB1cGRhdGU6IENhc2NhZGUuQ0FTQ0FERSxcbiAgICBkZWxldGU6IENhc2NhZGUuQ0FTQ0FERSxcbiAgfSlcbiAgY3JlZGVudGlhbHMhOiBJZGVudGl0eUNyZWRlbnRpYWxzO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIGlkZW50aWZpZXJcbiAgICogQHN1bW1hcnkgVGhlIE1TUCBJRCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvcmdhbml6YXRpb24gdGhhdCBpc3N1ZWQgdGhpcyBpZGVudGl0eVxuICAgKi9cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIEBpbmRleCgpXG4gIG1zcElkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVHlwZSBvZiBpZGVudGl0eVxuICAgKiBAc3VtbWFyeSBJbmRpY2F0ZXMgdGhlIGlkZW50aXR5IGVuY29kaW5nL2Zvcm1hdDsgZGVmYXVsdHMgdG8gWC41MDlcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICB0eXBlOiBJZGVudGl0eVR5cGUgPSBJZGVudGl0eVR5cGUuWDUwOTtcblxuICBjb25zdHJ1Y3Rvcihhcmc6IE1vZGVsQXJnPElkZW50aXR5Pikge1xuICAgIHN1cGVyKGFyZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IHN0cmluZ0Zvcm1hdCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IExvZ2dlciwgTWluaUxvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgSWRlbnRpdHksIFNpZ25lciwgc2lnbmVycyB9IGZyb20gXCJAaHlwZXJsZWRnZXIvZmFicmljLWdhdGV3YXlcIjtcbmltcG9ydCB7IENyeXB0b1NldHRpbmcsIElDcnlwdG9TdWl0ZSwgVXNlciB9IGZyb20gXCJmYWJyaWMtY29tbW9uXCI7XG5pbXBvcnQgeyBIU01PcHRpb25zIH0gZnJvbSBcIi4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplSW1wb3J0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgY3J5cHRvLCB7IFg1MDlDZXJ0aWZpY2F0ZSB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IFg1MDlDZXJ0aWZpY2F0ZSBhcyBYNTA5Q2VydCB9IGZyb20gXCJAcGVjdWxpYXIveDUwOVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb3JlIHV0aWxpdGllcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBmaWxlcywgY3J5cHRvIGlkZW50aXRpZXMsIGFuZCBGYWJyaWMgU0RLIGhlbHBlcnNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHN0YXRpYyBoZWxwZXIgbWV0aG9kcyB0byByZWFkIGNyZWRlbnRpYWxzIGFuZCBrZXlzIGZyb20gZGlzayBvciByYXcgY29udGVudCwgY29uc3RydWN0IEZhYnJpYyBnYXRld2F5IElkZW50aXRpZXMgYW5kIFNpZ25lcnMsIGFuZCBwZXJmb3JtIGNvbW1vbiBmaWxlc3lzdGVtIG9wZXJhdGlvbnMgdXNlZCBieSB0aGUgRmFicmljIGNsaWVudCB0b29saW5nLlxuICogQGNsYXNzIENvcmVVdGlsc1xuICogQGV4YW1wbGVcbiAqIC8vIFJlYWQgYW4gaWRlbnRpdHkgYW5kIHNpZ25lciBmcm9tIGRpcmVjdG9yaWVzXG4gKiBjb25zdCBpZGVudGl0eSA9IGF3YWl0IENvcmVVdGlscy5nZXRJZGVudGl0eSgnT3JnMU1TUCcsICcvbXNwL3NpZ25jZXJ0cycpO1xuICogY29uc3Qgc2lnbmVyID0gYXdhaXQgQ29yZVV0aWxzLmdldFNpZ25lcignL21zcC9rZXlzdG9yZScpO1xuICogLy8gQnVpbGQgYSBDQSB1c2VyXG4gKiBjb25zdCB1c2VyID0gYXdhaXQgQ29yZVV0aWxzLmdldENBVXNlcignYXBwVXNlcicsIHBlbUtleSwgcGVtQ2VydCwgJ09yZzFNU1AnKTtcbiAqL1xuZXhwb3J0IGNsYXNzIENvcmVVdGlscyB7XG4gIHByaXZhdGUgc3RhdGljIGxvZ2dlcjogTG9nZ2VyID0gbmV3IE1pbmlMb2dnZXIoQ29yZVV0aWxzLm5hbWUpO1xuXG4gIHByaXZhdGUgc3RhdGljIGNyeXB0b1N1aXRlOiBJQ3J5cHRvU3VpdGU7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXNvbHZlIGZpbGUgY29udGVudCBmcm9tIGEgcGF0aCBvciByZXR1cm4gcHJvdmlkZWQgcmF3IGNvbnRlbnRcbiAgICogQHN1bW1hcnkgSWYgdGhlIGlucHV0IGlzIGEgVWludDhBcnJheSBvciBQRU0gY29udGVudCwgcmV0dXJucyBpdCBhcy1pczsgb3RoZXJ3aXNlIHVzZXMgYSBwcm92aWRlZCBhc3luYyBmaWxlUmVhZGVyIHRvIGxvYWQgdGhlIGNvbnRlbnQgZnJvbSBkaXNrLlxuICAgKiBAcGFyYW0ge3N0cmluZ3xVaW50OEFycmF5fSBjb250ZW50T3JQYXRoIC0gRWl0aGVyIGEgcmF3IGNvbnRlbnQgYnVmZmVyL3N0cmluZyBvciBhIGZpbGVzeXN0ZW0gcGF0aFxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyk6IFByb21pc2U8c3RyaW5nfFVpbnQ4QXJyYXl8QnVmZmVyPn0gZmlsZVJlYWRlciAtIEFzeW5jIGZ1bmN0aW9uIHRvIHJlYWQgZmlsZSBjb250ZW50IHdoZW4gYSBwYXRoIGlzIHByb3ZpZGVkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nfFVpbnQ4QXJyYXl8QnVmZmVyPn0gVGhlIGNvbnRlbnQgdG8gYmUgdXNlZCBkb3duc3RyZWFtXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBhc3luYyBjb250ZW50T2ZMb2FkRmlsZShcbiAgICBjb250ZW50T3JQYXRoOiBzdHJpbmcgfCBVaW50OEFycmF5LFxuICAgIGZpbGVSZWFkZXI6IChwYXRoOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nIHwgVWludDhBcnJheSB8IEJ1ZmZlcj5cbiAgKSB7XG4gICAgaWYgKGNvbnRlbnRPclBhdGggaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgICBpZiAoXG4gICAgICBjb250ZW50T3JQYXRoLm1hdGNoKFxuICAgICAgICAvLS0tLS1CRUdJTiAoQ0VSVElGSUNBVEV8S0VZfFBSSVZBVEUgS0VZKS0tLS0tLis/LS0tLS1FTkQgXFwxLS0tLS0kL2dtc1xuICAgICAgKVxuICAgIClcbiAgICAgIHJldHVybiBjb250ZW50T3JQYXRoO1xuICAgIHJldHVybiBhd2FpdCBmaWxlUmVhZGVyKGNvbnRlbnRPclBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkIGZpbGUgY29udGVudCBmcm9tIGEgcGF0aCBvciByZXR1cm4gcHJvdmlkZWQgQnVmZmVyXG4gICAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIHdyYXBwZXIgdGhhdCBsb2FkcyBhIGZpbGUgdXNpbmcgZnMucHJvbWlzZXMgd2hlbiBhIHBhdGggc3RyaW5nIGlzIHByb3ZpZGVkOyBvdGhlcndpc2UgcmV0dXJucyB0aGUgZ2l2ZW4gQnVmZmVyIGRpcmVjdGx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ3xCdWZmZXJ9IGNvbnRlbnRPclBhdGggLSBQYXRoIHRvIGEgZmlsZSBvbiBkaXNrIG9yIGFuIGFscmVhZHktbG9hZGVkIEJ1ZmZlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IFRoZSBmaWxlIGNvbnRlbnQgYXMgYSBCdWZmZXIvc3RyaW5nIGRlcGVuZGluZyBvbiByZWFkZXJcbiAgICovXG4gIHN0YXRpYyBhc3luYyByZWFkRmlsZShjb250ZW50T3JQYXRoOiBzdHJpbmcgfCBCdWZmZXIpIHtcbiAgICBpZiAodHlwZW9mIGNvbnRlbnRPclBhdGggIT09IFwic3RyaW5nXCIpIHJldHVybiBjb250ZW50T3JQYXRoO1xuXG4gICAgY29uc3QgZmlsZVJlYWRlciA9IGFzeW5jIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUocGF0aCk7XG4gICAgfTtcblxuICAgIHJldHVybiBhd2FpdCBmaWxlUmVhZGVyKGNvbnRlbnRPclBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgYSBGYWJyaWMgQ0EgVXNlciBvYmplY3Qgd2l0aCBlbnJvbGxtZW50XG4gICAqIEBzdW1tYXJ5IENvbnN0cnVjdHMgYSBmYWJyaWMtY29tbW9uIFVzZXIsIHNldHMgYSBjcnlwdG8gc3VpdGUsIGltcG9ydHMgdGhlIHByb3ZpZGVkIHByaXZhdGUga2V5LCBhbmQgc2V0cyBlbnJvbGxtZW50IHdpdGggY2VydGlmaWNhdGUgYW5kIE1TUCBJRC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJOYW1lIC0gVGhlIHVzZXIgbmFtZSBmb3IgdGhlIENBIHVzZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByaXZhdGVLZXkgLSBQRU0tZW5jb2RlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2VydGlmaWNhdGUgLSBQRU0tZW5jb2RlZCBYLjUwOSBjZXJ0aWZpY2F0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbXNwSWQgLSBNZW1iZXJzaGlwIFNlcnZpY2UgUHJvdmlkZXIgaWRlbnRpZmllclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFVzZXI+fSBUaGUgZW5yb2xsZWQgRmFicmljIFVzZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRDQVVzZXIoXG4gICAgdXNlck5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgY2VydGlmaWNhdGU6IHN0cmluZyxcbiAgICBtc3BJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IGhzbT86IEhTTU9wdGlvbnMgfVxuICApOiBQcm9taXNlPFVzZXI+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIHN0cmluZ0Zvcm1hdChcbiAgICAgICAgXCJDcmVhdGluZyBDQSB7MH0gdXNlciB7MX0gd2l0aCBjZXJ0aWZpY2F0ZSB7Mn1cIixcbiAgICAgICAgbXNwSWQsXG4gICAgICAgIHVzZXJOYW1lLFxuICAgICAgICBjZXJ0aWZpY2F0ZVxuICAgICAgKVxuICAgICk7XG4gICAgY29uc3QgdXNlciA9IG5ldyBVc2VyKHVzZXJOYW1lKTtcbiAgICBjb25zdCBjb25maWcgPSBvcHRpb25zPy5oc21cbiAgICAgID8ge1xuICAgICAgICAgIHNvZnR3YXJlOiBmYWxzZSxcbiAgICAgICAgICBsaWI6IG9wdGlvbnMuaHNtLmxpYnJhcnksXG4gICAgICAgICAgc2xvdDogb3B0aW9ucy5oc20uc2xvdCxcbiAgICAgICAgICBsYWJlbDogb3B0aW9ucy5oc20udG9rZW5MYWJlbCxcbiAgICAgICAgICBwaW46IFN0cmluZyhvcHRpb25zLmhzbS5waW4pLFxuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjcnlwdG9TdWl0ZSA9IHRoaXMuZ2V0Q3J5cHRvU3VpdGUoY29uZmlnKTtcblxuICAgIHVzZXIuc2V0Q3J5cHRvU3VpdGUoY3J5cHRvU3VpdGUpO1xuICAgIGNvbnN0IGVucm9sbG1lbnRLZXkgPSBvcHRpb25zPy5oc21cbiAgICAgID8gYXdhaXQgdGhpcy5nZXRIU01FbnJvbGxtZW50S2V5KGNyeXB0b1N1aXRlLCBjZXJ0aWZpY2F0ZSwgb3B0aW9ucy5oc20pXG4gICAgICA6IHRoaXMuZ2V0U29mdHdhcmVFbnJvbGxtZW50S2V5KGNyeXB0b1N1aXRlLCBwcml2YXRlS2V5KTtcbiAgICBhd2FpdCB1c2VyLnNldEVucm9sbG1lbnQoZW5yb2xsbWVudEtleSwgY2VydGlmaWNhdGUsIG1zcElkKTtcbiAgICByZXR1cm4gdXNlcjtcbiAgfVxuXG4gIHN0YXRpYyBnZXRDcnlwdG9TdWl0ZShvcHRpb25zPzogQ3J5cHRvU2V0dGluZyk6IElDcnlwdG9TdWl0ZSB7XG4gICAgaWYgKCFvcHRpb25zKSByZXR1cm4gVXNlci5uZXdDcnlwdG9TdWl0ZSgpO1xuICAgIGlmIChDb3JlVXRpbHMuY3J5cHRvU3VpdGUpIHJldHVybiBDb3JlVXRpbHMuY3J5cHRvU3VpdGU7XG5cbiAgICBDb3JlVXRpbHMuY3J5cHRvU3VpdGUgPSBVc2VyLm5ld0NyeXB0b1N1aXRlKG9wdGlvbnMpO1xuICAgIHJldHVybiBDb3JlVXRpbHMuY3J5cHRvU3VpdGU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRTb2Z0d2FyZUVucm9sbG1lbnRLZXkoXG4gICAgY3J5cHRvU3VpdGU6IGFueSxcbiAgICBwcml2YXRlS2V5Pzogc3RyaW5nXG4gICkge1xuICAgIGlmICghcHJpdmF0ZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlByaXZhdGUga2V5IG11c3QgYmUgcHJvdmlkZWQgd2hlbiBIU00gY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcGxpZWRcIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyeXB0b1N1aXRlLmNyZWF0ZUtleUZyb21SYXcocHJpdmF0ZUtleSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBnZXRIU01FbnJvbGxtZW50S2V5KFxuICAgIGNyeXB0b1N1aXRlOiBhbnksXG4gICAgY2VydGlmaWNhdGU6IHN0cmluZyxcbiAgICBoc206IEhTTU9wdGlvbnNcbiAgKSB7XG4gICAgY29uc3Qgc2tpID1cbiAgICAgIGhzbS5rZXlJZEhleCAmJiBoc20ua2V5SWRIZXgudHJpbSgpLmxlbmd0aCA+IDBcbiAgICAgICAgPyBCdWZmZXIuZnJvbShoc20ua2V5SWRIZXgsIFwiaGV4XCIpXG4gICAgICAgIDogYXdhaXQgdGhpcy5nZXRDZXJ0aWZpY2F0ZVNLSShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY3J5cHRvU3VpdGUuZ2V0S2V5KHNraSk7XG4gICAgaWYgKCFrZXkgfHwgKHR5cGVvZiBrZXkuaXNQcml2YXRlID09PSBcImZ1bmN0aW9uXCIgJiYgIWtleS5pc1ByaXZhdGUoKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byByZXNvbHZlIHByaXZhdGUga2V5IGZyb20gSFNNXCIpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldENlcnRpZmljYXRlU0tJKGNlcnRpZmljYXRlOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGNvbnN0IHg1MDkgPSBuZXcgWDUwOUNlcnRpZmljYXRlKGNlcnRpZmljYXRlKTtcbiAgICBjb25zdCBqd2sgPSB4NTA5LnB1YmxpY0tleS5leHBvcnQoeyBmb3JtYXQ6IFwiandrXCIgfSk7XG4gICAgY29uc3QgcHJlZml4ID0gQnVmZmVyLmZyb20oWzB4MDRdKTtcbiAgICBjb25zdCB4ID0gQnVmZmVyLmZyb20oandrLnggfHwgXCJcIiwgXCJiYXNlNjR1cmxcIik7XG4gICAgY29uc3QgeSA9IEJ1ZmZlci5mcm9tKGp3ay55IHx8IFwiXCIsIFwiYmFzZTY0dXJsXCIpO1xuICAgIHJldHVybiBjcnlwdG9cbiAgICAgIC5jcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgICAudXBkYXRlKEJ1ZmZlci5jb25jYXQoW3ByZWZpeCwgeCwgeV0pKVxuICAgICAgLmRpZ2VzdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBhIEZhYnJpYyBHYXRld2F5IElkZW50aXR5IGZyb20gYW4gTVNQIElEIGFuZCBjZXJ0aWZpY2F0ZVxuICAgKiBAc3VtbWFyeSBSZWFkcyBhIGNlcnRpZmljYXRlIGZyb20gYSBkaXJlY3RvcnkgcGF0aCBvciBhY2NlcHRzIHJhdyBjb250ZW50IGFuZCByZXR1cm5zIGFuIElkZW50aXR5IG9iamVjdCBzdWl0YWJsZSBmb3IgdGhlIEZhYnJpYyBHYXRld2F5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbXNwSWQgLSBNZW1iZXJzaGlwIFNlcnZpY2UgUHJvdmlkZXIgSURcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNlcnREaXJlY3RvcnlQYXRoIC0gUGF0aCB0byBhIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZSBmaWxlLCBvciBQRU0gY29udGVudFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPElkZW50aXR5Pn0gVGhlIGlkZW50aXR5IGNvbnRhaW5pbmcgbXNwSWQgYW5kIGNlcnRpZmljYXRlIGNyZWRlbnRpYWxzXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0SWRlbnRpdHkoXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjZXJ0RGlyZWN0b3J5UGF0aDogc3RyaW5nXG4gICk6IFByb21pc2U8SWRlbnRpdHk+IHtcbiAgICBjb25zdCBpZGVudGl0eUZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgICAgY29uc3QgY2VydFBhdGggPSBhd2FpdCB0aGlzLmdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgICBjb25zdCBjcmVkZW50aWFscyA9IGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGNlcnRQYXRoKTtcbiAgICAgIHJldHVybiBjcmVkZW50aWFscztcbiAgICB9O1xuXG4gICAgY29uc3QgY3JlZGVudGlhbHM6IFVpbnQ4QXJyYXkgPSAoYXdhaXQgdGhpcy5jb250ZW50T2ZMb2FkRmlsZShcbiAgICAgIGNlcnREaXJlY3RvcnlQYXRoLFxuICAgICAgaWRlbnRpdHlGaWxlUmVhZGVyXG4gICAgKSkgYXMgVWludDhBcnJheTtcblxuICAgIHJldHVybiB7IG1zcElkLCBjcmVkZW50aWFscyB9O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEZpcnN0RGlyRmlsZU5hbWUoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcInBhdGhcIikpO1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgcHJvbWlzZXMucmVhZGRpcihkaXJQYXRoKTtcbiAgICByZXR1cm4gam9pbihkaXJQYXRoLCBmaWxlc1swXSk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcInBhdGhcIikpO1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgcHJvbWlzZXMucmVhZGRpcihkaXJQYXRoKTtcbiAgICByZXR1cm4gKGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGpvaW4oZGlyUGF0aCwgZmlsZXNbMF0pKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRGaWxlQ29udGVudChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgIHJldHVybiAoYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgpKS50b1N0cmluZygpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldFNpZ25lcihrZXlEaXJlY3RvcnlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFNpZ25lcj4ge1xuICAgIGNvbnN0IHNpZ25lckZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgICAgY29uc3Qga2V5UGF0aCA9IGF3YWl0IHRoaXMuZ2V0Rmlyc3REaXJGaWxlTmFtZShwYXRoKTtcbiAgICAgIHJldHVybiBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShrZXlQYXRoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcHJpdmF0ZUtleVBlbSA9IChhd2FpdCB0aGlzLmNvbnRlbnRPZkxvYWRGaWxlKFxuICAgICAga2V5RGlyZWN0b3J5UGF0aCxcbiAgICAgIHNpZ25lckZpbGVSZWFkZXJcbiAgICApKSBhcyBCdWZmZXI7XG4gICAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IHRoaXMuZXh0cmFjdFByaXZhdGVLZXkocHJpdmF0ZUtleVBlbSk7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocHJpdmF0ZUtleSk7XG4gICAgY29uc3QgayA9IChwcml2YXRlS2V5IGFzIGFueSlba2V5c1swXV07XG4gICAgLy8gLS1cblxuICAgIHJldHVybiBzaWduZXJzLm5ld1ByaXZhdGVLZXlTaWduZXIoayBhcyBhbnkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZXh0cmFjdFByaXZhdGVLZXkocGVtOiBCdWZmZXIpIHtcbiAgICBjb25zdCBsaWJOYW1lID0gXCJjcnlwdG9cIjtcbiAgICBsZXQgc3VidGxlOiBhbnk7XG4gICAgaWYgKFxuICAgICAgKGdsb2JhbFRoaXMgYXMgYW55KS53aW5kb3cgJiZcbiAgICAgICgoZ2xvYmFsVGhpcyBhcyBhbnkpLndpbmRvdyBhcyB7IENyeXB0bzogYW55IH0pLkNyeXB0b1xuICAgICkge1xuICAgICAgc3VidGxlID0gKChnbG9iYWxUaGlzIGFzIGFueSkuQ3J5cHRvIGFzIGFueSkuc3VidGxlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBsaWIgPSAoYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChsaWJOYW1lKSkpIGFzIGFueTtcbiAgICAgIHN1YnRsZSA9IGxpYi5zdWJ0bGUgfHwgbGliLndlYmNyeXB0by5zdWJ0bGU7XG4gICAgfVxuXG4gICAgaWYgKCFzdWJ0bGUpIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBsb2FkIFN1YnRsZUNyeXB0byBtb2R1bGVcIik7XG5cbiAgICBmdW5jdGlvbiBzdHIyYWIoc3RyOiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihzdHIubGVuZ3RoKTtcbiAgICAgIGNvbnN0IGJ1ZlZpZXcgPSBuZXcgVWludDhBcnJheShidWYpO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIHN0ckxlbiA9IHN0ci5sZW5ndGg7IGkgPCBzdHJMZW47IGkrKykge1xuICAgICAgICBidWZWaWV3W2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYnVmO1xuICAgIH1cblxuICAgIGNvbnN0IHN0ciA9IHBlbVxuICAgICAgLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgICAgLnJlcGxhY2UoXCItLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cIiwgXCJcIilcbiAgICAgIC5yZXBsYWNlQWxsKFwiXFxuXCIsIFwiXCIpXG4gICAgICAucmVwbGFjZShcIi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS1cIiwgXCJcIik7XG4gICAgY29uc3QgZGVjb2RlZCA9IEJ1ZmZlci5mcm9tKHN0ciwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJiaW5hcnlcIik7XG4gICAgY29uc3QgYmluYXJ5RGVyID0gc3RyMmFiKGRlY29kZWQpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICBcInBrY3M4XCIsXG4gICAgICBiaW5hcnlEZXIsXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgbmFtZWRDdXJ2ZTogXCJQLTI1NlwiLFxuICAgICAgfSxcbiAgICAgIHRydWUsXG4gICAgICBbXCJzaWduXCJdXG4gICAgKTtcblxuICAgIHJldHVybiBrZXk7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgY2VydGlmaWNhdGUgU2VyaWFsIE51bWJlciBhbmQgdGhlIEFLSSAoQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyKVxuICogaW4gdGhlIGZvcm1hdCBGYWJyaWMgQ0EgZXhwZWN0cyAocGxhaW4gaGV4LCBubyBjb2xvbnMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWtpQW5kU2VyaWFsRnJvbUNlcnQoY2VydDogc3RyaW5nKToge1xuICBha2k6IHN0cmluZztcbiAgc2VyaWFsOiBzdHJpbmc7XG59IHtcbiAgY29uc3QgeDUwOUNlcnRpZmljYXRlID0gbmV3IFg1MDlDZXJ0KGNlcnQpO1xuXG4gIC8vIEZpbmQgdGhlIEFLSSAoQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyKSBleHRlbnNpb24gYnkgaXRzIE9JRDogMi41LjI5LjM1XG4gIGNvbnN0IGFraUV4dCA9IHg1MDlDZXJ0aWZpY2F0ZS5leHRlbnNpb25zPy5maW5kKFxuICAgIChlKSA9PiBlLnR5cGUgPT09IFwiMi41LjI5LjM1XCJcbiAgKTtcbiAgaWYgKCFha2lFeHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIkF1dGhvcml0eSBLZXkgSWRlbnRpZmllciAoQUtJKSBleHRlbnNpb24gbm90IGZvdW5kIGluIGNlcnRpZmljYXRlLlwiXG4gICAgKTtcbiAgfVxuXG4gIC8vIGFraUV4dC52YWx1ZSBpcyB0aGUgZXh0ZW5zaW9uIGNvbnRlbnQgaW4gREVSIGJ5dGVzLiBDb252ZXJ0IGl0IHRvIGEgaGV4IHN0cmluZy5cbiAgbGV0IGFraSA9IEJ1ZmZlci5mcm9tKG5ldyBVaW50OEFycmF5KGFraUV4dC52YWx1ZSkpXG4gICAgLnRvU3RyaW5nKFwiaGV4XCIpXG4gICAgLnRvVXBwZXJDYXNlKCk7XG5cbiAgLyoqXG4gICAqIENvbW1vbiBjYXNlOlxuICAgKiBUaGUgREVSLWVuY29kZWQgQUtJIGV4dGVuc2lvbiBvZnRlbiBzdGFydHMgd2l0aDpcbiAgICogICAzMCAxNiA4MCAxNCA8MjAtYnl0ZSBrZXlJZGVudGlmaWVyPlxuICAgKiBJbiBoZXgsIHRoYXQncyBcIjMwMTY4MDE0XCIgKyA0MCBoZXggY2hhcnMgKDIwIGJ5dGVzKS5cbiAgICpcbiAgICogRmFicmljIENBIGV4cGVjdHMgT05MWSB0aGUgMjAtYnl0ZSBrZXlJZGVudGlmaWVyICg0MCBoZXggY2hhcnMpLFxuICAgKiBzbyB3ZSBzdHJpcCB0aGUgXCIzMDE2ODAxNFwiIHByZWZpeCB3aGVuIHByZXNlbnQuXG4gICAqL1xuICBpZiAoYWtpLnN0YXJ0c1dpdGgoXCIzMDE2ODAxNFwiKSAmJiBha2kubGVuZ3RoID49IDggKyA0MClcbiAgICBha2kgPSBha2kuc2xpY2UoOCwgOCArIDQwKTtcblxuICByZXR1cm4geyBha2ksIHNlcmlhbDogeDUwOUNlcnRpZmljYXRlLnNlcmlhbE51bWJlciB9O1xufVxuIiwiaW1wb3J0ICogYXMgeDUwOSBmcm9tIFwiQHBlY3VsaWFyL3g1MDlcIjtcbmltcG9ydCB7IENyeXB0bywgQ3J5cHRvS2V5IH0gZnJvbSBcIkBwZWN1bGlhci93ZWJjcnlwdG9cIjtcbmltcG9ydCB7IHN0cmluZ0Zvcm1hdCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGlzQnJvd3NlciwgTWluaUxvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG5jb25zdCBjcnlwdG8gPSBuZXcgQ3J5cHRvKCk7XG54NTA5LmNyeXB0b1Byb3ZpZGVyLnNldChjcnlwdG8pO1xuXG5leHBvcnQgZW51bSBCQVNFX0FMUEhBQkVUIHtcbiAgQkFTRTIgPSBcIjAxXCIsXG4gIEJBU0U4ID0gXCIwMTIzNDU2N1wiLFxuICBCQVNFMTEgPSBcIjAxMjM0NTY3ODlhXCIsXG4gIEJBU0UxNiA9IFwiMDEyMzQ1Njc4OWFiY2RlZlwiLFxuICBCQVNFMzIgPSBcIjAxMjM0NTY3ODlBQkNERUZHSEpLTU5QUVJTVFZXWFlaXCIsXG4gIEJBU0UzMl9aID0gXCJ5Ym5kcmZnOGVqa21jcHF4b3QxdXdpc3phMzQ1aDc2OVwiLFxuICBCQVNFMzYgPSBcIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiLFxuICBCQVNFNTggPSBcIjEyMzQ1Njc4OUFCQ0RFRkdISktMTU5QUVJTVFVWV1hZWmFiY2RlZmdoaWprbW5vcHFyc3R1dnd4eXpcIixcbiAgQkFTRTYyID0gXCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWlwiLFxuICBCQVNFNjQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky9cIixcbiAgQkFTRTY3ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fLiF+XCIsXG59XG5cbmV4cG9ydCB0eXBlIGtleU9iamVjdCA9IHtcbiAgaXY6IEFycmF5QnVmZmVyO1xuICBrZXk6IENyeXB0b0tleTtcbn07XG5cbmV4cG9ydCBlbnVtIENSWVBUTyB7XG4gIEhBU0ggPSBcIlNIQS0yNTZcIixcbiAgSVRFUkFUSU9OUyA9IDEwMDAsXG4gIEtFWUxFTkdUSCA9IDQ4LFxuICBERVJJVkVEX0lWX0xFTkdUSCA9IDE2LFxuICBERVJJVkVEX0tFWV9MRU5HVEggPSAzMiwgLy8gQmVjYXVzZSBTSEEtMjU2IHVzZWQgaGFzIGEgbmF0aXZlIHNpemUgb2YgMzIgYnl0ZXNcbiAgQUxHT1JZVEhNID0gXCJBRVMtR0NNXCIsXG4gIEtFWV9BTEdPUllUSE0gPSBcIlBCS0RGMlwiLFxufVxuXG5leHBvcnQgY2xhc3MgQmFzZUVuY29kZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VNYXA6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGJhc2U6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBsZWFkZXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBmYWN0b3I6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBpRmFjdG9yOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhbHBoYWJldDogQkFTRV9BTFBIQUJFVCkge1xuICAgIGlmICh0aGlzLmFscGhhYmV0Lmxlbmd0aCA+PSAyNTUpIHRocm93IG5ldyBFcnJvcihcIkFscGhhYmV0IHRvbyBsb25nXCIpO1xuXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmJhc2VNYXAubGVuZ3RoOyBqKyspIHRoaXMuYmFzZU1hcFtqXSA9IDI1NTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxwaGFiZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHggPSBhbHBoYWJldC5jaGFyQXQoaSk7XG4gICAgICBjb25zdCB4YyA9IHguY2hhckNvZGVBdCgwKTtcbiAgICAgIGlmICh0aGlzLmJhc2VNYXBbeGNdICE9PSAyNTUpIHRocm93IG5ldyBFcnJvcih4ICsgXCIgaXMgYW1iaWd1b3VzXCIpO1xuXG4gICAgICB0aGlzLmJhc2VNYXBbeGNdID0gaTtcbiAgICB9XG5cbiAgICB0aGlzLmJhc2UgPSB0aGlzLmFscGhhYmV0Lmxlbmd0aDtcbiAgICB0aGlzLmxlYWRlciA9IHRoaXMuYWxwaGFiZXQuY2hhckF0KDApO1xuICAgIHRoaXMuZmFjdG9yID0gTWF0aC5sb2codGhpcy5iYXNlKSAvIE1hdGgubG9nKDI1Nik7IC8vIGxvZyhCQVNFKSAvIGxvZygyNTYpLCByb3VuZGVkIHVwXG4gICAgdGhpcy5pRmFjdG9yID0gTWF0aC5sb2coMjU2KSAvIE1hdGgubG9nKHRoaXMuYmFzZSk7IC8vIGxvZygyNTYpIC8gbG9nKEJBU0UpLCByb3VuZGVkIHVwXG4gIH1cblxuICBlbmNvZGUoc291cmNlOiBVaW50OEFycmF5IHwgRGF0YVZpZXcgfCBhbnlbXSB8IHN0cmluZykge1xuICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBzb3VyY2UgPSBCdWZmZXIuZnJvbShzb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHNvdXJjZSkpIHtcbiAgICAgIHNvdXJjZSA9IG5ldyBVaW50OEFycmF5KFxuICAgICAgICBzb3VyY2UuYnVmZmVyLFxuICAgICAgICBzb3VyY2UuYnl0ZU9mZnNldCxcbiAgICAgICAgc291cmNlLmJ5dGVMZW5ndGhcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgIHNvdXJjZSA9IFVpbnQ4QXJyYXkuZnJvbShzb3VyY2UpO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2UubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcblxuICAgIC8vIFNraXAgJiBjb3VudCBsZWFkaW5nIHplcm9lcy5cbiAgICBsZXQgemVyb2VzID0gMDtcbiAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICBsZXQgcGJlZ2luID0gMDtcbiAgICBjb25zdCBwZW5kID0gc291cmNlLmxlbmd0aDtcbiAgICB3aGlsZSAocGJlZ2luICE9PSBwZW5kICYmIHNvdXJjZVtwYmVnaW5dID09PSAwKSB7XG4gICAgICBwYmVnaW4rKztcbiAgICAgIHplcm9lcysrO1xuICAgIH1cbiAgICAvLyBBbGxvY2F0ZSBlbm91Z2ggc3BhY2UgaW4gYmlnLWVuZGlhbiBiYXNlNTggcmVwcmVzZW50YXRpb24uXG4gICAgY29uc3Qgc2l6ZSA9ICgocGVuZCAtIHBiZWdpbikgKiB0aGlzLmlGYWN0b3IgKyAxKSA+Pj4gMDtcbiAgICBjb25zdCBiNTggPSBuZXcgVWludDhBcnJheShzaXplKTtcbiAgICAvLyBQcm9jZXNzIHRoZSBieXRlcy5cbiAgICB3aGlsZSAocGJlZ2luICE9PSBwZW5kKSB7XG4gICAgICBsZXQgY2FycnkgPSBzb3VyY2VbcGJlZ2luXTtcbiAgICAgIC8vIEFwcGx5IFwiYjU4ID0gYjU4ICogMjU2ICsgY2hcIi5cbiAgICAgIGxldCBpID0gMDtcbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBpdDEgPSBzaXplIC0gMTtcbiAgICAgICAgKGNhcnJ5ICE9PSAwIHx8IGkgPCBsZW5ndGgpICYmIGl0MSAhPT0gLTE7XG4gICAgICAgIGl0MS0tLCBpKytcbiAgICAgICkge1xuICAgICAgICBjYXJyeSArPSAoMjU2ICogYjU4W2l0MV0pID4+PiAwO1xuICAgICAgICBiNThbaXQxXSA9IGNhcnJ5ICUgdGhpcy5iYXNlID4+PiAwO1xuICAgICAgICBjYXJyeSA9IChjYXJyeSAvIHRoaXMuYmFzZSkgPj4+IDA7XG4gICAgICB9XG4gICAgICBpZiAoY2FycnkgIT09IDApIHRocm93IG5ldyBFcnJvcihcIk5vbi16ZXJvIGNhcnJ5XCIpO1xuXG4gICAgICBsZW5ndGggPSBpO1xuICAgICAgcGJlZ2luKys7XG4gICAgfVxuICAgIC8vIFNraXAgbGVhZGluZyB6ZXJvZXMgaW4gYmFzZTU4IHJlc3VsdC5cbiAgICBsZXQgaXQyID0gc2l6ZSAtIGxlbmd0aDtcbiAgICB3aGlsZSAoaXQyICE9PSBzaXplICYmIGI1OFtpdDJdID09PSAwKSBpdDIrKztcblxuICAgIC8vIFRyYW5zbGF0ZSB0aGUgcmVzdWx0IGludG8gYSBzdHJpbmcuXG4gICAgbGV0IHN0ciA9IHRoaXMubGVhZGVyLnJlcGVhdCh6ZXJvZXMpO1xuICAgIGZvciAoOyBpdDIgPCBzaXplOyArK2l0Mikge1xuICAgICAgc3RyICs9IHRoaXMuYWxwaGFiZXQuY2hhckF0KGI1OFtpdDJdKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIHByaXZhdGUgZGVjb2RlVW5zYWZlKHNvdXJjZTogc3RyaW5nKTogVWludDhBcnJheSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHNvdXJjZS5sZW5ndGggPT09IDApIHJldHVybiBuZXcgVWludDhBcnJheSgwKTtcblxuICAgIGxldCBwc3ogPSAwO1xuICAgIC8vIFNraXAgYW5kIGNvdW50IGxlYWRpbmcgJzEncy5cbiAgICBsZXQgemVyb2VzID0gMDtcbiAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICB3aGlsZSAoc291cmNlW3Bzel0gPT09IHRoaXMubGVhZGVyKSB7XG4gICAgICB6ZXJvZXMrKztcbiAgICAgIHBzeisrO1xuICAgIH1cbiAgICAvLyBBbGxvY2F0ZSBlbm91Z2ggc3BhY2UgaW4gYmlnLWVuZGlhbiBiYXNlMjU2IHJlcHJlc2VudGF0aW9uLlxuICAgIGNvbnN0IHNpemUgPSAoKHNvdXJjZS5sZW5ndGggLSBwc3opICogdGhpcy5mYWN0b3IgKyAxKSA+Pj4gMDsgLy8gbG9nKDU4KSAvIGxvZygyNTYpLCByb3VuZGVkIHVwLlxuICAgIGNvbnN0IGIyNTYgPSBuZXcgVWludDhBcnJheShzaXplKTtcbiAgICAvLyBQcm9jZXNzIHRoZSBjaGFyYWN0ZXJzLlxuICAgIHdoaWxlIChzb3VyY2VbcHN6XSkge1xuICAgICAgLy8gRGVjb2RlIGNoYXJhY3RlclxuICAgICAgbGV0IGNhcnJ5ID0gdGhpcy5iYXNlTWFwW3NvdXJjZS5jaGFyQ29kZUF0KHBzeildO1xuICAgICAgLy8gSW52YWxpZCBjaGFyYWN0ZXJcbiAgICAgIGlmIChjYXJyeSA9PT0gMjU1KSByZXR1cm47XG5cbiAgICAgIGxldCBpID0gMDtcbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBpdDMgPSBzaXplIC0gMTtcbiAgICAgICAgKGNhcnJ5ICE9PSAwIHx8IGkgPCBsZW5ndGgpICYmIGl0MyAhPT0gLTE7XG4gICAgICAgIGl0My0tLCBpKytcbiAgICAgICkge1xuICAgICAgICBjYXJyeSArPSAodGhpcy5iYXNlICogYjI1NltpdDNdKSA+Pj4gMDtcbiAgICAgICAgYjI1NltpdDNdID0gY2FycnkgJSAyNTYgPj4+IDA7XG4gICAgICAgIGNhcnJ5ID0gKGNhcnJ5IC8gMjU2KSA+Pj4gMDtcbiAgICAgIH1cbiAgICAgIGlmIChjYXJyeSAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKFwiTm9uLXplcm8gY2FycnlcIik7XG5cbiAgICAgIGxlbmd0aCA9IGk7XG4gICAgICBwc3orKztcbiAgICB9XG4gICAgLy8gU2tpcCBsZWFkaW5nIHplcm9lcyBpbiBiMjU2LlxuICAgIGxldCBpdDQgPSBzaXplIC0gbGVuZ3RoO1xuICAgIHdoaWxlIChpdDQgIT09IHNpemUgJiYgYjI1NltpdDRdID09PSAwKSBpdDQrKztcblxuICAgIGNvbnN0IHZjaCA9IG5ldyBVaW50OEFycmF5KHplcm9lcyArIChzaXplIC0gaXQ0KSk7XG4gICAgbGV0IGogPSB6ZXJvZXM7XG4gICAgd2hpbGUgKGl0NCAhPT0gc2l6ZSkgdmNoW2orK10gPSBiMjU2W2l0NCsrXTtcblxuICAgIHJldHVybiB2Y2g7XG4gIH1cblxuICBkZWNvZGUoc291cmNlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBidWZmZXIgPSB0aGlzLmRlY29kZVVuc2FmZShzb3VyY2UpO1xuICAgIGlmIChidWZmZXIpIHJldHVybiBidWZmZXI7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm9uLWJhc2VcIiArIHRoaXMuYmFzZSArIFwiIGNoYXJhY3RlclwiKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ3J5cHRvVXRpbHMge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBiNThlbmNvZGVyID0gbmV3IEJhc2VFbmNvZGVyKEJBU0VfQUxQSEFCRVQuQkFTRTU4KTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IE1pbmlMb2dnZXIoQ3J5cHRvVXRpbHMubmFtZSk7XG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIHN0YXRpYyBmYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoc3RyaW5nRm9ybWF0KFwiUGFyc2luZyBjZXJ0aWZpY2F0ZTogezB9XCIsIGNlcnRpZmljYXRlKSk7XG4gICAgY29uc3QgY2VydCA9IG5ldyB4NTA5Llg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3QgeyBzdWJqZWN0LCBpc3N1ZXIgfSA9IGNlcnQ7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBzdHJpbmdGb3JtYXQoXG4gICAgICAgIFwiQ2VydGlmaWNhdGUgcGFyc2VkIHdpdGggc3ViamVjdCB7MH0gYW5kIGlzc3VlciB7MX1cIixcbiAgICAgICAgc3ViamVjdCxcbiAgICAgICAgaXNzdWVyXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gYHg1MDk6Oi8ke3N1YmplY3QucmVwbGFjZUFsbChcIiwgXCIsIFwiL1wiKX06Oi8ke2lzc3Vlci5yZXBsYWNlQWxsKFwiLCBcIiwgXCIvXCIpfWA7XG4gIH1cblxuICBzdGF0aWMgZW5jb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iNThlbmNvZGVyLmVuY29kZShzdHIpO1xuICB9XG4gIHN0YXRpYyBkZWNvZGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRlY29kZWQgPSB0aGlzLmI1OGVuY29kZXIuZGVjb2RlKHN0cik7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGRlY29kZWQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdGF0aWMgc3RyaW5nVG9BcnJheUJ1ZmZlcihzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihzdHIubGVuZ3RoKTtcbiAgICBjb25zdCBidWZWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICBmb3IgKGxldCBpID0gMCwgc3RyTGVuID0gc3RyLmxlbmd0aDsgaSA8IHN0ckxlbjsgaSsrKSB7XG4gICAgICBidWZWaWV3W2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBleHRyYWN0S2V5KFxuICAgIHR5cGU6IFwicHJpdmF0ZVwiIHwgXCJwdWJsaWNcIixcbiAgICBwZW06IEJ1ZmZlciB8IHN0cmluZyxcbiAgICB1c2FnZXM/OiBhbnlbXVxuICApIHtcbiAgICBjb25zdCBzdWJ0bGUgPSBjcnlwdG8uc3VidGxlO1xuXG4gICAgY29uc3Qgc3RyID0gcGVtXG4gICAgICAudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgICAucmVwbGFjZShcbiAgICAgICAgbmV3IFJlZ0V4cChgLS0tLS1CRUdJTiAoJHt0eXBlLnRvVXBwZXJDYXNlKCl9IEtFWXxDRVJUSUZJQ0FURSktLS0tLWApLFxuICAgICAgICBcIlwiXG4gICAgICApXG4gICAgICAucmVwbGFjZUFsbChcIlxcblwiLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoXG4gICAgICAgIG5ldyBSZWdFeHAoYC0tLS0tRU5EICgke3R5cGUudG9VcHBlckNhc2UoKX0gS0VZfENFUlRJRklDQVRFKS0tLS0tYCksXG4gICAgICAgIFwiXCJcbiAgICAgICk7XG4gICAgY29uc3QgZGVjb2RlZCA9IEJ1ZmZlci5mcm9tKHN0ciwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJiaW5hcnlcIik7XG4gICAgY29uc3QgYmluYXJ5RGVyID0gdGhpcy5zdHJpbmdUb0FycmF5QnVmZmVyKGRlY29kZWQpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICBcInBrY3M4XCIsXG4gICAgICBiaW5hcnlEZXIsXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgbmFtZWRDdXJ2ZTogXCJQLTI1NlwiLFxuICAgICAgfSxcbiAgICAgIHRydWUsXG4gICAgICB1c2FnZXMgPyB1c2FnZXMgOiBbXCJzaWduXCJdXG4gICAgKTtcblxuICAgIHJldHVybiBrZXk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZXh0cmFjdFByaXZhdGVLZXkocGVtOiBCdWZmZXIgfCBzdHJpbmcsIHVzYWdlcz86IGFueVtdKSB7XG4gICAgcmV0dXJuIHRoaXMuZXh0cmFjdEtleShcInByaXZhdGVcIiwgcGVtLCB1c2FnZXMpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGV4dHJhY3RQdWJsaWNLZXkocGVtOiBCdWZmZXIgfCBzdHJpbmcsIHVzYWdlcz86IGFueVtdKSB7XG4gICAgcmV0dXJuIHRoaXMuZXh0cmFjdEtleShcInB1YmxpY1wiLCBwZW0sIHVzYWdlcyk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgc2lnbihwcml2YXRlS2V5OiBzdHJpbmcsIGRhdGE6IEJ1ZmZlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5leHRyYWN0UHJpdmF0ZUtleShwcml2YXRlS2V5KTtcbiAgICBjb25zdCBidWZmID0gKGF3YWl0IGNyeXB0by5zdWJ0bGUuc2lnbihcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJFQ0RTQVwiLFxuICAgICAgICBoYXNoOiBcIlNIQS0yNTZcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBkYXRhIGFzIGFueVxuICAgICkpIGFzIEFycmF5QnVmZmVyO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkoYnVmZikpXG4gICAgICAubWFwKChiKSA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIikpXG4gICAgICAuam9pbihcIlwiKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyB2ZXJpZnkoXG4gICAgY2VydGlmaWNhdGU6IHN0cmluZyxcbiAgICBzaWduYXR1cmU6IEJ1ZmZlciB8IHN0cmluZyxcbiAgICBkYXRhOiBCdWZmZXIgfCBzdHJpbmdcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2VydCA9IG5ldyB4NTA5Llg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2VydC5wdWJsaWNLZXkuZXhwb3J0KCk7XG4gICAgc2lnbmF0dXJlID0gKFxuICAgICAgdHlwZW9mIHNpZ25hdHVyZSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSwgXCJoZXhcIikgOiBzaWduYXR1cmVcbiAgICApIGFzIEJ1ZmZlcjtcbiAgICBkYXRhID0gKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiID8gQnVmZmVyLmZyb20oZGF0YSkgOiBkYXRhKSBhcyBCdWZmZXI7XG4gICAgcmV0dXJuIGNyeXB0by5zdWJ0bGUudmVyaWZ5KFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIGhhc2g6IFwiU0hBLTI1NlwiLFxuICAgICAgfSxcbiAgICAgIGtleSxcbiAgICAgIHNpZ25hdHVyZSBhcyBhbnksXG4gICAgICBkYXRhIGFzIGFueVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZW5jcnlwdChjZXJ0aWZpY2F0ZTogc3RyaW5nLCBkYXRhOiBzdHJpbmcgfCBCdWZmZXIpIHtcbiAgICBjb25zdCBjZXJ0ID0gbmV3IHg1MDkuWDUwOUNlcnRpZmljYXRlKGNlcnRpZmljYXRlKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBjZXJ0LnB1YmxpY0tleS5leHBvcnQoKTtcbiAgICBkYXRhID0gKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiID8gQnVmZmVyLmZyb20oZGF0YSkgOiBkYXRhKSBhcyBCdWZmZXI7XG4gICAgY29uc3QgYnVmZiA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZW5jcnlwdChcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJFQ0RTQVwiLFxuICAgICAgfSxcbiAgICAgIGtleSxcbiAgICAgIGRhdGFcbiAgICApO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkoYnVmZikpXG4gICAgICAubWFwKChiKSA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIikpXG4gICAgICAuam9pbihcIlwiKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldFN1YnRsZUNyeXB0bygpIHtcbiAgICByZXR1cm4gaXNCcm93c2VyKClcbiAgICAgID8gKGdsb2JhbFRoaXMgYXMgYW55KS53aW5kb3cuY3J5cHRvLnN1YnRsZVxuICAgICAgOiBjcnlwdG8uc3VidGxlO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGRlY3J5cHQocHJpdmF0ZUtleTogc3RyaW5nLCBkYXRhOiBzdHJpbmcgfCBCdWZmZXIpIHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXkpO1xuICAgIGRhdGEgPSAoXG4gICAgICB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEsIFwiaGV4XCIpIDogZGF0YVxuICAgICkgYXMgQnVmZmVyO1xuICAgIHJldHVybiB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmRlY3J5cHQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBkYXRhXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIGdldCBhIHJhbmRvbSBtYXN0ZXIga2V5XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvbiBJZiBkYXRhIGlzIG5vdCBwYXNzZWQsIGEgcmFuZG9tIEFycmF5QnVmZmVyIHdpbGwgYmUgZ2VuZXJhdGVkXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGRhdGEgZW5jcnl0aW9uIGRhdGFcbiAgICpcbiAgICogQGZ1bmN0aW9uIGdldE1hc3RlclxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldE1hc3RlcihkYXRhPzogQXJyYXlCdWZmZXIpOiBQcm9taXNlPGtleU9iamVjdD4ge1xuICAgIGNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZ2VuR2VuZXNpcyA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgICBkYXRhID0gdGV4dEVuY29kZXIuZW5jb2RlKGdlbkdlbmVzaXMpLmJ1ZmZlcjtcbiAgICB9XG5cbiAgICBjb25zdCBpbXBvcnRlZEtleSA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuaW1wb3J0S2V5KFxuICAgICAgXCJyYXdcIixcbiAgICAgIGRhdGEsXG4gICAgICBDUllQVE8uS0VZX0FMR09SWVRITSBhcyBzdHJpbmcsXG4gICAgICBmYWxzZSxcbiAgICAgIFtcImRlcml2ZUJpdHNcIl1cbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogaW1wb3J0ZWRLZXksXG4gICAgICBpdjogZGF0YSEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIGRlcml2ZSBhIGtleSBmcm9tIGFub3RoZXIga2V5XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzYWx0XG4gICAqIEBwYXJhbSB7Q3J5cHRvS2V5fSBrZXkgT3JpZ2luYWwga2V5XG4gICAqXG4gICAqIEBmdW5jdGlvbiBnZXREZXJpdmF0aW9uS2V5XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0RGVyaXZhdGlvbktleShzYWx0OiBzdHJpbmcsIGtleTogQ3J5cHRvS2V5KSB7XG4gICAgY29uc3QgdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICBjb25zdCBzYWx0QnVmZmVyID0gdGV4dEVuY29kZXIuZW5jb2RlKHNhbHQpO1xuICAgIGNvbnN0IHNhbHRIYXNoZWQgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmRpZ2VzdChcbiAgICAgIFwiU0hBLTI1NlwiLFxuICAgICAgc2FsdEJ1ZmZlclxuICAgICk7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbmFtZTogQ1JZUFRPLktFWV9BTEdPUllUSE0gYXMgc3RyaW5nLFxuICAgICAgaGFzaDogQ1JZUFRPLkhBU0gsXG4gICAgICBzYWx0OiBzYWx0SGFzaGVkLFxuICAgICAgaXRlcmF0aW9uczogQ1JZUFRPLklURVJBVElPTlMsXG4gICAgfTtcbiAgICBjb25zdCBkZXJpdmF0aW9uID0gYXdhaXQgdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kZXJpdmVCaXRzKFxuICAgICAgcGFyYW1zLFxuICAgICAga2V5LFxuICAgICAgQ1JZUFRPLktFWUxFTkdUSCAqIDhcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmdldEtleShkZXJpdmF0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5IGFuZCBJViBmcm9tIHRoZSBDcnl0b0tleSBhcnJheVxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBkZXJpdmF0aW9uXG4gICAqXG4gICAqIEBmdW5jdGlvbiBnZXRLZXlcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRLZXkoZGVyaXZhdGlvbjogQXJyYXlCdWZmZXIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgY29uc3QgaXZsZW4gPSAxNjtcbiAgICBjb25zdCBrZXlsZW4gPSAzMjtcbiAgICBjb25zdCBkZXJpdmVkS2V5ID0gZGVyaXZhdGlvbi5zbGljZSgwLCBrZXlsZW4pO1xuICAgIGNvbnN0IGl2ID0gZGVyaXZhdGlvbi5zbGljZShrZXlsZW4pO1xuICAgIGNvbnN0IGltcG9ydGVkRW5jcnlwdGlvbktleSA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuaW1wb3J0S2V5KFxuICAgICAgXCJyYXdcIixcbiAgICAgIGRlcml2ZWRLZXksXG4gICAgICB7IG5hbWU6IENSWVBUTy5BTEdPUllUSE0gYXMgc3RyaW5nIH0sXG4gICAgICBmYWxzZSxcbiAgICAgIFtcImVuY3J5cHRcIiwgXCJkZWNyeXB0XCJdXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiBpbXBvcnRlZEVuY3J5cHRpb25LZXksXG4gICAgICBpdjogaXYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIGRlY3J5cHQgZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICAgKiBAcGFyYW0ge2tleU9iamVjdH0ga2V5T2JqZWN0XG4gICAqXG4gICAqIEBmdW5jdGlvbiBlbmNyeXB0XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZW5jcnlwdFBpbihcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAga2V5T2JqZWN0OiBrZXlPYmplY3RcbiAgKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4ge1xuICAgIGNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgY29uc3QgdGV4dEJ1ZmZlciA9IHRleHRFbmNvZGVyLmVuY29kZSh0ZXh0KTtcbiAgICBjb25zdCBlbmNyeXB0ZWRUZXh0ID0gYXdhaXQgdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5lbmNyeXB0KFxuICAgICAgeyBuYW1lOiBDUllQVE8uQUxHT1JZVEhNIGFzIHN0cmluZywgaXY6IGtleU9iamVjdC5pdiB9LFxuICAgICAga2V5T2JqZWN0LmtleSxcbiAgICAgIHRleHRCdWZmZXJcbiAgICApO1xuICAgIHJldHVybiBlbmNyeXB0ZWRUZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFV0aWwgZnVuY3Rpb24gdG8gZGVjcnlwdCBkYXRhXG4gICAqXG4gICAqIEBwYXJhbSB7QnVmZmVyU291cmNlfSBlbmNyeXB0ZWRUZXh0XG4gICAqIEBwYXJhbSB7a2V5T2JqZWN0fSBrZXlPYmplY3RcbiAgICpcbiAgICogQGZ1bmN0aW9uIGRlY3J5cHRcbiAgICovXG4gIHN0YXRpYyBhc3luYyBkZWNyeXB0UGluKFxuICAgIGVuY3J5cHRlZFRleHQ6IEFycmF5QnVmZmVyLFxuICAgIGtleU9iamVjdDoga2V5T2JqZWN0XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgICBjb25zdCBkZWNyeXB0ZWRUZXh0ID0gYXdhaXQgdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kZWNyeXB0KFxuICAgICAgeyBuYW1lOiBDUllQVE8uQUxHT1JZVEhNIGFzIHN0cmluZywgaXY6IGtleU9iamVjdC5pdiB9LFxuICAgICAga2V5T2JqZWN0LmtleSxcbiAgICAgIGVuY3J5cHRlZFRleHRcbiAgICApO1xuICAgIHJldHVybiB0ZXh0RGVjb2Rlci5kZWNvZGUoZGVjcnlwdGVkVGV4dCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VFcnJvciwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG4vLyBpbXBvcnQgeyBNSVNTSU5HX1BSSVZBVEVfREFUQV9FUlJPUl9NRVNTQUdFIH0gZnJvbSBcIi4uL2NvbnRyYWN0cy9wcml2YXRlLWRhdGFcIjtcbi8qKlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBvdmVyZmxvdyBlcnJvciBpbiBhcml0aG1ldGljIG9wZXJhdGlvbnMgaW4gU21hcnQgQ29udHJhY3RzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0aGUgZXJyb3IgbWVzc2FnZVxuICpcbiAqIEBjbGFzcyBPdmVyZmxvd0Vycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgT3ZlcmZsb3dFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBPdmVyZmxvd0Vycm9yLm5hbWUpO1xuICB9XG59XG5cbi8qKlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhIGZhaWx1cmUgaW4gYmFsYW5jZSB0byBwZXJmb3JtIGEgdHJhbnNhY3Rpb24gaW4gU21hcnQgQ29udHJhY3RzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0aGUgZXJyb3IgbWVzc2FnZVxuICpcbiAqIEBjbGFzcyBCYWxhbmNlRXJyb3JcbiAqIEBleHRlbmRzIEludGVybmFsRXJyb3JcbiAqXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBCYWxhbmNlRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQmFsYW5jZUVycm9yLm5hbWUpO1xuICB9XG59XG5cbi8qKlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhIGZhaWx1cmUgaW4gYmFsYW5jZSB0byBwZXJmb3JtIGEgdHJhbnNhY3Rpb24gaW4gU21hcnQgQ29udHJhY3RzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0aGUgZXJyb3IgbWVzc2FnZVxuICpcbiAqIEBjbGFzcyBCYWxhbmNlRXJyb3JcbiAqIEBleHRlbmRzIEludGVybmFsRXJyb3JcbiAqXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBBbGxvd2FuY2VFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBBbGxvd2FuY2VFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIHJlZ2lzdHJhdGluZyBuZXcgZW50aXRpZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNnIHRoZSBlcnJvciBtZXNzYWdlXG4gKlxuICogQGNsYXNzIFJlZ2lzdHJhdGlvbkVycm9yXG4gKlxuICogQGNhdGVnb3J0IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgUmVnaXN0cmF0aW9uRXJyb3IgZXh0ZW5kcyBBdXRob3JpemF0aW9uRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBSZWdpc3RyYXRpb25FcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBhbiB1bnN1cHBvcnRlZCBvcGVyYXRpb24gaXMgYXR0ZW1wdGVkXG4gKiBAc3VtbWFyeSBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIGFuIG9wZXJhdGlvbiBpcyByZXF1ZXN0ZWQgdGhhdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50XG4gKiBwZXJzaXN0ZW5jZSBhZGFwdGVyIG9yIGNvbmZpZ3VyYXRpb24uIEl0IGV4dGVuZHMgdGhlIEJhc2VFcnJvciBjbGFzcyBhbmQgc2V0cyBhIDUwMCBzdGF0dXMgY29kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBhbiBFcnJvciBvYmplY3QgdG8gd3JhcFxuICogQGNsYXNzIFVuc3VwcG9ydGVkRXJyb3JcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBUaHJvd2luZyBhbiBVbnN1cHBvcnRlZEVycm9yXG4gKiBpZiAoIWFkYXB0ZXIuc3VwcG9ydHNUcmFuc2FjdGlvbnMoKSkge1xuICogICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignVHJhbnNhY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYWRhcHRlcicpO1xuICogfVxuICpcbiAqIC8vIENhdGNoaW5nIGFuIFVuc3VwcG9ydGVkRXJyb3JcbiAqIHRyeSB7XG4gKiAgIGF3YWl0IGFkYXB0ZXIuYmVnaW5UcmFuc2FjdGlvbigpO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRFcnJvcikge1xuICogICAgIGNvbnNvbGUuZXJyb3IoJ09wZXJhdGlvbiBub3Qgc3VwcG9ydGVkOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBNaXNzaW5nQ29udGV4dEVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIE1pc3NpbmdDb250ZXh0RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yID0gXCJNSVNTSU5HX1BSSVZBVEVfREFUQV9FUlJPUl9NRVNTQUdFXCIpIHtcbiAgICBzdXBlcihVbmF1dGhvcml6ZWRQcml2YXRlRGF0YUFjY2Vzcy5uYW1lLCBtc2csIDQwMyk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGVycm9yIHRoYXQgb2NjdXJzIHdoZW4gYSByZXF1aXJlZCBpbml0aWFsaXphdGlvbiBzdGVwIGlzIG5vdCBwZXJmb3JtZWQuXG4gKlxuICogQGNsYXNzIE5vdEluaXRpYWxpemVkRXJyb3JcbiAqIEBleHRlbmRzIEJhc2VFcnJvclxuICpcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZyB8IEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBhbiBFcnJvciBvYmplY3QgdG8gd3JhcC5cbiAqXG4gKiBAdGhyb3dzIHtOb3RJbml0aWFsaXplZEVycm9yfSAtIFRocm93cyBhbiBlcnJvciB3aGVuIGEgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24gc3RlcCBpcyBub3QgcGVyZm9ybWVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJbml0aWFsaXplIHRoZSBhcHBsaWNhdGlvblxuICogaWYgKCFpc0luaXRpYWxpemVkKSB7XG4gKiAgIHRocm93IG5ldyBOb3RJbml0aWFsaXplZEVycm9yKCdBcHBsaWNhdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQnKTtcbiAqIH1cbiAqXG4gKiAvLyBDYXRjaGluZyBhbiBOb3RJbml0aWFsaXplZEVycm9yXG4gKiB0cnkge1xuICogICAvLyBQZXJmb3JtIG9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIGluaXRpYWxpemF0aW9uXG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RJbml0aWFsaXplZEVycm9yKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcignSW5pdGlhbGl6YXRpb24gZXJyb3I6JywgZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTm90SW5pdGlhbGl6ZWRFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihOb3RJbml0aWFsaXplZEVycm9yLm5hbWUsIG1zZywgNDA5KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWlzc2luZ1BLQ1NTMTFMaWIgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgTWlzc2luZ1BLQ1NTMTFMaWIubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5kb3JzZW1lbnRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIEVuZG9yc2VtZW50RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTXZjY1JlYWRDb25mbGljdEVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgTXZjY1JlYWRDb25mbGljdEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBoYW50b21SZWFkQ29uZmxpY3RFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFBoYW50b21SZWFkQ29uZmxpY3RFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbmRvcnNlbWVudFBvbGljeUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgRW5kb3JzZW1lbnRQb2xpY3lFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkxpbWl0c0Vycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IEVycm9yLFxuICAgIG5hbWU6IHN0cmluZyA9IFRyYW5zYWN0aW9uTGltaXRzRXJyb3IubmFtZSxcbiAgICBjb2RlID0gNTkwXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIG5hbWUsIGNvZGUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvblRpbWVvdXRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFRyYW5zYWN0aW9uVGltZW91dEVycm9yLm5hbWUsIDU5MSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQnVmZmVyU2l6ZUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgVHJhbnNhY3Rpb25CdWZmZXJTaXplRXJyb3IubmFtZSwgNTkyKTtcbiAgfVxufVxuIiwiaW1wb3J0IEZhYnJpY0NBU2VydmljZXMgZnJvbSBcImZhYnJpYy1jYS1jbGllbnRcIjtcbmltcG9ydCB7XG4gIEFmZmlsaWF0aW9uU2VydmljZSxcbiAgSWRlbnRpdHlTZXJ2aWNlLFxuICBJRW5yb2xsUmVzcG9uc2UsXG4gIElSZWdpc3RlclJlcXVlc3QsXG4gIElTZXJ2aWNlUmVzcG9uc2UsXG4gIFRMU09wdGlvbnMsXG59IGZyb20gXCJmYWJyaWMtY2EtY2xpZW50XCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7IENBQ29uZmlnLCBDcmVkZW50aWFscyB9IGZyb20gXCIuLi8uLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9tb2RlbC9JZGVudGl0eVwiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBDb25mbGljdEVycm9yLFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvcmVVdGlscyB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQ0FfUk9MRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ3J5cHRvVXRpbHMgfSBmcm9tIFwiLi4vY3J5cHRvXCI7XG5pbXBvcnQge1xuICBDZXJ0aWZpY2F0ZVJlc3BvbnNlLFxuICBGYWJyaWNJZGVudGl0eSxcbiAgR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgSWRlbnRpdHlSZXNwb25zZSxcbn0gZnJvbSBcIi4uLy4uL3NoYXJlZC9mYWJyaWMtdHlwZXNcIjtcbmltcG9ydCB7IFJlZ2lzdHJhdGlvbkVycm9yIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9lcnJvcnNcIjtcbmltcG9ydCB7IExvZ2dlZENsYXNzLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEh5cGVybGVkZ2VyIEZhYnJpYyBDQSBpZGVudGl0eSB0eXBlcy5cbiAqIEBzdW1tYXJ5IEVudW1lcmF0ZXMgdGhlIHN1cHBvcnRlZCBpZGVudGl0eSB0eXBlcyByZWNvZ25pemVkIGJ5IEZhYnJpYyBDQSBmb3IgcmVnaXN0cmF0aW9uIGFuZCBpZGVudGl0eSBtYW5hZ2VtZW50LlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgZW51bSBIRkNBSWRlbnRpdHlUeXBlIHtcbiAgUEVFUiA9IFwicGVlclwiLFxuICBPUkRFUkVSID0gXCJvcmRlcmVyXCIsXG4gIENMSUVOVCA9IFwiY2xpZW50XCIsXG4gIFVTRVIgPSBcInVzZXJcIixcbiAgQURNSU4gPSBcImFkbWluXCIsXG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLZXkvdmFsdWUgYXR0cmlidXRlIHVzZWQgZHVyaW5nIENBIHJlZ2lzdHJhdGlvbi5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW4gYXR0cmlidXRlIGVudHJ5IHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGEgRmFicmljIENBIGlkZW50aXR5IGR1cmluZyByZWdpc3RyYXRpb24sIG9wdGlvbmFsbHkgbWFya2luZyBpdCBmb3IgaW5jbHVzaW9uIGluIGVjZXJ0LlxuICogQGludGVyZmFjZSBJS2V5VmFsdWVBdHRyaWJ1dGVcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIEF0dHJpYnV0ZSBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gQXR0cmlidXRlIHZhbHVlLlxuICogQHBhcmFtIHtib29sZWFufSBbZWNlcnRdIC0gV2hldGhlciB0aGUgYXR0cmlidXRlIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgZW5yb2xsbWVudCBjZXJ0aWZpY2F0ZSAoRUNlcnQpLlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElLZXlWYWx1ZUF0dHJpYnV0ZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgZWNlcnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdGFuZGFyZCBGYWJyaWMgQ0EgaWRlbnRpdHkgYXR0cmlidXRlIGtleXMuXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHdlbGwta25vd24gRmFicmljIENBIGF0dHJpYnV0ZSBrZXlzIHRoYXQgY2FuIGJlIGFzc2lnbmVkIHRvIGlkZW50aXRpZXMgZm9yIGRlbGVnYXRpb25zIGFuZCBwZXJtaXNzaW9ucy5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGVudW0gSEZDQUlkZW50aXR5QXR0cmlidXRlcyB7XG4gIEhGUkVHSVNUUkFSUk9MRVMgPSBcImhmLlJlZ2lzdHJhci5Sb2xlc1wiLFxuICBIRlJFR0lTVFJBUkRFTEVHQVRFUk9MRVMgPSBcImhmLlJlZ2lzdHJhci5EZWxlZ2F0ZVJvbGVzXCIsXG4gIEhGUkVHSVNUUkFSQVRUUklCVVRFUyA9IFwiaGYuUmVnaXN0cmFyLkF0dHJpYnV0ZXNcIixcbiAgSEZJTlRFUk1FRElBVEVDQSA9IFwiaGYuSW50ZXJtZWRpYXRlQ0FcIixcbiAgSEZSRVZPS0VSID0gXCJoZi5SZXZva2VyXCIsXG4gIEhGQUZGSUxJQVRJT05NR1IgPSBcImhmLkFmZmlsaWF0aW9uTWdyXCIsXG4gIEhGR0VOQ1JMID0gXCJoZi5HZW5DUkxcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2VydmljZSB3cmFwcGVyIGZvciBpbnRlcmFjdGluZyB3aXRoIGEgRmFicmljIENBLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgaGlnaC1sZXZlbCBvcGVyYXRpb25zIGZvciBtYW5hZ2luZyBpZGVudGl0aWVzIGFnYWluc3QgYSBIeXBlcmxlZGdlciBGYWJyaWMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5LCBpbmNsdWRpbmcgcmVnaXN0cmF0aW9uLCBlbnJvbGxtZW50LCByZXZvY2F0aW9uLCBhbmQgYWRtaW5pc3RyYXRpdmUgcXVlcmllcy4gRW5jYXBzdWxhdGVzIGxvd2VyLWxldmVsIEZhYnJpYyBDQSBjbGllbnQgY2FsbHMgd2l0aCBjb25zaXN0ZW50IGxvZ2dpbmcgYW5kIGVycm9yIG1hcHBpbmcuXG4gKiBAcGFyYW0ge0NBQ29uZmlnfSBjYUNvbmZpZyAtIENvbm5lY3Rpb24gYW5kIFRMUyBjb25maWd1cmF0aW9uIGZvciB0aGUgdGFyZ2V0IENBLlxuICogQGNsYXNzIEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlXG4gKiBAZXhhbXBsZVxuICogLy8gUmVnaXN0ZXIgYW5kIGVucm9sbCBhIG5ldyB1c2VyXG4gKiBjb25zdCBzdmMgPSBuZXcgRmFicmljRW5yb2xsbWVudFNlcnZpY2Uoe1xuICogICB1cmw6ICdodHRwczovL2xvY2FsaG9zdDo3MDU0JyxcbiAqICAgY2FOYW1lOiAnT3JnMUNBJyxcbiAqICAgdGxzOiB7IHRydXN0ZWRSb290czogWycvcGF0aC90by9jYS5wZW0nXSwgdmVyaWZ5OiBmYWxzZSB9LFxuICogICBjYUNlcnQ6ICcvcGF0aC90by9hZG1pbi9jZXJ0RGlyJyxcbiAqICAgY2FLZXk6ICcvcGF0aC90by9hZG1pbi9rZXlEaXInXG4gKiB9KTtcbiAqIGF3YWl0IHN2Yy5yZWdpc3Rlcih7IHVzZXJOYW1lOiAnYWxpY2UnLCBwYXNzd29yZDogJ3MzY3IzdCcgfSwgZmFsc2UsICdvcmcxLmRlcGFydG1lbnQxJywgQ0FfUk9MRS5VU0VSKTtcbiAqIGNvbnN0IGlkID0gYXdhaXQgc3ZjLmVucm9sbCgnYWxpY2UnLCAnczNjcjN0Jyk7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIGF1dG9udW1iZXJcbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFN2YyBhcyBGYWJyaWNFbnJvbGxtZW50U2VydmljZVxuICogICBwYXJ0aWNpcGFudCBDQSBhcyBGYWJyaWMgQ0FcbiAqICAgQXBwLT4+U3ZjOiByZWdpc3RlcihjcmVkZW50aWFscywgLi4uKVxuICogICBTdmMtPj5DQTogcmVnaXN0ZXIocmVxdWVzdCwgYWRtaW5Vc2VyKVxuICogICBDQS0tPj5TdmM6IGVucm9sbG1lbnRTZWNyZXRcbiAqICAgU3ZjLS0+PkFwcDogc2VjcmV0XG4gKiAgIEFwcC0+PlN2YzogZW5yb2xsKGVucm9sbG1lbnRJZCwgc2VjcmV0KVxuICogICBTdmMtPj5DQTogZW5yb2xsKHtlbnJvbGxtZW50SUQsIHNlY3JldH0pXG4gKiAgIENBLS0+PlN2YzogY2VydGlmaWNhdGVzXG4gKiAgIFN2Yy0tPj5BcHA6IElkZW50aXR5XG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNFbnJvbGxtZW50U2VydmljZSBleHRlbmRzIExvZ2dlZENsYXNzIHtcbiAgcHJpdmF0ZSBjYT86IEZhYnJpY0NBU2VydmljZXM7XG5cbiAgcHJpdmF0ZSBjZXJ0aWZpY2F0ZVNlcnZpY2U/OiBhbnk7XG5cbiAgcHJpdmF0ZSBhZmZpbGlhdGlvblNlcnZpY2U/OiBBZmZpbGlhdGlvblNlcnZpY2U7XG5cbiAgcHJpdmF0ZSBpZGVudGl0eVNlcnZpY2U/OiBJZGVudGl0eVNlcnZpY2U7XG5cbiAgcHJpdmF0ZSBjbGllbnQ/OiBhbnk7XG5cbiAgcHJpdmF0ZSB1c2VyPzogVXNlcjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNhQ29uZmlnOiBDQUNvbmZpZykge1xuICAgIENvcmVVdGlscy5nZXRDcnlwdG9TdWl0ZShcbiAgICAgIGNhQ29uZmlnLmhzbVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHNvZnR3YXJlOiBmYWxzZSxcbiAgICAgICAgICAgIGxpYjogY2FDb25maWcuaHNtLmxpYnJhcnksXG4gICAgICAgICAgICBzbG90OiBjYUNvbmZpZy5oc20uc2xvdCxcbiAgICAgICAgICAgIGxhYmVsOiBjYUNvbmZpZy5oc20udG9rZW5MYWJlbCxcbiAgICAgICAgICAgIHBpbjogU3RyaW5nKGNhQ29uZmlnLmhzbS5waW4pLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICApO1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgVXNlcigpOiBQcm9taXNlPFVzZXI+IHtcbiAgICBpZiAodGhpcy51c2VyKSByZXR1cm4gdGhpcy51c2VyO1xuICAgIGNvbnN0IHsgY2FOYW1lLCBjYUNlcnQsIGNhS2V5LCB1cmwsIGhzbSB9ID0gdGhpcy5jYUNvbmZpZztcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5Vc2VyKTtcbiAgICBsb2cuZGVidWcoYENyZWF0aW5nIENBIHVzZXIgZm9yICR7Y2FOYW1lfSBhdCAke3VybH1gKTtcbiAgICBsb2cuZGVidWcoYFJldHJpZXZpbmcgQ0EgY2VydGlmaWNhdGUgZnJvbSAke2NhQ2VydH1gKTtcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGF3YWl0IENvcmVVdGlscy5nZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChjYUNlcnQpO1xuICAgIGxldCBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWhzbSkge1xuICAgICAgaWYgKCFjYUtleSkge1xuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTWlzc2luZyBjYUtleSBjb25maWd1cmF0aW9uIGZvciBDQSAke2NhTmFtZX0uIFByb3ZpZGUgYSBrZXkgZGlyZWN0b3J5IG9yIGNvbmZpZ3VyZSBIU00gc3VwcG9ydC5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFJldHJpZXZpbmcgQ0Ega2V5IGZyb20gJHtjYUtleX1gKTtcbiAgICAgIGtleSA9IGF3YWl0IENvcmVVdGlscy5nZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChjYUtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYFVzaW5nIEhTTSBjb25maWd1cmF0aW9uIGZvciBDQSAke2NhTmFtZX0gd2l0aCBsaWJyYXJ5ICR7aHNtLmxpYnJhcnl9YFxuICAgICAgKTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBMb2FkaW5nIEFkbWluIHVzZXIgZm9yIGNhICR7Y2FOYW1lfWApO1xuICAgIHRoaXMudXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoXCJhZG1pblwiLCBrZXksIGNlcnRpZmljYXRlLCBjYU5hbWUsIHtcbiAgICAgIGhzbSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy51c2VyO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIENBKCk6IFByb21pc2U8RmFicmljQ0FTZXJ2aWNlcz4ge1xuICAgIGlmICh0aGlzLmNhKSByZXR1cm4gdGhpcy5jYTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5DQSk7XG4gICAgY29uc3QgeyB1cmwsIHRscywgY2FOYW1lIH0gPSB0aGlzLmNhQ29uZmlnO1xuXG4gICAgLy8gRk9SIFNvbWUgUmVhc29uIHRoZSB2ZXJpZmljYXRpb24gZmFpbHMgbmVlZCB0byBpbnZlc3RpZ2F0ZSB0aGlzIHdvcmtzIGZvciBub3dcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgdHJ1c3RlZFJvb3RzLCB2ZXJpZnkgfSA9IHRscyBhcyBUTFNPcHRpb25zO1xuXG4gICAgY29uc3Qgcm9vdCA9ICh0cnVzdGVkUm9vdHMgYXMgc3RyaW5nW10pWzBdIGFzIHN0cmluZztcbiAgICBsb2cuZGVidWcoYFJldHJpZXZpbmcgQ0EgY2VydGlmaWNhdGUgZnJvbSAke3Jvb3R9LiBjd2Q6ICR7cHJvY2Vzcy5jd2QoKX1gKTtcblxuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpbGVDb250ZW50KHJvb3QpO1xuICAgIGxvZy5kZWJ1ZyhgQ3JlYXRpbmcgQ0EgQ2xpZW50IGZvciBDQSAke2NhTmFtZX0gdW5kZXIgJHt1cmx9YCk7XG4gICAgdGhpcy5jYSA9IG5ldyBGYWJyaWNDQVNlcnZpY2VzKFxuICAgICAgdXJsLFxuICAgICAge1xuICAgICAgICB0cnVzdGVkUm9vdHM6IEJ1ZmZlci5mcm9tKGNlcnRpZmljYXRlKSxcbiAgICAgICAgdmVyaWZ5LFxuICAgICAgfSBhcyBUTFNPcHRpb25zLFxuICAgICAgY2FOYW1lXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5jYTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBDbGllbnQoKTogUHJvbWlzZTx7IG5ld0NlcnRpZmljYXRlU2VydmljZTogYW55IH0+IHtcbiAgICBpZiAodGhpcy5jbGllbnQpIHJldHVybiB0aGlzLmNsaWVudDtcbiAgICBjb25zdCBjYSA9IGF3YWl0IHRoaXMuQ0EoKTtcbiAgICB0aGlzLmNsaWVudCA9IChjYSBhcyBhbnkpW1wiX0ZhYnJpY0NBU2VydmljZXNcIl07XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIENlcnRpZmljYXRlKCkge1xuICAgIGlmICghdGhpcy5jZXJ0aWZpY2F0ZVNlcnZpY2UpXG4gICAgICB0aGlzLmNlcnRpZmljYXRlU2VydmljZSA9IChhd2FpdCB0aGlzLkNsaWVudCgpKS5uZXdDZXJ0aWZpY2F0ZVNlcnZpY2UoKTtcbiAgICByZXR1cm4gdGhpcy5jZXJ0aWZpY2F0ZVNlcnZpY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgQWZmaWxpYXRpb25zKCkge1xuICAgIGlmICghdGhpcy5hZmZpbGlhdGlvblNlcnZpY2UpXG4gICAgICB0aGlzLmFmZmlsaWF0aW9uU2VydmljZSA9IChhd2FpdCB0aGlzLkNBKCkpLm5ld0FmZmlsaWF0aW9uU2VydmljZSgpO1xuICAgIHJldHVybiB0aGlzLmFmZmlsaWF0aW9uU2VydmljZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBJZGVudGl0aWVzKCkge1xuICAgIGlmICghdGhpcy5pZGVudGl0eVNlcnZpY2UpXG4gICAgICB0aGlzLmlkZW50aXR5U2VydmljZSA9IChhd2FpdCB0aGlzLkNBKCkpLm5ld0lkZW50aXR5U2VydmljZSgpO1xuICAgIHJldHVybiB0aGlzLmlkZW50aXR5U2VydmljZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmUgY2VydGlmaWNhdGVzIGZyb20gdGhlIENBLlxuICAgKiBAc3VtbWFyeSBDYWxscyB0aGUgQ0EgY2VydGlmaWNhdGUgc2VydmljZSB0byBsaXN0IGNlcnRpZmljYXRlcywgb3B0aW9uYWxseSBtYXBwaW5nIHRvIFBFTSBzdHJpbmdzIG9ubHkuXG4gICAqIEBwYXJhbSB7R2V0Q2VydGlmaWNhdGVzUmVxdWVzdH0gW3JlcXVlc3RdIC0gT3B0aW9uYWwgZmlsdGVyIHJlcXVlc3QgZm9yIGNlcnRpZmljYXRlIGxvb2t1cC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbZG9NYXA9dHJ1ZV0gLSBXaGVuIHRydWUsIHJldHVybnMgYXJyYXkgb2YgUEVNIHN0cmluZ3M7IG90aGVyd2lzZSByZXR1cm5zIGZ1bGwgcmVzcG9uc2Ugb2JqZWN0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZ1tdIHwgQ2VydGlmaWNhdGVSZXNwb25zZT59IEFycmF5IG9mIFBFTSBzdHJpbmdzIG9yIHRoZSBmdWxsIGNlcnRpZmljYXRlIHJlc3BvbnNlLlxuICAgKi9cbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzKFxuICAgIHJlcXVlc3Q/OiBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICAgIGRvTWFwID0gdHJ1ZVxuICApOiBQcm9taXNlPHN0cmluZ1tdIHwgQ2VydGlmaWNhdGVSZXNwb25zZT4ge1xuICAgIGNvbnN0IGNlcnRpZmljYXRlU2VydmljZSA9IGF3YWl0IHRoaXMuQ2VydGlmaWNhdGUoKTtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5Vc2VyKCk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0Q2VydGlmaWNhdGVzKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgUmV0cmlldmluZyBjZXJ0aWZpY2F0ZXMke3JlcXVlc3QgPyBgIGZvciAke3JlcXVlc3QuaWR9YCA6IFwiXCJ9IGZvciBDQSAke3RoaXMuY2FDb25maWcuY2FOYW1lfWBcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBDZXJ0aWZpY2F0ZVJlc3BvbnNlID0gKFxuICAgICAgYXdhaXQgY2VydGlmaWNhdGVTZXJ2aWNlLmdldENlcnRpZmljYXRlcyhyZXF1ZXN0IHx8IHt9LCB1c2VyKVxuICAgICkucmVzdWx0O1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBGb3VuZCAke3Jlc3BvbnNlLmNlcnRzLmxlbmd0aH0gY2VydGlmaWNhdGVzOiAke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlKX1gXG4gICAgKTtcbiAgICByZXR1cm4gZG9NYXAgPyByZXNwb25zZS5jZXJ0cy5tYXAoKGMpID0+IGMuUEVNKSA6IHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaXN0IGlkZW50aXRpZXMgcmVnaXN0ZXJlZCBpbiB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFF1ZXJpZXMgdGhlIENBIGlkZW50aXR5IHNlcnZpY2UgdG8gZmV0Y2ggYWxsIGlkZW50aXRpZXMgYW5kIHJldHVybnMgdGhlIGxpc3QgYXMgRmFicmljSWRlbnRpdHkgb2JqZWN0cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxGYWJyaWNJZGVudGl0eVtdPn0gVGhlIGxpc3Qgb2YgaWRlbnRpdGllcyByZWdpc3RlcmVkIGluIHRoZSBDQS5cbiAgICovXG4gIGFzeW5jIGdldElkZW50aXRpZXMoKTogUHJvbWlzZTxGYWJyaWNJZGVudGl0eVtdPiB7XG4gICAgY29uc3QgaWRlbnRpdGllc1NlcnZpY2UgPSBhd2FpdCB0aGlzLklkZW50aXRpZXMoKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRJZGVudGl0aWVzKTtcbiAgICBsb2cuZGVidWcoYFJldHJpZXZpbmcgSWRlbnRpdGllcyB1bmRlciBDQSAke3RoaXMuY2FDb25maWcuY2FOYW1lfWApO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBJZGVudGl0eVJlc3BvbnNlID0gKFxuICAgICAgYXdhaXQgaWRlbnRpdGllc1NlcnZpY2UuZ2V0QWxsKGF3YWl0IHRoaXMuVXNlcigpKVxuICAgICkucmVzdWx0O1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBGb3VuZCAke3Jlc3BvbnNlLmlkZW50aXRpZXMubGVuZ3RofSBJZGVudGl0aWVzOiAke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlKX1gXG4gICAgKTtcbiAgICByZXR1cm4gcmVzcG9uc2UuaWRlbnRpdGllcztcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUVycm9yKGU6IEVycm9yKSB7XG4gICAgY29uc3QgcmVnZXhwID0gLy4qY29kZTpcXHMoXFxkKykuKj9tZXNzYWdlOlxcc1tcIiddKC4rKVtcIiddL2dzO1xuICAgIGNvbnN0IG1hdGNoID0gcmVnZXhwLmV4ZWMoZS5tZXNzYWdlKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gbmV3IFJlZ2lzdHJhdGlvbkVycm9yKGUpO1xuICAgIGNvbnN0IFssIGNvZGUsIG1lc3NhZ2VdID0gbWF0Y2g7XG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICBjYXNlIFwiNzRcIjpcbiAgICAgIGNhc2UgXCI3MVwiOlxuICAgICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IobWVzc2FnZSk7XG4gICAgICBjYXNlIFwiMjBcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBBdXRob3JpemF0aW9uRXJyb3IobWVzc2FnZSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbmV3IFJlZ2lzdHJhdGlvbkVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmUgYWZmaWxpYXRpb25zIGZyb20gdGhlIENBLlxuICAgKiBAc3VtbWFyeSBRdWVyaWVzIHRoZSBDQSBmb3IgdGhlIGxpc3Qgb2YgYWZmaWxpYXRpb25zIGF2YWlsYWJsZSB1bmRlciB0aGUgY29uZmlndXJlZCBDQS5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgYWZmaWxpYXRpb25zIHJlc3VsdCBwYXlsb2FkLlxuICAgKi9cbiAgYXN5bmMgZ2V0QWZmaWxpYXRpb25zKCkge1xuICAgIGNvbnN0IGFmZmlsaWF0aW9uU2VydmljZSA9IGF3YWl0IHRoaXMuQWZmaWxpYXRpb25zKCk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0QWZmaWxpYXRpb25zKTtcbiAgICBsb2cuZGVidWcoYFJldHJpZXZpbmcgQWZmaWxpYXRpb25zIHVuZGVyIENBICR7dGhpcy5jYUNvbmZpZy5jYU5hbWV9YCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSAoYXdhaXQgYWZmaWxpYXRpb25TZXJ2aWNlLmdldEFsbChhd2FpdCB0aGlzLlVzZXIoKSkpXG4gICAgICAucmVzdWx0O1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBGb3VuZCAke3Jlc3BvbnNlLmEubGVuZ3RofSBBZmZpbGlhdGlvbnM6ICR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpfWBcbiAgICApO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZCBpZGVudGl0eSBkZXRhaWxzIGZyb20gdGhlIENBIGJ5IGVucm9sbG1lbnQgSUQuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhbmQgdmFsaWRhdGVzIGEgc2luZ2xlIGlkZW50aXR5LCB0aHJvd2luZyBOb3RGb3VuZEVycm9yIHdoZW4gbWlzc2luZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVucm9sbG1lbnRJZCAtIEVucm9sbG1lbnQgSUQgdG8gbG9va3VwLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEZhYnJpY0lkZW50aXR5Pn0gVGhlIGlkZW50aXR5IGRldGFpbHMgc3RvcmVkIGluIHRoZSBDQS5cbiAgICovXG4gIGFzeW5jIHJlYWQoZW5yb2xsbWVudElkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjYSA9IGF3YWl0IHRoaXMuQ0EoKTtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5Vc2VyKCk7XG4gICAgbGV0IHJlc3VsdDogSVNlcnZpY2VSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgY2EubmV3SWRlbnRpdHlTZXJ2aWNlKCkuZ2V0T25lKGVucm9sbG1lbnRJZCwgdXNlcik7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkbid0IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXN1bHQuc3VjY2VzcylcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGRuJ3QgZmluZCBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke3Jlc3VsdC5lcnJvcnMuam9pbihcIlxcblwiKX1gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQgYXMgRmFicmljSWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGEgbmV3IGlkZW50aXR5IHdpdGggdGhlIENBLlxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgcmVnaXN0cmF0aW9uIHJlcXVlc3QgZm9yIGEgbmV3IGVucm9sbG1lbnQgSUQsIHJldHVybmluZyB0aGUgZW5yb2xsbWVudCBzZWNyZXQgdXBvbiBzdWNjZXNzLlxuICAgKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBtb2RlbCAtIENyZWRlbnRpYWxzIGNvbnRhaW5pbmcgdXNlck5hbWUgYW5kIHBhc3N3b3JkIGZvciB0aGUgbmV3IGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N1cGVyVXNlcj1mYWxzZV0gLSBXaGV0aGVyIHRvIHJlZ2lzdGVyIHRoZSBpZGVudGl0eSBhcyBhIHN1cGVyIHVzZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWZmaWxpYXRpb249XCJcIl0gLSBBZmZpbGlhdGlvbiBzdHJpbmcgKGUuZy4sIG9yZzEuZGVwYXJ0bWVudDEpLlxuICAgKiBAcGFyYW0ge0NBX1JPTEUgfCBzdHJpbmd9IFt1c2VyUm9sZV0gLSBSb2xlIHRvIGFzc2lnbiB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7SUtleVZhbHVlQXR0cmlidXRlfSBbYXR0cnNdIC0gT3B0aW9uYWwgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW21heEVucm9sbG1lbnRzXSAtIE1heGltdW0gbnVtYmVyIG9mIGVucm9sbG1lbnRzIGFsbG93ZWQgZm9yIHRoZSBpZGVudGl0eS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSBUaGUgZW5yb2xsbWVudCBzZWNyZXQgZm9yIHRoZSByZWdpc3RlcmVkIGlkZW50aXR5LlxuICAgKi9cbiAgYXN5bmMgcmVnaXN0ZXIoXG4gICAgbW9kZWw6IENyZWRlbnRpYWxzLFxuICAgIGlzU3VwZXJVc2VyOiBib29sZWFuID0gZmFsc2UsXG4gICAgYWZmaWxpYXRpb246IHN0cmluZyA9IFwiXCIsXG4gICAgdXNlclJvbGU/OiBDQV9ST0xFIHwgc3RyaW5nLFxuICAgIGF0dHJzPzogSUtleVZhbHVlQXR0cmlidXRlLFxuICAgIG1heEVucm9sbG1lbnRzPzogbnVtYmVyXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IHJlZ2lzdHJhdGlvbjogc3RyaW5nO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJlZ2lzdGVyKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyB1c2VyTmFtZSwgcGFzc3dvcmQgfSA9IG1vZGVsO1xuICAgICAgY29uc3QgY2EgPSBhd2FpdCB0aGlzLkNBKCk7XG4gICAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5Vc2VyKCk7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgZW5yb2xsbWVudElEOiB1c2VyTmFtZSBhcyBzdHJpbmcsXG4gICAgICAgIGVucm9sbG1lbnRTZWNyZXQ6IHBhc3N3b3JkLFxuICAgICAgICBhZmZpbGlhdGlvbjogYWZmaWxpYXRpb24sXG4gICAgICAgIHVzZXJSb2xlOiB1c2VyUm9sZSxcbiAgICAgICAgYXR0cnM6IGF0dHJzLFxuICAgICAgICBtYXhFbnJvbGxtZW50czogbWF4RW5yb2xsbWVudHMsXG4gICAgICB9IGFzIElSZWdpc3RlclJlcXVlc3Q7XG4gICAgICByZWdpc3RyYXRpb24gPSBhd2FpdCBjYS5yZWdpc3Rlcihwcm9wcywgdXNlcik7XG4gICAgICBsb2cuaW5mbyhcbiAgICAgICAgYFJlZ2lzdHJhdGlvbiBmb3IgJHt1c2VyTmFtZX0gY3JlYXRlZCB3aXRoIHVzZXIgdHlwZSAke3VzZXJSb2xlID8/IFwiVW5kZWZpbmVkIFJvbGVcIn0gJHtpc1N1cGVyVXNlciA/IFwiYXMgc3VwZXIgdXNlclwiIDogXCJcIn1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVnaXN0cmF0aW9uO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBpZGVudGl0eUZyb21FbnJvbGxtZW50KFxuICAgIGVucm9sbG1lbnQ6IElFbnJvbGxSZXNwb25zZSxcbiAgICBtc3BJZDogc3RyaW5nXG4gICk6IElkZW50aXR5IHtcbiAgICBjb25zdCB7IGNlcnRpZmljYXRlLCBrZXksIHJvb3RDZXJ0aWZpY2F0ZSB9ID0gZW5yb2xsbWVudDtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcihGYWJyaWNFbnJvbGxtZW50U2VydmljZSwge30pLmZvcihcbiAgICAgIHRoaXMuaWRlbnRpdHlGcm9tRW5yb2xsbWVudFxuICAgICk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEdlbmVyYXRpbmcgSWRlbnRpdHkgZnJvbSBjZXJ0aWZpY2F0ZSAke2NlcnRpZmljYXRlfSBpbiBtc3AgJHttc3BJZH1gXG4gICAgKTtcbiAgICBjb25zdCBjbGllbnRJZCA9IENyeXB0b1V0aWxzLmZhYnJpY0lkRnJvbUNlcnRpZmljYXRlKGNlcnRpZmljYXRlKTtcbiAgICBjb25zdCBpZCA9IENyeXB0b1V0aWxzLmVuY29kZShjbGllbnRJZCk7XG4gICAgbG9nLmRlYnVnKGBJZGVudGl0eSAke2NsaWVudElkfSBhbmQgZW5jb2RlZElkICR7aWR9YCk7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5KHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgY2VydGlmaWNhdGU6IGNlcnRpZmljYXRlLFxuICAgICAgICBwcml2YXRlS2V5OiBrZXkudG9CeXRlcygpLFxuICAgICAgICByb290Q2VydGlmaWNhdGU6IHJvb3RDZXJ0aWZpY2F0ZSxcbiAgICAgICAgY3JlYXRlZE9uOiBub3csXG4gICAgICAgIHVwZGF0ZWRPbjogbm93LFxuICAgICAgfSxcbiAgICAgIG1zcElkOiBtc3BJZCxcbiAgICAgIGNyZWF0ZWRPbjogbm93LFxuICAgICAgdXBkYXRlZE9uOiBub3csXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVucm9sbCBhbiBpZGVudGl0eSB3aXRoIHRoZSBDQSB1c2luZyBhIHJlZ2lzdHJhdGlvbiBzZWNyZXQuXG4gICAqIEBzdW1tYXJ5IEV4Y2hhbmdlcyB0aGUgZW5yb2xsbWVudCBJRCBhbmQgc2VjcmV0IGZvciBjZXJ0aWZpY2F0ZXMsIHJldHVybmluZyBhIGNvbnN0cnVjdGVkIElkZW50aXR5IG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBlbnJvbGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb24gLSBFbnJvbGxtZW50IHNlY3JldCByZXR1cm5lZCBhdCByZWdpc3RyYXRpb24gdGltZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBlbnJvbGxlZCBpZGVudGl0eSBvYmplY3Qgd2l0aCBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIGVucm9sbChlbnJvbGxtZW50SWQ6IHN0cmluZywgcmVnaXN0cmF0aW9uOiBzdHJpbmcpIHtcbiAgICBsZXQgaWRlbnRpdHk6IElkZW50aXR5O1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmVucm9sbCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgICAgbG9nLmRlYnVnKGBFbnJvbGxpbmcgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgICBjb25zdCBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UgPSBhd2FpdCBjYS5lbnJvbGwoe1xuICAgICAgICBlbnJvbGxtZW50SUQ6IGVucm9sbG1lbnRJZCxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcmVnaXN0cmF0aW9uLFxuICAgICAgfSk7XG4gICAgICBpZGVudGl0eSA9IEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlLmlkZW50aXR5RnJvbUVucm9sbG1lbnQoXG4gICAgICAgIGVucm9sbG1lbnQsXG4gICAgICAgIHRoaXMuY2FDb25maWcuY2FOYW1lXG4gICAgICApO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBTdWNjZXNzZnVsbHkgZW5yb2xsZWQgJHtlbnJvbGxtZW50SWR9IHVuZGVyICR7dGhpcy5jYUNvbmZpZy5jYU5hbWV9IGFzICR7aWRlbnRpdHkuaWR9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkZW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhbmQgZW5yb2xsIGEgbmV3IGlkZW50aXR5IGluIG9uZSBzdGVwLlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgYSBuZXcgZW5yb2xsbWVudCBJRCB3aXRoIHRoZSBDQSBhbmQgaW1tZWRpYXRlbHkgZXhjaGFuZ2VzIHRoZSBzZWNyZXQgdG8gZW5yb2xsLCByZXR1cm5pbmcgdGhlIGNyZWF0ZWQgSWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IG1vZGVsIC0gQ3JlZGVudGlhbHMgZm9yIHRoZSBuZXcgaWRlbnRpdHkgY29udGFpbmluZyB1c2VyTmFtZSBhbmQgcGFzc3dvcmQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3VwZXJVc2VyPWZhbHNlXSAtIFdoZXRoZXIgdG8gcmVnaXN0ZXIgdGhlIGlkZW50aXR5IGFzIGEgc3VwZXIgdXNlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthZmZpbGlhdGlvbj1cIlwiXSAtIEFmZmlsaWF0aW9uIHN0cmluZyAoZS5nLiwgb3JnMS5kZXBhcnRtZW50MSkuXG4gICAqIEBwYXJhbSB7Q0FfUk9MRSB8IHN0cmluZ30gW3VzZXJSb2xlXSAtIFJvbGUgdG8gYXNzaWduIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtJS2V5VmFsdWVBdHRyaWJ1dGV9IFthdHRyc10gLSBPcHRpb25hbCBhdHRyaWJ1dGVzIHRvIGF0dGFjaCB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4RW5yb2xsbWVudHNdIC0gTWF4aW11bSBudW1iZXIgb2YgZW5yb2xsbWVudHMgYWxsb3dlZCBmb3IgdGhlIGlkZW50aXR5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPElkZW50aXR5Pn0gVGhlIGVucm9sbGVkIGlkZW50aXR5LlxuICAgKi9cbiAgYXN5bmMgcmVnaXN0ZXJBbmRFbnJvbGwoXG4gICAgbW9kZWw6IENyZWRlbnRpYWxzLFxuICAgIGlzU3VwZXJVc2VyOiBib29sZWFuID0gZmFsc2UsXG4gICAgYWZmaWxpYXRpb246IHN0cmluZyA9IFwiXCIsXG4gICAgdXNlclJvbGU/OiBDQV9ST0xFIHwgc3RyaW5nLFxuICAgIGF0dHJzPzogSUtleVZhbHVlQXR0cmlidXRlLFxuICAgIG1heEVucm9sbG1lbnRzPzogbnVtYmVyXG4gICk6IFByb21pc2U8SWRlbnRpdHk+IHtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSBhd2FpdCB0aGlzLnJlZ2lzdGVyKFxuICAgICAgbW9kZWwsXG4gICAgICBpc1N1cGVyVXNlcixcbiAgICAgIGFmZmlsaWF0aW9uLFxuICAgICAgdXNlclJvbGUsXG4gICAgICBhdHRycyxcbiAgICAgIG1heEVucm9sbG1lbnRzXG4gICAgKTtcbiAgICBjb25zdCB7IHVzZXJOYW1lIH0gPSBtb2RlbDtcbiAgICByZXR1cm4gdGhpcy5lbnJvbGwodXNlck5hbWUgYXMgc3RyaW5nLCByZWdpc3RyYXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldm9rZXMgdGhlIGVucm9sbG1lbnQgb2YgYW4gaWRlbnRpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIGVucm9sbG1lbnQgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBlbnJvbGxtZW50SWQgLSBUaGUgZW5yb2xsbWVudCBJRCBvZiB0aGUgaWRlbnRpdHkgdG8gYmUgcmV2b2tlZC5cbiAgICpcbiAgICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlc3VsdCBvZiB0aGUgcmV2b2NhdGlvbiBvcGVyYXRpb24uXG4gICAqXG4gICAqIEB0aHJvd3Mge05vdEZvdW5kRXJyb3J9IElmIHRoZSBlbnJvbGxtZW50IHdpdGggdGhlIHNwZWNpZmllZCBJRCBkb2VzIG5vdCBleGlzdC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlcmUgaXMgYW4gZXJyb3IgZHVyaW5nIHRoZSByZXZvY2F0aW9uIHByb2Nlc3MuXG4gICAqL1xuICBhc3luYyByZXZva2UoZW5yb2xsbWVudElkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjYSA9IGF3YWl0IHRoaXMuQ0EoKTtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5Vc2VyKCk7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBhd2FpdCB0aGlzLnJlYWQoZW5yb2xsbWVudElkKTtcbiAgICBpZiAoIWlkZW50aXR5KVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgZmluZCBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9YFxuICAgICAgKTtcbiAgICBsZXQgcmVzdWx0OiBJU2VydmljZVJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBjYS5yZXZva2UoXG4gICAgICAgIHsgZW5yb2xsbWVudElEOiBpZGVudGl0eS5pZCwgcmVhc29uOiBcIlVzZXIgRGVsZXRhdGlvblwiIH0sXG4gICAgICAgIHVzZXJcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgcmV2b2tlIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgcmV2b2tlIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7cmVzdWx0LmVycm9ycy5qb2luKFwiXFxuXCIpfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSVJlZ2lzdGVyUmVxdWVzdCwgSUtleVZhbHVlQXR0cmlidXRlIH0gZnJvbSBcImZhYnJpYy1jYS1jbGllbnRcIjtcbmltcG9ydCB7IENBX1JPTEUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIG1pbixcbiAgbWlubGVuZ3RoLFxuICBNb2RlbCxcbiAgcmVxdWlyZWQsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVnaXN0cmF0aW9uUmVxdWVzdEJ1aWxkZXIgZXh0ZW5kcyBNb2RlbCB7XG4gIEByZXF1aXJlZCgpXG4gIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiO1xuICBAbWlubGVuZ3RoKDEpXG4gIGF0dHJzPzogSUtleVZhbHVlQXR0cmlidXRlW107XG4gIEByZXF1aXJlZCgpXG4gIGVucm9sbG1lbnRJRCE6IHN0cmluZztcbiAgQHJlcXVpcmVkKClcbiAgZW5yb2xsbWVudFNlY3JldCE6IHN0cmluZztcbiAgQG1pbigwKVxuICBtYXhFbnJvbGxtZW50cz86IG51bWJlcjtcbiAgQHJlcXVpcmVkKClcbiAgcm9sZSE6IHN0cmluZztcblxuICBidWlsZCgpOiBJUmVnaXN0ZXJSZXF1ZXN0IHtcbiAgICBjb25zdCBlcnJzID0gdGhpcy5oYXNFcnJvcnMoKTtcbiAgICBpZiAoZXJycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJzLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBJUmVnaXN0ZXJSZXF1ZXN0ID0ge1xuICAgICAgZW5yb2xsbWVudElEOiB0aGlzLmVucm9sbG1lbnRJRCxcbiAgICAgIGVucm9sbG1lbnRTZWNyZXQ6IHRoaXMuZW5yb2xsbWVudFNlY3JldCxcbiAgICAgIHJvbGU6IHRoaXMucm9sZSxcbiAgICAgIGFmZmlsaWF0aW9uOiB0aGlzLmFmZmlsaWF0aW9uLFxuICAgIH07XG4gICAgaWYgKHR5cGVvZiB0aGlzLm1heEVucm9sbG1lbnRzICE9PSBcInVuZGVmaW5lZFwiKVxuICAgICAgcmVzcG9uc2UubWF4RW5yb2xsbWVudHMgPSB0aGlzLm1heEVucm9sbG1lbnRzO1xuICAgIGlmICh0aGlzLmF0dHJzKSByZXNwb25zZS5hdHRycyA9IHRoaXMuYXR0cnM7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgc2V0QWZmaWxpYXRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuYWZmaWxpYXRpb24gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZEF0dHIoYXR0cjogSUtleVZhbHVlQXR0cmlidXRlKSB7XG4gICAgdGhpcy5hdHRycyA9IHRoaXMuYXR0cnMgfHwgW107XG4gICAgdGhpcy5hdHRycy5wdXNoKGF0dHIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0QXR0cnModmFsdWU6IElLZXlWYWx1ZUF0dHJpYnV0ZVtdKSB7XG4gICAgdGhpcy5hdHRycyA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RW5yb2xsbWVudElEKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVucm9sbG1lbnRJRCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RW5yb2xsbWVudFNlY3JldCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5lbnJvbGxtZW50U2VjcmV0ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRNYXhFbnJvbGxtZW50cyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5tYXhFbnJvbGxtZW50cyA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Um9sZSh2YWx1ZTogQ0FfUk9MRSB8IHN0cmluZykge1xuICAgIHRoaXMucm9sZSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iLCIvKipcbiAqIEVudW0gcmVwcmVzZW50aW5nIHRoZSBldmVudHMgZW1pdHRlZCBieSBhbiBFUkMyMCBjb250cmFjdC5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhpcyBlbnVtIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHNwZWNpZmljIGV2ZW50cyB0aGF0IGNhbiBiZSBlbWl0dGVkIGJ5IGFuIEVSQzIwIGNvbnRyYWN0LlxuICogVGhlIGV2ZW50cyBhcmUgbmFtZWQgYWNjb3JkaW5nIHRvIHRoZSBFSVAtMjAgc3RhbmRhcmQuXG4gKi9cbmV4cG9ydCBlbnVtIEVSQzIwRXZlbnRzIHtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGB0cmFuc2ZlcmAgZnVuY3Rpb24gaXMgY2FsbGVkIHN1Y2Nlc3NmdWxseS5cbiAgICpcbiAgICogQHBhcmFtIGZyb20gLSBUaGUgYWRkcmVzcyBvZiB0aGUgc2VuZGVyLlxuICAgKiBAcGFyYW0gdG8gLSBUaGUgYWRkcmVzcyBvZiB0aGUgcmVjaXBpZW50LlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgYW1vdW50IG9mIHRva2VucyB0cmFuc2ZlcnJlZC5cbiAgICovXG4gIFRSQU5TRkVSID0gXCJUcmFuc2ZlclwiLFxuXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYW4gYGFwcHJvdmVgIGZ1bmN0aW9uIGlzIGNhbGxlZCBzdWNjZXNzZnVsbHkuXG4gICAqXG4gICAqIEBwYXJhbSBvd25lciAtIFRoZSBhZGRyZXNzIG9mIHRoZSB0b2tlbiBvd25lci5cbiAgICogQHBhcmFtIHNwZW5kZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgYXBwcm92ZWQgc3BlbmRlci5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgYXBwcm92ZWQgZm9yIHRoZSBzcGVuZGVyLlxuICAgKi9cbiAgQVBQUk9WQUwgPSBcIkFwcHJvdmFsXCIsXG59XG4iLCJpbXBvcnQgeyBNb2RlbCwgdHlwZSBNb2RlbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCB1cGRhdGVkQXQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IGRlc2NyaXB0aW9uLCB1c2VzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGF2b3VyIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5AdXNlcyhGYWJyaWNGbGF2b3VyKVxuZXhwb3J0IGNsYXNzIEZhYnJpY0Jhc2VNb2RlbCBleHRlbmRzIE1vZGVsIHtcbiAgQGRlc2NyaXB0aW9uKFwiU3RvcmVzIHRoZSBvcmlnaW5hbCB0aW1lc3RhbXAgb2YgY3JlYXRpb25cIilcbiAgQGNvbHVtbigpXG4gIEBjcmVhdGVkQXQoKVxuICBjcmVhdGVkQXQhOiBEYXRlO1xuXG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgdGltZXN0YW1wIG9mIHRoZSBsYXN0IHVwZGF0ZVwiKVxuICBAY29sdW1uKClcbiAgQHVwZGF0ZWRBdCgpXG4gIHVwZGF0ZWRBdCE6IERhdGU7XG5cbiAgQGRlc2NyaXB0aW9uKFwiU3RvcmVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBtb2RlbFwiKVxuICBAY29sdW1uKClcbiAgQHZlcnNpb24oKVxuICB2ZXJzaW9uITogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGFyZz86IE1vZGVsQXJnPEZhYnJpY0Jhc2VNb2RlbD4pIHtcbiAgICBzdXBlcihhcmcpO1xuICB9XG59XG4iLCJpbXBvcnQgeyB0eXBlIE1vZGVsQXJnIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQnksIHVwZGF0ZWRCeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgZGVzY3JpcHRpb24sIHVzZXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0ZsYXZvdXIgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBGYWJyaWNCYXNlTW9kZWwgfSBmcm9tIFwiLi9GYWJyaWNCYXNlTW9kZWxcIjtcblxuQHVzZXMoRmFicmljRmxhdm91cilcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsIGV4dGVuZHMgRmFicmljQmFzZU1vZGVsIHtcbiAgQGRlc2NyaXB0aW9uKFwiU3RvcmVzIHRoZSBjcmVhdG9yXCIpXG4gIEBjb2x1bW4oKVxuICBAY3JlYXRlZEJ5KClcbiAgY3JlYXRlZEJ5ITogc3RyaW5nO1xuXG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgdXNlciB0aGF0IGxhc3QgdXBkYXRlZCB0aGUgbW9kZWxcIilcbiAgQGNvbHVtbigpXG4gIEB1cGRhdGVkQnkoKVxuICB1cGRhdGVkQnkhOiBzdHJpbmc7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGFyZz86IE1vZGVsQXJnPEZhYnJpY0lkZW50aWZpZWRCYXNlTW9kZWw+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY01vZGVsS2V5cyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFNlZ3JlZ2F0ZWRNb2RlbCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgREJLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb2xsZWN0aW9uUmVzb2x2ZXIsIE1pcnJvck1ldGFkYXRhIH0gZnJvbSBcIi4uL2RlY29yYXRvcnNcIjtcblxuTW9kZWwucHJvdG90eXBlLmlzU2hhcmVkID0gZnVuY3Rpb24gaXNTaGFyZWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogTVxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBNb2RlbC5pc1NoYXJlZCh0aGlzLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KTtcbn07XG5cbk1vZGVsLnByb3RvdHlwZS5pc1ByaXZhdGUgPSBmdW5jdGlvbiBpc1ByaXZhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogTVxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBNb2RlbC5pc1ByaXZhdGUodGhpcy5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPik7XG59O1xuXG5Nb2RlbC5wcm90b3R5cGUuc2VncmVnYXRlID0gZnVuY3Rpb24gc2VncmVnYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IE1cbik6IFNlZ3JlZ2F0ZWRNb2RlbDxNPiB7XG4gIHJldHVybiBNb2RlbC5zZWdyZWdhdGUodGhpcyk7XG59O1xuXG4oTW9kZWwgYXMgYW55KS5zZWdyZWdhdGUgPSBmdW5jdGlvbiBzZWdyZWdhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE1cbik6IFNlZ3JlZ2F0ZWRNb2RlbDxNPiB7XG4gIGlmICghTW9kZWwuaXNUcmFuc2llbnQobW9kZWwpKSByZXR1cm4geyBtb2RlbDogbW9kZWwgfTtcbiAgY29uc3QgZGVjb3JhdGVkUHJvcGVydGllcyA9XG4gICAgTWV0YWRhdGEuZ2V0QXR0cmlidXRlcyhtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIHx8IFtdO1xuXG4gIGNvbnN0IHRyYW5zaWVudFByb3BzID0gTWV0YWRhdGEuZ2V0KFxuICAgIG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSxcbiAgICBEQktleXMuVFJBTlNJRU5UXG4gICk7XG4gIGNvbnN0IHByaXZhdGVQcm9wZXJ0aWVzID0gTWV0YWRhdGEuZ2V0KFxuICAgIG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSxcbiAgICBGYWJyaWNNb2RlbEtleXMuUFJJVkFURVxuICApO1xuICBjb25zdCBzaGFyZWRQcm9wZXJ0aWVzID0gTWV0YWRhdGEuZ2V0KFxuICAgIG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSxcbiAgICBGYWJyaWNNb2RlbEtleXMuU0hBUkVEXG4gICk7XG5cbiAgY29uc3QgcmVzdWx0OiBTZWdyZWdhdGVkTW9kZWw8TT4gPSB7XG4gICAgbW9kZWw6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICAgIHB1YmxpYzoge30gYXMgUmVjb3JkPGtleW9mIE0sIGFueT4sXG4gICAgdHJhbnNpZW50OiB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PixcbiAgICBwcml2YXRlczoge30gYXMgUmVjb3JkPGtleW9mIE0sIGFueT4sXG4gICAgc2hhcmVkOiB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PixcbiAgfTtcblxuICBjb25zdCB0cmFuc2llbnRLZXlzID0gT2JqZWN0LmtleXModHJhbnNpZW50UHJvcHMgfHwge30pO1xuICBjb25zdCBwcml2YXRlS2V5cyA9IE9iamVjdC5rZXlzKHByaXZhdGVQcm9wZXJ0aWVzIHx8IHt9KTtcbiAgY29uc3Qgc2hhcmVkS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZFByb3BlcnRpZXMgfHwge30pO1xuXG4gIC8vIGNvbnN0IHBrS2V5ID0gTW9kZWwucGsobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVjb3JhdGVkUHJvcGVydGllcykge1xuICAgIGNvbnN0IHZhbHVlID0gbW9kZWxba2V5IGFzIGtleW9mIE1dO1xuICAgIGNvbnN0IGlzVHJhbnNpZW50ID0gdHJhbnNpZW50S2V5cy5pbmNsdWRlcyhrZXkpO1xuICAgIGNvbnN0IGlzUHVibGljID0gIWlzVHJhbnNpZW50O1xuICAgIGNvbnN0IGlzUHJpdmF0ZSA9IHByaXZhdGVLZXlzLmluY2x1ZGVzKGtleSk7XG4gICAgY29uc3QgaXNTaGFyZWQgPSBzaGFyZWRLZXlzLmluY2x1ZGVzKGtleSk7XG4gICAgLy8gY29uc3QgaXNQcmltYXJ5S2V5ID0ga2V5ID09PSBwa0tleTtcblxuICAgIGlmIChpc1RyYW5zaWVudCB8fCBpc1ByaXZhdGUgfHwgaXNTaGFyZWQpIHtcbiAgICAgIHJlc3VsdC50cmFuc2llbnQgPSByZXN1bHQudHJhbnNpZW50IHx8ICh7fSBhcyBhbnkpO1xuICAgICAgKHJlc3VsdC50cmFuc2llbnQgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIGlmIChpc1ByaXZhdGUpIHtcbiAgICAgIHJlc3VsdC5wcml2YXRlcyA9IHJlc3VsdC5wcml2YXRlcyB8fCAoe30gYXMgYW55KTtcbiAgICAgIChyZXN1bHQucHJpdmF0ZXMgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIGlmIChpc1NoYXJlZCkge1xuICAgICAgcmVzdWx0LnNoYXJlZCA9IHJlc3VsdC5zaGFyZWQgfHwgKHt9IGFzIGFueSk7XG4gICAgICAocmVzdWx0LnNoYXJlZCBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzUHVibGljKSB7XG4gICAgICByZXN1bHQucHVibGljID0gKHJlc3VsdC5wdWJsaWMgfHwge30pIGFzIGFueTtcbiAgICAgIChyZXN1bHQucHVibGljIGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJlc3VsdC5tb2RlbCA9IE1vZGVsLmJ1aWxkKHJlc3VsdC5wdWJsaWMsIG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUpO1xuICByZXR1cm4gcmVzdWx0IGFzIFNlZ3JlZ2F0ZWRNb2RlbDxNPjtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLmlzUHJpdmF0ZSA9IGZ1bmN0aW9uIGlzUHJpdmF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+XG4pOiBib29sZWFuIHtcbiAgcmV0dXJuICEhTWV0YWRhdGEuZ2V0KFxuICAgIHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSkgOiBtb2RlbCxcbiAgICBGYWJyaWNNb2RlbEtleXMuUFJJVkFURVxuICApO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkuaXNTaGFyZWQgPSBmdW5jdGlvbiBpc1NoYXJlZDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+XG4pOiBib29sZWFuIHtcbiAgcmV0dXJuICEhTWV0YWRhdGEuZ2V0KFxuICAgIHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSkgOiBtb2RlbCxcbiAgICBGYWJyaWNNb2RlbEtleXMuU0hBUkVEXG4gICk7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5taXJyb3JlZCA9IGZ1bmN0aW9uIG1pcnJvcmVkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gTWV0YWRhdGEuZ2V0KFxuICAgIHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSkgOiBtb2RlbCxcbiAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk1JUlJPUilcbiAgKTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLm93bmVyT2YgPSBmdW5jdGlvbiBvd25lck9mPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBtZXRhID0gTWV0YWRhdGEuZ2V0KFxuICAgIG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSxcbiAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk9XTkVEX0JZKVxuICApO1xuICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBtb2RlbFttZXRhIGFzIGtleW9mIE1dIGFzIHN0cmluZztcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLm1pcnJvcmVkQXQgPSBmdW5jdGlvbiBtaXJyb3JlZEF0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IE1pcnJvck1ldGFkYXRhIHwgdW5kZWZpbmVkIHtcbiAgbW9kZWwgPSB0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IChtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIDogbW9kZWw7XG4gIHJldHVybiBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwgYXMgYW55LFxuICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuTUlSUk9SKVxuICApO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkuY29sbGVjdGlvbnNGb3IgPSBmdW5jdGlvbiBjb2xsZWN0aW9uc0ZvcjxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+XG4pOiB7XG4gIHByaXZhdGVDb2xzOiAoc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKVtdO1xuICBzaGFyZWRDb2xzOiAoc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKVtdO1xufSB7XG4gIGNvbnN0IHByaXZhdGVLZXlzOiBzdHJpbmdbXSA9IFtGYWJyaWNNb2RlbEtleXMuUFJJVkFURV0gYXMgc3RyaW5nW107XG4gIGNvbnN0IHNoYXJlZEtleXM6IHN0cmluZ1tdID0gW0ZhYnJpY01vZGVsS2V5cy5TSEFSRURdIGFzIHN0cmluZ1tdO1xuXG4gIGNvbnN0IHByaXZhdGVLZXkgPSBNZXRhZGF0YS5rZXkoLi4ucHJpdmF0ZUtleXMpO1xuICBjb25zdCBzaGFyZWRLZXkgPSBNZXRhZGF0YS5rZXkoLi4uc2hhcmVkS2V5cyk7XG5cbiAgY29uc3QgY29uc3RyID0gdHlwZW9mIG1vZGVsID09PSBcImZ1bmN0aW9uXCIgPyBtb2RlbCA6IG1vZGVsLmNvbnN0cnVjdG9yO1xuXG4gIGNvbnN0IHByaXZhdGVNZXRhOiB7IGNvbGxlY3Rpb25zOiBzdHJpbmdbXSB9ID0gTWV0YWRhdGEuZ2V0KFxuICAgIGNvbnN0ciBhcyBhbnksXG4gICAgcHJpdmF0ZUtleVxuICApO1xuICBjb25zdCBzaGFyZWRNZXRhOiB7IGNvbGxlY3Rpb25zOiBzdHJpbmdbXSB9ID0gTWV0YWRhdGEuZ2V0KFxuICAgIGNvbnN0ciBhcyBhbnksXG4gICAgc2hhcmVkS2V5XG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBwcml2YXRlQ29sczogcHJpdmF0ZU1ldGE/LmNvbGxlY3Rpb25zIHx8IFtdLFxuICAgIHNoYXJlZENvbHM6IHNoYXJlZE1ldGE/LmNvbGxlY3Rpb25zIHx8IFtdLFxuICB9O1xufS5iaW5kKE1vZGVsKTtcbiIsImltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgUmVwbyxcbiAgQ29udGV4dCxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbiAgUmVwb3NpdG9yeSxcbiAgQ29udGV4dE9mLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIGdlbmVyYXRlZCxcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgb25DcmVhdGUsXG4gIG9uRGVsZXRlLFxuICBvblJlYWQsXG4gIG9uVXBkYXRlLFxuICByZWFkb25seSxcbiAgdHJhbnNpZW50LFxuICBWYWxpZGF0aW9uRXJyb3IsXG4gIERCS2V5cyxcbiAgREJPcGVyYXRpb25zLFxuICBvbixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbCwgcmVxdWlyZWQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNNb2RlbEtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHsgQ29udGV4dCBhcyBITENvbnRleHQgfSBmcm9tIFwiZmFicmljLWNvbnRyYWN0LWFwaVwiO1xuaW1wb3J0IHsgQ2xpZW50SWRlbnRpdHkgfSBmcm9tIFwiZmFicmljLXNoaW0tYXBpXCI7XG5pbXBvcnQgeyBGYWJyaWNFUkMyMENvbnRyYWN0IH0gZnJvbSBcIi4uL2NvbnRyYWN0cy9lcmMyMC9lcmMyMGNvbnRyYWN0XCI7XG5pbXBvcnQge1xuICBhcHBseSxcbiAgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIG1ldGFkYXRhLFxuICBNZXRhZGF0YSxcbiAgcHJvcCxcbiAgcHJvcE1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0ZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IHRvUGFzY2FsQ2FzZSB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgRmFicmljQ29udHJhY3RGbGFncyB9IGZyb20gXCIuLi9jb250cmFjdHMvdHlwZXNcIjtcbmltcG9ydCBcIi4uL3NoYXJlZC9vdmVycmlkZXNcIjtcbmltcG9ydCB7IHR5cGUgRmFicmljQ29udHJhY3RDb250ZXh0IH0gZnJvbSBcIi4uL2NvbnRyYWN0cy9Db250cmFjdENvbnRleHRcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXh0cmFjdHMgdGhlIE1TUCBJRCBmcm9tIGVpdGhlciBhIHN0cmluZyBvciBDbGllbnRJZGVudGl0eSBvYmplY3RcbiAqIEBwYXJhbSBpZGVudGl0eSAtIFRoZSBpZGVudGl0eSB2YWx1ZSB3aGljaCBjYW4gYmUgYSBzdHJpbmcgTVNQIElEIG9yIENsaWVudElkZW50aXR5IG9iamVjdFxuICogQHJldHVybnMgVGhlIE1TUCBJRCBhcyBhIHN0cmluZywgb3IgdW5kZWZpbmVkIGlmIG5vdCBhdmFpbGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RNc3BJZChcbiAgaWRlbnRpdHk6IHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWlkZW50aXR5KSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIGlkZW50aXR5ID09PSBcInN0cmluZ1wiKSByZXR1cm4gaWRlbnRpdHk7XG4gIHJldHVybiBpZGVudGl0eS5nZXRNU1BJRCgpO1xufVxuXG4vKipcbiAqIERlY29yYXRvciBmb3IgbWFya2luZyBtZXRob2RzIHRoYXQgcmVxdWlyZSBvd25lcnNoaXAgYXV0aG9yaXphdGlvbi5cbiAqIENoZWNrcyB0aGUgb3duZXIgb2YgdGhlIHRva2VuIGJlZm9yZSBhbGxvd2luZyB0aGUgbWV0aG9kIHRvIGJlIGV4ZWN1dGVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBUb2tlbkNvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3Qge1xuICogICBAT3duZXIoKVxuICogICBhc3luYyBNaW50KGN0eDogQ29udGV4dCwgYW1vdW50OiBudW1iZXIpIHtcbiAqICAgICAvLyBNaW50IHRva2VuIGxvZ2ljXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIHtNZXRob2REZWNvcmF0b3J9IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IGNoZWNrcyBvd25lcnNoaXAgYXV0aG9yaXphdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE93bmVyKCkge1xuICByZXR1cm4gZnVuY3Rpb24gKFxuICAgIHRhcmdldDogYW55LFxuICAgIHByb3BlcnR5S2V5OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkge1xuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcblxuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBhc3luYyBmdW5jdGlvbiAoXG4gICAgICB0aGlzOiBGYWJyaWNFUkMyMENvbnRyYWN0LFxuICAgICAgLi4uYXJnczogYW55W11cbiAgICApIHtcbiAgICAgIGNvbnN0IGN0eDogSExDb250ZXh0ID0gYXJnc1swXTtcbiAgICAgIGNvbnN0IGFjb3VudElkID0gY3R4LmNsaWVudElkZW50aXR5LmdldElEKCk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdCA9IGF3YWl0ICh0aGlzIGFzIEZhYnJpY0VSQzIwQ29udHJhY3QpW1xuICAgICAgICBcInRva2VuUmVwb3NpdG9yeVwiXG4gICAgICBdLnNlbGVjdCgpO1xuXG4gICAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCBzZWxlY3QuZXhlY3V0ZShjdHgpO1xuXG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFwiTm8gdG9rZW5zIGF2YWlhbGJsZVwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUbyBtYW55IHRva2VuIGF2YWlsYWJsZSA6ICR7dG9rZW5zLmxlbmd0aH1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRva2Vuc1swXS5vd25lciAhPSBhY291bnRJZCkge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgICAgICAgIGBVc2VyIG5vdCBhdXRob3JpemVkIHRvIHJ1biAke3Byb3BlcnR5S2V5fSBvbiB0aGUgdG9rZW5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvd25lZEJ5T25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgUiBleHRlbmRzIFJlcG88TT4sXG4gIFYsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHN0dWIgfSA9IGNvbnRleHQgYXMgYW55O1xuXG4gIGNvbnN0IGNyZWF0b3IgPSBhd2FpdCBzdHViLmdldENyZWF0b3IoKTtcbiAgY29uc3Qgb3duZXIgPSBjcmVhdG9yLm1zcGlkO1xuXG4gIGNvbnN0IHNldE93bmVkQnlLZXlWYWx1ZSA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhcmdldDogTSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnRcbiAgKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgfSk7XG4gIH07XG5cbiAgc2V0T3duZWRCeUtleVZhbHVlKG1vZGVsLCBrZXkgYXMgc3RyaW5nLCBvd25lcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvd25lZEJ5KCkge1xuICBmdW5jdGlvbiBvd25lZEJ5KCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqOiBhbnksIGF0dHJpYnV0ZT86IGFueSkge1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICBnZW5lcmF0ZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgb25DcmVhdGUob3duZWRCeU9uQ3JlYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFxuICAgICAgICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpLFxuICAgICAgICAgIGF0dHJpYnV0ZVxuICAgICAgICApXG4gICAgICApKG9iaiwgYXR0cmlidXRlKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5PV05FRF9CWSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogb3duZWRCeSxcbiAgICAgIGFyZ3M6IFtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cmFuc2FjdGlvbklkT25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgUiBleHRlbmRzIFJlcG88TT4sXG4gIFYsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHN0dWIgfSA9IGNvbnRleHQgYXMgYW55O1xuICBtb2RlbFtrZXldID0gc3R1Yi5nZXRUeElEKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2FjdGlvbklkKCkge1xuICBmdW5jdGlvbiB0cmFuc2FjdGlvbklkKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqOiBhbnksIGF0dHJpYnV0ZT86IGFueSkge1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICByZWFkb25seSgpLFxuICAgICAgICBvbkNyZWF0ZSh0cmFuc2FjdGlvbklkT25DcmVhdGUpLFxuICAgICAgICBvblVwZGF0ZSh0cmFuc2FjdGlvbklkT25DcmVhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoXG4gICAgICAgICAgTWV0YWRhdGEua2V5KFxuICAgICAgICAgICAgRmFicmljTW9kZWxLZXlzLkZBQlJJQyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgICAgIEZhYnJpY01vZGVsS2V5cy5UUkFOU0FDVElPTl9JRFxuICAgICAgICAgICksXG4gICAgICAgICAgYXR0cmlidXRlXG4gICAgICAgIClcbiAgICAgICkob2JqLCBhdHRyaWJ1dGUpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlRSQU5TQUNUSU9OX0lEKVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB0cmFuc2FjdGlvbklkLFxuICAgICAgYXJnczogW10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IHR5cGUgTWlycm9yQ29uZGl0aW9uID0gKG1zcDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG5leHBvcnQgdHlwZSBNaXJyb3JNZXRhZGF0YSA9IHtcbiAgY29uZGl0aW9uPzogTWlycm9yQ29uZGl0aW9uO1xuICByZXNvbHZlcjogQ29sbGVjdGlvblJlc29sdmVyIHwgc3RyaW5nO1xuICBtc3BJZDogc3RyaW5nO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV2YWxNaXJyb3JNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSxcbiAgcmVzb2x2ZXI6IHVuZGVmaW5lZCB8IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcixcbiAgY3R4OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+XG4pIHtcbiAgbGV0IGNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyB8IHVuZGVmaW5lZCA9IHJlc29sdmVyO1xuICBpZiAodHlwZW9mIGNvbGxlY3Rpb24gIT09IFwic3RyaW5nXCIpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3duZXIgPVxuICAgICAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fCBjdHguZ2V0KFwic3R1YlwiKS5nZXRDcmVhdG9yKCkudG9TdHJpbmcoKTtcbiAgICAgIGlmIChyZXNvbHZlciAmJiB0eXBlb2YgcmVzb2x2ZXIgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgY29sbGVjdGlvbiA9IGF3YWl0IHJlc29sdmVyKG1vZGVsLCBvd25lciwgY3R4KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIHJlc29sdmUgY29sbGVjdGlvbiBtaXJyb3IgbmFtZTogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29sbGVjdGlvbiB8fCB0eXBlb2YgY29sbGVjdGlvbiAhPT0gXCJzdHJpbmdcIilcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBObyBjb2xsZWN0aW9uIGZvdW5kIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgKTtcbiAgcmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgY29uc3Qgc291cmNlTW9kZWwgPSBtb2RlbDtcbiAgLy8gUHV0IG1pcnJvciBmbGFncyBkaXJlY3RseSBvbiBjb250ZXh0IHNvIGFkYXB0ZXIucHJlcGFyZSgpIGFuZCBhZGFwdGVyLmNyZWF0ZSgpIGNhbiBzZWUgdGhlbVxuICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG8gPSB0aGlzLm92ZXJyaWRlKFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgKHRoaXMgYXMgYW55KS5fb3ZlcnJpZGVzLCB7XG4gICAgICAgIG1pcnJvcjogdHJ1ZSxcbiAgICAgICAgbWlycm9yQ29sbGVjdGlvbjogY29sbGVjdGlvbixcbiAgICAgICAgaWdub3JlVmFsaWRhdGlvbjogdHJ1ZSxcbiAgICAgICAgaWdub3JlSGFuZGxlcnM6IHRydWUsXG4gICAgICB9IGFzIGFueSlcbiAgICApO1xuICAgIGNvbnN0IG1pcnJvciA9IGF3YWl0IHJlcG8uY3JlYXRlKHNvdXJjZU1vZGVsLCBjb250ZXh0KTtcbiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgICAgYE1pcnJvciBmb3IgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGNyZWF0ZWQgd2l0aCAke01vZGVsLnBrKG1vZGVsKSBhcyBzdHJpbmd9OiAke21pcnJvcltNb2RlbC5wayhtb2RlbCldfWBcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIENsZWFuIHVwIG1pcnJvciBmbGFncyBmcm9tIGNvbnRleHRcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgY29uc3Qgc291cmNlTW9kZWwgPSBtb2RlbDtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIG1pcnJvckNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgICBhcHBseVVwZGF0ZVZhbGlkYXRpb246IGZhbHNlLFxuICAgICAgICBtZXJnZUZvclVwZGF0ZTogZmFsc2UsXG4gICAgICB9IGFzIGFueSlcbiAgICApO1xuICAgIGF3YWl0IHJlcG8udXBkYXRlKHNvdXJjZU1vZGVsLCBjb250ZXh0KTtcbiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgICAgYE1pcnJvciBmb3IgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IHVwZGF0ZWQ6ICR7KG1vZGVsIGFzIGFueSlbTW9kZWwucGsobW9kZWwpXX1gXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgZmFicmljQ3R4LnB1dChcInNlZ3JlZ2F0ZWRcIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICB0cnkge1xuICAgIGNvbnN0IHBrUHJvcCA9IE1vZGVsLnBrKG1vZGVsKSBhcyBrZXlvZiBNO1xuICAgIGNvbnN0IGlkID0gbW9kZWxbcGtQcm9wXTtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBzZWdyZWdhdGVkOiBjb2xsZWN0aW9uLFxuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcmVwby5kZWxldGUoaWQgYXMgYW55LCBjb250ZXh0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1heSBhbHJlYWR5IGJlIGRlbGV0ZWQgYnkgYWRhcHRlci5kZWxldGVTZWdyZWdhdGVkQ29sbGVjdGlvbnNcbiAgICB9XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBkZWxldGVkOiAke1N0cmluZyhpZCl9YFxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwic2VncmVnYXRlZFwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWlycm9yV3JpdGVHdWFyZDxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAga2V5OiBrZXlvZiBNLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbXNwID0gZXh0cmFjdE1zcElkKFxuICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgKTtcbiAgaWYgKCFtc3ApIHJldHVybjtcbiAgaWYgKG1zcCA9PT0gZGF0YS5tc3BJZCB8fCAoZGF0YS5jb25kaXRpb24gJiYgZGF0YS5jb25kaXRpb24obXNwKSkpIHtcbiAgICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgICAgYE9yZ2FuaXphdGlvbiAke21zcH0gaXMgbm90IGF1dGhvcml6ZWQgdG8gbW9kaWZ5IG1pcnJvcmVkIGRhdGFgXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZE1pcnJvckhhbmRsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbXNwID0gZXh0cmFjdE1zcElkKFxuICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgKTtcblxuICBpZiAoIW1zcCkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgY29uc3QgbWF0Y2hlcyA9IG1zcCA9PT0gZGF0YS5tc3BJZCB8fCAoZGF0YS5jb25kaXRpb24gJiYgZGF0YS5jb25kaXRpb24obXNwKSk7XG5cbiAgaWYgKG1hdGNoZXMpIHtcbiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgICAgYE1pcnJvciByZWFkOiBNU1AgJHttc3B9IG1hdGNoZXMsIHJvdXRpbmcgcmVhZHMgdG8gbWlycm9yIGNvbGxlY3Rpb24gJHtjb2xsZWN0aW9ufWBcbiAgICApO1xuICAgIC8vIFJvdXRlIHJlYWRzIGV4Y2x1c2l2ZWx5IHRocm91Z2ggdGhlIG1pcnJvciBjb2xsZWN0aW9uXG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJmdWxseVNlZ3JlZ2F0ZWRcIiwgdHJ1ZSk7XG4gICAgZmFicmljQ3R4LnJlYWRGcm9tKGNvbGxlY3Rpb24pO1xuICB9XG4gIC8vIFdoZW4gTVNQIGRvZXMgTk9UIG1hdGNoLCBub3JtYWwgcmVhZCBmbG93IOKAlCBhbGwgZGF0YSBpcyBpbiBwdWJsaWMgc3RhdGVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pcnJvcihcbiAgY29sbGVjdGlvbjogQ29sbGVjdGlvblJlc29sdmVyIHwgc3RyaW5nLFxuICBtc3BJZE9yQ29uZGl0aW9uPzogc3RyaW5nIHwgTWlycm9yQ29uZGl0aW9uLFxuICBjb25kaXRpb24/OiBNaXJyb3JDb25kaXRpb25cbikge1xuICBjb25zdCBpc0NvbmRpdGlvbk9ubHkgPVxuICAgIHR5cGVvZiBtc3BJZE9yQ29uZGl0aW9uICE9PSBcInN0cmluZ1wiICYmIEJvb2xlYW4obXNwSWRPckNvbmRpdGlvbik7XG4gIGNvbnN0IG1zcElkID0gaXNDb25kaXRpb25Pbmx5XG4gICAgPyB1bmRlZmluZWRcbiAgICA6IChtc3BJZE9yQ29uZGl0aW9uIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNvbmQgPSBpc0NvbmRpdGlvbk9ubHlcbiAgICA/IChtc3BJZE9yQ29uZGl0aW9uIGFzIE1pcnJvckNvbmRpdGlvbilcbiAgICA6IGNvbmRpdGlvbjtcblxuICBmdW5jdGlvbiBtaXJyb3IoXG4gICAgcmVzb2x2ZXI6IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyxcbiAgICBtc3BJZDogc3RyaW5nLFxuICAgIGNvbmRpdGlvbj86IE1pcnJvckNvbmRpdGlvblxuICApIHtcbiAgICBjb25zdCBtZXRhOiBNaXJyb3JNZXRhZGF0YSA9IHtcbiAgICAgIGNvbmRpdGlvbjogY29uZGl0aW9uLFxuICAgICAgbXNwSWQ6IG1zcElkLFxuICAgICAgcmVzb2x2ZXI6IHJlc29sdmVyLFxuICAgIH07XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgbWV0YWRhdGEoXG4gICAgICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuTUlSUk9SKSxcbiAgICAgICAgbWV0YVxuICAgICAgKSxcbiAgICAgIC8vIFJlYWQgaGFuZGxlciBydW5zIGVhcmx5IChwcmlvcml0eSAzMCkgdG8gc2V0IHVwIGNvbnRleHQgYmVmb3JlIGFueSByZWFkc1xuICAgICAgb25SZWFkKHJlYWRNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMzAgfSksXG4gICAgICAvLyBXcml0ZSBndWFyZHMg4oCUIHJlamVjdCBtYXRjaGluZyBNU1BzIGJlZm9yZSBhbnkgcHJvY2Vzc2luZ1xuICAgICAgb25DcmVhdGUobWlycm9yV3JpdGVHdWFyZCBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDIwIH0pLFxuICAgICAgb25VcGRhdGUobWlycm9yV3JpdGVHdWFyZCBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDIwIH0pLFxuICAgICAgb25EZWxldGUobWlycm9yV3JpdGVHdWFyZCBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDIwIH0pLFxuICAgICAgLy8gTWlycm9yIHN5bmMgaGFuZGxlcnMg4oCUIHdyaXRlIGZ1bGwgbW9kZWwgYWZ0ZXIgb3RoZXIgaGFuZGxlcnMgKHByaW9yaXR5IDEwMClcbiAgICAgIG9uQ3JlYXRlKGNyZWF0ZU1pcnJvckhhbmRsZXIgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAxMDAgfSksXG4gICAgICBvblVwZGF0ZSh1cGRhdGVNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMTAwIH0pLFxuICAgICAgb25EZWxldGUoZGVsZXRlTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDEwMCB9KVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLk1JUlJPUilcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogbWlycm9yLFxuICAgICAgYXJnczogW2NvbGxlY3Rpb24sIG1zcElkLCBjb25kXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uUmVzb2x2ZXIgPSA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwPzogc3RyaW5nLFxuICAuLi5hcmdzOiBhbnlbXVxuKSA9PiBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBNb2RlbENvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciA9IDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZD86IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IG9yZ05hbWUgPVxuICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgY29uc3QgY29uc3RyID0gdHlwZW9mIG1vZGVsID09PSBcImZ1bmN0aW9uXCIgPyBtb2RlbCA6IG1vZGVsLmNvbnN0cnVjdG9yO1xuICBpZiAoIW9yZ05hbWUpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTW9kZWwgJHtjb25zdHIubmFtZX0gaXMgbm90IG93bmVkIGJ5IGFueSBvcmdhbml6YXRpb24uIGRpZCB5b3UgdXNlIEBvd25lZEJ5KCkgKG9yIHByb3ZpZGUgdGhlIG5hbWUpP2BcbiAgICApO1xuICByZXR1cm4gYCR7dG9QYXNjYWxDYXNlKGNvbnN0ci5uYW1lKX0ke29yZ05hbWUgPyB0b1Bhc2NhbENhc2Uob3JnTmFtZSkgOiBcIlwifWA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gTmFtZXNwYWNlQ29sbGVjdGlvbihuYW1lc3BhY2U6IHN0cmluZyk6IENvbGxlY3Rpb25SZXNvbHZlciB7XG4gIHJldHVybiA8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LCBtc3BJZD86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG9yZ05hbWUgPVxuICAgICAgbXNwSWQgfHwgKHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gTW9kZWwub3duZXJPZihtb2RlbCkgOiB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGNvbnN0ciA9IHR5cGVvZiBtb2RlbCA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWwgOiBtb2RlbC5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoIW9yZ05hbWUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE1vZGVsICR7Y29uc3RyLm5hbWV9IGlzIG5vdCBvd25lZCBieSBhbnkgb3JnYW5pemF0aW9uLiBkaWQgeW91IHVzZSBAb3duZWRCeSgpIChvciBwcm92aWRlIHRoZSBuYW1lKT9gXG4gICAgICApO1xuICAgIHJldHVybiBgJHtuYW1lc3BhY2V9JHtvcmdOYW1lID8gdG9QYXNjYWxDYXNlKG9yZ05hbWUpIDogXCJcIn1gO1xuICB9O1xufVxuXG5leHBvcnQgY29uc3QgSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvbjogQ29sbGVjdGlvblJlc29sdmVyID0gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIG1zcElkPzogc3RyaW5nXG4pID0+IHtcbiAgY29uc3Qgb3JnTmFtZSA9XG4gICAgbXNwSWQgfHwgKHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gTW9kZWwub3duZXJPZihtb2RlbCkgOiB1bmRlZmluZWQpO1xuICBpZiAoIW9yZ05hbWUpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfSBpcyBub3Qgb3duZWQgYnkgYW55IG9yZ2FuaXphdGlvbi4gZGlkIHlvdSB1c2UgQG93bmVkQnkoKSAob3IgcHJvdmlkZSB0aGUgbmFtZSk/YFxuICAgICk7XG4gIHJldHVybiBgX18ke3RvUGFzY2FsQ2FzZShvcmdOYW1lKX1Qcml2YXRlQ29sbGVjdGlvbmA7XG59O1xuXG5leHBvcnQgdHlwZSBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhID0ge1xuICBjb2xsZWN0aW9uczogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyO1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJpb3JpdHkgZm9yIGVhcmx5IGNvbGxlY3Rpb24gZXh0cmFjdGlvbiAoYmVmb3JlIHBrIGdlbmVyYXRpb24gYXQgcHJpb3JpdHkgNjApXG4gKiBAc3VtbWFyeSBUaGlzIHByaW9yaXR5IGVuc3VyZXMgY29sbGVjdGlvbnMgYXJlIHJlZ2lzdGVyZWQgaW4gY29udGV4dCBiZWZvcmUgYW55IHNlcXVlbmNlXG4gKiBvcGVyYXRpb25zIG9jY3VyLCBhbGxvd2luZyBzZXF1ZW5jZXMgdG8gYmUgcmVwbGljYXRlZCB0byBwcml2YXRlL3NoYXJlZCBjb2xsZWN0aW9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNFR1JFR0FURURfQ09MTEVDVElPTl9FWFRSQUNUSU9OX1BSSU9SSVRZID0gMzU7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNlZ3JlZ2F0aW9uRmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IE0sXG4gIGNvbGxlY3Rpb25zOiBzdHJpbmdbXSxcbiAgY3R4OiBhbnlcbikge1xuICAvLyBSZWdpc3RlciBjb2xsZWN0aW9ucyBlYXJseSB1c2luZyByZWFkRnJvbSAtIHRoaXMgYWxsb3dzIHNlcXVlbmNlIGNvZGVcbiAgLy8gdG8ga25vdyB3aGljaCBjb2xsZWN0aW9ucyB0byByZXBsaWNhdGUgdG8gZHVyaW5nIHBrIGdlbmVyYXRpb25cbiAgaWYgKGNvbGxlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAoY3R4IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkucmVhZEZyb20oY29sbGVjdGlvbnMpO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgbW9kZWwgaXMgZnVsbHkgc2VncmVnYXRlZCAoYWxsIG5vbi1wayBwcm9wZXJ0aWVzIGFyZSBwcml2YXRlL3NoYXJlZC90cmFuc2llbnQpLlxuICAvLyBVc2UgTW9kZWwuc2VncmVnYXRlKCkgd2hpY2ggaXMgdGhlIGNhbm9uaWNhbCB3YXkgdG8gZGV0ZXJtaW5lIHdoYXQncyB0cmFuc2llbnQsXG4gIC8vIHJhdGhlciB0aGFuIHJlYWRpbmcgREJLZXlzLlRSQU5TSUVOVCBtZXRhZGF0YSB3aGljaCBtYXkgbm90IGFjY3VtdWxhdGUgY29ycmVjdGx5XG4gIC8vIHdoZW4gY2xhc3MtbGV2ZWwgQHByaXZhdGVEYXRhIGFwcGxpZXMgZGVjb3JhdG9ycyBpdGVyYXRpdmVseS5cbiAgaWYgKCFjdHguaXNGdWxseVNlZ3JlZ2F0ZWQgJiYgY29sbGVjdGlvbnMubGVuZ3RoKSB7XG4gICAgaWYgKCFoYXNQdWJsaWNQcm9wZXJ0aWVzKGNsYXp6LmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KSkge1xuICAgICAgY3R4Lm1hcmtGdWxseVNlZ3JlZ2F0ZWQoKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGx5TWlycm9yRmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICBtc3A6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY3R4OiBGYWJyaWNDb250cmFjdENvbnRleHRcbikge1xuICBpZiAoIW1zcCkgcmV0dXJuO1xuICBjb25zdCBtaXJyb3JNZXRhID0gTW9kZWwubWlycm9yZWRBdChjbGF6eik7XG4gIGlmICghbWlycm9yTWV0YSkgcmV0dXJuO1xuICBjb25zdCBtYXRjaGVzID1cbiAgICBtc3AgPT09IG1pcnJvck1ldGEubXNwSWQgfHxcbiAgICAobWlycm9yTWV0YS5jb25kaXRpb24gJiYgbWlycm9yTWV0YS5jb25kaXRpb24obXNwKSk7XG4gIGlmICghbWF0Y2hlcykgcmV0dXJuO1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKFxuICAgIG5ldyBjbGF6eigpLFxuICAgIG1pcnJvck1ldGEucmVzb2x2ZXIsXG4gICAgY3R4XG4gICk7XG4gIC8vIE1pcnJvciBNU1AgbWF0Y2hlcyDigJQgcm91dGUgcmVhZHMgZXhjbHVzaXZlbHkgdGhyb3VnaCB0aGUgbWlycm9yXG4gIC8vIGNvbGxlY3Rpb24uIENsZWFyIGFueSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY29sbGVjdGlvbnMgc28gcXVlcmllc1xuICAvLyBnbyBPTkxZIHRvIHRoZSBtaXJyb3IsIG5vdCB0byB0aGUgcmVndWxhciBwcml2YXRlL3NoYXJlZCBvbmVzLlxuICBjdHgucHV0KFwic2VncmVnYXRlUmVhZFwiLCB1bmRlZmluZWQpO1xuICBjdHgucHV0KFwic2VncmVnYXRlUmVhZFN0YWNrXCIsIHVuZGVmaW5lZCk7XG4gIGN0eC5wdXQoXCJmdWxseVNlZ3JlZ2F0ZWRcIiwgdHJ1ZSk7XG4gIGN0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBjdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIGN0eC5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gaGFzUHVibGljUHJvcGVydGllczxNIGV4dGVuZHMgTW9kZWw+KGNsYXp6OiBDb25zdHJ1Y3RvcjxNPik6IGJvb2xlYW4ge1xuICBjb25zdCBhdHRyaWJ1dGVzID0gTWV0YWRhdGEuZ2V0QXR0cmlidXRlcyhjbGF6eikgfHwgW107XG4gIGNvbnN0IHBrID0gTW9kZWwucGsoY2xhenopO1xuICBjb25zdCB0cmFuc2llbnRNZXRhID0gTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgREJLZXlzLlRSQU5TSUVOVCkgfHwge307XG4gIGNvbnN0IHByaXZhdGVNZXRhID1cbiAgICBNZXRhZGF0YS5nZXQoY2xhenogYXMgYW55LCBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLlBSSVZBVEUpKSB8fCB7fTtcbiAgY29uc3Qgc2hhcmVkTWV0YSA9XG4gICAgTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5TSEFSRUQpKSB8fCB7fTtcblxuICByZXR1cm4gYXR0cmlidXRlcy5zb21lKChhdHRyKSA9PiB7XG4gICAgaWYgKGF0dHIgPT09IHBrKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGF0dHIgaW4gdHJhbnNpZW50TWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHByaXZhdGVNZXRhKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGF0dHIgaW4gc2hhcmVkTWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRWFybHkgaGFuZGxlciB0byBleHRyYWN0IGFuZCByZWdpc3RlciBjb2xsZWN0aW9ucyBpbiBjb250ZXh0XG4gKiBAc3VtbWFyeSBSdW5zIHdpdGggcHJpb3JpdHkgPCA0MCB0byBleHRyYWN0IGNvbGxlY3Rpb24gbmFtZXMgYmVmb3JlIHBrIGdlbmVyYXRpb24gKHByaW9yaXR5IDYwKS5cbiAqIFRoaXMgYWxsb3dzIEZhYnJpY0NvbnRyYWN0U2VxdWVuY2UgdG8ga25vdyB3aGljaCBjb2xsZWN0aW9ucyB0byByZXBsaWNhdGUgdG8uXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gKiBAcGFyYW0ge0NvbnRleHRPZjxSZXBvc2l0b3J5PE0sIGFueT4+fSBjb250ZXh0IC0gVGhlIGV4ZWN1dGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ge1NlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW119IGRhdGEgLSBUaGUgc2VncmVnYXRlZCBkYXRhIG1ldGFkYXRhXG4gKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdfSBrZXlzIC0gVGhlIHByb3BlcnR5IGtleShzKSBiZWluZyBzZWdyZWdhdGVkXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0cmFjdFNlZ3JlZ2F0ZWRDb2xsZWN0aW9uczxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIGNvbnRleHQ6IENvbnRleHRPZjx0eXBlb2YgdGhpcz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleXM6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcCkge1xuICAgIC8vIENhbid0IGV4dHJhY3QgY29sbGVjdGlvbnMgd2l0aG91dCBNU1AsIHdpbGwgYmUgY2F1Z2h0IGJ5IGxhdGVyIGhhbmRsZXJzXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbWV0YWRhdGEgb2YgZGF0YUFycmF5KSB7XG4gICAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gbWV0YWRhdGEuY29sbGVjdGlvbnM7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuICAgIGlmIChjb2xsZWN0aW9uICYmICFjb2xsZWN0aW9ucy5pbmNsdWRlcyhjb2xsZWN0aW9uKSkge1xuICAgICAgY29sbGVjdGlvbnMucHVzaChjb2xsZWN0aW9uKTtcbiAgICB9XG4gIH1cbiAgYXBwbHlTZWdyZWdhdGlvbkZsYWdzKG1vZGVsLCBjb2xsZWN0aW9ucywgY29udGV4dCk7XG5cbiAgLy8gU3RvcmUgc2VncmVnYXRpb24gbWV0YWRhdGEgb24gdGhlIGFkYXB0ZXIgKHBlcnNpc3RzIGFjcm9zcyBjb250ZXh0IGNoYWlucykuXG4gIC8vIFRoZSBTZXF1ZW5jZSBjcmVhdGVzIGl0cyBvd24gY29udGV4dCB2aWEgbG9nQ3R4LCBsb3NpbmcgY29udGV4dC1zdG9yZWQgZmxhZ3MuXG4gIGNvbnN0IHNlcU5hbWUgPSBNb2RlbC5zZXF1ZW5jZU5hbWUobW9kZWwsIFwicGtcIik7XG4gIChjb250ZXh0IGFzIGFueSkuc2V0U2VxdWVuY2VTZWdyZWdhdGlvbihcbiAgICBzZXFOYW1lLFxuICAgIChjb250ZXh0IGFzIGFueSkuaXNGdWxseVNlZ3JlZ2F0ZWQsXG4gICAgY29sbGVjdGlvbnNcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIC8vIFZhbGlkYXRlIGFsbCBrZXlzIHJlc29sdmUgdG8gdGhlIHNhbWUgY29sbGVjdGlvblxuICBrZXlBcnJheS5mb3JFYWNoKChfaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSBrZXlBcnJheS5tYXAoKGtleSkgPT4gU3RyaW5nKGtleSkpO1xuICAvLyBTdG9yZSB0aGUgc2VncmVnYXRlZCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25SZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNGbGFncz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleXM6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID0gTW9kZWwub3duZXJPZihtb2RlbCkgfHwgZXh0cmFjdE1zcElkKGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikpO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBhd2FpdCBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25VcGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXk6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgb2xkTW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAga2V5QXJyYXkuZm9yRWFjaCgoaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSAoa2V5QXJyYXkgYXMgKGtleW9mIE0pW10pLm1hcCgoa2V5KSA9PiBTdHJpbmcoa2V5KSk7XG4gIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25EZWxldGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55PixcbiAgViBleHRlbmRzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYgfCBWW10sXG4gIGtleTogKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdKSBhcyBWW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gc2VncmVnYXRlZChcbiAgY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyLFxuICB0eXBlOiBGYWJyaWNNb2RlbEtleXMuUFJJVkFURSB8IEZhYnJpY01vZGVsS2V5cy5TSEFSRUQsXG4gIGZpbHRlcj86IChwcm9wTmFtZTogc3RyaW5nKSA9PiBib29sZWFuXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyU2VncmVnYXRlZCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICBmdW5jdGlvbiBzZWdyZWdhdGVkRGVjKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgICAgY29uc3Qga2V5ID0gTWV0YWRhdGEua2V5KHR5cGUsIHByb3BlcnR5S2V5KTtcbiAgICAgIGNvbnN0IGNvbnN0cjogQ29uc3RydWN0b3IgPSB0YXJnZXQuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I7XG5cbiAgICAgIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBrZXkpIHx8IHt9O1xuICAgICAgY29uc3QgY29sbGVjdGlvbnMgPSBuZXcgU2V0KG1ldGEuY29sbGVjdGlvbnMgfHwgW10pO1xuICAgICAgY29sbGVjdGlvbnMuYWRkKGNvbGxlY3Rpb24pO1xuICAgICAgbWV0YS5jb2xsZWN0aW9ucyA9IFsuLi5jb2xsZWN0aW9uc107XG4gICAgICBNZXRhZGF0YS5zZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBrZXksIG1ldGEpO1xuXG4gICAgICBjb25zdCBjb25zdHJNZXRhID0gTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgdHlwZSkgfHwge307XG4gICAgICBjb25zdCBjb25zdHJDb2xsZWN0aW9ucyA9IG5ldyBTZXQoY29uc3RyTWV0YS5jb2xsZWN0aW9ucyB8fCBbXSk7XG4gICAgICBjb25zdHJDb2xsZWN0aW9ucy5hZGQoY29sbGVjdGlvbik7XG4gICAgICBjb25zdHJNZXRhLmNvbGxlY3Rpb25zID0gWy4uLmNvbnN0ckNvbGxlY3Rpb25zXTtcbiAgICAgIE1ldGFkYXRhLnNldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIHR5cGUsIGNvbnN0ck1ldGEpO1xuXG4gICAgICBjb25zdCB0cmFuc2llbnRNZXRhID1cbiAgICAgICAgTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgREJLZXlzLlRSQU5TSUVOVCkgfHwge307XG4gICAgICBjb25zdCB1cGRhdGVkVHJhbnNpZW50TWV0YSA9IHtcbiAgICAgICAgLi4udHJhbnNpZW50TWV0YSxcbiAgICAgICAgW3Byb3BlcnR5S2V5IGFzIGFueV06IHt9LFxuICAgICAgfTtcbiAgICAgIE1ldGFkYXRhLnNldChcbiAgICAgICAgY29uc3RyIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICBEQktleXMuVFJBTlNJRU5ULFxuICAgICAgICB1cGRhdGVkVHJhbnNpZW50TWV0YVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNzOiBhbnlbXSA9IFtdO1xuICAgIGlmICghcHJvcGVydHlLZXkpIHtcbiAgICAgIC8vIGRlY29yYXRlZCBhdCB0aGUgY2xhc3MgbGV2ZWxcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXRBdHRyaWJ1dGVzKHRhcmdldCBhcyBDb25zdHJ1Y3Rvcik7XG4gICAgICBwcm9wZXJ0aWVzPy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihwKSkge1xuICAgICAgICAgIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgdHlwZSkoKHRhcmdldCBhcyBhbnkpLnByb3RvdHlwZSwgcCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZ3JvdXBOYW1lID1cbiAgICAgICAgdHlwZW9mIGNvbGxlY3Rpb24gPT09IFwic3RyaW5nXCIgPyBjb2xsZWN0aW9uIDogY29sbGVjdGlvbi50b1N0cmluZygpO1xuICAgICAgLy8gVXNlIGRpZmZlcmVudCBncm91cCBuYW1lcyBmb3IgZXh0cmFjdGlvbiB2cyBkYXRhIGhhbmRsZXJzIHRvIHByZXZlbnQgbWVyZ2luZ1xuICAgICAgY29uc3QgZXh0cmFjdEdyb3VwTmFtZSA9IGAke2dyb3VwTmFtZX06ZXh0cmFjdGA7XG4gICAgICBjb25zdCBkYXRhR3JvdXBOYW1lID0gYCR7Z3JvdXBOYW1lfTpkYXRhYDtcbiAgICAgIGNvbnN0IGVhcmx5RXh0cmFjdGlvbk1ldGEgPSB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH07XG4gICAgICBjb25zdCBlYXJseUV4dHJhY3Rpb25Hcm91cFNvcnQgPSB7XG4gICAgICAgIHByaW9yaXR5OiBTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSxcbiAgICAgICAgZ3JvdXA6IGV4dHJhY3RHcm91cE5hbWUsXG4gICAgICB9O1xuICAgICAgZGVjcy5wdXNoKFxuICAgICAgICBwcm9wKCksXG4gICAgICAgIHRyYW5zaWVudCgpLFxuICAgICAgICBzZWdyZWdhdGVkRGVjLFxuICAgICAgICAvLyBFYXJseSBleHRyYWN0aW9uIGhhbmRsZXJzIC0gcnVuIEJFRk9SRSBwayBnZW5lcmF0aW9uIChwcmlvcml0eSA2MClcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGNvbGxlY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIGNvbnRleHQgZm9yIHNlcXVlbmNlIHJlcGxpY2F0aW9uXG4gICAgICAgIC8vIFdlIHJlZ2lzdGVyIGZvciBlYWNoIG9wZXJhdGlvbiBleHBsaWNpdGx5IHRvIGVuc3VyZSBwcm9wZXIgaGFuZGxlciBsb29rdXBcbiAgICAgICAgb24oXG4gICAgICAgICAgREJPcGVyYXRpb25zLkFMTCxcbiAgICAgICAgICBleHRyYWN0U2VncmVnYXRlZENvbGxlY3Rpb25zIGFzIGFueSxcbiAgICAgICAgICBlYXJseUV4dHJhY3Rpb25NZXRhLFxuICAgICAgICAgIGVhcmx5RXh0cmFjdGlvbkdyb3VwU29ydFxuICAgICAgICApLFxuICAgICAgICAvLyBNYWluIGhhbmRsZXJzIGZvciBzZWdyZWdhdGVkIGRhdGEgb3BlcmF0aW9ucyAocHJpb3JpdHkgOTUpXG4gICAgICAgIG9uQ3JlYXRlKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGUsXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25SZWFkKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25SZWFkIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvblVwZGF0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uVXBkYXRlIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvbkRlbGV0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uRGVsZXRlIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYXBwbHkoLi4uZGVjcykodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlRGF0YShcbiAgY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyID0gSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvblxuKSB7XG4gIGZ1bmN0aW9uIHByaXZhdGVEYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICAgIHJldHVybiBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuUFJJVkFURSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogcHJpdmF0ZURhdGEsXG4gICAgICBhcmdzOiBbY29sbGVjdGlvbl0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZERhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gIGZ1bmN0aW9uIHNoYXJlZERhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gICAgcmV0dXJuIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgRmFicmljTW9kZWxLZXlzLlNIQVJFRCk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlNIQVJFRClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogc2hhcmVkRGF0YSxcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBKU09OU2VyaWFsaXplcixcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWN1cnNpdmVseSBzb3J0cyBvYmplY3Qga2V5cyB3aXRob3V0IHJlb3JkZXJpbmcgYXJyYXlzXG4gKiBAcGFyYW0ge2FueX0gb2JqIC0gVGhlIHZhbHVlIHRvIHByb2Nlc3NcbiAqIEByZXR1cm4ge2FueX0gQSBjb3B5IHdpdGggc29ydGVkIG9iamVjdCBrZXlzIGJ1dCBwcmVzZXJ2ZWQgYXJyYXkgb3JkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzT25seVJlY3Vyc2l2ZShvYmo6IGFueSk6IGFueSB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG9iajtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iai5tYXAoc29ydEtleXNPbmx5UmVjdXJzaXZlKTtcbiAgaWYgKG9iai5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSByZXR1cm4gb2JqO1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVxuICAgIC5zb3J0KClcbiAgICAucmVkdWNlKChhY2M6IFJlY29yZDxzdHJpbmcsIGFueT4sIGtleSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSBzb3J0S2V5c09ubHlSZWN1cnNpdmUob2JqW2tleV0pO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERldGVybWluaXN0aWMgSlNPTiBzZXJpYWxpemVyIGZvciBGYWJyaWMgbW9kZWxzXG4gKiBAc3VtbWFyeSBFbnN1cmVzIHN0YWJsZSwgZGV0ZXJtaW5pc3RpYyBKU09OIG91dHB1dCBieSBzb3J0aW5nIG9iamVjdCBrZXlzIHJlY3Vyc2l2ZWx5IGJlZm9yZSBzdHJpbmdpZmljYXRpb24sIHdoaWNoIGlzIGltcG9ydGFudCBmb3IgRmFicmljIGVuZG9yc2VtZW50IGFuZCBoYXNoaW5nLiBFeHRlbmRzIEpTT05TZXJpYWxpemVyIHRvIHBsdWcgaW50byBleGlzdGluZyBEZWNhZiBtb2RlbCBzZXJpYWxpemF0aW9uIGZsb3cuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBEZWNhZiBNb2RlbCBzdWJ0eXBlIHNlcmlhbGl6ZWQgYnkgdGhpcyBpbnN0YW5jZVxuICogQHBhcmFtIHt2b2lkfSBbY29uc3RydWN0b3JdIE5vIHB1YmxpYyBjb25zdHJ1Y3RvciBhcmd1bWVudHNcbiAqIEBjbGFzcyBEZXRlcm1pbmlzdGljU2VyaWFsaXplclxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8TXlNb2RlbD4oKTtcbiAqIGNvbnN0IGpzb24gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShtb2RlbCk7XG4gKiBjb25zdCByZWJ1aWx0ID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShqc29uKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IERTIGFzIERldGVybWluaXN0aWNTZXJpYWxpemVyXG4gKiAgIENhbGxlci0+PkRTOiBzZXJpYWxpemUobW9kZWwpXG4gKiAgIERTLT4+RFM6IHByZVNlcmlhbGl6ZShtb2RlbClcbiAqICAgRFMtPj5EUzogc29ydC1rZXlzLXJlY3Vyc2l2ZVxuICogICBEUy0+PkRTOiBqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXG4gKiAgIERTLS0+PkNhbGxlcjogc3RyaW5nXG4gKiAgIENhbGxlci0+PkRTOiBkZXNlcmlhbGl6ZShzdHJpbmcpXG4gKiAgIERTLS0+PkNhbGxlcjogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIERldGVybWluaXN0aWNTZXJpYWxpemVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0pIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIC8vIFRPRE86IFZlcmlmeSB3aHkgdGhlcmUgaXMgbm8gbWV0YWRhdGFcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBsZXQgbWV0YWRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGEgfHwgbW9kZWwuY29uc3RydWN0b3IubmFtZTtcblxuICAgIGNvbnN0IHByZVNlcmlhbGl6ZSA9IGZ1bmN0aW9uIHByZVNlcmlhbGl6ZShcbiAgICAgIHRoaXM6IERldGVybWluaXN0aWNTZXJpYWxpemVyPGFueT4sXG4gICAgICBvYmo6IGFueVxuICAgICk6IGFueSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcCgobykgPT4gcHJlU2VyaWFsaXplLmNhbGwoc2VsZiwgbykpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlU2VyaWFsaXplLmNhbGwodGhpcywgb2JqKTtcbiAgICB9LmJpbmQodGhpcyk7XG5cbiAgICBNb2RlbC5yZWxhdGlvbnMobW9kZWwpLmZvckVhY2goKHIpID0+IHtcbiAgICAgIHRvU2VyaWFsaXplW3JdID0gcHJlU2VyaWFsaXplKHRvU2VyaWFsaXplW3JdKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG9TZXJpYWxpemU7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVidWlsZHMgYSBtb2RlbCBmcm9tIGEgc2VyaWFsaXphdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBmYWlscyB0byBwYXJzZSB0aGUgc3RyaW5nLCBvciB0byBidWlsZCB0aGUgbW9kZWxcbiAgICovXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRlc2VyaWFsaXphdGlvbltNb2RlbEtleXMuQU5DSE9SXTtcbiAgICBpZiAoIWNsYXNzTmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcmlhbGl6ZSBhIG1vZGVsIGludG8gYSBkZXRlcm1pbmlzdGljIEpTT04gc3RyaW5nXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCB3aXRoIHByZVNlcmlhbGl6ZSwgc29ydHMga2V5cyByZWN1cnNpdmVseSwgYW5kIHN0cmluZ2lmaWVzIGRldGVybWluaXN0aWNhbGx5IGZvciBzdGFibGUgb3JkZXJpbmdcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHJldHVybiB7c3RyaW5nfSBEZXRlcm1pbmlzdGljIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsXG4gICAqL1xuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoXCJqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXCIpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNPbmx5UmVjdXJzaXZlKHRoaXMucHJlU2VyaWFsaXplKG1vZGVsKSkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgRmFicmljIGV2ZW50IG5hbWUgZnJvbSBjb21wb25lbnRzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIGV2ZW50IG5hbWUgYnkgam9pbmluZyB0YWJsZSwgZXZlbnQsIGFuZCBvcHRpb25hbCBvd25lciB3aXRoIHVuZGVyc2NvcmVzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUvY29sbGVjdGlvbiBuYW1lXG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmd9IGV2ZW50IC0gVGhlIGV2ZW50IHR5cGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3duZXJdIC0gT3B0aW9uYWwgb3duZXIgaWRlbnRpZmllclxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGV2ZW50IG5hbWUgaW4gZm9ybWF0IFwidGFibGVfZXZlbnRcIiBvciBcInRhYmxlX2V2ZW50X293bmVyXCJcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWUoXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICBvd25lcj86IHN0cmluZ1xuKSB7XG4gIGNvbnN0IHBhcmFtcyA9IFt0YWJsZSwgZXZlbnRdO1xuICBpZiAob3duZXIpIHBhcmFtcy5wdXNoKG93bmVyKTtcbiAgcmV0dXJuIHBhcmFtcy5qb2luKFwiX1wiKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgRmFicmljIGV2ZW50IG5hbWUgaW50byBpdHMgY29tcG9uZW50c1xuICogQHN1bW1hcnkgU3BsaXRzIGFuIGV2ZW50IG5hbWUgYnkgdW5kZXJzY29yZXMgYW5kIGV4dHJhY3RzIHRhYmxlLCBldmVudCwgYW5kIG9wdGlvbmFsIG93bmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBldmVudCBuYW1lIHRvIHBhcnNlXG4gKiBAcmV0dXJuIHt7dGFibGU6IHN0cmluZywgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsIG93bmVyOiBzdHJpbmd9fSBUaGUgcGFyc2VkIGNvbXBvbmVudHMgYXMgYSBzdHJ1Y3R1cmVkIG9iamVjdFxuICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlIGV2ZW50IG5hbWUgZm9ybWF0IGlzIGludmFsaWRcbiAqIEBmdW5jdGlvbiBwYXJzZUV2ZW50TmFtZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgUGFyc2VyIGFzIHBhcnNlRXZlbnROYW1lXG4gKiAgIENhbGxlci0+PlBhcnNlcjogcGFyc2VFdmVudE5hbWUobmFtZSlcbiAqICAgUGFyc2VyLT4+UGFyc2VyOiBzcGxpdCBuYW1lIGJ5IFwiX1wiXG4gKiAgIGFsdCBwYXJ0cyBsZW5ndGggaW52YWxpZFxuICogICAgIFBhcnNlci0tPj5DYWxsZXI6IHRocm93IEludGVybmFsRXJyb3JcbiAqICAgZWxzZVxuICogICAgIFBhcnNlci0tPj5DYWxsZXI6IHsgdGFibGUsIGV2ZW50LCBvd25lcj8gfVxuICogICBlbmRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRXZlbnROYW1lKG5hbWU6IHN0cmluZyk6IHtcbiAgdGFibGU/OiBzdHJpbmc7XG4gIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nO1xuICBvd25lcj86IHN0cmluZztcbn0ge1xuICBjb25zdCBwYXJ0cyA9IG5hbWUuc3BsaXQoXCJfXCIpO1xuICBpZiAocGFydHMubGVuZ3RoIDwgMiB8fCBwYXJ0cy5sZW5ndGggPiAzKVxuICAgIHJldHVybiB7IHRhYmxlOiB1bmRlZmluZWQsIGV2ZW50OiBuYW1lLCBvd25lcjogdW5kZWZpbmVkIH07XG4gIHJldHVybiB7XG4gICAgdGFibGU6IHBhcnRzWzBdLFxuICAgIGV2ZW50OiBwYXJ0c1sxXSxcbiAgICBvd25lcjogcGFydHNbMl0sXG4gIH0gYXMge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmc7XG4gICAgb3duZXI/OiBzdHJpbmc7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBPdmVyZmxvd0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gT3ZlcmZsb3ctc2FmZSBhZGRpdGlvbiBvcGVyYXRpb25cbiAqIEBzdW1tYXJ5IEFkZHMgdHdvIG51bWJlcnMgYW5kIHZlcmlmaWVzIG5vIG92ZXJmbG93IGJ5IHJldmVyc2UtY2hlY2tpbmcgdGhlIG9wZXJhbmRzXG4gKiBAcGFyYW0ge251bWJlcn0gYSAtIEZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gU2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHN1bSBvZiBhIGFuZCBiXG4gKiBAZnVuY3Rpb24gYWRkXG4gKiBAdGhyb3dzIHtPdmVyZmxvd0Vycm9yfSBvbiBhZGRpdGlvbiBvdmVyZmxvd1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgYyA9IGEgKyBiO1xuICBpZiAoYSAhPT0gYyAtIGIgfHwgYiAhPT0gYyAtIGEpIHtcbiAgICB0aHJvdyBuZXcgT3ZlcmZsb3dFcnJvcihgQWRkaXRpb24gb3ZlcmZsb3c6ICR7YX0gKyAke2J9YCk7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE92ZXJmbG93LXNhZmUgc3VidHJhY3Rpb24gb3BlcmF0aW9uXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdHMgYiBmcm9tIGEgYW5kIHZhbGlkYXRlcyBubyBvdmVyZmxvdyBieSByZXZlcnNlLWNoZWNraW5nIHRoZSBvcGVyYW5kc1xuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBNaW51ZW5kXG4gKiBAcGFyYW0ge251bWJlcn0gYiAtIFN1YnRyYWhlbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRpZmZlcmVuY2UgYSAtIGJcbiAqIEBmdW5jdGlvbiBzdWJcbiAqIEB0aHJvd3Mge092ZXJmbG93RXJyb3J9IG9uIHN1YnRhY3Rpb24gb3ZlcmZsb3dcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGMgPSBhIC0gYjtcbiAgaWYgKGEgIT09IGMgKyBiIHx8IGIgIT09IGEgLSBjKSB7XG4gICAgdGhyb3cgbmV3IE92ZXJmbG93RXJyb3IoYFN1YnRyYWN0aW9uIG92ZXJmbG93OiAke2F9IC0gJHtifWApO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFNhZmUgSW50ZWdlciBQYXJzZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqXG4gKiBAZnVuY3Rpb24gc2FmZVBhcnNlSW50XG4gKlxuICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBpZiBwYXJzZUludCByZXR1cm5zIE5hTlxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVQYXJzZUludChzdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBjaGVjayBpZiBzdHJpbmcgb25seSBoYXZlIGRpZ2l0c1xuICBjb25zdCBkaWdpdFJlZ2V4ID0gL15cXGQrJC87XG4gIGlmICghZGlnaXRSZWdleC50ZXN0KHN0cmluZykpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgc3RyaW5nRm9ybWF0KFwiRmFpbGVkIHRvIHBhcnNlOiB7MH1cIiwgXCJzdHJpbmcgY29udGFpbnMgZGlnaXRzXCIpXG4gICAgKTtcbiAgfVxuICBjb25zdCBwYXJzZWRpbnQgPSBwYXJzZUludChzdHJpbmcpO1xuICBpZiAoaXNOYU4ocGFyc2VkaW50KSkge1xuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBzdHJpbmdGb3JtYXQoXCJGYWlsZWQgdG8gcGFyc2U6IHswfVwiLCBcInN0cmluZyBpcyBub3QgYSBwYXJzYWJsZSBpbnRlZ2VyXCIpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkaW50O1xufVxuIiwiaW1wb3J0IHtcbiAgSlNPTlNlcmlhbGl6ZXIsXG4gIE1vZGVsLFxuICBNb2RlbEtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgc29ydEtleXNPbmx5UmVjdXJzaXZlIH0gZnJvbSBcIi4vRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBvdmVycmlkZSBkZXNlcmlhbGl6ZShzdHI6IHN0cmluZywgdGFibGVOYW1lPzogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIC8vIGNvbnN0IGNsYXNzTmFtZSA9IHRhYmxlTmFtZTtcbiAgICAvLyBpZiAoIWNsYXNzTmFtZSlcbiAgICAvLyAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuXG4gICAgLy8gLy8gdGhpcyB3aWxsIHJldHVybiB1bmRlZmluZWQgdmFsdWVzXG4gICAgLy8gY29uc3QgbW9kZWw6IE0gPSBNb2RlbC5idWlsZChkZXNlcmlhbGl6YXRpb24sIGNsYXNzTmFtZSkgYXMgdW5rbm93biBhcyBNO1xuXG4gICAgLy8gLy8gUG9wdWxhdGUgTW9kZWxcbiAgICAvLyBjb25zdCBwcm9jZXNzZWREZXNlYWxpemF0aW9uID0gT2JqZWN0LmtleXMobW9kZWwpLnJlZHVjZShcbiAgICAvLyAgIChhY2N1bTogTSwga2V5KSA9PiB7XG4gICAgLy8gICAgIChhY2N1bSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID1cbiAgICAvLyAgICAgICBkZXNlcmlhbGl6YXRpb25bUmVwb3NpdG9yeS5jb2x1bW4oYWNjdW0sIGtleSldO1xuICAgIC8vICAgICByZXR1cm4gYWNjdW07XG4gICAgLy8gICB9LFxuICAgIC8vICAgbW9kZWxcbiAgICAvLyApO1xuXG4gICAgLy8gY29uc3QgcmVzdWx0ID0gTW9kZWwuYnVpbGQoXG4gICAgLy8gICBwcm9jZXNzZWREZXNlYWxpemF0aW9uLFxuICAgIC8vICAgY2xhc3NOYW1lXG4gICAgLy8gKSBhcyB1bmtub3duIGFzIE07XG5cbiAgICAvLyByZXR1cm4gcmVzdWx0O1xuICAgIHJldHVybiBkZXNlcmlhbGl6YXRpb247XG4gIH1cblxuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0sIHB1dEFuY2hvciA9IHRydWUpOiBzdHJpbmcge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgY29uc3Qgc3RyaW5naWZ5ID0gcmVxdWlyZShcImpzb24tc3RyaW5naWZ5LWRldGVybWluaXN0aWNcIik7XG4gICAgY29uc3QgcHJlU2VyaWFsaXphdGlvbiA9IHRoaXMucHJlU2VyaWFsaXplKG1vZGVsLCBwdXRBbmNob3IpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNPbmx5UmVjdXJzaXZlKHByZVNlcmlhbGl6YXRpb24pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0sIHB1dEFuY2hvcjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIC8vIFRPRE86IFZlcmlmeSB3aHkgdGhlcmUgaXMgbm8gbWV0YWRhdGFcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBsZXQgbWV0YWRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChwdXRBbmNob3IpXG4gICAgICB0b1NlcmlhbGl6ZVtNb2RlbEtleXMuQU5DSE9SXSA9IG1ldGFkYXRhIHx8IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgICBmdW5jdGlvbiBwcmVTZXJpYWxpemUoXG4gICAgICB0aGlzOiBTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxhbnk+LFxuICAgICAgb2JqOiBhbnlcbiAgICApOiBhbnkge1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcChwcmVTZXJpYWxpemUpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlU2VyaWFsaXplKG9iaik7XG4gICAgfVxuICAgIE1vZGVsLnJlbGF0aW9ucyhtb2RlbCkuZm9yRWFjaCgocikgPT4ge1xuICAgICAgdG9TZXJpYWxpemVbcl0gPSBwcmVTZXJpYWxpemUuY2FsbCh0aGlzLCB0b1NlcmlhbGl6ZVtyXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIENsaWVudEJhc2VkU2VydmljZSxcbiAgQ29udGV4dCxcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBQZXJzaXN0ZW5jZUtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IEZhYnJpY0NBU2VydmljZXMsIHtcbiAgQWZmaWxpYXRpb25TZXJ2aWNlLFxuICBJQXR0cmlidXRlUmVxdWVzdCxcbiAgSWRlbnRpdHlTZXJ2aWNlLFxuICBJRW5yb2xsUmVzcG9uc2UsXG4gIElJZGVudGl0eVJlcXVlc3QsXG4gIElSZWdpc3RlclJlcXVlc3QsXG4gIElSZXZva2VSZXF1ZXN0LFxuICBJU2VydmljZVJlc3BvbnNlLFxuICBUTFNPcHRpb25zLFxufSBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHsgQ0FDb25maWcsIENyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQ29uZmxpY3RFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb3JlVXRpbHMsIGdldEFraUFuZFNlcmlhbEZyb21DZXJ0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge1xuICBDZXJ0aWZpY2F0ZVJlc3BvbnNlLFxuICBGYWJyaWNJZGVudGl0eSxcbiAgR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgSWRlbnRpdHlSZXNwb25zZSxcbn0gZnJvbSBcIi4uLy4uL3NoYXJlZC9mYWJyaWMtdHlwZXNcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgQ0FfUk9MRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSUtleVZhbHVlQXR0cmlidXRlIH0gZnJvbSBcIi4vRmFicmljRW5yb2xsbWVudFNlcnZpY2VcIjtcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9pbmRleFwiO1xuaW1wb3J0IHsgQ3J5cHRvVXRpbHMgfSBmcm9tIFwiLi4vY3J5cHRvXCI7XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNJZGVudGl0eVNlcnZpY2UgZXh0ZW5kcyBDbGllbnRCYXNlZFNlcnZpY2U8XG4gIEZhYnJpY0NBU2VydmljZXMsXG4gIENBQ29uZmlnXG4+IHtcbiAgcHJvdGVjdGVkIF91c2VyITogVXNlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCByb290Q2xpZW50KCk6IHsgbmV3Q2VydGlmaWNhdGVTZXJ2aWNlOiBhbnkgfSB7XG4gICAgcmV0dXJuICh0aGlzLmNsaWVudCBhcyBhbnkpW1wiX0ZhYnJpY0NhU2VydmljZXNcIl0gYXMgYW55O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB1c2VyKCk6IFVzZXIge1xuICAgIGlmICghdGhpcy5fdXNlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIkZhYnJpYyBpZGVudGl0eSBzZXJ2aWNlIG5vdCBwcm9wZXJseSBzZXR1cDogbWlzc2luZyB1c2VyXCJcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGNlcnRpZmljYXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q2xpZW50Lm5ld0NlcnRpZmljYXRlU2VydmljZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBhZmZpbGlhdGlvbnMoKTogQWZmaWxpYXRpb25TZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubmV3QWZmaWxpYXRpb25TZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGlkZW50aXRpZXMoKTogSWRlbnRpdHlTZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0VXNlcihjZmc6IENBQ29uZmlnLCBjdHg6IENvbnRleHQpIHtcbiAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyLmZvcih0aGlzLmdldFVzZXIpO1xuICAgIGNvbnN0IHsgY2FOYW1lLCBjYUNlcnQsIGNhS2V5LCB1cmwsIGhzbSB9ID0gY2ZnO1xuXG4gICAgbG9nLmluZm8oYENyZWF0aW5nIENBIHVzZXIgZm9yICR7Y2FOYW1lfSBhdCAke3VybH1gKTtcbiAgICBsb2cudmVyYm9zZShgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7Y2FDZXJ0fWApO1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhQ2VydCk7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaHNtKSB7XG4gICAgICBpZiAoIWNhS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNaXNzaW5nIGNhS2V5IGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfS4gUHJvdmlkZSBhIGtleSBkaXJlY3Rvcnkgb3IgY29uZmlndXJlIEhTTSBzdXBwb3J0LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBrZXkgZnJvbSAke2NhS2V5fWApO1xuICAgICAga2V5ID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgVXNpbmcgSFNNIGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfSB3aXRoIGxpYnJhcnkgJHtoc20ubGlicmFyeX1gXG4gICAgICApO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYExvYWRpbmcgQWRtaW4gdXNlciBmb3IgY2EgJHtjYU5hbWV9YCk7XG4gICAgdGhpcy5fdXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoXCJhZG1pblwiLCBrZXksIGNlcnRpZmljYXRlLCBjYU5hbWUsIHtcbiAgICAgIGhzbSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fdXNlcjtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGluaXRpYWxpemUoXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTx7IGNvbmZpZzogQ0FDb25maWc7IGNsaWVudDogRmFicmljQ0FTZXJ2aWNlcyB9PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUGVyc2lzdGVuY2VLZXlzLklOSVRJQUxJWkFUSU9OLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgY29uc3QgW2NvbmZpZ10gPSBhcmdzO1xuICAgIGlmICghY29uZmlnKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgRmFicmljIENBIGNvbmZpZ3VyYXRpb25cIik7XG5cbiAgICBjb25zdCB7IHVybCwgdGxzLCBjYU5hbWUgfSA9IGNvbmZpZztcbiAgICBsb2cuaW5mbyhgSW5pdGlhbGl6aW5nIENBIENsaWVudCBmb3IgQ0EgJHtjb25maWcuY2FOYW1lfSBhdCAke2NvbmZpZy51cmx9YCk7XG4gICAgY29uc3QgeyB0cnVzdGVkUm9vdHMsIHZlcmlmeSB9ID0gdGxzIGFzIFRMU09wdGlvbnM7XG5cbiAgICBjb25zdCByb290ID0gKHRydXN0ZWRSb290cyBhcyBzdHJpbmdbXSlbMF0gYXMgc3RyaW5nO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7cm9vdH0uIGN3ZDogJHtwcm9jZXNzLmN3ZCgpfWApO1xuXG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0RmlsZUNvbnRlbnQocm9vdCk7XG5cbiAgICBsb2cuZGVidWcoYENBIENlcnRpZmljYXRlOiAke2NlcnRpZmljYXRlLnRvU3RyaW5nKCl9YCk7XG5cbiAgICBjb25zdCBjbGllbnQgPSBuZXcgRmFicmljQ0FTZXJ2aWNlcyhcbiAgICAgIHVybCxcbiAgICAgIHtcbiAgICAgICAgdHJ1c3RlZFJvb3RzOiBCdWZmZXIuZnJvbShjZXJ0aWZpY2F0ZSksXG4gICAgICAgIHZlcmlmeSxcbiAgICAgIH0gYXMgVExTT3B0aW9ucyxcbiAgICAgIGNhTmFtZVxuICAgICk7XG5cbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5nZXRVc2VyKGNvbmZpZywgY3R4KTtcbiAgICBsb2cuZGVidWcoYENBIHVzZXIgbG9hZGVkOiAke3VzZXIuZ2V0TmFtZSgpfWApO1xuICAgIHJldHVybiB7XG4gICAgICBjb25maWcsXG4gICAgICBjbGllbnQsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldENlcnRpZmljYXRlcyguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55Pik6IFByb21pc2U8c3RyaW5nW10+O1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXMoXG4gICAgcmVxdWVzdDogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHN0cmluZ1tdPjtcbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzPE1BUCBleHRlbmRzIGJvb2xlYW4+KFxuICAgIGRvTWFwOiBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICByZXF1ZXN0OiBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICAgIGRvTWFwOiBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICByZXF1ZXN0PzogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCB8IE1BUCxcbiAgICBkb01hcDogTUFQID0gdHJ1ZSBhcyBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT4ge1xuICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ29udGV4dCkge1xuICAgICAgYXJncyA9IFtyZXF1ZXN0XTtcbiAgICAgIGRvTWFwID0gdHJ1ZSBhcyBNQVA7XG4gICAgICByZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlcXVlc3QgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBkb01hcCA9IHJlcXVlc3Q7XG4gICAgICByZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRvTWFwICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgYXJncyA9IFtkb01hcCBhcyBNYXliZUNvbnRleHR1YWxBcmc8YW55PiwgLi4uYXJnc107XG4gICAgICBkb01hcCA9IHRydWUgYXMgTUFQO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgT3BlcmF0aW9uS2V5cy5SRUFELCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5nZXRDZXJ0aWZpY2F0ZXNcbiAgICApO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIGNlcnRpZmljYXRlcyR7cmVxdWVzdCA/IGAgZm9yICR7cmVxdWVzdC5pZH1gIDogXCJcIn0gZm9yIENBICR7dGhpcy5jb25maWcuY2FOYW1lfWBcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBDZXJ0aWZpY2F0ZVJlc3BvbnNlID0gKFxuICAgICAgYXdhaXQgdGhpcy5jZXJ0aWZpY2F0ZXMuZ2V0Q2VydGlmaWNhdGVzKHJlcXVlc3QgfHwge30sIHRoaXMudXNlcilcbiAgICApLnJlc3VsdDtcbiAgICBsb2cudmVyYm9zZShgRm91bmQgJHtyZXNwb25zZS5jZXJ0cy5sZW5ndGh9IGNlcnRpZmljYXRlc2ApO1xuICAgIGxvZy5kZWJ1ZyhyZXNwb25zZS5jZXJ0cyk7XG4gICAgcmV0dXJuIChcbiAgICAgIGRvTWFwID8gcmVzcG9uc2UuY2VydHMubWFwKChjKSA9PiBjLlBFTSkgOiByZXNwb25zZVxuICAgICkgYXMgTUFQIGV4dGVuZHMgZmFsc2UgPyBDZXJ0aWZpY2F0ZVJlc3BvbnNlIDogc3RyaW5nW107XG4gIH1cblxuICBhc3luYyBnZXRJZGVudGl0aWVzKGN0eDogQ29udGV4dCk6IFByb21pc2U8RmFicmljSWRlbnRpdHlbXT4ge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuZ2V0SWRlbnRpdGllcyk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgSWRlbnRpdGllcyB1bmRlciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZTogSWRlbnRpdHlSZXNwb25zZSA9IChhd2FpdCB0aGlzLmlkZW50aXRpZXMuZ2V0QWxsKHRoaXMudXNlcikpXG4gICAgICAucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmlkZW50aXRpZXMubGVuZ3RofSBJZGVudGl0aWVzYCk7XG4gICAgbG9nLmRlYnVnKHJlc3BvbnNlLmlkZW50aXRpZXMpO1xuICAgIHJldHVybiByZXNwb25zZS5pZGVudGl0aWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBhZmZpbGlhdGlvbnMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFF1ZXJpZXMgdGhlIENBIGZvciB0aGUgbGlzdCBvZiBhZmZpbGlhdGlvbnMgYXZhaWxhYmxlIHVuZGVyIHRoZSBjb25maWd1cmVkIENBLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZmZpbGlhdGlvbnMgcmVzdWx0IHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBnZXRBZmZpbGlhdGlvbnMoY3R4OiBDb250ZXh0KSB7XG4gICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IodGhpcy5nZXRBZmZpbGlhdGlvbnMpO1xuICAgIGxvZy52ZXJib3NlKGBSZXRyaWV2aW5nIEFmZmlsaWF0aW9ucyB1bmRlciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCB0aGlzLmFmZmlsaWF0aW9ucy5nZXRBbGwodGhpcy51c2VyKSkucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmEubGVuZ3RofSBBZmZpbGlhdGlvbnNgKTtcbiAgICBsb2cuZGVidWcoSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VFcnJvcihlOiBFcnJvcikge1xuICAgIGNvbnN0IHJlZ2V4cCA9IC8uKmNvZGU6XFxzKFxcZCspLio/bWVzc2FnZTpcXHNbXCInXSguKylbXCInXS9ncztcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4cC5leGVjKGUubWVzc2FnZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihlKTtcbiAgICBjb25zdCBbLCBjb2RlLCBtZXNzYWdlXSA9IG1hdGNoO1xuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSBcIjc0XCI6XG4gICAgICBjYXNlIFwiNzFcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKG1lc3NhZ2UpO1xuICAgICAgY2FzZSBcIjIwXCI6XG4gICAgICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKG1lc3NhZ2UpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWQgaWRlbnRpdHkgZGV0YWlscyBmcm9tIHRoZSBDQSBieSBlbnJvbGxtZW50IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIHZhbGlkYXRlcyBhIHNpbmdsZSBpZGVudGl0eSwgdGhyb3dpbmcgTm90Rm91bmRFcnJvciB3aGVuIG1pc3NpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGxvb2t1cC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxGYWJyaWNJZGVudGl0eT59IFRoZSBpZGVudGl0eSBkZXRhaWxzIHN0b3JlZCBpbiB0aGUgQ0EuXG4gICAqL1xuICBhc3luYyByZWFkKFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8RmFicmljSWRlbnRpdHk+IHtcbiAgICBjb25zdCB7IGxvZyB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIE9wZXJhdGlvbktleXMuUkVBRCwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVhZFxuICAgICk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgaWRlbnRpdHkgd2l0aCBlbnJvbGxtZW50IElEICR7ZW5yb2xsbWVudElkfWApO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuaWRlbnRpdGllcy5nZXRPbmUoZW5yb2xsbWVudElkLCB0aGlzLnVzZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkbid0IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcblxuICAgIHJldHVybiByZXN1bHQucmVzdWx0IGFzIEZhYnJpY0lkZW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhIG5ldyBpZGVudGl0eSB3aXRoIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHJlZ2lzdHJhdGlvbiByZXF1ZXN0IGZvciBhIG5ldyBlbnJvbGxtZW50IElELCByZXR1cm5pbmcgdGhlIGVucm9sbG1lbnQgc2VjcmV0IHVwb24gc3VjY2Vzcy5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZCBmb3IgdGhlIG5ldyBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gVGhlIGVucm9sbG1lbnQgc2VjcmV0IGZvciB0aGUgcmVnaXN0ZXJlZCBpZGVudGl0eS5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyKFxuICAgIG1vZGVsOiBDcmVkZW50aWFscyxcbiAgICBpc1N1cGVyVXNlcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiLFxuICAgIHVzZXJSb2xlPzogQ0FfUk9MRSB8IHN0cmluZyxcbiAgICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZSxcbiAgICBtYXhFbnJvbGxtZW50cz86IG51bWJlcixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWdpc3RlclwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5yZWdpc3RlclxuICAgICk7XG5cbiAgICBsZXQgcmVnaXN0cmF0aW9uOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdXNlck5hbWUsIHBhc3N3b3JkIH0gPSBtb2RlbDtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICBlbnJvbGxtZW50SUQ6IHVzZXJOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcGFzc3dvcmQsXG4gICAgICAgIGFmZmlsaWF0aW9uOiBhZmZpbGlhdGlvbixcbiAgICAgICAgdXNlclJvbGU6IHVzZXJSb2xlLFxuICAgICAgICBhdHRyczogYXR0cnMsXG4gICAgICAgIG1heEVucm9sbG1lbnRzOiBtYXhFbnJvbGxtZW50cyxcbiAgICAgIH0gYXMgSVJlZ2lzdGVyUmVxdWVzdDtcbiAgICAgIHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMuY2xpZW50LnJlZ2lzdGVyKHByb3BzLCB0aGlzLnVzZXIpO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBSZWdpc3RyYXRpb24gZm9yICR7dXNlck5hbWV9IGNyZWF0ZWQgd2l0aCB1c2VyIHR5cGUgJHt1c2VyUm9sZSA/PyBcIlVuZGVmaW5lZCBSb2xlXCJ9ICR7aXNTdXBlclVzZXIgPyBcImFzIHN1cGVyIHVzZXJcIiA6IFwiXCJ9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjdHg6IENvbnRleHRcbiAgKTogSWRlbnRpdHkge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuaWRlbnRpdHlGcm9tRW5yb2xsbWVudCk7XG4gICAgY29uc3QgeyBjZXJ0aWZpY2F0ZSwga2V5LCByb290Q2VydGlmaWNhdGUgfSA9IGVucm9sbG1lbnQ7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgR2VuZXJhdGluZyBJZGVudGl0eSBmcm9tIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGV9IGluIG1zcCAke21zcElkfWBcbiAgICApO1xuICAgIGNvbnN0IGNsaWVudElkID0gQ3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGlkID0gQ3J5cHRvVXRpbHMuZW5jb2RlKGNsaWVudElkKTtcbiAgICBsb2cuZGVidWcoYElkZW50aXR5ICR7Y2xpZW50SWR9IGFuZCBlbmNvZGVkSWQgJHtpZH1gKTtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5KHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgY2VydGlmaWNhdGU6IGNlcnRpZmljYXRlLFxuICAgICAgICBwcml2YXRlS2V5OiBrZXkudG9CeXRlcygpLFxuICAgICAgICByb290Q2VydGlmaWNhdGU6IHJvb3RDZXJ0aWZpY2F0ZSxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogbXNwSWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVucm9sbCBhbiBpZGVudGl0eSB3aXRoIHRoZSBDQSB1c2luZyBhIHJlZ2lzdHJhdGlvbiBzZWNyZXQuXG4gICAqIEBzdW1tYXJ5IEV4Y2hhbmdlcyB0aGUgZW5yb2xsbWVudCBJRCBhbmQgc2VjcmV0IGZvciBjZXJ0aWZpY2F0ZXMsIHJldHVybmluZyBhIGNvbnN0cnVjdGVkIElkZW50aXR5IG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBlbnJvbGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb24gLSBFbnJvbGxtZW50IHNlY3JldCByZXR1cm5lZCBhdCByZWdpc3RyYXRpb24gdGltZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBlbnJvbGxlZCBpZGVudGl0eSBvYmplY3Qgd2l0aCBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIGVucm9sbChcbiAgICBlbnJvbGxtZW50SWQ6IHN0cmluZyxcbiAgICByZWdpc3RyYXRpb246IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwiZW5yb2xsXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLmVucm9sbFxuICAgICk7XG4gICAgbGV0IGlkZW50aXR5OiBJZGVudGl0eTtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKGBFbnJvbGxpbmcgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgICBjb25zdCBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5lbnJvbGwoe1xuICAgICAgICBlbnJvbGxtZW50SUQ6IGVucm9sbG1lbnRJZCxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcmVnaXN0cmF0aW9uLFxuICAgICAgfSk7XG4gICAgICBpZGVudGl0eSA9IEZhYnJpY0lkZW50aXR5U2VydmljZS5pZGVudGl0eUZyb21FbnJvbGxtZW50KFxuICAgICAgICBlbnJvbGxtZW50LFxuICAgICAgICB0aGlzLmNvbmZpZy5jYU5hbWUsXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgU3VjY2Vzc2Z1bGx5IGVucm9sbGVkICR7ZW5yb2xsbWVudElkfSB1bmRlciAke3RoaXMuY29uZmlnLmNhTmFtZX0gYXMgJHtpZGVudGl0eS5pZH1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGFuZCBlbnJvbGwgYSBuZXcgaWRlbnRpdHkgaW4gb25lIHN0ZXAuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhIG5ldyBlbnJvbGxtZW50IElEIHdpdGggdGhlIENBIGFuZCBpbW1lZGlhdGVseSBleGNoYW5nZXMgdGhlIHNlY3JldCB0byBlbnJvbGwsIHJldHVybmluZyB0aGUgY3JlYXRlZCBJZGVudGl0eS5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBmb3IgdGhlIG5ldyBpZGVudGl0eSBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlckFuZEVucm9sbChcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXIsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWdpc3Rlci1lbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVnaXN0ZXJBbmRFbnJvbGxcbiAgICApO1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMucmVnaXN0ZXIoXG4gICAgICBtb2RlbCxcbiAgICAgIGlzU3VwZXJVc2VyLFxuICAgICAgYWZmaWxpYXRpb24sXG4gICAgICB1c2VyUm9sZSxcbiAgICAgIGF0dHJzLFxuICAgICAgbWF4RW5yb2xsbWVudHMsXG4gICAgICBjdHhcbiAgICApO1xuICAgIGNvbnN0IHsgdXNlck5hbWUgfSA9IG1vZGVsO1xuICAgIHJldHVybiB0aGlzLmVucm9sbCh1c2VyTmFtZSBhcyBzdHJpbmcsIHJlZ2lzdHJhdGlvbiwgY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmUtZW5yb2xsIGFuIGV4aXN0aW5nIGlkZW50aXR5IHVzaW5nIGl0cyBjdXJyZW50IGVucm9sbG1lbnQuXG4gICAqIEBzdW1tYXJ5IFJlbmV3cyB0aGUgZW5yb2xsbWVudCBjZXJ0aWZpY2F0ZSBieSBjYWxsaW5nIHRoZSBDQSByZWVucm9sbC5cbiAgICogQHBhcmFtIHtVc2VyfSBjdXJyZW50VXNlciAtIEFscmVhZHkgZW5yb2xsZWQgdXNlciwgbXVzdCBoYXZlIGEgc2lnbmluZyBpZGVudGl0eS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSByZW5ld2VkIGlkZW50aXR5IG9iamVjdCB3aXRoIG5ldyBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUlkZW50aXR5KFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIGlkZW50aXR5OiB7IGNlcnRpZmljYXRlOiBzdHJpbmc7IHByaXZhdGVLZXk6IHN0cmluZyB9LFxuICAgIGlkZW50aXR5UmVxdWVzdDogSUlkZW50aXR5UmVxdWVzdCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwicmVlbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudXBkYXRlSWRlbnRpdHlcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxvZy5pbmZvKGBSZW5ld2luZyBpZGVudGl0eSBmb3IgJHtlbnJvbGxtZW50SWR9YCk7XG5cbiAgICAgIC8vIFVwZGF0ZSBhdHRyaWJ1dGVzIGluIHRoZSBDQSByZWdpc3RyeSAoYWRtaW4gb3BlcmF0aW9uKS4gVGhpcyBjaGFuZ2VzIHRoZSBcInNvdXJjZSBvZiB0cnV0aFwiLlxuICAgICAgY29uc3QgaWRlbnRpdHlTZXJ2aWNlID0gdGhpcy5jbGllbnQubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG5cbiAgICAgIGNvbnN0IGNhVXNlcklkZW50aXR5ID0gKGF3YWl0IGlkZW50aXR5U2VydmljZS5nZXRPbmUoXG4gICAgICAgIGVucm9sbG1lbnRJZCxcbiAgICAgICAgdGhpcy51c2VyXG4gICAgICApKSBhcyB7IHJlc3VsdDogeyBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZVtdIH0gfTtcblxuICAgICAgYXdhaXQgaWRlbnRpdHlTZXJ2aWNlLnVwZGF0ZShlbnJvbGxtZW50SWQsIGlkZW50aXR5UmVxdWVzdCwgdGhpcy51c2VyKTsgLy8gYXMgSVNlcnZpY2VSZXNwb25zZSAmIHsgcmVzdWx0OiBJSWRlbnRpdHlSZXF1ZXN0IH07XG5cbiAgICAgIC8vIFJlZW5yb2xsIGFzIHRoZSB1c2VyLiBSZXF1ZXN0IG11c3QgYmUgc2lnbmVkIHVzaW5nIHRoZSBleGlzdGluZyBjZXJ0aWZpY2F0ZS5cbiAgICAgIGNvbnN0IHJlZW5yb2xsVXNlciA9IFVzZXIuY3JlYXRlVXNlcihcbiAgICAgICAgZW5yb2xsbWVudElkLFxuICAgICAgICBcIlwiLCAvLyBlbnJvbGxtZW50U2VjcmV0IG5vdCByZXF1aXJlZCBmb3IgcmVlbnJvbGxcbiAgICAgICAgdGhpcy51c2VyLmdldE1zcGlkKCksXG4gICAgICAgIGlkZW50aXR5LmNlcnRpZmljYXRlLFxuICAgICAgICBpZGVudGl0eS5wcml2YXRlS2V5XG4gICAgICApO1xuICAgICAgcmVlbnJvbGxVc2VyLnNldENyeXB0b1N1aXRlKHRoaXMudXNlci5nZXRDcnlwdG9TdWl0ZSgpKTtcblxuICAgICAgY29uc3QgZW5yb2xsbWVudEF0dHJzOiBJQXR0cmlidXRlUmVxdWVzdFtdID0gKFxuICAgICAgICBjYVVzZXJJZGVudGl0eS5yZXN1bHQuYXR0cnMgfHwgW11cbiAgICAgICkubWFwKCh7IG5hbWUgfSkgPT4gKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgfSkpO1xuXG4gICAgICBjb25zdCBlbnJvbGxtZW50ID0gYXdhaXQgdGhpcy5jbGllbnQucmVlbnJvbGwoXG4gICAgICAgIHJlZW5yb2xsVXNlcixcbiAgICAgICAgZW5yb2xsbWVudEF0dHJzXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZW5ld2VkSWRlbnRpdHkgPSBGYWJyaWNJZGVudGl0eVNlcnZpY2UuaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICAgICAgZW5yb2xsbWVudCxcbiAgICAgICAgdGhpcy5jb25maWcuY2FOYW1lLFxuICAgICAgICBjdHhcbiAgICAgICk7XG5cbiAgICAgIC8vIFJldm9rZSB0aGUgcHJldmlvdXMgY2VydGlmaWNhdGUgb25seSwgc28gdGhlIG9sZCBjZXJ0IGJlY29tZXMgaW52YWxpZC5cbiAgICAgIGxvZy5kZWJ1ZyhgUmV2b2tpbmcgcHJldmlvdXMgY2VydGlmaWNhdGVzIGZvciAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIGNvbnN0IHsgYWtpLCBzZXJpYWwgfSA9IGdldEFraUFuZFNlcmlhbEZyb21DZXJ0KGlkZW50aXR5LmNlcnRpZmljYXRlKTtcbiAgICAgIGF3YWl0IHRoaXMucmV2b2tlKGVucm9sbG1lbnRJZCwgeyBha2ksIHNlcmlhbCB9LCBhcmdzKTtcblxuICAgICAgbG9nLmRlYnVnKGBSZW5ldyBpZGVudGl0eSBzdWNjZXNzZnVsIGZvciAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIHJldHVybiByZW5ld2VkSWRlbnRpdHk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldm9rZXMgdGhlIGVucm9sbG1lbnQgb2YgYW4gaWRlbnRpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIGVucm9sbG1lbnQgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBlbnJvbGxtZW50SWQgLSBUaGUgZW5yb2xsbWVudCBJRCBvZiB0aGUgaWRlbnRpdHkgdG8gYmUgcmV2b2tlZC5cbiAgICpcbiAgICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlc3VsdCBvZiB0aGUgcmV2b2NhdGlvbiBvcGVyYXRpb24uXG4gICAqXG4gICAqIEB0aHJvd3Mge05vdEZvdW5kRXJyb3J9IElmIHRoZSBlbnJvbGxtZW50IHdpdGggdGhlIHNwZWNpZmllZCBJRCBkb2VzIG5vdCBleGlzdC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlcmUgaXMgYW4gZXJyb3IgZHVyaW5nIHRoZSByZXZvY2F0aW9uIHByb2Nlc3MuXG4gICAqL1xuICBhc3luYyByZXZva2UoXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgcmV2b2tlT3B0aW9uczogT21pdDxJUmV2b2tlUmVxdWVzdCwgXCJlbnJvbGxtZW50SURcIj4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJU2VydmljZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInJldm9rZVwiLCB0cnVlKSkuZm9yKHRoaXMucmV2b2tlKTtcbiAgICBsb2cudmVyYm9zZShgUmV2b2tpbmcgaWRlbnRpdHkgd2l0aCBlbnJvbGxtZW50IElEICR7ZW5yb2xsbWVudElkfWApO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgdGhpcy5yZWFkKGVucm9sbG1lbnRJZCk7XG4gICAgaWYgKCFpZGVudGl0eSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfWBcbiAgICAgICk7XG4gICAgbGV0IHJlc3VsdDogSVNlcnZpY2VSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgQm9vbGVhbihyZXZva2VPcHRpb25zLnNlcmlhbCkgfHwgQm9vbGVhbihyZXZva2VPcHRpb25zLmFraSlcbiAgICAgICAgICA/IFwiUmV2b2tlIFVzZXIgQ2VydGlmaWNhdGVcIlxuICAgICAgICAgIDogXCJVc2VyIERlbGV0aW9uXCI7XG5cbiAgICAgIGNvbnN0IHJldm9rZVJlcXVlc3Q6IElSZXZva2VSZXF1ZXN0ID0ge1xuICAgICAgICByZWFzb24sXG4gICAgICAgIC4uLnJldm9rZU9wdGlvbnMsXG4gICAgICAgIGVucm9sbG1lbnRJRDogaWRlbnRpdHkuaWQsXG4gICAgICB9O1xuXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmNsaWVudC5yZXZva2UocmV2b2tlUmVxdWVzdCwgdGhpcy51c2VyKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgcm9sZSB0eXBlcyB1c2VkIGR1cmluZyBlbnJvbGxtZW50IGFuZCByZWdpc3RyYXRpb24uXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBzdGFuZGFyZCBIeXBlcmxlZGdlciBGYWJyaWMgQ0Egcm9sZXMgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gaWRlbnRpdGllcyB3aGVuIHJlZ2lzdGVyaW5nIHdpdGggdGhlIENBIHNlcnZpY2UuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIENBX1JPTEUge1xuICAvKiogQWRtaW5pc3RyYXRvciByb2xlIHdpdGggZWxldmF0ZWQgcHJpdmlsZWdlcyBmb3IgbWFuYWdpbmcgaWRlbnRpdGllcyBhbmQgYWZmaWxpYXRpb25zICovXG4gIEFETUlOID0gXCJhZG1pblwiLFxuICAvKiogU3RhbmRhcmQgdXNlciByb2xlIGZvciBhcHBsaWNhdGlvbiBjbGllbnRzIGludGVyYWN0aW5nIHdpdGggdGhlIG5ldHdvcmsgKi9cbiAgVVNFUiA9IFwidXNlclwiLFxuICAvKiogQ2xpZW50IHJvbGUgdHlwaWNhbGx5IHVzZWQgZm9yIFNESy1iYXNlZCBpbnRlcmFjdGlvbnMgYW5kIHNlcnZpY2UgYWNjb3VudHMgKi9cbiAgQ0xJRU5UID0gXCJjbGllbnRcIixcbn1cbiIsImltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRGYWJyaWNDbGllbnRGbGFnczogRmFicmljQ2xpZW50RmxhZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgZXZhbHVhdGVUaW1lb3V0OiA1LFxuICBlbmRvcnNlVGltZW91dDogMTUsXG4gIHN1Ym1pdFRpbWVvdXQ6IDUsXG4gIGNvbW1pdFRpbWVvdXQ6IDYwLFxuICBsZWdhY3k6IGZhbHNlLFxuICBhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3M6IGZhbHNlLFxuICBhbGxvd0dhdGV3YXlPdmVycmlkZTogZmFsc2UsXG4gIHJlYnVpbGRXaXRoVHJhbnNpZW50OiB0cnVlLFxuICBlbmNyeXB0VHJhbnNpZW50OiBmYWxzZSxcbiAgc3ludGhldGljRXZlbnRzOiB0cnVlLFxufSkgYXMgYW55O1xuIiwiaW1wb3J0IHsgaXNCcm93c2VyLCBNaW5pTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVJbXBvcnQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuY29uc3QgbG9nID0gbmV3IE1pbmlMb2dnZXIoXCJmYWJyaWMtZnNcIik7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIExvYWRzIGNvbnRlbnQgZnJvbSBhIGZpbGUgb3IgcmV0dXJucyB0aGUgY29udGVudCBpZiBhbHJlYWR5IGxvYWRlZFxuICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiB0aGUgaW5wdXQgaXMgYWxyZWFkeSBjb250ZW50IG9yIGEgcGF0aCB0byBhIGZpbGUsIGFuZCBsb2FkcyB0aGUgZmlsZSBpZiBuZWVkZWRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudE9yUGF0aCAtIFRoZSBjb250ZW50IG9yIHBhdGggdG8gbG9hZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZmlsZVJlYWRlciAtIEZ1bmN0aW9uIHRvIHJlYWQgdGhlIGZpbGUgaWYgY29udGVudE9yUGF0aCBpcyBhIHBhdGhcbiAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nIHwgVWludDhBcnJheSB8IEJ1ZmZlcj59IFRoZSBjb250ZW50XG4gKiBAZnVuY3Rpb24gY29udGVudE9mTG9hZEZpbGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbnRlbnRPZkxvYWRGaWxlKFxuICBjb250ZW50T3JQYXRoOiBzdHJpbmcgfCBVaW50OEFycmF5LFxuICBmaWxlUmVhZGVyOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+XG4pIHtcbiAgaWYgKGNvbnRlbnRPclBhdGggaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgaWYgKFxuICAgIGNvbnRlbnRPclBhdGgubWF0Y2goXG4gICAgICAvLS0tLS1CRUdJTiAoQ0VSVElGSUNBVEV8S0VZfFBSSVZBVEUgS0VZKS0tLS0tLis/LS0tLS1FTkQgXFwxLS0tLS0kL2dtc1xuICAgIClcbiAgKVxuICAgIHJldHVybiBjb250ZW50T3JQYXRoO1xuICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBmaWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtXG4gKiBAc3VtbWFyeSBMb2FkcyBhIGZpbGUgdXNpbmcgdGhlIE5vZGUuanMgZmlsZSBzeXN0ZW0gbW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZyB8IEJ1ZmZlcn0gY29udGVudE9yUGF0aCAtIFRoZSBjb250ZW50IG9yIHBhdGggdG8gbG9hZFxuICogQHJldHVybiB7UHJvbWlzZTxCdWZmZXI+fSBUaGUgZmlsZSBjb250ZW50IGFzIGEgQnVmZmVyXG4gKiBAZnVuY3Rpb24gcmVhZEZpbGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRGaWxlKGNvbnRlbnRPclBhdGg6IHN0cmluZyB8IEJ1ZmZlcikge1xuICBpZiAodHlwZW9mIGNvbnRlbnRPclBhdGggIT09IFwic3RyaW5nXCIpIHJldHVybiBjb250ZW50T3JQYXRoO1xuXG4gIGNvbnN0IGZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUocGF0aCk7XG4gIH07XG5cbiAgcmV0dXJuIGF3YWl0IGZpbGVSZWFkZXIoY29udGVudE9yUGF0aCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgdXNlclxuICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSB1c2VyIHdpdGggdGhlIGdpdmVuIGNyZWRlbnRpYWxzIGZvciBpbnRlcmFjdGluZyB3aXRoIGEgRmFicmljIENBXG4gKiBAcGFyYW0ge3N0cmluZ30gdXNlck5hbWUgLSBUaGUgdXNlciBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJpdmF0ZUtleSAtIFRoZSBwcml2YXRlIGtleSBhcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IGNlcnRpZmljYXRlIC0gVGhlIGNlcnRpZmljYXRlIGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNwSWQgLSBUaGUgTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gKiBAcmV0dXJuIHtQcm9taXNlPFVzZXI+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCB1c2VyXG4gKiBAZnVuY3Rpb24gZ2V0Q0FVc2VyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDQVVzZXIoXG4gIHVzZXJOYW1lOiBzdHJpbmcsXG4gIHByaXZhdGVLZXk6IHN0cmluZyxcbiAgY2VydGlmaWNhdGU6IHN0cmluZyxcbiAgbXNwSWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxVc2VyPiB7XG4gIGxvZy5kZWJ1ZyhcbiAgICBgQ3JlYXRpbmcgYSBDQSAke21zcElkfSB1c2VyICR7dXNlck5hbWV9IHdpdGggY2VydGlmaWNhdGUgJHtjZXJ0aWZpY2F0ZX1gXG4gICk7XG4gIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih1c2VyTmFtZSk7XG4gIGNvbnN0IGNyeXB0b1N1aXRlID0gVXNlci5uZXdDcnlwdG9TdWl0ZSgpO1xuICB1c2VyLnNldENyeXB0b1N1aXRlKGNyeXB0b1N1aXRlKTtcbiAgY29uc3QgaW1wb3J0ZWRLZXkgPSBjcnlwdG9TdWl0ZS5jcmVhdGVLZXlGcm9tUmF3KHByaXZhdGVLZXkpO1xuICBhd2FpdCB1c2VyLnNldEVucm9sbG1lbnQoaW1wb3J0ZWRLZXksIGNlcnRpZmljYXRlLCBtc3BJZCk7XG4gIHJldHVybiB1c2VyO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIGFuIGlkZW50aXR5IGZyb20gYSBjZXJ0aWZpY2F0ZSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IExvYWRzIGEgY2VydGlmaWNhdGUgZnJvbSBhIGRpcmVjdG9yeSBhbmQgY3JlYXRlcyBhbiBJZGVudGl0eSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc3BJZCAtIFRoZSBNZW1iZXJzaGlwIFNlcnZpY2UgUHJvdmlkZXIgSURcbiAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZVxuICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBpZGVudGl0eVxuICogQGZ1bmN0aW9uIGdldElkZW50aXR5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRJZGVudGl0eShcbiAgbXNwSWQ6IHN0cmluZyxcbiAgY2VydERpcmVjdG9yeVBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICBjb25zdCBpZGVudGl0eUZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCBjZXJ0UGF0aCA9IGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShjZXJ0UGF0aCk7XG4gICAgcmV0dXJuIGNyZWRlbnRpYWxzO1xuICB9O1xuXG4gIGNvbnN0IGNyZWRlbnRpYWxzOiBVaW50OEFycmF5ID0gKGF3YWl0IGNvbnRlbnRPZkxvYWRGaWxlKFxuICAgIGNlcnREaXJlY3RvcnlQYXRoLFxuICAgIGlkZW50aXR5RmlsZVJlYWRlclxuICApKSBhcyBVaW50OEFycmF5O1xuXG4gIHJldHVybiB7IG1zcElkLCBjcmVkZW50aWFscyB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBmdWxsIHBhdGggb2YgdGhlIGZpcnN0IGZpbGUgaW4gYSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZGlyZWN0b3J5IGFuZCByZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBmaXJzdCBmaWxlIGZvdW5kXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyUGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeVxuICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZnVsbCBwYXRoIG9mIHRoZSBmaXJzdCBmaWxlXG4gKiBAZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBwcm9taXNlcy5yZWFkZGlyKGRpclBhdGgpO1xuICByZXR1cm4gam9pbihkaXJQYXRoLCBmaWxlc1swXSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGZpcnN0IGZpbGUgaW4gYSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZGlyZWN0b3J5LCBmaW5kcyB0aGUgZmlyc3QgZmlsZSwgYW5kIHJldHVybnMgaXRzIGNvbnRlbnQgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXJQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjb250ZW50IG9mIHRoZSBmaXJzdCBmaWxlXG4gKiBAZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KFxuICBkaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcInBhdGhcIikpO1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gIHJldHVybiAoYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoam9pbihkaXJQYXRoLCBmaWxlc1swXSkpKS50b1N0cmluZygpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgc2lnbmVyIGZyb20gYSBrZXkgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBMb2FkcyBhIHByaXZhdGUga2V5IGZyb20gYSBkaXJlY3RvcnkgYW5kIGNyZWF0ZXMgYSBTaWduZXIgZm9yIEZhYnJpYyB0cmFuc2FjdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlEaXJlY3RvcnlQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHByaXZhdGUga2V5XG4gKiBAcmV0dXJuIHtQcm9taXNlPFNpZ25lcj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBzaWduZXJcbiAqIEBmdW5jdGlvbiBnZXRTaWduZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNpZ25lcihrZXlEaXJlY3RvcnlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFNpZ25lcj4ge1xuICBjb25zdCBzaWduZXJGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgY29uc3Qga2V5UGF0aCA9IGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGtleVBhdGgpO1xuICB9O1xuXG4gIGNvbnN0IHByaXZhdGVLZXlQZW0gPSAoYXdhaXQgY29udGVudE9mTG9hZEZpbGUoXG4gICAga2V5RGlyZWN0b3J5UGF0aCxcbiAgICBzaWduZXJGaWxlUmVhZGVyXG4gICkpIGFzIEJ1ZmZlcjtcblxuICBsZXQgaztcbiAgaWYgKGlzQnJvd3NlcigpKSB7XG4gICAgLy8gd2ViIGJhc2VkIGltcGxlbWVudGF0aW9uXG4gICAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IGV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByaXZhdGVLZXkpO1xuICAgIGsgPSAocHJpdmF0ZUtleSBhcyBhbnkpW2tleXNbMF1dO1xuICB9IGVsc2Uge1xuICAgIC8vIE5vZGUgYmFzZWQgaW1wbGVtZW50YXRpb25cbiAgICBjb25zdCB7IGNyZWF0ZVByaXZhdGVLZXkgfSA9IGF3YWl0IGltcG9ydChcImNyeXB0b1wiKTtcbiAgICBrID0gY3JlYXRlUHJpdmF0ZUtleShwcml2YXRlS2V5UGVtKTtcbiAgfVxuXG4gIHJldHVybiBzaWduZXJzLm5ld1ByaXZhdGVLZXlTaWduZXIoayBhcyBhbnkpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFeHRyYWN0cyBhIHByaXZhdGUga2V5IGZyb20gYSBQRU0gYnVmZmVyXG4gKiBAc3VtbWFyeSBDb252ZXJ0cyBhIFBFTS1lbmNvZGVkIHByaXZhdGUga2V5IHRvIGEgQ3J5cHRvS2V5IG9iamVjdFxuICogQHBhcmFtIHtCdWZmZXJ9IHBlbSAtIFRoZSBQRU0tZW5jb2RlZCBwcml2YXRlIGtleVxuICogQHJldHVybiB7UHJvbWlzZTxDcnlwdG9LZXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgQ3J5cHRvS2V5XG4gKiBAZnVuY3Rpb24gZXh0cmFjdFByaXZhdGVLZXlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IEV4dHJhY3RQcml2YXRlS2V5XG4gKiAgIHBhcnRpY2lwYW50IFN1YnRsZUNyeXB0b1xuICpcbiAqICAgQ2FsbGVyLT4+RXh0cmFjdFByaXZhdGVLZXk6IGV4dHJhY3RQcml2YXRlS2V5KHBlbSlcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5FeHRyYWN0UHJpdmF0ZUtleTogR2V0IFN1YnRsZUNyeXB0byBpbXBsZW1lbnRhdGlvblxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PkV4dHJhY3RQcml2YXRlS2V5OiBQYXJzZSBQRU0gZm9ybWF0XG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+RXh0cmFjdFByaXZhdGVLZXk6IENvbnZlcnQgdG8gYmluYXJ5IERFUlxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PlN1YnRsZUNyeXB0bzogaW1wb3J0S2V5KHBrY3M4LCBiaW5hcnlEZXIsIG9wdGlvbnMpXG4gKiAgIFN1YnRsZUNyeXB0by0tPj5FeHRyYWN0UHJpdmF0ZUtleTogQ3J5cHRvS2V5XG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LS0+PkNhbGxlcjogQ3J5cHRvS2V5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHRyYWN0UHJpdmF0ZUtleShwZW06IEJ1ZmZlcikge1xuICAvLyBjb25zdCBsaWJOYW1lID0gXCJub2RlOmNyeXB0b1wiO1xuICBsZXQgc3VidGxlO1xuICAvLyBpZiAoaXNCcm93c2VyKCkpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICBzdWJ0bGUgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmNyeXB0by5zdWJ0bGU7XG4gIC8vIH0gZWxzZSB7XG4gIC8vICAgY29uc3QgbGliID0gKGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQobGliTmFtZSkpKSBhcyBhbnk7XG4gIC8vICAgc3VidGxlID0gbGliLnN1YnRsZSB8fCBsaWIud2ViY3J5cHRvLnN1YnRsZTtcbiAgLy8gfVxuXG4gIGlmICghc3VidGxlKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBTdWJ0bGVDcnlwdG8gbW9kdWxlXCIpO1xuXG4gIGZ1bmN0aW9uIHN0cjJhYihzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihzdHIubGVuZ3RoKTtcbiAgICBjb25zdCBidWZWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICBmb3IgKGxldCBpID0gMCwgc3RyTGVuID0gc3RyLmxlbmd0aDsgaSA8IHN0ckxlbjsgaSsrKSB7XG4gICAgICBidWZWaWV3W2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICBjb25zdCBzdHIgPSBwZW1cbiAgICAudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgLnJlcGxhY2UoXCItLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cIiwgXCJcIilcbiAgICAucmVwbGFjZUFsbChcIlxcblwiLCBcIlwiKVxuICAgIC5yZXBsYWNlKFwiLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLVwiLCBcIlwiKTtcbiAgY29uc3QgZGVjb2RlZCA9IEJ1ZmZlci5mcm9tKHN0ciwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJiaW5hcnlcIik7XG4gIGNvbnN0IGJpbmFyeURlciA9IHN0cjJhYihkZWNvZGVkKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICBcInBrY3M4XCIsXG4gICAgICBiaW5hcnlEZXIsXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgbmFtZWRDdXJ2ZTogXCJQLTI1NlwiLFxuICAgICAgfSxcbiAgICAgIHRydWUsXG4gICAgICBbXCJzaWduXCJdXG4gICAgKTtcblxuICAgIHJldHVybiBrZXk7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyRmxhZ3MsXG4gIENvbmRpdGlvbixcbiAgQ29udGV4dCxcbiAgR3JvdXBPcGVyYXRvcixcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBPcGVyYXRvcixcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUHJlcGFyZWRTdGF0ZW1lbnQsXG4gIFByZXBhcmVkU3RhdGVtZW50S2V5cyxcbiAgUXVlcnlDbGF1c2UsXG4gIFF1ZXJ5RXJyb3IsXG4gIFJlcG9zaXRvcnksXG4gIFNlbGVjdFNlbGVjdG9yLFxuICBTZXF1ZW5jZSxcbiAgU3RhdGVtZW50LFxuICBTdGF0ZW1lbnRFeGVjdXRvcixcbiAgVmlld0tpbmQsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHtcbiAgQ291Y2hEQktleXMsXG4gIENvdWNoREJPcGVyYXRvcixcbiAgQ291Y2hEQkdyb3VwT3BlcmF0b3IsXG4gIENvdWNoREJRdWVyeUxpbWl0LFxuICBNYW5nb1F1ZXJ5LFxuICBNYW5nb09wZXJhdG9yLFxuICBNYW5nb1NlbGVjdG9yLFxuICB0cmFuc2xhdGVPcGVyYXRvcnMsXG4gIGdlbmVyYXRlRGVzaWduRG9jTmFtZSxcbiAgZ2VuZXJhdGVWaWV3TmFtZSxcbiAgZmluZFZpZXdNZXRhZGF0YSxcbiAgQ291Y2hEQlZpZXdNZXRhZGF0YSxcbiAgVmlld1Jlc3BvbnNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB0b0NhbWVsQ2FzZSB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgREJLZXlzLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG50eXBlIEZhYnJpY1ZpZXdEZXNjcmlwdG9yID0ge1xuICBkZG9jOiBzdHJpbmc7XG4gIHZpZXc6IHN0cmluZztcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55Pjtcbn07XG5cbnR5cGUgRmFicmljQWdncmVnYXRlSW5mbyA9XG4gIHwge1xuICAgICAga2luZDogVmlld0tpbmQ7XG4gICAgICBtZXRhOiBDb3VjaERCVmlld01ldGFkYXRhO1xuICAgICAgZGVzY3JpcHRvcjogRmFicmljVmlld0Rlc2NyaXB0b3I7XG4gICAgICBjb3VudERpc3RpbmN0PzogYm9vbGVhbjtcbiAgICB9XG4gIHwge1xuICAgICAga2luZDogXCJhdmdcIjtcbiAgICAgIGF0dHJpYnV0ZTogc3RyaW5nO1xuICAgICAgc3VtRGVzY3JpcHRvcjogRmFicmljVmlld0Rlc2NyaXB0b3I7XG4gICAgICBjb3VudERlc2NyaXB0b3I6IEZhYnJpY1ZpZXdEZXNjcmlwdG9yO1xuICAgIH07XG5cbmNvbnN0IGVzY2FwZVJlZ0V4cCA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+XG4gIHZhbHVlLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBcIlxcXFwkJlwiKTtcblxuZnVuY3Rpb24gbmV4dExleGljb2dyYXBoaWNTdHJpbmcodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIlxcdTAwMDBcIjtcbiAgY29uc3QgY2hhcnMgPSBBcnJheS5mcm9tKHZhbHVlKTtcbiAgZm9yIChsZXQgaSA9IGNoYXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgY29uc3QgY29kZSA9IGNoYXJzW2ldLmNvZGVQb2ludEF0KDApO1xuICAgIGlmIChjb2RlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmIChjb2RlIDwgMHgxMGZmZmYpIHtcbiAgICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZSArIDEpO1xuICAgICAgcmV0dXJuIGNoYXJzLnNsaWNlKDAsIGkgKyAxKS5qb2luKFwiXCIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYCR7dmFsdWV9XFx1MDAwMGA7XG59XG5cbmZ1bmN0aW9uIHByZWZpeFJhbmdlKHByZWZpeDogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHByZWZpeCxcbiAgICBlbmQ6IG5leHRMZXhpY29ncmFwaGljU3RyaW5nKHByZWZpeCksXG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnRTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsLCBSPiBleHRlbmRzIFN0YXRlbWVudDxcbiAgTSxcbiAgRmFicmljQ2xpZW50QWRhcHRlcixcbiAgUixcbiAgTWFuZ29RdWVyeVxuPiB7XG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IEZhYnJpY0NsaWVudEFkYXB0ZXIsIG92ZXJyaWRlcz86IFBhcnRpYWw8QWRhcHRlckZsYWdzPikge1xuICAgIHN1cGVyKGFkYXB0ZXIsIG92ZXJyaWRlcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3F1YXNoKFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc3F1YXNoZWQ6IFByZXBhcmVkU3RhdGVtZW50PE0+IHwgdW5kZWZpbmVkID0gc3VwZXIuc3F1YXNoKFxuICAgICAgY3R4IGFzIG5ldmVyXG4gICAgKTtcbiAgICBpZiAoIXNxdWFzaGVkKSByZXR1cm4gc3F1YXNoZWQ7XG5cbiAgICBjb25zdCB7IG1ldGhvZCwgcGFyYW1zLCBhcmdzIH0gPSBzcXVhc2hlZDtcbiAgICBjb25zdCB7IGRpcmVjdGlvbiwgbGltaXQgfSA9IHBhcmFtcztcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORDpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uLCBsaW1pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWTpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5MSVNUX0JZOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFX0JZOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uLCBsaW1pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQlk6XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIG1ldGhvZCAke21ldGhvZH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3F1YXNoZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZXhlY3V0ZVByZXBhcmVkKFxuICAgIC4uLmFyZ3o6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgcmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwodGhpcy5mcm9tU2VsZWN0b3IsIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgY29uc3QgeyBtZXRob2QsIGFyZ3MgfSA9IHRoaXMucHJlcGFyZWQgYXMgUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PjtcbiAgICByZXR1cm4gcmVwby5zdGF0ZW1lbnQobWV0aG9kLCAuLi5hcmdzLCAuLi5hcmd6KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHByZXBhcmUoXG4gICAgY3R4PzogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogUHJvbWlzZTxTdGF0ZW1lbnRFeGVjdXRvcjxNLCBSPj4ge1xuICAgIGN0eCA9XG4gICAgICBjdHggfHxcbiAgICAgIChhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgUGVyc2lzdGVuY2VLZXlzLlFVRVJZLFxuICAgICAgICB0aGlzLm92ZXJyaWRlcyB8fCB7fSxcbiAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICkpO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1NpbXBsZVF1ZXJ5KCkgJiZcbiAgICAgIChjdHggYXMgQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4pLmdldChcImZvcmNlUHJlcGFyZVNpbXBsZVF1ZXJpZXNcIilcbiAgICApIHtcbiAgICAgIGNvbnN0IHNxdWFzaGVkID0gdGhpcy5zcXVhc2goY3R4IGFzIENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+KTtcbiAgICAgIGlmIChzcXVhc2hlZCkge1xuICAgICAgICB0aGlzLnByZXBhcmVkID0gc3F1YXNoZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW107XG4gICAgY29uc3QgcGFyYW1zOiBhbnkgPSB7fSBhcyBhbnk7XG5cbiAgICBjb25zdCBwcmVwYXJlZDogUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PiA9IHtcbiAgICAgIGNsYXNzOiB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIGFyZ3MsXG4gICAgICBwYXJhbXMsXG4gICAgfSBhcyBhbnk7XG5cbiAgICBjb25zdCBtZXRob2Q6IHN0cmluZ1tdID0gW1F1ZXJ5Q2xhdXNlLkZJTkRfQlldO1xuXG4gICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucHJlcGFyZUNvbmRpdGlvbih0aGlzLndoZXJlQ29uZGl0aW9uLCBjdHggYXMgbmV2ZXIpO1xuICAgICAgbWV0aG9kLnB1c2gocGFyc2VkLm1ldGhvZCk7XG4gICAgICBpZiAocGFyc2VkLmFyZ3MgJiYgcGFyc2VkLmFyZ3MubGVuZ3RoKVxuICAgICAgICBhcmdzLnB1c2goLi4uKHBhcnNlZC5hcmdzIGFzIChzdHJpbmcgfCBudW1iZXIpW10pKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0U2VsZWN0b3IpXG4gICAgICBtZXRob2QucHVzaChcbiAgICAgICAgUXVlcnlDbGF1c2UuU0VMRUNULFxuICAgICAgICB0aGlzLnNlbGVjdFNlbGVjdG9yLmpvaW4oYCAke1F1ZXJ5Q2xhdXNlLkFORC50b0xvd2VyQ2FzZSgpfSBgKVxuICAgICAgKTtcbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3JzPy5sZW5ndGgpIHtcbiAgICAgIG1ldGhvZC5wdXNoKFF1ZXJ5Q2xhdXNlLk9SREVSX0JZLCB0aGlzLm9yZGVyQnlTZWxlY3RvcnNbMF1bMF0gYXMgc3RyaW5nKTtcbiAgICAgIGFyZ3MucHVzaCh0aGlzLm9yZGVyQnlTZWxlY3RvcnNbMF1bMV0gYXMgYW55KTtcbiAgICB9XG4gICAgcHJlcGFyZWQubWV0aG9kID0gdG9DYW1lbENhc2UobWV0aG9kLmpvaW4oXCIgXCIpKTtcbiAgICBwcmVwYXJlZC5wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5wcmVwYXJlZCA9IHByZXBhcmVkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgYSByZWNvcmQgZnJvbSBDb3VjaERCL0ZhYnJpY1xuICAgKiBAc3VtbWFyeSBFeHRyYWN0cyB0aGUgSUQgZnJvbSBhIENvdWNoREIgZG9jdW1lbnQgYW5kIHJldmVydHMgaXQgdG8gYSBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHByb2Nlc3NSZWNvcmQoXG4gICAgcmVjb3JkOiBhbnksXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBNIHtcbiAgICBjb25zdCBwa0F0dHIgPSBNb2RlbC5wayh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgY29uc3QgdHlwZSA9IE1ldGFkYXRhLmdldChcbiAgICAgIHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgTWV0YWRhdGEua2V5KERCS2V5cy5JRCwgcGtBdHRyIGFzIHN0cmluZylcbiAgICApPy50eXBlO1xuXG4gICAgaWYgKHJlY29yZFtDb3VjaERCS2V5cy5JRF0pIHtcbiAgICAgIGNvbnN0IFssIC4uLmtleUFyZ3NdID0gcmVjb3JkW0NvdWNoREJLZXlzLklEXS5zcGxpdChDb3VjaERCS2V5cy5TRVBBUkFUT1IpO1xuICAgICAgY29uc3QgaWQgPSBrZXlBcmdzLmpvaW4oXCJfXCIpO1xuICAgICAgcmVjb3JkW3BrQXR0cl0gPSBTZXF1ZW5jZS5wYXJzZVZhbHVlKHR5cGUgYXMgYW55LCBpZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NSZWNvcmQocmVjb3JkLCBjdHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBNYW5nbyBxdWVyeVxuICAgKiBAc3VtbWFyeSBTZW5kcyBhIHJhdyBNYW5nbyBxdWVyeSB0byBGYWJyaWMgYW5kIHByb2Nlc3NlcyB0aGUgcmVzdWx0c1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmF3PFI+KHJhd0lucHV0OiBNYW5nb1F1ZXJ5LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJhdyk7XG4gICAgY29uc3QgYWdncmVnYXRvciA9IChyYXdJbnB1dCBhcyBhbnkpPy5hZ2dyZWdhdGVJbmZvO1xuICAgIGlmICgocmF3SW5wdXQgYXMgYW55KT8uYWdncmVnYXRlICYmIGFnZ3JlZ2F0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBZ2dyZWdhdGU8Uj4oYWdncmVnYXRvciwgY3R4KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0czogYW55W10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KFxuICAgICAgcmF3SW5wdXQsXG4gICAgICB0cnVlLFxuICAgICAgdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICBjdHhcbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLnNlbGVjdFNlbGVjdG9yKSB7XG4gICAgICBjb25zdCBwcm9jZXNzZWQgPSByZXN1bHRzLm1hcCgocikgPT4gdGhpcy5wcm9jZXNzUmVjb3JkKHIsIGN0eCkpO1xuICAgICAgaWYgKCFjdHguZ2V0T3JVbmRlZmluZWQoXCJhZnRlclF1ZXJ5SGFuZGxlcnNcIikpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZCBhcyB1bmtub3duIGFzIFI7XG4gICAgICB9XG4gICAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXBwbHlBZnRlckhhbmRsZXJzVG9SZXN1bHQocHJvY2Vzc2VkLCBjdHgpKSBhcyBSO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cyBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgYSBDb3VjaERCIE1hbmdvIHF1ZXJ5IGZyb20gdGhlIHN0YXRlbWVudFxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyB0aGUgc3RhdGVtZW50J3MgY29uZGl0aW9ucywgc2VsZWN0b3JzLCBhbmQgb3B0aW9ucyBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkKCk6IE1hbmdvUXVlcnkge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkKTtcbiAgICBjb25zdCBhZ2dyZWdhdGVRdWVyeSA9IHRoaXMuYnVpbGRBZ2dyZWdhdGVRdWVyeSgpO1xuICAgIGlmIChhZ2dyZWdhdGVRdWVyeSkgcmV0dXJuIGFnZ3JlZ2F0ZVF1ZXJ5O1xuICAgIGNvbnN0IHNlbGVjdG9yczogTWFuZ29TZWxlY3RvciA9IHt9O1xuICAgIHNlbGVjdG9yc1tDb3VjaERCS2V5cy5UQUJMRV0gPSB7fTtcbiAgICBzZWxlY3RvcnNbQ291Y2hEQktleXMuVEFCTEVdID0gTW9kZWwudGFibGVOYW1lKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCBxdWVyeTogTWFuZ29RdWVyeSA9IHsgc2VsZWN0b3I6IHNlbGVjdG9ycyB9O1xuICAgIGlmICh0aGlzLnNlbGVjdFNlbGVjdG9yKSBxdWVyeS5maWVsZHMgPSB0aGlzLnNlbGVjdFNlbGVjdG9yIGFzIHN0cmluZ1tdO1xuXG4gICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbjogTWFuZ29TZWxlY3RvciA9IHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgIENvbmRpdGlvbi5hbmQoXG4gICAgICAgICAgdGhpcy53aGVyZUNvbmRpdGlvbixcbiAgICAgICAgICBDb25kaXRpb24uYXR0cmlidXRlPE0+KENvdWNoREJLZXlzLlRBQkxFIGFzIGtleW9mIE0pLmVxKFxuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3JbQ291Y2hEQktleXMuVEFCTEVdXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApLnNlbGVjdG9yO1xuICAgICAgY29uc3Qgc2VsZWN0b3JLZXlzID0gT2JqZWN0LmtleXMoY29uZGl0aW9uKSBhcyBNYW5nb09wZXJhdG9yW107XG4gICAgICBpZiAoXG4gICAgICAgIHNlbGVjdG9yS2V5cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhDb3VjaERCR3JvdXBPcGVyYXRvcikuaW5kZXhPZihzZWxlY3RvcktleXNbMF0pICE9PSAtMVxuICAgICAgKVxuICAgICAgICBzd2l0Y2ggKHNlbGVjdG9yS2V5c1swXSkge1xuICAgICAgICAgIGNhc2UgQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EOlxuICAgICAgICAgICAgY29uZGl0aW9uW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gPSBbXG4gICAgICAgICAgICAgIC4uLk9iamVjdC52YWx1ZXMoXG4gICAgICAgICAgICAgICAgY29uZGl0aW9uW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gYXMgTWFuZ29TZWxlY3RvclxuICAgICAgICAgICAgICApLnJlZHVjZSgoYWNjdW06IE1hbmdvU2VsZWN0b3JbXSwgdmFsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5cy5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiVG9vIG1hbnkga2V5cyBpbiBxdWVyeSBzZWxlY3Rvci4gc2hvdWxkIGJlIG9uZVwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGsgPSBrZXlzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChrID09PSBDb3VjaERCR3JvdXBPcGVyYXRvci5BTkQpXG4gICAgICAgICAgICAgICAgICBhY2N1bS5wdXNoKC4uLih2YWxba10gYXMgYW55W10pKTtcbiAgICAgICAgICAgICAgICBlbHNlIGFjY3VtLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgICAgICAgIH0sIFtdKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvciA9IGNvbmRpdGlvbjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgQ291Y2hEQkdyb3VwT3BlcmF0b3IuT1I6IHtcbiAgICAgICAgICAgIGNvbnN0IHM6IFJlY29yZDxhbnksIGFueT4gPSB7fTtcbiAgICAgICAgICAgIHNbQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSA9IFtcbiAgICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgICAuLi5PYmplY3QuZW50cmllcyhxdWVyeS5zZWxlY3RvcikubWFwKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8YW55LCBhbnk+ID0ge307XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3IgPSBzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlXCIpO1xuICAgICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY29uZGl0aW9uKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgaWYgKHF1ZXJ5LnNlbGVjdG9yW2tleV0pXG4gICAgICAgICAgICBsb2cud2FybihcbiAgICAgICAgICAgICAgYEEgJHtrZXl9IHF1ZXJ5IHBhcmFtIGlzIGFib3V0IHRvIGJlIG92ZXJyaWRkZW46ICR7cXVlcnkuc2VsZWN0b3Jba2V5XX0gYnkgJHt2YWx9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBxdWVyeS5zZWxlY3RvcltrZXldID0gdmFsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3JzPy5sZW5ndGgpIHtcbiAgICAgIHF1ZXJ5LnNvcnQgPSBxdWVyeS5zb3J0IHx8IFtdO1xuICAgICAgcXVlcnkuc2VsZWN0b3IgPSBxdWVyeS5zZWxlY3RvciB8fCAoe30gYXMgTWFuZ29TZWxlY3Rvcik7XG4gICAgICBmb3IgKGNvbnN0IFtzZWxlY3RvcktleSwgZGlyZWN0aW9uXSBvZiB0aGlzLm9yZGVyQnlTZWxlY3RvcnMpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzZWxlY3RvcktleSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IHJlYzogUmVjb3JkPHN0cmluZywgT3JkZXJEaXJlY3Rpb24+ID0ge307XG4gICAgICAgIHJlY1tzZWxlY3Rvcl0gPSBkaXJlY3Rpb24gYXMgT3JkZXJEaXJlY3Rpb247XG4gICAgICAgIChxdWVyeS5zb3J0IGFzIFJlY29yZDxzdHJpbmcsIE9yZGVyRGlyZWN0aW9uPltdKS5wdXNoKHJlYyk7XG4gICAgICAgIGlmICghcXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdKSB7XG4gICAgICAgICAgcXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgICAgICAocXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5CSUdHRVJdID1cbiAgICAgICAgICAgIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5saW1pdFNlbGVjdG9yKSB7XG4gICAgICBxdWVyeS5saW1pdCA9IHRoaXMubGltaXRTZWxlY3RvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4oXG4gICAgICAgIGBObyBsaW1pdCBzZWxlY3RvciBkZWZpbmVkLiBVc2luZyBkZWZhdWx0IGNvdWNoZGIgbGltaXQgb2YgJHtDb3VjaERCUXVlcnlMaW1pdH1gXG4gICAgICApO1xuICAgICAgcXVlcnkubGltaXQgPSBDb3VjaERCUXVlcnlMaW1pdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vZmZzZXRTZWxlY3RvcikgcXVlcnkuc2tpcCA9IHRoaXMub2Zmc2V0U2VsZWN0b3I7XG5cbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGNvbmRpdGlvbiBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeSBzZWxlY3RvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIENvbmRpdGlvbiBvYmplY3QgaW50byBhIENvdWNoREIgTWFuZ28gcXVlcnkgc2VsZWN0b3Igc3RydWN0dXJlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGFyc2VDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb248TT4pOiBNYW5nb1F1ZXJ5IHtcbiAgICBmdW5jdGlvbiBtZXJnZShcbiAgICAgIG9wOiBNYW5nb09wZXJhdG9yLFxuICAgICAgb2JqMTogTWFuZ29TZWxlY3RvcixcbiAgICAgIG9iajI6IE1hbmdvU2VsZWN0b3JcbiAgICApOiBNYW5nb1F1ZXJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdDogTWFuZ29RdWVyeSA9IHsgc2VsZWN0b3I6IHt9IGFzIE1hbmdvU2VsZWN0b3IgfTtcbiAgICAgIHJlc3VsdC5zZWxlY3RvcltvcF0gPSBbb2JqMSwgb2JqMl07XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHsgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uIH0gPSBjb25kaXRpb24gYXMgdW5rbm93biBhcyB7XG4gICAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+O1xuICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcjtcbiAgICAgIGNvbXBhcmlzb246IGFueTtcbiAgICB9O1xuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5TVEFSVFNfV0lUSCkge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyMSAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJTVEFSVFNfV0lUSCByZXF1aXJlcyBhbiBhdHRyaWJ1dGUgbmFtZVwiKTtcbiAgICAgIGlmICh0eXBlb2YgY29tcGFyaXNvbiAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJTVEFSVFNfV0lUSCByZXF1aXJlcyBhIHN0cmluZyBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3QgcmFuZ2UgPSBwcmVmaXhSYW5nZShjb21wYXJpc29uKTtcbiAgICAgIGNvbnN0IHNlbGVjdG9yOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHNlbGVjdG9yW2F0dHIxXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAoc2VsZWN0b3JbYXR0cjFdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5CSUdHRVJfRVFdID0gcmFuZ2Uuc3RhcnQ7XG4gICAgICAoc2VsZWN0b3JbYXR0cjFdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5TTUFMTEVSXSA9IHJhbmdlLmVuZDtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yIH07XG4gICAgfVxuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5FTkRTX1dJVEgpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cjEgIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiRU5EU19XSVRIIHJlcXVpcmVzIGFuIGF0dHJpYnV0ZSBuYW1lXCIpO1xuICAgICAgaWYgKHR5cGVvZiBjb21wYXJpc29uICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkVORFNfV0lUSCByZXF1aXJlcyBhIHN0cmluZyBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3Qgc2VsZWN0b3I6IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgc2VsZWN0b3JbYXR0cjFdID0ge1xuICAgICAgICBbQ291Y2hEQk9wZXJhdG9yLlJFR0VYUF06IGAke2VzY2FwZVJlZ0V4cChjb21wYXJpc29uKX0kYCxcbiAgICAgIH0gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yIH07XG4gICAgfVxuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5CRVRXRUVOKSB7XG4gICAgICBjb25zdCBhdHRyID0gYXR0cjEgYXMgc3RyaW5nO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbXBhcmlzb24pIHx8IGNvbXBhcmlzb24ubGVuZ3RoICE9PSAyKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkJFVFdFRU4gb3BlcmF0b3IgcmVxdWlyZXMgW21pbiwgbWF4XSBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3QgW21pbiwgbWF4XSA9IGNvbXBhcmlzb247XG4gICAgICBjb25zdCBvcEJldHdlZW46IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgb3BCZXR3ZWVuW2F0dHJdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcEJldHdlZW5bYXR0cl0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgIHRyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5CSUdHRVJfRVEpXG4gICAgICBdID0gbWluO1xuICAgICAgKG9wQmV0d2VlblthdHRyXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLlNNQUxMRVJfRVEpXG4gICAgICBdID0gbWF4O1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3I6IG9wQmV0d2VlbiB9O1xuICAgIH1cblxuICAgIGxldCBvcDogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgaWYgKFxuICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICkgPT09IC0xXG4gICAgKSB7XG4gICAgICBvcFthdHRyMSBhcyBzdHJpbmddID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcFthdHRyMSBhcyBzdHJpbmddIGFzIE1hbmdvU2VsZWN0b3IpW3RyYW5zbGF0ZU9wZXJhdG9ycyhvcGVyYXRvcildID1cbiAgICAgICAgY29tcGFyaXNvbjtcbiAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgIG9wID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yIGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBvcFt0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuTk9UKV0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wW3RyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5OT1QpXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgKGF0dHIxIGFzIHVua25vd24gYXMgeyBhdHRyMTogc3RyaW5nIH0pLmF0dHIxXG4gICAgICBdID0gY29tcGFyaXNvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3AxOiBhbnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGF0dHIxIGFzIENvbmRpdGlvbjxNPikuc2VsZWN0b3I7XG4gICAgICBjb25zdCBvcDI6IGFueSA9IHRoaXMucGFyc2VDb25kaXRpb24oY29tcGFyaXNvbiBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yO1xuICAgICAgb3AgPSBtZXJnZSh0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpLCBvcDEsIG9wMikuc2VsZWN0b3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc2VsZWN0b3I6IG9wIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhbiBhZ2dyZWdhdGUgcXVlcnkgaWYgYWdncmVnYXRpb24gaXMgcmVxdWVzdGVkXG4gICAqIEBzdW1tYXJ5IENoZWNrcyBmb3IgYWdncmVnYXRlIG9wZXJhdGlvbnMgYW5kIHJldHVybnMgYSBzcGVjaWFsIE1hbmdvUXVlcnkgZm9yIHRoZW1cbiAgICovXG4gIHByaXZhdGUgYnVpbGRBZ2dyZWdhdGVRdWVyeSgpOiBNYW5nb1F1ZXJ5IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuZnJvbVNlbGVjdG9yKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmF2Z1NlbGVjdG9yKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBTdHJpbmcodGhpcy5hdmdTZWxlY3Rvcik7XG4gICAgICBjb25zdCBzdW1JbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFwic3VtXCIsIGF0dHJpYnV0ZSk7XG4gICAgICBjb25zdCBjb3VudEluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXCJjb3VudFwiLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKCFzdW1JbmZvIHx8ICFjb3VudEluZm8pXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICAgIGBBdmcgb3BlcmF0aW9uIHJlcXVpcmVzIHN1bSBhbmQgY291bnQgdmlld3MgZm9yIGF0dHJpYnV0ZSAke2F0dHJpYnV0ZX1gXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeSh7XG4gICAgICAgIGtpbmQ6IFwiYXZnXCIsXG4gICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgc3VtRGVzY3JpcHRvcjogc3VtSW5mby5kZXNjcmlwdG9yLFxuICAgICAgICBjb3VudERlc2NyaXB0b3I6IGNvdW50SW5mby5kZXNjcmlwdG9yLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvdW50RGlzdGluY3RTZWxlY3RvciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3QgYXR0cmlidXRlID1cbiAgICAgICAgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgPT0gbnVsbFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBTdHJpbmcodGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IpO1xuICAgICAgY29uc3QgaW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcImRpc3RpbmN0XCIsIGF0dHJpYnV0ZSk7XG4gICAgICBpZiAoaW5mbykge1xuICAgICAgICBpbmZvLmNvdW50RGlzdGluY3QgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeShpbmZvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhZ2dyZWdhdG9yVXNlZCA9XG4gICAgICB0eXBlb2YgdGhpcy5jb3VudFNlbGVjdG9yICE9PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICB0eXBlb2YgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgIT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICEhdGhpcy5taW5TZWxlY3RvciB8fFxuICAgICAgISF0aGlzLm1heFNlbGVjdG9yIHx8XG4gICAgICAhIXRoaXMuc3VtU2VsZWN0b3IgfHxcbiAgICAgICEhdGhpcy5kaXN0aW5jdFNlbGVjdG9yO1xuXG4gICAgY29uc3QgYWdncmVnYXRvckNoZWNrczogQXJyYXk8W1ZpZXdLaW5kLCBTZWxlY3RTZWxlY3RvcjxNPiB8IHVuZGVmaW5lZF0+ID0gW1xuICAgICAgW1xuICAgICAgICBcImNvdW50XCIsXG4gICAgICAgICh0aGlzLmNvdW50U2VsZWN0b3IgPz8gdW5kZWZpbmVkKSBhcyBTZWxlY3RTZWxlY3RvcjxNPiB8IHVuZGVmaW5lZCxcbiAgICAgIF0sXG4gICAgICBbXCJtYXhcIiwgdGhpcy5tYXhTZWxlY3Rvcl0sXG4gICAgICBbXCJtaW5cIiwgdGhpcy5taW5TZWxlY3Rvcl0sXG4gICAgICBbXCJzdW1cIiwgdGhpcy5zdW1TZWxlY3Rvcl0sXG4gICAgICBbXCJkaXN0aW5jdFwiLCB0aGlzLmRpc3RpbmN0U2VsZWN0b3JdLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IFtraW5kLCBzZWxlY3Rvcl0gb2YgYWdncmVnYXRvckNoZWNrcykge1xuICAgICAgY29uc3QgYXR0cmlidXRlID0gc2VsZWN0b3IgPyBTdHJpbmcoc2VsZWN0b3IpIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihraW5kLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKGluZm8pIHJldHVybiB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KGluZm8pO1xuICAgIH1cblxuICAgIGlmIChhZ2dyZWdhdG9yVXNlZCkge1xuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgIGBObyBDb3VjaERCIHZpZXcgbWV0YWRhdGEgZm91bmQgZm9yIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKFxuICAgICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yXG4gICAgICAgICl9IGFnZ3JlZ2F0b3JgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGFnZ3JlZ2F0ZSBkZXNjcmlwdG9yIGZvciBhIHZpZXctYmFzZWQgYWdncmVnYXRpb25cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcbiAgICBraW5kOiBWaWV3S2luZCxcbiAgICBhdHRyaWJ1dGU/OiBzdHJpbmdcbiAgKTogRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuZnJvbVNlbGVjdG9yKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1ldGFzID0gZmluZFZpZXdNZXRhZGF0YSh0aGlzLmZyb21TZWxlY3Rvciwga2luZCwgYXR0cmlidXRlKTtcbiAgICBpZiAoIW1ldGFzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtZXRhID0gbWV0YXNbMF07XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCB2aWV3TmFtZSA9IGdlbmVyYXRlVmlld05hbWUodGFibGVOYW1lLCBtZXRhLmF0dHJpYnV0ZSwga2luZCwgbWV0YSk7XG4gICAgY29uc3QgZGRvYyA9IG1ldGEuZGRvYyB8fCBnZW5lcmF0ZURlc2lnbkRvY05hbWUodGFibGVOYW1lLCB2aWV3TmFtZSk7XG4gICAgY29uc3Qgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIHJlZHVjZTogbWV0YS5yZWR1Y2UgIT09IHVuZGVmaW5lZCA/IHRydWUgOiAhbWV0YS5yZXR1cm5Eb2NzLFxuICAgIH07XG4gICAgaWYgKGtpbmQgPT09IFwiZGlzdGluY3RcIiB8fCBraW5kID09PSBcImdyb3VwQnlcIikgb3B0aW9ucy5ncm91cCA9IHRydWU7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQsXG4gICAgICBtZXRhLFxuICAgICAgZGVzY3JpcHRvcjoge1xuICAgICAgICBkZG9jLFxuICAgICAgICB2aWV3OiB2aWV3TmFtZSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyB0aGUgc3BlY2lhbCBhZ2dyZWdhdGUgTWFuZ29RdWVyeSBtYXJrZXJcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRlUXVlcnkoXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mb1xuICApOiBNYW5nb1F1ZXJ5ICYgeyBhZ2dyZWdhdGU6IHRydWU7IGFnZ3JlZ2F0ZUluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8gfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdG9yOiB7fSxcbiAgICAgIGFnZ3JlZ2F0ZTogdHJ1ZSxcbiAgICAgIGFnZ3JlZ2F0ZUluZm86IGluZm8sXG4gICAgfSBhcyBNYW5nb1F1ZXJ5ICYgeyBhZ2dyZWdhdGU6IHRydWU7IGFnZ3JlZ2F0ZUluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgYWRhcHRlciBjYXN0IHRvIEZhYnJpY0NsaWVudEFkYXB0ZXIgZm9yIHZpZXcgYWNjZXNzXG4gICAqL1xuICBwcml2YXRlIGdldEZhYnJpY0FkYXB0ZXIoKTogRmFicmljQ2xpZW50QWRhcHRlciB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlciBhcyBGYWJyaWNDbGllbnRBZGFwdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhbiBhZ2dyZWdhdGUgcXVlcnkgdmlhIGFkYXB0ZXIncyB2aWV3IG1ldGhvZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlQWdncmVnYXRlPFI+KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8sXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcm9taXNlPFI+IHtcbiAgICBpZiAoIXRoaXMuaXNWaWV3QWdncmVnYXRlKGluZm8pKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVBdmVyYWdlPFI+KGluZm8sIGN0eCk7XG4gICAgfVxuICAgIGNvbnN0IGZhYnJpY0FkYXB0ZXIgPSB0aGlzLmdldEZhYnJpY0FkYXB0ZXIoKTtcbiAgICBjb25zdCB2aWV3SW5mbyA9IGluZm8gYXMgRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+O1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLmRkb2MsXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLnZpZXcsXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLm9wdGlvbnMsXG4gICAgICBjdHhcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NWaWV3UmVzcG9uc2U8Uj4oaW5mbywgcmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGF2ZXJhZ2UgY2FsY3VsYXRpb24gZnJvbSBzdW0gYW5kIGNvdW50IHZpZXdzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZUF2ZXJhZ2U8Uj4oXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mbyxcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IFByb21pc2U8Uj4ge1xuICAgIGlmIChpbmZvLmtpbmQgIT09IFwiYXZnXCIpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkF2ZXJhZ2UgZGVzY3JpcHRvciBpcyBub3QgdmFsaWRcIik7XG4gICAgY29uc3QgZmFicmljQWRhcHRlciA9IHRoaXMuZ2V0RmFicmljQWRhcHRlcigpO1xuICAgIGNvbnN0IFtzdW1EZXNjLCBjb3VudERlc2NdID0gW2luZm8uc3VtRGVzY3JpcHRvciwgaW5mby5jb3VudERlc2NyaXB0b3JdO1xuICAgIGNvbnN0IFtzdW1SZXNwb25zZSwgY291bnRSZXNwb25zZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmYWJyaWNBZGFwdGVyLnZpZXc8Vmlld1Jlc3BvbnNlPihcbiAgICAgICAgc3VtRGVzYy5kZG9jLFxuICAgICAgICBzdW1EZXNjLnZpZXcsXG4gICAgICAgIHN1bURlc2Mub3B0aW9ucyxcbiAgICAgICAgY3R4XG4gICAgICApLFxuICAgICAgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICAgIGNvdW50RGVzYy5kZG9jLFxuICAgICAgICBjb3VudERlc2MudmlldyxcbiAgICAgICAgY291bnREZXNjLm9wdGlvbnMsXG4gICAgICAgIGN0eFxuICAgICAgKSxcbiAgICBdKTtcbiAgICBjb25zdCBzdW0gPSBzdW1SZXNwb25zZS5yb3dzPy5bMF0/LnZhbHVlID8/IDA7XG4gICAgY29uc3QgY291bnQgPSBjb3VudFJlc3BvbnNlLnJvd3M/LlswXT8udmFsdWUgPz8gMDtcbiAgICBpZiAoIWNvdW50KSByZXR1cm4gMCBhcyB1bmtub3duIGFzIFI7XG4gICAgcmV0dXJuIChzdW0gLyBjb3VudCkgYXMgdW5rbm93biBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgdGhlIHZpZXcgcmVzcG9uc2UgYmFzZWQgb24gYWdncmVnYXRlIGtpbmRcbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1ZpZXdSZXNwb25zZTxSPihcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvLFxuICAgIHJlc3BvbnNlOiBWaWV3UmVzcG9uc2VcbiAgKTogUiB7XG4gICAgaWYgKGluZm8ua2luZCA9PT0gXCJhdmdcIilcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICBcIkF2ZXJhZ2UgcmVzdWx0cyBzaG91bGQgYmUgaGFuZGxlZCBiZWZvcmUgcHJvY2Vzc2luZyByb3dzXCJcbiAgICAgICk7XG4gICAgY29uc3Qgcm93cyA9IHJlc3BvbnNlLnJvd3MgfHwgW107XG4gICAgY29uc3Qgdmlld0luZm8gPSBpbmZvIGFzIEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PjtcbiAgICBjb25zdCBtZXRhID0gdmlld0luZm8ubWV0YTtcbiAgICBpZiAodmlld0luZm8uY291bnREaXN0aW5jdCkge1xuICAgICAgcmV0dXJuIChyb3dzLmxlbmd0aCB8fCAwKSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmICh2aWV3SW5mby5raW5kID09PSBcImRpc3RpbmN0XCIgfHwgdmlld0luZm8ua2luZCA9PT0gXCJncm91cEJ5XCIpIHtcbiAgICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiByb3cua2V5ID8/IHJvdy52YWx1ZSkgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICBpZiAobWV0YS5yZXR1cm5Eb2NzKSB7XG4gICAgICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4gcm93LnZhbHVlID8/IHJvdy5kb2MgPz8gcm93KSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmICghcm93cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAodmlld0luZm8ua2luZCA9PT0gXCJjb3VudFwiID8gMCA6IG51bGwpIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgcmV0dXJuIChyb3dzWzBdLnZhbHVlID8/IHJvd3NbMF0ua2V5ID8/IG51bGwpIGFzIHVua25vd24gYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVHlwZSBndWFyZCB0byBjaGVjayBpZiBpbmZvIGlzIGEgdmlldy1iYXNlZCBhZ2dyZWdhdGVcbiAgICovXG4gIHByaXZhdGUgaXNWaWV3QWdncmVnYXRlKFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm9cbiAgKTogaW5mbyBpcyBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT4ge1xuICAgIHJldHVybiBpbmZvLmtpbmQgIT09IFwiYXZnXCI7XG4gIH1cbn1cbiIsImltcG9ydCBcIi4uL3NoYXJlZC9vdmVycmlkZXNcIjtcbmltcG9ydCB7XG4gIENvdWNoREJLZXlzLFxuICB0eXBlIE1hbmdvUXVlcnksXG4gIHR5cGUgVmlld1Jlc3BvbnNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0ICogYXMgZ3JwYyBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHtcbiAgTW9kZWwsXG4gIHR5cGUgTW9kZWxDb25zdHJ1Y3RvcixcbiAgdHlwZSBTZXJpYWxpemVyLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBkZWJ1ZywgZmluYWwsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7XG4gIHR5cGUgUGVlckNvbmZpZyxcbiAgdHlwZSBTZWdyZWdhdGVkTW9kZWwsXG4gIHR5cGUgTXNwRGV0YWlscyxcbn0gZnJvbSBcIi4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgY29ubmVjdCxcbiAgdHlwZSBDb25uZWN0T3B0aW9ucyxcbiAgR2F0ZXdheSxcbiAgTmV0d29yayxcbiAgUHJvcG9zYWxPcHRpb25zLFxuICBDb250cmFjdCBhcyBDb250cmFrdCxcbiAgdHlwZSBTaWduZXIsXG4gIEdhdGV3YXlFcnJvcixcbiAgRW5kb3JzZUVycm9yLFxufSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBHYXRld2F5IGFzIExlZ2FjeUdhdGV3YXksIFdhbGxldHMgfSBmcm9tIFwiZmFicmljLW5ldHdvcmtcIjtcbmltcG9ydCB0eXBlIHsgRW5kb3JzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHtcbiAgZ2V0SWRlbnRpdHksXG4gIGdldFNpZ25lcixcbiAgZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQsXG4gIHJlYWRGaWxlIGFzIHJlYWRGc0ZpbGUsXG59IGZyb20gXCIuL2ZhYnJpYy1mc1wiO1xuaW1wb3J0IHtcbiAgQmFzZUVycm9yLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxuICBTZXJpYWxpemF0aW9uRXJyb3IsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgTm90Rm91bmRFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgQmFkUmVxdWVzdEVycm9yLFxuICB0eXBlIFByaW1hcnlLZXlUeXBlLFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgQWRhcHRlcixcbiAgdHlwZSBBZGFwdGVyRmxhZ3MsXG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBGb3JiaWRkZW5FcnJvcixcbiAgTWlncmF0aW9uRXJyb3IsXG4gIE9ic2VydmVyRXJyb3IsXG4gIFBhZ2luZ0Vycm9yLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFF1ZXJ5RXJyb3IsXG4gIFJlcG9zaXRvcnksXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIFN0YXRlbWVudCxcbiAgdHlwZSBQcmVwYXJlZFN0YXRlbWVudCxcbiAgUGFnaW5hdG9yLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIENvbnRleHR1YWxBcmdzLFxuICB0eXBlIFByZXBhcmVkTW9kZWwsXG4gIEFsbE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRmFicmljRmxhdm91ciB9IGZyb20gXCIuLi9zaGFyZWQvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDbGllbnRTZXJpYWxpemVyIH0gZnJvbSBcIi4uL3NoYXJlZC9DbGllbnRTZXJpYWxpemVyXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnREaXNwYXRjaCB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudERpc3BhdGNoXCI7XG4vLyBpbXBvcnQgeyBIU01TaWduZXJGYWN0b3J5Q3VzdG9tIH0gZnJvbSBcIi4vZmFicmljLWhzbVwiO1xuaW1wb3J0IHsgdHlwZSBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50U3RhdGVtZW50IH0gZnJvbSBcIi4vRmFicmljQ2xpZW50U3RhdGVtZW50XCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRQYWdpbmF0b3IgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRQYWdpbmF0b3JcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRSZXBvc2l0b3J5XCI7XG5pbXBvcnQge1xuICBFbmRvcnNlbWVudEVycm9yLFxuICBFbmRvcnNlbWVudFBvbGljeUVycm9yLFxuICBNdmNjUmVhZENvbmZsaWN0RXJyb3IsXG4gIFBoYW50b21SZWFkQ29uZmxpY3RFcnJvcixcbiAgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IsXG59IGZyb20gXCIuLi9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWZhdWx0RmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IENyeXB0b1V0aWxzIH0gZnJvbSBcIi4vY3J5cHRvXCI7XG5pbXBvcnQgeyBleHRyYWN0SWRzIH0gZnJvbSBcIi4vaWRzL2lkLWV4dHJhY3Rpb25cIjtcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSBcIi4uL3NoYXJlZC9pbmRleFwiO1xuXG50eXBlIExlZ2FjeVBlZXJUYXJnZXQgPSB7XG4gIG1zcElkOiBzdHJpbmc7XG4gIHBlZXJFbmRwb2ludDogc3RyaW5nO1xuICBwZWVySG9zdEFsaWFzPzogc3RyaW5nO1xuICB0bHNDZXJ0Pzogc3RyaW5nIHwgQnVmZmVyO1xufTtcblxudHlwZSBMZWdhY3lQZWVyV2l0aE5hbWUgPSBMZWdhY3lQZWVyVGFyZ2V0ICYgeyBuYW1lOiBzdHJpbmcgfTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWRhcHRlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya3NcbiAqIEBzdW1tYXJ5IFRoZSBGYWJyaWNBZGFwdGVyIGV4dGVuZHMgQ291Y2hEQkFkYXB0ZXIgdG8gcHJvdmlkZSBhIHNlYW1sZXNzIGludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya3MuXG4gKiBJdCBoYW5kbGVzIGNvbm5lY3Rpb24gbWFuYWdlbWVudCwgdHJhbnNhY3Rpb24gc3VibWlzc2lvbiwgYW5kIENSVUQgb3BlcmF0aW9ucyBhZ2FpbnN0IEZhYnJpYyBjaGFpbmNvZGUuXG4gKiBAdGVtcGxhdGUgUGVlckNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdHlwZSBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAdGVtcGxhdGUgRmFicmljRmxhZ3MgLSBGbGFncyBzcGVjaWZpYyB0byBGYWJyaWMgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIENvbnRleHQ8RmFicmljRmxhZ3M+IC0gQ29udGV4dCB0eXBlIGNvbnRhaW5pbmcgRmFicmljLXNwZWNpZmljIGZsYWdzXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAcGFyYW0gYWxpYXMgLSBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGFkYXB0ZXIgaW5zdGFuY2VcbiAqIEBjbGFzcyBGYWJyaWNDbGllbnRBZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IEZhYnJpY0FkYXB0ZXIgaW5zdGFuY2VcbiAqIGNvbnN0IGNvbmZpZzogUGVlckNvbmZpZyA9IHtcbiAqICAgbXNwSWQ6ICdPcmcxTVNQJyxcbiAqICAgcGVlckVuZHBvaW50OiAnbG9jYWxob3N0OjcwNTEnLFxuICogICBjaGFubmVsTmFtZTogJ215Y2hhbm5lbCcsXG4gKiAgIGNoYWluY29kZU5hbWU6ICdteWNjJyxcbiAqICAgY29udHJhY3ROYW1lOiAnbXljb250cmFjdCcsXG4gKiAgIHRsc0NlcnRQYXRoOiAnL3BhdGgvdG8vdGxzL2NlcnQnLFxuICogICBjZXJ0RGlyZWN0b3J5UGF0aDogJy9wYXRoL3RvL2NlcnQvZGlyJyxcbiAqICAga2V5RGlyZWN0b3J5UGF0aDogJy9wYXRoL3RvL2tleS9kaXInXG4gKiB9O1xuICpcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgRmFicmljQWRhcHRlcihjb25maWcsICdvcmcxLWFkYXB0ZXInKTtcbiAqXG4gKiAvLyBVc2UgdGhlIGFkYXB0ZXIgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgRmFicmljIG5ldHdvcmtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFkYXB0ZXIucmVhZCgndXNlcnMnLCAndXNlcjEnLCBteVNlcmlhbGl6ZXIpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAqICAgcGFydGljaXBhbnQgTmV0d29ya1xuICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAqXG4gKiAgIENsaWVudC0+PkZhYnJpY0FkYXB0ZXI6IGNyZWF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbCwgdHJhbnNpZW50LCBzZXJpYWxpemVyKVxuICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogc3VibWl0VHJhbnNhY3Rpb24oT3BlcmF0aW9uS2V5cy5DUkVBVEUsIFtzZXJpYWxpemVkTW9kZWxdLCB0cmFuc2llbnQpXG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KClcbiAqICAgR2F0ZXdheS0+Pk5ldHdvcms6IGdldE5ldHdvcmsoY2hhbm5lbE5hbWUpXG4gKiAgIE5ldHdvcmstPj5Db250cmFjdDogZ2V0Q29udHJhY3QoY2hhaW5jb2RlTmFtZSwgY29udHJhY3ROYW1lKVxuICogICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IHN1Ym1pdChhcGksIHByb3Bvc2FsT3B0aW9ucylcbiAqICAgQ29udHJhY3QtPj5DaGFpbmNvZGU6IGludm9rZVxuICogICBDaGFpbmNvZGUtLT4+Q29udHJhY3Q6IHJlc3BvbnNlXG4gKiAgIENvbnRyYWN0LS0+PkZhYnJpY0FkYXB0ZXI6IHJlc3VsdFxuICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogZGVjb2RlKHJlc3VsdClcbiAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGVjb2RlZFJlc3VsdClcbiAqICAgRmFicmljQWRhcHRlci0tPj5DbGllbnQ6IGRlc2VyaWFsaXplZFJlc3VsdFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50QWRhcHRlciBleHRlbmRzIEFkYXB0ZXI8XG4gIFBlZXJDb25maWcsXG4gIENsaWVudCxcbiAgTWFuZ29RdWVyeSxcbiAgQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyB0ZXh0IGRlY29kZXIgZm9yIGNvbnZlcnRpbmcgVWludDhBcnJheSB0byBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIHByaXZhdGUgc3RhdGljIHNlcmlhbGl6ZXIgPSBuZXcgQ2xpZW50U2VyaWFsaXplcigpO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgbG9nID0gTG9nZ2luZy5mb3IoRmFicmljQ2xpZW50QWRhcHRlcik7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXI8YW55PiA9XG4gICAgRmFicmljQ2xpZW50QWRhcHRlci5zZXJpYWxpemVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBGYWJyaWNBZGFwdGVyIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IGFkYXB0ZXIgZm9yIGludGVyYWN0aW5nIHdpdGggYSBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya1xuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIE9wdGlvbmFsIGFsaWFzIGZvciB0aGUgYWRhcHRlciBpbnN0YW5jZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnOiBQZWVyQ29uZmlnLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzLCBjb25maWcpLFxuICAgICAgRmFicmljRmxhdm91cixcbiAgICAgIGFsaWFzXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG92ZXJyaWRlcz86IFBhcnRpYWw8QWRhcHRlckZsYWdzPlxuICApOiBTdGF0ZW1lbnQ8TSwgRmFicmljQ2xpZW50QWRhcHRlciwgYW55LCBNYW5nb1F1ZXJ5PiB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRTdGF0ZW1lbnQodGhpcywgb3ZlcnJpZGVzKTtcbiAgfVxuXG4gIFBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHF1ZXJ5OiBQcmVwYXJlZFN0YXRlbWVudDxhbnk+IHwgTWFuZ29RdWVyeSxcbiAgICBzaXplOiBudW1iZXIsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICk6IFBhZ2luYXRvcjxNLCBhbnksIE1hbmdvUXVlcnk+IHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY0NsaWVudFBhZ2luYXRvcih0aGlzLCBxdWVyeSwgc2l6ZSwgY2xhenopO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiB8IENvbnN0cnVjdG9yPE0+W10gfCB1bmRlZmluZWQsXG4gICAgZmxhZ3M6IFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8RmFicmljQ2xpZW50RmxhZ3M+IHtcbiAgICBjb25zdCBtZXJnZWRGbGFncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY29uZmlnLCBmbGFncyk7XG4gICAgY29uc3QgZiA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBhd2FpdCBzdXBlci5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBtZXJnZWRGbGFncywgLi4uYXJncylcbiAgICApO1xuICAgIHJldHVybiBmO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgY29udGV4dDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IEFsbE9wZXJhdGlvbktleXMsXG4gICAgb3ZlcnJpZGVzOiBQYXJ0aWFsPEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4gfCBDb25zdHJ1Y3RvcjxNPltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PGFueT4+XG4gICk6IFByb21pc2U8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jb250ZXh0KTtcbiAgICBsb2cuc2lsbHkoXG4gICAgICBgY3JlYXRpbmcgbmV3IGNvbnRleHQgZm9yICR7b3BlcmF0aW9ufSBvcGVyYXRpb24gb24gJHttb2RlbCA/IChBcnJheS5pc0FycmF5KG1vZGVsKSA/IG1vZGVsLm1hcCgobSkgPT4gTW9kZWwudGFibGVOYW1lKG0pKSA6IE1vZGVsLnRhYmxlTmFtZShtb2RlbCkpIDogXCJub1wifSB0YWJsZSAke292ZXJyaWRlcyAmJiBPYmplY3Qua2V5cyhvdmVycmlkZXMpID8gT2JqZWN0LmtleXMob3ZlcnJpZGVzKS5sZW5ndGggOiBcIm5vXCJ9IHdpdGggZmxhZyBvdmVycmlkZXNgXG4gICAgKTtcbiAgICBsZXQgY3R4ID0gYXJncy5wb3AoKTtcbiAgICBpZiAodHlwZW9mIGN0eCAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhKGN0eCBpbnN0YW5jZW9mIENvbnRleHQpKSB7XG4gICAgICBhcmdzLnB1c2goY3R4KTtcbiAgICAgIGN0eCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBvdmVycmlkZXMgPSBjdHhcbiAgICAgID8gT2JqZWN0LmFzc2lnbih7fSwgY3R4LnRvT3ZlcnJpZGVzKCksIG92ZXJyaWRlcylcbiAgICAgIDogb3ZlcnJpZGVzO1xuICAgIGNvbnN0IGZsYWdzID0gYXdhaXQgdGhpcy5mbGFncyhcbiAgICAgIHR5cGVvZiBvcGVyYXRpb24gPT09IFwic3RyaW5nXCIgPyBvcGVyYXRpb24gOiBvcGVyYXRpb24ubmFtZSxcbiAgICAgIG1vZGVsLFxuICAgICAgb3ZlcnJpZGVzIGFzIFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgICAgLi4uWy4uLmFyZ3MsIGN0eF0uZmlsdGVyKEJvb2xlYW4pXG4gICAgKTtcblxuICAgIGlmIChjdHgpIHtcbiAgICAgIGlmICghKGN0eCBpbnN0YW5jZW9mIHRoaXMuQ29udGV4dCkpIHtcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgICAgIC4uLmN0eFtcImNhY2hlXCJdLFxuICAgICAgICAgIC4uLmZsYWdzLFxuICAgICAgICAgIHBhcmVudENvbnRleHQ6IGN0eCxcbiAgICAgICAgfSkgYXMgYW55O1xuICAgICAgICBjdHguYWNjdW11bGF0ZSh7XG4gICAgICAgICAgY2hpbGRDb250ZXh0czogW1xuICAgICAgICAgICAgLi4uKGN0eC5nZXRPclVuZGVmaW5lZChcImNoaWxkQ29udGV4dHNcIikgfHwgW10pLFxuICAgICAgICAgICAgbmV3Q3R4LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3Q3R4O1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudE9wID0gY3R4LmdldE9yVW5kZWZpbmVkKFwib3BlcmF0aW9uXCIpO1xuICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gY3R4LmdldE9yVW5kZWZpbmVkKFwiYWZmZWN0ZWRUYWJsZXNcIik7XG4gICAgICBpZiAoXG4gICAgICAgICFjdXJyZW50T3AgfHxcbiAgICAgICAgY3VycmVudE9wICE9PSBvcGVyYXRpb24gfHxcbiAgICAgICAgKG1vZGVsICYmIG1vZGVsICE9PSBjdXJyZW50TW9kZWwpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgICAgIC4uLmN0eFtcImNhY2hlXCJdLFxuICAgICAgICAgIC4uLmZsYWdzLFxuICAgICAgICAgIHBhcmVudENvbnRleHQ6IGN0eCxcbiAgICAgICAgfSkgYXMgYW55O1xuXG4gICAgICAgIGN0eC5hY2N1bXVsYXRlKHtcbiAgICAgICAgICBjaGlsZENvbnRleHRzOiBbXG4gICAgICAgICAgICAuLi4oY3R4LmdldE9yVW5kZWZpbmVkKFwiY2hpbGRDb250ZXh0c1wiKSB8fCBbXSksXG4gICAgICAgICAgICBuZXdDdHgsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXdDdHg7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3R4LmFjY3VtdWxhdGUoZmxhZ3MpIGFzIGFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgLi4uZmxhZ3MsXG4gICAgfSkgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWNvZGVzIGEgVWludDhBcnJheSB0byBhIHN0cmluZ1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBiaW5hcnkgZGF0YSByZWNlaXZlZCBmcm9tIEZhYnJpYyB0byBhIHN0cmluZyB1c2luZyBVVEYtOCBlbmNvZGluZ1xuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGEgLSBUaGUgYmluYXJ5IGRhdGEgdG8gZGVjb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRlY29kZWQgc3RyaW5nXG4gICAqL1xuICBkZWNvZGUoZGF0YTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuZGVjb2Rlci5kZWNvZGUoZGF0YSk7XG4gIH1cblxuICBvdmVycmlkZSByZXBvc2l0b3J5PFxuICAgIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PFxuICAgICAgYW55LFxuICAgICAgQWRhcHRlcjxQZWVyQ29uZmlnLCBDbGllbnQsIE1hbmdvUXVlcnksIENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICAgID4sXG4gID4oKTogQ29uc3RydWN0b3I8Uj4ge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8Uj47XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFtDb25zdHJ1Y3RvcjxNPiwgUHJpbWFyeUtleVR5cGUsIFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmFueVtdLCBDb250ZXh0XSB7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZVByZWZpeCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbCk7XG4gICAgcmV0dXJuIFtjbGF6eiwgaWQsIHJlY29yZCwgLi4uY3R4QXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIG11bHRpcGxlIHJlY29yZHMgZm9yIGNyZWF0aW9uXG4gICAqIEBzdW1tYXJ5IEFkZHMgbmVjZXNzYXJ5IENvdWNoREIgZmllbGRzIHRvIG11bHRpcGxlIHJlY29yZHMgYmVmb3JlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0gaWRzIC0gVGhlIElEcyBvZiB0aGUgcmVjb3Jkc1xuICAgKiBAcGFyYW0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byBwcmVwYXJlXG4gICAqIEByZXR1cm4gQSB0dXBsZSBjb250YWluaW5nIHRoZSB0YWJsZU5hbWUsIGlkcywgYW5kIHByZXBhcmVkIHJlY29yZHNcbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgaWRzIGFuZCBtb2RlbHMgYXJyYXlzIGhhdmUgZGlmZmVyZW50IGxlbmd0aHNcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVBbGxQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuY3JlYXRlQWxsUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmRzID0gaWRzLm1hcCgoaWQsIGNvdW50KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWxzW2NvdW50XSk7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH0pO1xuICAgIHJldHVybiBbY2xhenosIGlkcywgcmVjb3JkcywgLi4uY3R4QXJnc107XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQWxsUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICkge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZUFsbFByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkcyA9IGlkcy5tYXAoKCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9KTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZHMsIHJlY29yZHMsIC4uLmN0eEFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGNyZWF0ZSBtdWx0aXBsZSByZWNvcmRzIGluIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVyc1xuICAgKiBAcGFyYW0ge0FycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+fSBtb2RlbHMgLSBBcnJheSBvZiByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgLy9IRVJFIVxuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHRyYW5zaWVudCA9IGN0eEFyZ3Muc2hpZnQoKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4sXG4gICAgICB0aGlzLmNyZWF0ZUFsbFxuICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxvZy5pbmZvKGBhZGRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudCA9IHRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyh0cmFuc2llbnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBoYXNUcmFuc2llbnQgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBjb25zdCB0cmFuc2llbnRQYXlsb2FkID0gaGFzVHJhbnNpZW50ID8geyBbdGFibGVOYW1lXTogdHJhbnNpZW50IH0gOiB7fTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCxcbiAgICAgIFtcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShtLCBjbGF6ei5uYW1lKSlcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICB0cmFuc2llbnRQYXlsb2FkIGFzIGFueSxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG5cbiAgICBsZXQgcmVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W107XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzdWx0KSkubWFwKChyOiBhbnkpID0+IEpTT04ucGFyc2UocikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShcbiAgICAgICAgY2xhenosXG4gICAgICAgIGN0eCxcbiAgICAgICAgbmVlZHNGdWxsUGF5bG9hZCxcbiAgICAgICAgcmVzWzBdW01vZGVsLnBrKGNsYXp6KSBhcyBzdHJpbmddIHx8IGlkc1swXVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZEFsbChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgbW9kZWxzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgICAgIE1vZGVsLm1lcmdlKE9iamVjdC5hc3NpZ24oe30sIG0gYXMgYW55LCB0cmFuc2llbnRbaV0gfHwge30pLCByZXNbaV0pXG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZHNcbiAgICAgICAgKSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHJlYWQgbXVsdGlwbGUgcmVjb3JkcyBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVycyB0byByZWFkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmV0cmlldmVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZEFsbCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cuaW5mbyhgcmVhZGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlJFQURfQUxMLFxuICAgICAgW0pTT04uc3RyaW5naWZ5KGlkcyldLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlc3VsdCkpLm1hcCgocjogYW55KSA9PiBKU09OLnBhcnNlKHIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byB1cGRhdGUgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnNcbiAgICogQHBhcmFtIHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gbW9kZWxzIC0gQXJyYXkgb2YgdXBkYXRlZCByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB1cGRhdGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgY3R4QXJncyA9IFsuLi4oYXJncyBhcyB1bmtub3duIGFzIGFueVtdKV07XG4gICAgY29uc3QgdHJhbnNpZW50ID0gY3R4QXJncy5zaGlmdCgpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoXG4gICAgICBjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PixcbiAgICAgIHRoaXMudXBkYXRlQWxsXG4gICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy5pbmZvKGB1cGRhdGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHRyYW5zaWVudFBheWxvYWQgPSBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHt9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICAgICAgW1xuICAgICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBtb2RlbHMubWFwKChtKSA9PiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG0sIGNsYXp6Lm5hbWUpKVxuICAgICAgICApLFxuICAgICAgXSxcbiAgICAgIHRyYW5zaWVudFBheWxvYWQgYXMgYW55LFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcblxuICAgIGxldCByZXM6IGFueTtcbiAgICB0cnkge1xuICAgICAgcmVzID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShjbGF6eiwgY3R4LCBuZWVkc0Z1bGxQYXlsb2FkLCBpZHNbMF0pKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQWxsKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICAgICAgTW9kZWwubWVyZ2UoT2JqZWN0LmFzc2lnbih7fSwgbSBhcyBhbnksIHRyYW5zaWVudFtpXSB8fCB7fSksIHJlc1tpXSlcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkc1xuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gZGVsZXRlIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+fSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnMgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7U2VyaWFsaXplcjxhbnk+fSBzZXJpYWxpemVyIC0gU2VyaWFsaXplciBmb3IgdGhlIG1vZGVsIGRhdGFcbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCwgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGVBbGwpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIE1vZGVsLmlzVHJhbnNpZW50KGNsYXp6KSB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICBjb25zdCBzaG91bGRIeWRyYXRlID0gdGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShcbiAgICAgIGNsYXp6LFxuICAgICAgY3R4LFxuICAgICAgbmVlZHNGdWxsUGF5bG9hZCxcbiAgICAgIGlkc1swXVxuICAgICk7XG4gICAgaWYgKHNob3VsZEh5ZHJhdGUpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMucmVhZEFsbChjbGF6eiwgaWRzLCAuLi5jdHhBcmdzKTtcbiAgICB9XG5cbiAgICBsb2cuaW5mbyhgZGVsZXRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCxcbiAgICAgIFtKU09OLnN0cmluZ2lmeShpZHMpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzaG91bGRIeWRyYXRlXG4gICAgICAgID8gcmVzdWx0XG4gICAgICAgIDogSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXMpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIHBlcnNpc3RlbmNlXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgbW9kZWwgaW5zdGFuY2UgaW50byBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgZGF0YWJhc2Ugc3RvcmFnZSxcbiAgICogaGFuZGxpbmcgY29sdW1uIG1hcHBpbmcgYW5kIHNlcGFyYXRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByZXBhcmVcbiAgICogQHBhcmFtIHBrIC0gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgZGF0YVxuICAgKi9cbiAgb3ZlcnJpZGUgcHJlcGFyZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBTZWdyZWdhdGVkTW9kZWw8TT4gJiBQcmVwYXJlZE1vZGVsIHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnByZXBhcmUpO1xuICAgIGNvbnN0IHNwbGl0ID0gTW9kZWwuc2VncmVnYXRlKG1vZGVsKTtcbiAgICBpZiAoKG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXSkge1xuICAgICAgbG9nLnNpbGx5KFxuICAgICAgICBgUGFzc2luZyBhbG9uZyBwZXJzaXN0ZW5jZSBtZXRhZGF0YSBmb3IgJHsobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BsaXQubW9kZWwsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgbWlycm9yTWV0YSA9IE1vZGVsLm1pcnJvcmVkQXQobW9kZWwpO1xuICAgIGlmIChtaXJyb3JNZXRhKSB7XG4gICAgICBjb25zdCBtaXJyb3JNc3AgPSBtaXJyb3JNZXRhLm1zcElkO1xuICAgICAgaWYgKCFtaXJyb3JNc3ApIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBtaXJyb3IgTVNQIGNvdWxkIGJlIGZvdW5kYCk7XG4gICAgICBsZXQgbXNwcyA9IHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpIHx8IFtdO1xuICAgICAgbXNwcyA9IEFycmF5LmlzQXJyYXkobXNwcykgPyBtc3BzIDogW21zcHNdO1xuICAgICAgY29uc3QgbWVyZ2VkID0gWy4uLm5ldyBTZXQoWy4uLm1zcHMsIG1pcnJvck1zcF0pXTtcbiAgICAgIGN0eC5hY2N1bXVsYXRlKHtcbiAgICAgICAgZW5kb3JzaW5nT3JnczogbWVyZ2VkLFxuICAgICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zOiBtZXJnZWQsXG4gICAgICAgIGxlZ2FjeTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByZWNvcmQ6IHNwbGl0Lm1vZGVsLFxuICAgICAgbW9kZWw6IHNwbGl0Lm1vZGVsLFxuICAgICAgaWQ6IG1vZGVsW01vZGVsLnBrKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KV0gYXMgc3RyaW5nLFxuICAgICAgdHJhbnNpZW50OiBzcGxpdC50cmFuc2llbnQsXG4gICAgICBwcml2YXRlczogc3BsaXQucHJpdmF0ZXMsXG4gICAgICBzaGFyZWQ6IHNwbGl0LnNoYXJlZCxcbiAgICB9O1xuICB9XG5cbiAgb3ZlcnJpZGUgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogTSB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZXZlcnQpO1xuICAgIGlmIChcbiAgICAgIHRyYW5zaWVudCAmJlxuICAgICAgdGhpcy5zaG91bGRSZWJ1aWxkV2l0aFRyYW5zaWVudChcbiAgICAgICAgY3R4LFxuICAgICAgICBjdHguZ2V0T3JVbmRlZmluZWQoXCJvcGVyYXRpb25cIikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICApXG4gICAgKSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYHJlLWFkZGluZyB0cmFuc2llbnQgcHJvcGVydGllczogJHtPYmplY3Qua2V5cyh0cmFuc2llbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmVudHJpZXModHJhbnNpZW50IGFzIFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgICAgIC5maWx0ZXIoKFssIHZdKSA9PiB0eXBlb2YgdiAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAoa2V5IGluIG9iaiAmJiAob2JqIGFzIGFueSlba2V5XSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgICAgIGBvdmVyd3JpdGluZyBleGlzdGluZyAke2tleX0uIGlmIHRoaXMgaXMgbm90IGEgZGVmYXVsdCB2YWx1ZSwgdGhpcyBtYXkgcG9zZSBhIHByb2JsZW1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIChvYmogYXMgTSlba2V5IGFzIGtleW9mIE1dID0gdmFsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KShvYmopO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBvcGVyYXRpb24/OiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjdHgpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY3R4LmdldE9yVW5kZWZpbmVkKFwicmVidWlsZFdpdGhUcmFuc2llbnRcIikpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGNoaWxkUmVidWlsZCA9XG4gICAgICB0eXBlb2YgKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbihcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmIChjaGlsZFJlYnVpbGQpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHJlc29sdmVkT3AgPSB0aGlzLnJlc29sdmVPcGVyYXRpb24oY3R4LCBvcGVyYXRpb24pO1xuICAgIGlmICghcmVzb2x2ZWRPcCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IG9wID0gcmVzb2x2ZWRPcC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIG9wLmluY2x1ZGVzKFwicmVhZFwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJmaW5kXCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcInF1ZXJ5XCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcInN0YXRlbWVudFwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJwYWdlXCIpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZU9wZXJhdGlvbihcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIG9wZXJhdGlvbj86IHN0cmluZ1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChvcGVyYXRpb24pIHJldHVybiBvcGVyYXRpb247XG4gICAgaWYgKHR5cGVvZiAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuKFwib3BlcmF0aW9uXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGhhc1RyYW5zaWVudDogYm9vbGVhbixcbiAgICBpZD86IFByaW1hcnlLZXlUeXBlXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghaGFzVHJhbnNpZW50KSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcGsgPSBNb2RlbC5wayhjbGF6eik7XG4gICAgY29uc3QgY29tcG9zZWQgPSBNb2RlbC5jb21wb3NlZChjbGF6eiwgcGspO1xuICAgIGNvbnN0IGdlbmVyYXRlZCA9IE1vZGVsLmdlbmVyYXRlZChjbGF6eiwgcGspO1xuICAgIGNvbnN0IGhhc0lkID0gaWQgIT09IHVuZGVmaW5lZCAmJiBpZCAhPT0gbnVsbDtcbiAgICBpZiAoIWhhc0lkICYmIGNvbXBvc2VkKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIWhhc0lkICYmIGdlbmVyYXRlZCkge1xuICAgICAgY3R4LmxvZ2dlci53YXJuKFxuICAgICAgICBgQ2Fubm90IHJlZnJlc2ggcmVjb3JkIHdpdGggcHJpdmF0ZSBnZW5lcmF0ZWQgcHJpbWFyeSBrZXlgXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzSWQ7XG4gIH1cblxuICBwcml2YXRlIGdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGlyZWN0ID1cbiAgICAgIGN0eC5nZXRPclVuZGVmaW5lZChcImVuZG9yc2luZ09yZ3NcIikgfHxcbiAgICAgIChjdHguZ2V0T3JVbmRlZmluZWQoXCJlbmRvcnNpbmdPcmdzXCIpIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKTtcbiAgICBpZiAoZGlyZWN0ICYmIGRpcmVjdC5sZW5ndGgpIHJldHVybiBkaXJlY3Q7XG4gICAgcmV0dXJuIChcbiAgICAgIChjdHguZ2V0RnJvbUNoaWxkcmVuKFwiZW5kb3JzaW5nT3Jnc1wiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgfHxcbiAgICAgIChjdHguZ2V0RnJvbUNoaWxkcmVuKFwiZW5kb3JzaW5nT3Jnc1wiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jb25maWcuYWxsb3dHYXRld2F5T3ZlcnJpZGU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byBjcmVhdGUgYSByZWNvcmQgaW4gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgdHJhbnNpZW50OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4sXG4gICAgICB0aGlzLmNyZWF0ZVxuICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cudmVyYm9zZShgYWRkaW5nIGVudHJ5IHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGs6ICR7aWR9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHRyYW5zaWVudFBheWxvYWQgPSBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHt9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIFt0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG1vZGVsLCBjbGF6ei5uYW1lKV0sXG4gICAgICB0cmFuc2llbnRQYXlsb2FkIGFzIGFueSxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgY29uc3QgZGVzZXJpYWxpemVkID0gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRoaXMuZGVjb2RlKHJlc3VsdCkpO1xuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKGNsYXp6LCBjdHgsIG5lZWRzRnVsbFBheWxvYWQsIGlkKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgTW9kZWwubWVyZ2UoXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCwgdHJhbnNpZW50IHx8IHt9KSxcbiAgICAgICAgICAgIGRlc2VyaWFsaXplZCxcbiAgICAgICAgICAgIGNsYXp6XG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZFxuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkZXNlcmlhbGl6ZWQ7XG4gIH1cblxuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyBoZWFsdGhjaGVjazxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5oZWFsdGhjaGVjayk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxvZy52ZXJib3NlKGByZWFkaW5nIGVudHJ5IGZyb20gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJoZWFsdGhjaGVja1wiLFxuICAgICAgW10sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIHRvIHJlYWQgYSByZWNvcmQgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyByZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgbG9nLnZlcmJvc2UoYHJlYWRpbmcgZW50cnkgZnJvbSAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrOiAke2lkfWApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIFtpZC50b1N0cmluZygpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gIH1cblxuICB1cGRhdGVQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgIC8vIHJlY29yZFtDb3VjaERCS2V5cy5JRF0gPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsKTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZCwgcmVjb3JkLCAuLi5jdHhBcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHVwZGF0ZSBhIHJlY29yZCBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgdXBkYXRlZCByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHVwZGF0ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyB1cGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHRyYW5zaWVudDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBjdHhBcmdzID0gWy4uLihhcmdzIGFzIHVua25vd24gYXMgYW55W10pXTtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChcbiAgICAgIGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+LFxuICAgICAgdGhpcy51cGRhdGVcbiAgICApO1xuICAgIGxvZy5pbmZvKGBDTElFTlQgVVBEQVRFIGNsYXNzIDogJHt0eXBlb2YgY2xhenp9YCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cudmVyYm9zZShgdXBkYXRpbmcgZW50cnkgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCBoYXNUcmFuc2llbnQgPSB0cmFuc2llbnQgJiYgT2JqZWN0LmtleXModHJhbnNpZW50KS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgaGFzVHJhbnNpZW50IHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgY29uc3QgdHJhbnNpZW50UGF5bG9hZCA9IGhhc1RyYW5zaWVudCA/IHsgW3RhYmxlTmFtZV06IHRyYW5zaWVudCB9IDoge307XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgW3RoaXMuc2VyaWFsaXplci5zZXJpYWxpemUobW9kZWwsIGNsYXp6Lm5hbWUgfHwgY2xhenopXSwgLy8gVE9ETyBzaG91bGQgYmUgcmVjZXZpbmcgY2xhc3MgYnV0IGlzIHJlY2VpdmluZyBzdHJpbmdcbiAgICAgIHRyYW5zaWVudFBheWxvYWQgYXMgYW55LFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICBjb25zdCBkZXNlcmlhbGl6ZWQgPSB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gICAgaWYgKHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoY2xhenosIGN0eCwgbmVlZHNGdWxsUGF5bG9hZCwgaWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBNb2RlbC5tZXJnZShcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oe30sIG1vZGVsLCB0cmFuc2llbnQgfHwge30pLFxuICAgICAgICAgICAgZGVzZXJpYWxpemVkLFxuICAgICAgICAgICAgY2xhenpcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkXG4gICAgICAgICksXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGRlbGV0ZSBhIHJlY29yZCBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXIgdG8gZGVsZXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIHJlY29yZFxuICAgKi9cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGUpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBNb2RlbC5pc1RyYW5zaWVudChjbGF6eikgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBsZXQgcmVzdWx0OiBhbnk7XG4gICAgY29uc3Qgc2hvdWxkSHlkcmF0ZSA9IHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoXG4gICAgICBjbGF6eixcbiAgICAgIGN0eCxcbiAgICAgIG5lZWRzRnVsbFBheWxvYWQsXG4gICAgICBpZFxuICAgICk7XG4gICAgaWYgKHNob3VsZEh5ZHJhdGUpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMucmVhZChjbGF6eiwgaWQsIGN0eCk7XG4gICAgfVxuXG4gICAgbG9nLnZlcmJvc2UoYGRlbGV0aW5nIGVudHJ5IGZyb20gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICBbaWQudG9TdHJpbmcoKV0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIHJldHVybiBzaG91bGRIeWRyYXRlXG4gICAgICA/IHJlc3VsdFxuICAgICAgOiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IHF1ZXJ5IGFnYWluc3QgdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHN1bW1hcnkgRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gdG8gcGVyZm9ybSBhIHF1ZXJ5IHVzaW5nIE1hbmdvIFF1ZXJ5IHN5bnRheFxuICAgKiBAdGVtcGxhdGUgViAtIFRoZSByZXR1cm4gdHlwZVxuICAgKiBAcGFyYW0ge01hbmdvUXVlcnl9IHJhd0lucHV0IC0gVGhlIE1hbmdvIFF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHtib29sZWFufSBwcm9jZXNzIC0gV2hldGhlciB0byBwcm9jZXNzIHRoZSByZXN1bHRcbiAgICogQHJldHVybiB7UHJvbWlzZTxWPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHF1ZXJ5IHJlc3VsdFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAgICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAgICpcbiAgICogICBDbGllbnQtPj5GYWJyaWNBZGFwdGVyOiByYXcocmF3SW5wdXQsIHByb2Nlc3MpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IEpTT04uc3RyaW5naWZ5KHJhd0lucHV0KVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBldmFsdWF0ZVRyYW5zYWN0aW9uKFwicXVlcnlcIiwgW2lucHV0XSlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IGV2YWx1YXRlKFwicXVlcnlcIiwgcHJvcG9zYWxPcHRpb25zKVxuICAgKiAgIENvbnRyYWN0LT4+Q2hhaW5jb2RlOiBpbnZva2VcbiAgICogICBDaGFpbmNvZGUtLT4+Q29udHJhY3Q6IHJlc3BvbnNlXG4gICAqICAgQ29udHJhY3QtLT4+RmFicmljQWRhcHRlcjogcmVzdWx0XG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IEpTT04ucGFyc2UoZGVjb2RlKHJlc3VsdCkpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IFByb2Nlc3MgcmVzdWx0IGJhc2VkIG9uIHR5cGVcbiAgICogICBGYWJyaWNBZGFwdGVyLS0+PkNsaWVudDogcHJvY2Vzc2VkIHJlc3VsdFxuICAgKi9cbiAgQGRlYnVnKClcbiAgYXN5bmMgcmF3PFYsIEQgZXh0ZW5kcyBib29sZWFuPihcbiAgICByYXdJbnB1dDogTWFuZ29RdWVyeSxcbiAgICBkb2NzT25seTogRCA9IHRydWUgYXMgRCxcbiAgICBjbGF6ejogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFY+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJhdyk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gY2xhenoubmFtZTtcbiAgICBsb2cuaW5mbyhgUGVyZm9ybWluZyByYXcgc3RhdGVtZW50IG9uIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKGNsYXp6KX1gKTtcbiAgICBsZXQgdHJhbnNhY3Rpb25SZXN1bHQ6IGFueTtcbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgIGN0eCxcbiAgICAgICAgXCJyYXdcIixcbiAgICAgICAgW0pTT04uc3RyaW5naWZ5KHJhd0lucHV0KSwgZG9jc09ubHldLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdGFibGVOYW1lXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHRyYW5zYWN0aW9uUmVzdWx0KSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyByZXN1bHQ6ICR7ZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZVJlY29yZCA9IChyZWNvcmQ6IFJlY29yZDxhbnksIGFueT4pID0+IHtcbiAgICAgIGlmIChNb2RlbC5pc01vZGVsKHJlY29yZCkpIHJldHVybiBNb2RlbC5idWlsZChyZWNvcmQpO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoKSByZXR1cm4gcmVzdWx0IGFzIFY7XG4gICAgICBjb25zdCBlbCA9IHJlc3VsdFswXTtcbiAgICAgIGlmIChNb2RlbC5pc01vZGVsKGVsKSlcbiAgICAgICAgLy8gaWYgdGhlIGZpcnN0IG9uZSBpcyBhIG1vZGVsLCBhbGwgYXJlIG1vZGVsc1xuICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcCgoZWwpID0+IE1vZGVsLmJ1aWxkKGVsKSkgYXMgVjtcbiAgICAgIHJldHVybiByZXN1bHQgYXMgVjtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VSZWNvcmQocmVzdWx0IGFzIGFueSkgYXMgVjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSBDb3VjaERCIHZpZXcgcXVlcnkgYWdhaW5zdCB0aGUgRmFicmljIGNoYWluY29kZVxuICAgKiBAc3VtbWFyeSBFdmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiB0byBxdWVyeSBhIGRlc2lnbiBkb2N1bWVudCB2aWV3XG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHZpZXcgcmVzcG9uc2UgdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGRvYyAtIERlc2lnbiBkb2N1bWVudCBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2aWV3TmFtZSAtIFZpZXcgbmFtZVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9wdGlvbnMgLSBWaWV3IHF1ZXJ5IG9wdGlvbnNcbiAgICogQHBhcmFtIHsuLi5Db250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj59IGFyZ3MgLSBPcHRpb25hbCBjb250ZXh0dWFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPFZpZXdSZXNwb25zZTxSPj59IFRoZSB2aWV3IHJlc3BvbnNlXG4gICAqL1xuICBAZGVidWcoKVxuICBhc3luYyB2aWV3PFI+KFxuICAgIGRkb2M6IHN0cmluZyxcbiAgICB2aWV3TmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8Vmlld1Jlc3BvbnNlPFI+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy52aWV3KTtcbiAgICBsb2cuaW5mbyhgUXVlcnlpbmcgdmlldyAke2Rkb2N9LyR7dmlld05hbWV9YCk7XG4gICAgbGV0IHRyYW5zYWN0aW9uUmVzdWx0OiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHRyYW5zYWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICBjdHgsXG4gICAgICAgIFwidmlld1wiLFxuICAgICAgICBbZGRvYywgdmlld05hbWUsIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpXSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGxldCByZXN1bHQ6IFZpZXdSZXNwb25zZTxSPjtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZSh0cmFuc2FjdGlvblJlc3VsdCkpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgdmlldyByZXN1bHQ6ICR7ZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBvciBjcmVhdGVzIGEgZ1JQQyBjbGllbnQgZm9yIHRoZSBGYWJyaWMgcGVlclxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgY2FjaGVkIGNsaWVudCBvciBjcmVhdGVzIGEgbmV3IG9uZSBpZiBub25lIGV4aXN0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPENsaWVudD59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBnUlBDIGNsaWVudFxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0Q2xpZW50KCk6IENsaWVudCB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnQpXG4gICAgICB0aGlzLl9jbGllbnQgPSBGYWJyaWNDbGllbnRBZGFwdGVyLmdldENsaWVudCh0aGlzLmNvbmZpZyk7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIEdhdGV3YXkgaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IEdhdGV3YXkgaW5zdGFuY2UgdXNpbmcgdGhlIGN1cnJlbnQgY2xpZW50XG4gICAqIEByZXR1cm4ge1Byb21pc2U8R2F0ZXdheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgR2F0ZXdheShjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+KTogUHJvbWlzZTxHYXRld2F5PiB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0R2F0ZXdheShjdHgsIHRoaXMuY29uZmlnLCB0aGlzLmNsaWVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRyYWN0TmFtZShjbGFzc05hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAoIWNsYXNzTmFtZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYCR7Y2xhc3NOYW1lfUNvbnRyYWN0YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIENvbnRyYWN0IGluc3RhbmNlIGZvciB0aGUgRmFicmljIGNoYWluY29kZVxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IENvbnRyYWN0IGluc3RhbmNlIHVzaW5nIHRoZSBjdXJyZW50IEdhdGV3YXlcbiAgICogQHJldHVybiB7UHJvbWlzZTxDb250cmFrdD59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBDb250cmFjdCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIENvbnRyYWN0KFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgY29udHJhY3ROYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8Q29udHJha3Q+IHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5nZXRDb250cmFjdChcbiAgICAgIGF3YWl0IHRoaXMuR2F0ZXdheShjdHgpLFxuICAgICAgdGhpcy5jb25maWcsXG4gICAgICBjb250cmFjdE5hbWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBTdWJtaXRzIG9yIGV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgY2hhaW5jb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcGkgLSBUaGUgY2hhaW5jb2RlIGZ1bmN0aW9uIHRvIGNhbGxcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWJtaXQgLSBXaGV0aGVyIHRvIHN1Ym1pdCAodHJ1ZSkgb3IgZXZhbHVhdGUgKGZhbHNlKSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdIC0gQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNoYWluY29kZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFt0cmFuc2llbnREYXRhXSAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbZW5kb3JzaW5nT3JnYW5pemF0aW9uc10gLSBPcmdhbml6YXRpb25zIHRoYXQgbXVzdCBlbmRvcnNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFVpbnQ4QXJyYXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdHJhbnNhY3Rpb24gcmVzdWx0XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gICAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAgICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAgICpcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY29ubmVjdCgpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBnZXRDb250cmFjdCgpXG4gICAqICAgYWx0IHN1Ym1pdCB0cmFuc2FjdGlvblxuICAgKiAgICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBzdWJtaXQoYXBpLCBwcm9wb3NhbE9wdGlvbnMpXG4gICAqICAgZWxzZSBldmFsdWF0ZSB0cmFuc2FjdGlvblxuICAgKiAgICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBldmFsdWF0ZShhcGksIHByb3Bvc2FsT3B0aW9ucylcbiAgICogICBlbmRcbiAgICogICBDb250cmFjdC0+PkNoYWluY29kZTogaW52b2tlXG4gICAqICAgQ2hhaW5jb2RlLS0+PkNvbnRyYWN0OiByZXNwb25zZVxuICAgKiAgIENvbnRyYWN0LS0+PkZhYnJpY0FkYXB0ZXI6IHJlc3VsdFxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjbG9zZSgpXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgdHJhbnNhY3Rpb24oXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBhcGk6IHN0cmluZyxcbiAgICBzdWJtaXQgPSB0cnVlLFxuICAgIGFyZ3M/OiBhbnlbXSxcbiAgICB0cmFuc2llbnREYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IHN0cmluZ1tdLFxuICAgIGNsYXNzTmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy50cmFuc2FjdGlvbik7XG4gICAgY29uc3QgZ2F0ZXdheSA9IGF3YWl0IHRoaXMuR2F0ZXdheShjdHgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250cmFjdCA9IGF3YWl0IHRoaXMuQ29udHJhY3QoXG4gICAgICAgIGN0eCxcbiAgICAgICAgdGhpcy5nZXRDb250cmFjdE5hbWUoY2xhc3NOYW1lKVxuICAgICAgKTtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgJHtzdWJtaXQgPyBcIlN1Ym1pdFwiIDogXCJFdmFsdWF0ZVwifXRpbmcgdHJhbnNhY3Rpb24gJHt0aGlzLmdldENvbnRyYWN0TmFtZShjbGFzc05hbWUpIHx8IHRoaXMuY29uZmlnLmNvbnRyYWN0TmFtZX0uJHthcGl9YFxuICAgICAgKTtcbiAgICAgIGxvZy5kZWJ1ZyhgYXJnczogJHthcmdzPy5tYXAoKGEpID0+IGEudG9TdHJpbmcoKSkuam9pbihcIlxcblwiKSB8fCBcIm5vbmVcIn1gKTtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IHN1Ym1pdCA/IGNvbnRyYWN0LnN1Ym1pdCA6IGNvbnRyYWN0LmV2YWx1YXRlO1xuXG4gICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zID0gZW5kb3JzaW5nT3JnYW5pemF0aW9ucz8ubGVuZ3RoXG4gICAgICAgID8gZW5kb3JzaW5nT3JnYW5pemF0aW9uc1xuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHByb3Bvc2FsT3B0aW9uczogUHJvcG9zYWxPcHRpb25zID0ge1xuICAgICAgICBhcmd1bWVudHM6IGFyZ3MgfHwgW10sXG4gICAgICAgIHRyYW5zaWVudERhdGE6IE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudERhdGEpLnJlZHVjZShcbiAgICAgICAgICAoYWNjLCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IEpTT04uc3RyaW5naWZ5KHZhbCk7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sXG4gICAgICAgICAge30gYXMgdHlwZW9mIHRyYW5zaWVudERhdGFcbiAgICAgICAgKSxcbiAgICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9uczogY3R4LmdldE9yVW5kZWZpbmVkKFwiYWxsb3dNYW51YWxFbmRvcnNpbmdPcmdzXCIpXG4gICAgICAgICAgPyBlbmRvcnNpbmdPcmdhbml6YXRpb25zIHx8IHVuZGVmaW5lZFxuICAgICAgICAgIDogdW5kZWZpbmVkLCAvLyBtc3BJZCBsaXN0XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gYXdhaXQgbWV0aG9kLmNhbGwoY29udHJhY3QsIGFwaSwgcHJvcG9zYWxPcHRpb25zKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYENsb3NpbmcgJHt0aGlzLmNvbmZpZy5tc3BJZH0gZ2F0ZXdheSBjb25uZWN0aW9uYCk7XG4gICAgICBnYXRld2F5LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRVc2VMZWdhY3lHYXRld2F5KGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFjdHguZ2V0T3JVbmRlZmluZWQoXCJsZWdhY3lcIikgJiYgISF0aGlzLmNvbmZpZy5hbGxvd0dhdGV3YXlPdmVycmlkZTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZUxlZ2FjeUFyZ3MoYXJncz86IGFueVtdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiAoYXJncyB8fCBbXSkubWFwKChhcmcpID0+XG4gICAgICB0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiID8gYXJnIDogSlNPTi5zdHJpbmdpZnkoYXJnKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTGVnYWN5VHJhbnNpZW50KFxuICAgIHRyYW5zaWVudERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICk6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gfCB1bmRlZmluZWQge1xuICAgIGlmICghdHJhbnNpZW50RGF0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModHJhbnNpZW50RGF0YSk7XG4gICAgaWYgKCFlbnRyaWVzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICBtYXBba2V5XSA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVMZWdhY3lNc3BDb3VudCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvbmZpZ3VyZWQgPSB0aGlzLmNvbmZpZy5sZWdhY3lNc3BDb3VudCA/PyAxO1xuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcihjb25maWd1cmVkKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShwYXJzZWQpIHx8IHBhcnNlZCA8IDEpIHJldHVybiAxO1xuICAgIHJldHVybiBNYXRoLmZsb29yKHBhcnNlZCk7XG4gIH1cblxuICBwcml2YXRlIHBpY2tMZWdhY3lDYW5kaWRhdGVzKFxuICAgIGNhbmRpZGF0ZXM6IE1zcERldGFpbHNbXSxcbiAgICBsaW1pdDogbnVtYmVyXG4gICk6IE1zcERldGFpbHNbXSB7XG4gICAgaWYgKCFjYW5kaWRhdGVzLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgYXZhaWxhYmxlID0gWy4uLmNhbmRpZGF0ZXNdO1xuICAgIGNvbnN0IHRhcmdldCA9IE1hdGgubWluKGxpbWl0LCBhdmFpbGFibGUubGVuZ3RoKTtcbiAgICBjb25zdCBwaWNrZWQ6IE1zcERldGFpbHNbXSA9IFtdO1xuICAgIHdoaWxlIChwaWNrZWQubGVuZ3RoIDwgdGFyZ2V0ICYmIGF2YWlsYWJsZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGlkeCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGF2YWlsYWJsZS5sZW5ndGgpO1xuICAgICAgY29uc3QgW3NlbGVjdGlvbl0gPSBhdmFpbGFibGUuc3BsaWNlKGlkeCwgMSk7XG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgIHBpY2tlZC5wdXNoKHNlbGVjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwaWNrZWQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBMZWdhY3lQZWVyVGFyZ2V0W10ge1xuICAgIGNvbnN0IHBlZXJzOiBMZWdhY3lQZWVyVGFyZ2V0W10gPSBbXG4gICAgICB7XG4gICAgICAgIG1zcElkOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgICAgcGVlckVuZHBvaW50OiB0aGlzLmNvbmZpZy5wZWVyRW5kcG9pbnQsXG4gICAgICAgIHBlZXJIb3N0QWxpYXM6IHRoaXMuY29uZmlnLnBlZXJIb3N0QWxpYXMsXG4gICAgICAgIHRsc0NlcnQ6IHRoaXMuY29uZmlnLnRsc0NlcnQsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBsZXQgZW5kb3JzaW5nT3JncyA9IHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpIHx8IFtdO1xuICAgIGVuZG9yc2luZ09yZ3MgPSBBcnJheS5pc0FycmF5KGVuZG9yc2luZ09yZ3MpXG4gICAgICA/IGVuZG9yc2luZ09yZ3NcbiAgICAgIDogW2VuZG9yc2luZ09yZ3NdO1xuICAgIGNvbnN0IGVuZG9yc2VycyA9XG4gICAgICBlbmRvcnNpbmdPcmdzLmZpbHRlcigob3JnKTogb3JnIGlzIHN0cmluZyA9PiBCb29sZWFuKG9yZykpIHx8IFtdO1xuICAgIGNvbnN0IGV4dHJhcyA9IGVuZG9yc2Vycy5maWx0ZXIoKG9yZykgPT4gb3JnICE9PSB0aGlzLmNvbmZpZy5tc3BJZCk7XG4gICAgaWYgKCFleHRyYXMubGVuZ3RoKSByZXR1cm4gcGVlcnM7XG5cbiAgICBjb25zdCBtYXAgPSB0aGlzLmNvbmZpZy5tc3BNYXA7XG4gICAgY29uc3QgbGVnYWN5Q291bnQgPSB0aGlzLnJlc29sdmVMZWdhY3lNc3BDb3VudCgpO1xuICAgIGZvciAoY29uc3QgbXNwIG9mIGV4dHJhcykge1xuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IG1hcD8uW21zcF07XG4gICAgICBpZiAoIWNhbmRpZGF0ZXM/Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICBgTm8gcGVlciBtYXBwaW5nIGF2YWlsYWJsZSBmb3IgTVNQICR7bXNwfS4gUHJvdmlkZSBpdCB2aWEgY29uZmlnLm1zcE1hcGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnBpY2tMZWdhY3lDYW5kaWRhdGVzKGNhbmRpZGF0ZXMsIGxlZ2FjeUNvdW50KTtcbiAgICAgIGlmICghc2VsZWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgYE5vIHZhbGlkIHBlZXIgbWFwcGluZyBhdmFpbGFibGUgZm9yIE1TUCAke21zcH0uIFByb3ZpZGUgaXQgdmlhIGNvbmZpZy5tc3BNYXBgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNob2ljZSBvZiBzZWxlY3Rpb25zKSB7XG4gICAgICAgIGlmICghY2hvaWNlLmVuZHBvaW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgICBgSW52YWxpZCBwZWVyIG1hcHBpbmcgZm9yIE1TUCAke21zcH06IG1pc3NpbmcgZW5kcG9pbnRgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBwZWVycy5wdXNoKHtcbiAgICAgICAgICBtc3BJZDogbXNwLFxuICAgICAgICAgIHBlZXJFbmRwb2ludDogY2hvaWNlLmVuZHBvaW50LFxuICAgICAgICAgIHBlZXJIb3N0QWxpYXM6IGNob2ljZS5hbGlhcyxcbiAgICAgICAgICB0bHNDZXJ0OiBjaG9pY2UudGxzQ2VydCB8fCB0aGlzLmNvbmZpZy50bHNDZXJ0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGVlcnM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyhcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGZjbjogc3RyaW5nLFxuICAgIGFyZ3M6IHN0cmluZ1tdLFxuICAgIHRyYW5zaWVudE1hcDogUmVjb3JkPHN0cmluZywgQnVmZmVyPiB8IHVuZGVmaW5lZCxcbiAgICBwZWVyQ29uZmlnczogTGVnYWN5UGVlclRhcmdldFtdLFxuICAgIGNsYXNzTmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5zdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMpO1xuICAgIGNvbnN0IHBlZXJzID0gdGhpcy5ub3JtYWxpemVMZWdhY3lQZWVycyhwZWVyQ29uZmlncyk7XG4gICAgY29uc3QgaWRlbnRpdHlNYXRlcmlhbCA9IGF3YWl0IHRoaXMucmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwoKTtcbiAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCBXYWxsZXRzLm5ld0luTWVtb3J5V2FsbGV0KCk7XG4gICAgY29uc3QgaWRlbnRpdHlMYWJlbCA9IGAke3RoaXMuY29uZmlnLm1zcElkfS1sZWdhY3lgO1xuICAgIGF3YWl0IHdhbGxldC5wdXQoaWRlbnRpdHlMYWJlbCwge1xuICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgY2VydGlmaWNhdGU6IGlkZW50aXR5TWF0ZXJpYWwuY2VydGlmaWNhdGUsXG4gICAgICAgIHByaXZhdGVLZXk6IGlkZW50aXR5TWF0ZXJpYWwucHJpdmF0ZUtleSxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICB0eXBlOiBcIlguNTA5XCIsXG4gICAgfSBhcyBJZGVudGl0eSk7XG5cbiAgICBjb25zdCBjb25uZWN0aW9uUHJvZmlsZSA9IGF3YWl0IHRoaXMuYnVpbGRMZWdhY3lDb25uZWN0aW9uUHJvZmlsZShwZWVycyk7XG4gICAgY29uc3QgZ2F0ZXdheSA9IG5ldyBMZWdhY3lHYXRld2F5KCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZ2F0ZXdheS5jb25uZWN0KGNvbm5lY3Rpb25Qcm9maWxlLCB7XG4gICAgICAgIGlkZW50aXR5OiBpZGVudGl0eUxhYmVsLFxuICAgICAgICB3YWxsZXQsXG4gICAgICAgIGRpc2NvdmVyeToge1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgYXNMb2NhbGhvc3Q6IHRoaXMuc2hvdWxkVHJlYXRQZWVyc0FzTG9jYWxob3N0KHBlZXJzKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGxzSW5mbzoge1xuICAgICAgICAgIGNlcnRpZmljYXRlOiBpZGVudGl0eU1hdGVyaWFsLmNlcnRpZmljYXRlLFxuICAgICAgICAgIGtleTogaWRlbnRpdHlNYXRlcmlhbC5wcml2YXRlS2V5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG5ldHdvcmsgPSBhd2FpdCBnYXRld2F5LmdldE5ldHdvcmsodGhpcy5jb25maWcuY2hhbm5lbCk7XG4gICAgICBjb25zdCBjb250cmFjdCA9IG5ldHdvcmsuZ2V0Q29udHJhY3QoXG4gICAgICAgIHRoaXMuY29uZmlnLmNoYWluY29kZU5hbWUsXG4gICAgICAgIHRoaXMuZ2V0Q29udHJhY3ROYW1lKGNsYXNzTmFtZSlcbiAgICAgICk7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGNvbnRyYWN0LmNyZWF0ZVRyYW5zYWN0aW9uKGZjbik7XG5cbiAgICAgIGlmICh0cmFuc2llbnRNYXApIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNpZW50KHRyYW5zaWVudE1hcCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVuZG9yc2VycyA9IHBlZXJzXG4gICAgICAgIC5tYXAoKHBlZXIpID0+IG5ldHdvcmsuZ2V0Q2hhbm5lbCgpLmdldEVuZG9yc2VyKHBlZXIubmFtZSkpXG4gICAgICAgIC5maWx0ZXIoKGVuZG9yc2VyKTogZW5kb3JzZXIgaXMgRW5kb3JzZXIgPT4gQm9vbGVhbihlbmRvcnNlcikpO1xuICAgICAgaWYgKGVuZG9yc2Vycy5sZW5ndGgpIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0RW5kb3JzaW5nUGVlcnMoZW5kb3JzZXJzKTtcbiAgICAgIH1cblxuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGBMZWdhY3kgc3VibWl0dGluZyAke3RoaXMuZ2V0Q29udHJhY3ROYW1lKGNsYXNzTmFtZSkgfHwgdGhpcy5jb25maWcuY29udHJhY3ROYW1lfS4ke2Zjbn0gdmlhIHBlZXJzICR7cGVlcnMubWFwKChwKSA9PiBwLnBlZXJFbmRwb2ludCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zYWN0aW9uLnN1Ym1pdCguLi5hcmdzKTtcbiAgICAgIHJldHVybiBVaW50OEFycmF5LmZyb20ocmVzdWx0KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZ2F0ZXdheS5kaXNjb25uZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVMZWdhY3lQZWVycyhcbiAgICBwZWVyczogTGVnYWN5UGVlclRhcmdldFtdXG4gICk6IExlZ2FjeVBlZXJXaXRoTmFtZVtdIHtcbiAgICBjb25zdCBkZWR1cGVkID0gbmV3IE1hcDxzdHJpbmcsIExlZ2FjeVBlZXJXaXRoTmFtZT4oKTtcbiAgICBjb25zdCBhZGRQZWVyID0gKHBlZXI6IExlZ2FjeVBlZXJUYXJnZXQpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGAke3BlZXIucGVlckVuZHBvaW50fXwke3BlZXIucGVlckhvc3RBbGlhcyB8fCBcIlwifWA7XG4gICAgICBpZiAoZGVkdXBlZC5oYXMoa2V5KSkgcmV0dXJuO1xuICAgICAgY29uc3QgbmFtZSA9IGBwZWVyLSR7cGVlci5tc3BJZH0tJHtkZWR1cGVkLnNpemV9YDtcbiAgICAgIGRlZHVwZWQuc2V0KGtleSwge1xuICAgICAgICAuLi5wZWVyLFxuICAgICAgICBuYW1lLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHBlZXJzLmZvckVhY2goYWRkUGVlcik7XG4gICAgYWRkUGVlcih7XG4gICAgICBtc3BJZDogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICBwZWVyRW5kcG9pbnQ6IHRoaXMuY29uZmlnLnBlZXJFbmRwb2ludCxcbiAgICAgIHBlZXJIb3N0QWxpYXM6IHRoaXMuY29uZmlnLnBlZXJIb3N0QWxpYXMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShkZWR1cGVkLnZhbHVlcygpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwoKTogUHJvbWlzZTx7XG4gICAgY2VydGlmaWNhdGU6IHN0cmluZztcbiAgICBwcml2YXRlS2V5OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGF3YWl0IHRoaXMucmVhZFBlbUlucHV0KFxuICAgICAgdGhpcy5jb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGhcbiAgICApO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLnJlYWRQZW1JbnB1dChcbiAgICAgIHRoaXMuY29uZmlnLmtleUNlcnRPckRpcmVjdG9yeVBhdGhcbiAgICApO1xuICAgIHJldHVybiB7IGNlcnRpZmljYXRlLCBwcml2YXRlS2V5IH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkTGVnYWN5Q29ubmVjdGlvblByb2ZpbGUocGVlcnM6IExlZ2FjeVBlZXJXaXRoTmFtZVtdKSB7XG4gICAgY29uc3QgcGVlckVudHJpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBjaGFubmVsUGVlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBvcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgZm9yIChjb25zdCBwZWVyIG9mIHBlZXJzKSB7XG4gICAgICBjb25zdCB0bHNQZW0gPSBhd2FpdCB0aGlzLnJlYWRQZW1JbnB1dChcbiAgICAgICAgcGVlci50bHNDZXJ0IHx8IHRoaXMuY29uZmlnLnRsc0NlcnRcbiAgICAgICk7XG4gICAgICBjb25zdCBob3N0bmFtZSA9XG4gICAgICAgIHBlZXIucGVlckhvc3RBbGlhcyB8fCB0aGlzLmV4dHJhY3RIb3N0KHBlZXIucGVlckVuZHBvaW50KTtcbiAgICAgIHBlZXJFbnRyaWVzW3BlZXIubmFtZV0gPSB7XG4gICAgICAgIHVybDogdGhpcy5lbnN1cmVHcnBjVXJsKHBlZXIucGVlckVuZHBvaW50KSxcbiAgICAgICAgdGxzQ0FDZXJ0czogeyBwZW06IHRsc1BlbSB9LFxuICAgICAgICBncnBjT3B0aW9uczoge1xuICAgICAgICAgIFwic3NsLXRhcmdldC1uYW1lLW92ZXJyaWRlXCI6IGhvc3RuYW1lLFxuICAgICAgICAgIGhvc3RuYW1lT3ZlcnJpZGU6IGhvc3RuYW1lLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNoYW5uZWxQZWVyc1twZWVyLm5hbWVdID0ge1xuICAgICAgICBlbmRvcnNpbmdQZWVyOiB0cnVlLFxuICAgICAgICBjaGFpbmNvZGVRdWVyeTogdHJ1ZSxcbiAgICAgICAgbGVkZ2VyUXVlcnk6IHRydWUsXG4gICAgICAgIGV2ZW50U291cmNlOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIG9yZ3NbcGVlci5tc3BJZF0gPSBvcmdzW3BlZXIubXNwSWRdIHx8IHtcbiAgICAgICAgbXNwaWQ6IHBlZXIubXNwSWQsXG4gICAgICAgIHBlZXJzOiBbXSxcbiAgICAgIH07XG4gICAgICBvcmdzW3BlZXIubXNwSWRdLnBlZXJzLnB1c2gocGVlci5uYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogXCJsZWdhY3ktbWFudWFsXCIsXG4gICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgICBjbGllbnQ6IHtcbiAgICAgICAgb3JnYW5pemF0aW9uOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgIH0sXG4gICAgICBvcmdhbml6YXRpb25zOiBvcmdzLFxuICAgICAgcGVlcnM6IHBlZXJFbnRyaWVzLFxuICAgICAgb3JkZXJlcnM6IHt9LFxuICAgICAgY2hhbm5lbHM6IHtcbiAgICAgICAgW3RoaXMuY29uZmlnLmNoYW5uZWxdOiB7XG4gICAgICAgICAgcGVlcnM6IGNoYW5uZWxQZWVycyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkVHJlYXRQZWVyc0FzTG9jYWxob3N0KHBlZXJzOiBMZWdhY3lQZWVyV2l0aE5hbWVbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwZWVycy5ldmVyeSgocGVlcikgPT4gdGhpcy5pc0xvY2FsRW5kcG9pbnQocGVlci5wZWVyRW5kcG9pbnQpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNMb2NhbEVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5leHRyYWN0SG9zdChlbmRwb2ludCkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gaG9zdCA9PT0gXCJsb2NhbGhvc3RcIiB8fCBob3N0ID09PSBcIjEyNy4wLjAuMVwiO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0SG9zdChlbmRwb2ludDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzYW5pdGl6ZWQgPSBlbmRwb2ludC5yZXBsYWNlKC9eZ3JwY3M/OlxcL1xcLy8sIFwiXCIpO1xuICAgIHJldHVybiBzYW5pdGl6ZWQuc3BsaXQoXCI6XCIpWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVHcnBjVXJsKGVuZHBvaW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICgvXmdycGNzPzpcXC9cXC8vaS50ZXN0KGVuZHBvaW50KSkgcmV0dXJuIGVuZHBvaW50O1xuICAgIHJldHVybiBgZ3JwY3M6Ly8ke2VuZHBvaW50fWA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWRQZW1JbnB1dChzb3VyY2U/OiBzdHJpbmcgfCBCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghc291cmNlKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgY2VydGlmaWNhdGUgb3Iga2V5IG1hdGVyaWFsXCIpO1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoc291cmNlKSkgcmV0dXJuIHNvdXJjZS50b1N0cmluZyhcInV0ZjhcIik7XG4gICAgY29uc3QgdHJpbW1lZCA9IHNvdXJjZS50cmltKCk7XG4gICAgaWYgKC8tLS0tLUJFR0lOIFtBLVogXSstLS0tLS8udGVzdCh0cmltbWVkKSkgcmV0dXJuIHRyaW1tZWQ7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHNvdXJjZSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBpZiAoc3RhdHM/LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHJldHVybiBhd2FpdCBnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChzb3VyY2UpO1xuICAgIH1cbiAgICByZXR1cm4gKGF3YWl0IHJlYWRGc0ZpbGUoc291cmNlKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuIGVycm9yIGludG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYW55IGVycm9yIGludG8gYSBzdGFuZGFyZGl6ZWQgQmFzZUVycm9yXG4gICAqIEBwYXJhbSB7RXJyb3IgfCBzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3JcbiAgICovXG4gIG92ZXJyaWRlIHBhcnNlRXJyb3I8RSBleHRlbmRzIEJhc2VFcnJvcj4oZXJyOiBFcnJvciB8IHN0cmluZyk6IEUge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLnBhcnNlRXJyb3I8RT4oZXJyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIHRoYXQgbW9kaWZpZXMgdGhlIGxlZGdlciBzdGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIGNoYWluY29kZSBmdW5jdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjaGFpbmNvZGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbdHJhbnNpZW50RGF0YV0gLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2VuZG9yc2luZ09yZ2FuaXphdGlvbnNdIC0gT3JnYW5pemF0aW9ucyB0aGF0IG11c3QgZW5kb3JzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBhcGk6IHN0cmluZyxcbiAgICBhcmdzPzogYW55W10sXG4gICAgdHJhbnNpZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IEFycmF5PHN0cmluZz4sXG4gICAgY2xhc3NOYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGlmICh0aGlzLnNob3VsZFVzZUxlZ2FjeUdhdGV3YXkoY3R4KSkge1xuICAgICAgY29uc3QgbGVnYWN5QXJncyA9IHRoaXMucHJlcGFyZUxlZ2FjeUFyZ3MoYXJncyk7XG4gICAgICBjb25zdCB0cmFuc2llbnRNYXAgPSB0aGlzLmJ1aWxkTGVnYWN5VHJhbnNpZW50KHRyYW5zaWVudERhdGEpO1xuICAgICAgY29uc3QgcGVlckNvbmZpZ3MgPSB0aGlzLmJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MoY3R4KTtcbiAgICAgIHJldHVybiB0aGlzLnN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyhcbiAgICAgICAgY3R4LFxuICAgICAgICBhcGksXG4gICAgICAgIGxlZ2FjeUFyZ3MsXG4gICAgICAgIHRyYW5zaWVudE1hcCxcbiAgICAgICAgcGVlckNvbmZpZ3MsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBhcGksXG4gICAgICB0cnVlLFxuICAgICAgYXJncyxcbiAgICAgIHRyYW5zaWVudERhdGEsXG4gICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zLFxuICAgICAgY2xhc3NOYW1lXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gb24gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIGEgdHJhbnNhY3Rpb24gdGhhdCBkb2VzIG5vdCBtb2RpZnkgdGhlIGxlZGdlciBzdGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIGNoYWluY29kZSBmdW5jdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjaGFpbmNvZGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbdHJhbnNpZW50RGF0YV0gLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2VuZG9yc2luZ09yZ2FuaXphdGlvbnNdIC0gT3JnYW5pemF0aW9ucyB0aGF0IG11c3QgZW5kb3JzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGFwaTogc3RyaW5nLFxuICAgIGFyZ3M/OiBhbnlbXSxcbiAgICB0cmFuc2llbnREYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zPzogQXJyYXk8c3RyaW5nPixcbiAgICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBhcGksXG4gICAgICBmYWxzZSxcbiAgICAgIGFyZ3MsXG4gICAgICB0cmFuc2llbnREYXRhLFxuICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucyxcbiAgICAgIGNsYXNzTmFtZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNodXRzIGRvd24gdGhlIGNvbm5lY3Rpb24gdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENsb3NlcyB0aGUgYWN0aXZlIGRpc3BhdGNoICh3aGljaCBpbiB0dXJuIGNsb3NlcyBhbnkgZ2F0ZXdheVxuICAgKiBldmVudCBzdWJzY3JpcHRpb24pIHZpYSB0aGUgYmFzZSBjbGFzcywgdGhlbiBjbG9zZXMgdGhlIGdSUEMgY2xpZW50LlxuICAgKiBXb3JrcyBjb3JyZWN0bHkgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGBzeW50aGV0aWNFdmVudHNgIGlzIGVuYWJsZWQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBjb25uZWN0aW9ucyBhcmUgY2xvc2VkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBzaHV0ZG93biguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQmFzZSBjbGFzcyBoYW5kbGVzIGRpc3BhdGNoLmNsb3NlKCkgaW50ZXJuYWxseS5cbiAgICBhd2FpdCBzdXBlci5zaHV0ZG93biguLi5hcmdzKTtcbiAgICBpZiAodGhpcy5jbGllbnQpIHtcbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoYENsb3NpbmcgJHt0aGlzLmNvbmZpZy5tc3BJZH0gZ2F0ZXdheSBjbGllbnRgKTtcbiAgICAgIHRoaXMuY2xpZW50LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgQ29udHJhY3QgaW5zdGFuY2UgZnJvbSBhIEdhdGV3YXlcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgY2hhaW5jb2RlIGNvbnRyYWN0IGZyb20gdGhlIHNwZWNpZmllZCBuZXR3b3JrXG4gICAqIEBwYXJhbSB7R2F0ZXdheX0gZ2F0ZXdheSAtIFRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtDb250cmFrdH0gVGhlIENvbnRyYWN0IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZ2V0Q29udHJhY3QoXG4gICAgZ2F0ZXdheTogR2F0ZXdheSxcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgY29udHJhY3ROYW1lPzogc3RyaW5nXG4gICk6IENvbnRyYWt0IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRDb250cmFjdCk7XG4gICAgY29uc3QgbmV0d29yayA9IHRoaXMuZ2V0TmV0d29yayhnYXRld2F5LCBjb25maWcuY2hhbm5lbCk7XG4gICAgbGV0IGNvbnRyYWN0OiBDb250cmFrdDtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgUmV0cmlldmluZyBjaGFpbmNvZGUgJHtjb25maWcuY2hhaW5jb2RlTmFtZX0gY29udHJhY3QgJHtjb250cmFjdE5hbWUgfHwgY29uZmlnLmNvbnRyYWN0TmFtZX0gZnJvbSBuZXR3b3JrICR7Y29uZmlnLmNoYW5uZWx9YFxuICAgICAgKTtcbiAgICAgIGNvbnRyYWN0TmFtZSA9IGNvbnRyYWN0TmFtZSA/IGNvbnRyYWN0TmFtZSA6IGNvbmZpZy5jb250cmFjdE5hbWU7XG4gICAgICBjb250cmFjdCA9IG5ldHdvcmsuZ2V0Q29udHJhY3QoY29uZmlnLmNoYWluY29kZU5hbWUsIGNvbnRyYWN0TmFtZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiBjb250cmFjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIE5ldHdvcmsgaW5zdGFuY2UgZnJvbSBhIEdhdGV3YXlcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdG8gYSBzcGVjaWZpYyBjaGFubmVsIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAcGFyYW0ge0dhdGV3YXl9IGdhdGV3YXkgLSBUaGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2hhbm5lbCB0byBjb25uZWN0IHRvXG4gICAqIEByZXR1cm4ge05ldHdvcmt9IFRoZSBOZXR3b3JrIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZ2V0TmV0d29yayhnYXRld2F5OiBHYXRld2F5LCBjaGFubmVsTmFtZTogc3RyaW5nKTogTmV0d29yayB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5nZXROZXR3b3JrKTtcbiAgICBsZXQgbmV0d29yazogTmV0d29yaztcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvIGNoYW5uZWwgJHtjaGFubmVsTmFtZX1gKTtcbiAgICAgIG5ldHdvcmsgPSBnYXRld2F5LmdldE5ldHdvcmsoY2hhbm5lbE5hbWUpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXR3b3JrO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgR2F0ZXdheSBpbnN0YW5jZSBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIEdhdGV3YXkgdXNpbmcgdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24gYW5kIGNsaWVudFxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIHtDbGllbnR9IFtjbGllbnRdIC0gT3B0aW9uYWwgZ1JQQyBjbGllbnQsIHdpbGwgYmUgY3JlYXRlZCBpZiBub3QgcHJvdmlkZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxHYXRld2F5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRHYXRld2F5KFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIGNsaWVudD86IENsaWVudFxuICApIHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGlvbihcbiAgICAgIGNsaWVudCB8fCAoYXdhaXQgdGhpcy5nZXRDbGllbnQoY29uZmlnKSksXG4gICAgICBjb25maWcsXG4gICAgICBjdHhcbiAgICApKSBhcyBHYXRld2F5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIGNsaWVudCB3aXRoIFRMUyBjcmVkZW50aWFscyBmb3Igc2VjdXJlIGNvbW11bmljYXRpb25cbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm4ge0NsaWVudH0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGdSUEMgY2xpZW50XG4gICAqL1xuICBzdGF0aWMgZ2V0Q2xpZW50KGNvbmZpZzogUGVlckNvbmZpZyk6IENsaWVudCB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0Q2xpZW50KTtcbiAgICBsb2cuZGVidWcoYGdlbmVyYXRpbmcgVExTIGNyZWRlbnRpYWxzIGZvciBtc3AgJHtjb25maWcubXNwSWR9YCk7XG4gICAgbGV0IHBhdGhPckNlcnQ6IHN0cmluZyB8IEJ1ZmZlciA9IGNvbmZpZy50bHNDZXJ0IGFzIHN0cmluZyB8IEJ1ZmZlcjtcblxuICAgIGlmICh0eXBlb2YgcGF0aE9yQ2VydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKFxuICAgICAgICBwYXRoT3JDZXJ0Lm1hdGNoKFxuICAgICAgICAgIC8tLS0tLUJFR0lOIChDRVJUSUZJQ0FURXxLRVl8UFJJVkFURSBLRVkpLS0tLS0uKz8tLS0tLUVORCBcXDEtLS0tLSQvZ21zXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBwYXRoT3JDZXJ0ID0gQnVmZmVyLmZyb20ocGF0aE9yQ2VydCwgXCJ1dGY4XCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXRoT3JDZXJ0ID0gQnVmZmVyLmZyb20oZnMucmVhZEZpbGVTeW5jKHBhdGhPckNlcnQsIFwidXRmOFwiKSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVhZCB0aGUgdGxzIGNlcnRpZmljYXRlIGZyb20gJHtwYXRoT3JDZXJ0fTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGxzQ3JlZGVudGlhbHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZVNzbChwYXRoT3JDZXJ0KTtcbiAgICBsb2cuZGVidWcoYGdlbmVyYXRpbmcgR2F0ZXdheSBDbGllbnQgZm9yIHVybCAke2NvbmZpZy5wZWVyRW5kcG9pbnR9YCk7XG4gICAgcmV0dXJuIG5ldyBDbGllbnQoY29uZmlnLnBlZXJFbmRwb2ludCwgdGxzQ3JlZGVudGlhbHMsIHtcbiAgICAgIFwiZ3JwYy5tYXhfcmVjZWl2ZV9tZXNzYWdlX2xlbmd0aFwiOiAoY29uZmlnLnNpemVMaW1pdCB8fCAxNSkgKiAxMDI0ICogMTAyNCxcbiAgICAgIFwiZ3JwYy5tYXhfc2VuZF9tZXNzYWdlX2xlbmd0aFwiOiAoY29uZmlnLnNpemVMaW1pdCB8fCAxNSkgKiAxMDI0ICogMTAyNCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXN0YWJsaXNoZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgR2F0ZXdheSBjb25uZWN0aW9uIHdpdGggaWRlbnRpdHkgYW5kIHNpZ25lclxuICAgKiBAcGFyYW0ge0NsaWVudH0gY2xpZW50IC0gVGhlIGdSUEMgY2xpZW50XG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEdhdGV3YXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY29ubmVjdGVkIEdhdGV3YXlcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IElkZW50aXR5XG4gICAqICAgcGFydGljaXBhbnQgU2lnbmVyXG4gICAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICAgKlxuICAgKiAgIENhbGxlci0+PkZhYnJpY0FkYXB0ZXI6IGdldENvbm5lY3Rpb24oY2xpZW50LCBjb25maWcpXG4gICAqICAgRmFicmljQWRhcHRlci0+PklkZW50aXR5OiBnZXRJZGVudGl0eShtc3BJZCwgY2VydERpcmVjdG9yeVBhdGgpXG4gICAqICAgSWRlbnRpdHktLT4+RmFicmljQWRhcHRlcjogaWRlbnRpdHlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+U2lnbmVyOiBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aClcbiAgICogICBTaWduZXItLT4+RmFicmljQWRhcHRlcjogc2lnbmVyXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IENyZWF0ZSBDb25uZWN0T3B0aW9uc1xuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KG9wdGlvbnMpXG4gICAqICAgR2F0ZXdheS0tPj5GYWJyaWNBZGFwdGVyOiBnYXRld2F5XG4gICAqICAgRmFicmljQWRhcHRlci0tPj5DYWxsZXI6IGdhdGV3YXlcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRDb25uZWN0aW9uKFxuICAgIGNsaWVudDogQ2xpZW50LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICkge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMuZ2V0Q29ubmVjdGlvbik7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYFJldHJpZXZpbmcgUGVlciBJZGVudGl0eSBmb3IgJHtjb25maWcubXNwSWR9IHVuZGVyICR7Y29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRofWBcbiAgICApO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgZ2V0SWRlbnRpdHkoXG4gICAgICBjb25maWcubXNwSWQsXG4gICAgICBjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55XG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgcHJlcGFyaW5nIHRyYW5zYWN0aW9uIHNpZ25lciBmb3IgJHtDcnlwdG9VdGlscy5mYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZShpZGVudGl0eS5jcmVkZW50aWFscy50b1N0cmluZygpKX1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGV4dHJhY3QgRmFicmljIElEIGZyb20gY2VydGlmaWNhdGVgLCBlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgc2lnbmVyOiBTaWduZXI7XG4gICAgY29uc3QgY2xvc2UgPSAoKSA9PiB7fTtcbiAgICBpZiAoIWNvbmZpZy5oc20pIHtcbiAgICAgIHNpZ25lciA9IGF3YWl0IGdldFNpZ25lcihjb25maWcua2V5Q2VydE9yRGlyZWN0b3J5UGF0aCBhcyBhbnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb25zdCBoc20gPSBuZXcgSFNNU2lnbmVyRmFjdG9yeUN1c3RvbShjb25maWcuaHNtLmxpYnJhcnkpO1xuICAgICAgLy8gY29uc3QgaWRlbnRpZmllciA9IGhzbS5nZXRTS0lGcm9tQ2VydGlmaWNhdGVQYXRoKFxuICAgICAgLy8gICBjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55XG4gICAgICAvLyApO1xuICAgICAgLy8gY29uc3QgcGtjczExU2lnbmVyID0gaHNtLm5ld1NpZ25lcih7XG4gICAgICAvLyAgIGxhYmVsOiBjb25maWcuaHNtLnRva2VuTGFiZWwgYXMgc3RyaW5nLFxuICAgICAgLy8gICBwaW46IFN0cmluZyhjb25maWcuaHNtLnBpbikgYXMgc3RyaW5nLFxuICAgICAgLy8gICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgLy8gICAvLyB1c2VyVHlwZTogMSAvKkNLVV9VU0VSICovLFxuICAgICAgLy8gfSk7XG4gICAgICAvLyBzaWduZXIgPSBwa2NzMTFTaWduZXIuc2lnbmVyO1xuICAgICAgLy8gY2xvc2UgPSBwa2NzMTFTaWduZXIuY2xvc2U7XG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcIkhTTSBOT1QgSU1QTEVNRU5URURcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGNsaWVudCxcbiAgICAgIGlkZW50aXR5OiBpZGVudGl0eSxcbiAgICAgIHNpZ25lcjogc2lnbmVyLFxuICAgICAgLy8gRGVmYXVsdCB0aW1lb3V0cyBmb3IgZGlmZmVyZW50IGdSUEMgY2FsbHNcbiAgICAgIGV2YWx1YXRlT3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwiZXZhbHVhdGVUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDUgc2Vjb25kc1xuICAgICAgfSxcbiAgICAgIGVuZG9yc2VPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJlbmRvcnNlVGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byAxNSBzZWNvbmRzXG4gICAgICB9LFxuICAgICAgc3VibWl0T3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwic3VibWl0VGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byA1IHNlY29uZHNcbiAgICAgIH0sXG4gICAgICBjb21taXRTdGF0dXNPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJjb21taXRUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDEgbWludXRlXG4gICAgICB9LFxuICAgIH0gYXMgQ29ubmVjdE9wdGlvbnM7XG5cbiAgICBsb2cuZGVidWcoYENvbm5lY3RpbmcgdG8gJHtjb25maWcubXNwSWR9YCk7XG4gICAgY29uc3QgZ2F0ZXdheSA9IGNvbm5lY3Qob3B0aW9ucyk7XG5cbiAgICAvLyBUT0RPOiByZXBsYWNlP1xuICAgIGlmIChjb25maWcuaHNtKSB7XG4gICAgICBnYXRld2F5LmNsb3NlID0gbmV3IFByb3h5KGdhdGV3YXkuY2xvc2UsIHtcbiAgICAgICAgYXBwbHkodGFyZ2V0OiAoKSA9PiB2b2lkLCB0aGlzQXJnOiBhbnksIGFyZ0FycmF5OiBhbnlbXSk6IGFueSB7XG4gICAgICAgICAgUmVmbGVjdC5hcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ0FycmF5KTtcbiAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdhdGV3YXk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgY2xpZW50LlxuICAgKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIG5ldyBGYWJyaWNDbGllbnREaXNwYXRjaCBpbnN0YW5jZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrLlxuICAgKiBAcmV0dXJucyB7RGlzcGF0Y2h9IEEgbmV3IERpc3BhdGNoIGluc3RhbmNlIGNvbmZpZ3VyZWQgZm9yIHRoZSBGYWJyaWMgY2xpZW50LlxuICAgKiBAcmVtYXJrcyBUaGUgRGlzcGF0Y2ggaW5zdGFuY2UgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgbG9naWMgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrLCBzdWNoIGFzIHN1Ym1pdHRpbmcgdHJhbnNhY3Rpb25zIG9yIHF1ZXJ5aW5nIGRhdGEuXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGZhYnJpY0Rpc3BhdGNoID0gZmFicmljQ2xpZW50QWRhcHRlci5EaXNwYXRjaCgpO1xuICAgKiBmYWJyaWNEaXNwYXRjaC5zdWJtaXRUcmFuc2FjdGlvbignY3JlYXRlUHJvZHVjdCcsIHsgbmFtZTogJ1Byb2R1Y3QgQScsIHByaWNlOiAxMDAgfSk7XG4gICAqL1xuICBvdmVycmlkZSBEaXNwYXRjaCgpOiBGYWJyaWNDbGllbnREaXNwYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRBZGFwdGVyW1wiX2Jhc2VEaXNwYXRjaFwiXSh0aGlzLmNsaWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbiBlcnJvciBpbnRvIGEgQmFzZUVycm9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGFueSBlcnJvciBpbnRvIGEgc3RhbmRhcmRpemVkIEJhc2VFcnJvciB1c2luZyB0aGUgcGFyZW50IGNsYXNzIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7RXJyb3IgfCBzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3JcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgcGFyc2VFcnJvcjxFIGV4dGVuZHMgQmFzZUVycm9yPihcbiAgICBlcnI6IEVycm9yIHwgc3RyaW5nIHwgR2F0ZXdheUVycm9yXG4gICk6IEUge1xuICAgIC8vIGlmIChcbiAgICAvLyAgIE1JU1NJTkdfUFJJVkFURV9EQVRBX1JFR0VYLnRlc3QoXG4gICAgLy8gICAgIHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIgPyBlcnIgOiBlcnIubWVzc2FnZVxuICAgIC8vICAgKVxuICAgIC8vIClcbiAgICAvLyAgIHJldHVybiBuZXcgVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MoZXJyKSBhcyBFO1xuXG4gICAgbGV0IG1zZyA9IHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIgPyBlcnIgOiBlcnIubWVzc2FnZTtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgR2F0ZXdheUVycm9yICYmIGVyci5kZXRhaWxzLmxlbmd0aCAmJiBlcnIuY29kZSA9PT0gMTApIHtcbiAgICAgIG1zZyA9IGAke2Vyci5kZXRhaWxzWzBdLm1lc3NhZ2V9YDtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBlcnIgaW5zdGFuY2VvZiBFbmRvcnNlRXJyb3IgJiZcbiAgICAgIGVyci5kZXRhaWxzLmxlbmd0aCAmJlxuICAgICAgZXJyLmNvZGUgPT09IDEwICYmXG4gICAgICBlcnIuZGV0YWlsc1swXS5tZXNzYWdlPy5pbmNsdWRlcyhVbnN1cHBvcnRlZEVycm9yLm5hbWUpXG4gICAgKSB7XG4gICAgICBtc2cgPSBgJHtlcnIuZGV0YWlsc1swXS5tZXNzYWdlfWA7XG4gICAgfVxuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIk1WQ0NfUkVBRF9DT05GTElDVFwiKSlcbiAgICAgIHJldHVybiBuZXcgTXZjY1JlYWRDb25mbGljdEVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJERUFETElORV9FWENFRURFRFwiKSlcbiAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIkVORE9SU0VNRU5UX1BPTElDWV9GQUlMVVJFXCIpKVxuICAgICAgcmV0dXJuIG5ldyBFbmRvcnNlbWVudFBvbGljeUVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJQSEFOVE9NX1JFQURfQ09ORkxJQ1RcIikpXG4gICAgICByZXR1cm4gbmV3IFBoYW50b21SZWFkQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgKGVyciBhcyBhbnkpLmNvZGUpIHtcbiAgICAgIHN3aXRjaCAoKGVyciBhcyBhbnkpLmNvZGUpIHtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIHJldHVybiBuZXcgRW5kb3JzZW1lbnRFcnJvcihlcnIpIGFzIEU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhWYWxpZGF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhOb3RGb3VuZEVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQ29uZmxpY3RFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEJhZFJlcXVlc3RFcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQmFkUmVxdWVzdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFF1ZXJ5RXJyb3IubmFtZSkpIHJldHVybiBuZXcgUXVlcnlFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhQYWdpbmdFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBQYWdpbmdFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhVbnN1cHBvcnRlZEVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBVbnN1cHBvcnRlZEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE1pZ3JhdGlvbkVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE1pZ3JhdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE9ic2VydmVyRXJyb3IubmFtZSkpIHJldHVybiBuZXcgT2JzZXJ2ZXJFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhBdXRob3JpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhGb3JiaWRkZW5FcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBGb3JiaWRkZW5FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhDb25uZWN0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhTZXJpYWxpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKGVycikgYXMgRTtcbiAgfVxufVxuXG5GYWJyaWNDbGllbnRBZGFwdGVyLmRlY29yYXRpb24oKTtcbkFkYXB0ZXIuc2V0Q3VycmVudChGYWJyaWNGbGF2b3VyKTtcbiIsImltcG9ydCB7XG4gIEFkYXB0ZXIsXG4gIENvbnRleHR1YWxBcmdzLFxuICBEaXNwYXRjaCxcbiAgRXZlbnRJZHMsXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIENvbnRleHQsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgUGVyc2lzdGVuY2VLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFBlZXJDb25maWcgfSBmcm9tIFwiLi4vc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDaGFpbmNvZGVFdmVudCxcbiAgQ2xvc2VhYmxlQXN5bmNJdGVyYWJsZSxcbn0gZnJvbSBcIkBoeXBlcmxlZGdlci9mYWJyaWMtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgcGFyc2VFdmVudE5hbWUgfSBmcm9tIFwiLi4vc2hhcmVkL2V2ZW50c1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFdmVudCBkaXNwYXRjaGVyIGZvciBIeXBlcmxlZGdlciBGYWJyaWMgY2hhaW5jb2RlIGV2ZW50c1xuICogQHN1bW1hcnkgTGlzdGVucyBmb3IgYW5kIHByb2Nlc3NlcyBldmVudHMgZW1pdHRlZCBieSBGYWJyaWMgY2hhaW5jb2RlLCBkaXNwYXRjaGluZyB0aGVtIHRvIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gKiBAdGVtcGxhdGUgUGVlckNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdHlwZSBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAcGFyYW0gY2xpZW50IC0gZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gKiBAY2xhc3MgRmFicmljQ2xpZW50RGlzcGF0Y2hcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgRmFicmljRGlzcGF0Y2ggaW5zdGFuY2VcbiAqIGNvbnN0IGNsaWVudCA9IGF3YWl0IEZhYnJpY0FkYXB0ZXIuZ2V0Q2xpZW50KHBlZXJDb25maWcpO1xuICogY29uc3QgZGlzcGF0Y2ggPSBuZXcgRmFicmljRGlzcGF0Y2goY2xpZW50KTtcbiAqXG4gKiAvLyBDb25maWd1cmUgdGhlIGRpc3BhdGNoIHdpdGggcGVlciBjb25maWd1cmF0aW9uXG4gKiBkaXNwYXRjaC5jb25maWd1cmUocGVlckNvbmZpZyk7XG4gKlxuICogLy8gUmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgZm9yIGEgc3BlY2lmaWMgdGFibGUgYW5kIGV2ZW50XG4gKiBkaXNwYXRjaC5vYnNlcnZlKCd1c2VycycsICdjcmVhdGUnLCAoaWQpID0+IHtcbiAqICAgY29uc29sZS5sb2coYFVzZXIgY3JlYXRlZDogJHtpZH1gKTtcbiAqIH0pO1xuICpcbiAqIC8vIFN0YXJ0IGxpc3RlbmluZyBmb3IgZXZlbnRzXG4gKiBhd2FpdCBkaXNwYXRjaC5zdGFydCgpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBGYWJyaWNEaXNwYXRjaFxuICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gKiAgIHBhcnRpY2lwYW50IE5ldHdvcmtcbiAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gKlxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogbmV3IEZhYnJpY0Rpc3BhdGNoKGNsaWVudClcbiAqICAgQ2xpZW50LT4+RmFicmljRGlzcGF0Y2g6IGNvbmZpZ3VyZShwZWVyQ29uZmlnKVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogb2JzZXJ2ZSh0YWJsZSwgZXZlbnQsIGNhbGxiYWNrKVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogc3RhcnQoKVxuICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBpbml0aWFsaXplKClcbiAqICAgRmFicmljRGlzcGF0Y2gtPj5HYXRld2F5OiBnZXRHYXRld2F5KGNvbmZpZywgY2xpZW50KVxuICogICBHYXRld2F5LT4+TmV0d29yazogZ2V0TmV0d29yayhjaGFubmVsKVxuICogICBOZXR3b3JrLT4+TmV0d29yazogZ2V0Q2hhaW5jb2RlRXZlbnRzKGNoYWluY29kZU5hbWUpXG4gKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IGhhbmRsZUV2ZW50cygpXG4gKiAgIGxvb3AgRm9yIGVhY2ggZXZlbnRcbiAqICAgICBDaGFpbmNvZGUtLT4+RmFicmljRGlzcGF0Y2g6IENoYWluY29kZUV2ZW50XG4gKiAgICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogcGFyc2VFdmVudE5hbWUoZXZlbnROYW1lKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHBhcnNlUGF5bG9hZChwYXlsb2FkKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgZXZlbnQsIGlkKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLS0+PkNsaWVudDogY2FsbGJhY2soaWQpXG4gKiAgIGVuZFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50RGlzcGF0Y2ggZXh0ZW5kcyBEaXNwYXRjaDxGYWJyaWNDbGllbnRBZGFwdGVyPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgbGlzdGVuaW5nIHN0YWNrIGZvciBjaGFpbmNvZGUgZXZlbnRzXG4gICAqL1xuICBwcml2YXRlIGxpc3RlbmluZ1N0YWNrPzogQ2xvc2VhYmxlQXN5bmNJdGVyYWJsZTxDaGFpbmNvZGVFdmVudD47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZXh0IGRlY29kZXIgZm9yIGNvbnZlcnRpbmcgZXZlbnQgcGF5bG9hZHMgZnJvbSBieXRlcyB0byBzdHJpbmdzXG4gICAqL1xuICBwcml2YXRlIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBGYWJyaWNEaXNwYXRjaCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIGRpc3BhdGNoZXIgZm9yIEZhYnJpYyBjaGFpbmNvZGUgZXZlbnRzXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgLSBnUlBDIGNsaWVudCBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjbGllbnQ6IENsaWVudCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsb3NlcyB0aGUgZXZlbnQgbGlzdGVuaW5nIGNvbm5lY3Rpb25cbiAgICogQHN1bW1hcnkgU3RvcHMgbGlzdGVuaW5nIGZvciBjaGFpbmNvZGUgZXZlbnRzIGFuZCByZWxlYXNlcyByZXNvdXJjZXNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjbG9zZShcbiAgICAuLi5jdHhBcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3M6IGxvZ2dlZEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGN0eEFyZ3MsIFBlcnNpc3RlbmNlS2V5cy5TSFVURE9XTiwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmNsb3NlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc3VwZXIuY2xvc2UoLi4ubG9nZ2VkQXJncyk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY2xvc2UgRmFicmljIHByb3hpZXMgZXZlbnQgbGlzdGVuZXJgLCBlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGlzdGVuaW5nU3RhY2spIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubGlzdGVuaW5nU3RhY2suY2xvc2UoKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY2xvc2UgRmFicmljIGV2ZW50IGxpc3RlbmVyYCwgZSBhcyBFcnJvcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmxpc3RlbmluZ1N0YWNrID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGV2ZW50IHBheWxvYWQgZnJvbSBiaW5hcnkgZm9ybWF0XG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgVWludDhBcnJheSBjb250YWluaW5nIEpTT04gdG8gYW4gb2JqZWN0IHdpdGggYW4gaWQgcHJvcGVydHlcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBqc29uQnl0ZXMgLSBUaGUgYmluYXJ5IHBheWxvYWQgZnJvbSB0aGUgY2hhaW5jb2RlIGV2ZW50XG4gICAqIEByZXR1cm4ge3sgaWQ6IHN0cmluZyB9fSBUaGUgcGFyc2VkIHBheWxvYWQgY29udGFpbmluZyB0aGUgcmVjb3JkIElEXG4gICAqL1xuICBwcml2YXRlIHBhcnNlUGF5bG9hZChqc29uQnl0ZXM6IFVpbnQ4QXJyYXkpOiB7IGlkOiBzdHJpbmc7IHJlc3VsdD86IGFueSB9IHtcbiAgICBjb25zdCBqc29uID0gdGhpcy5kZWNvZGVyLmRlY29kZShqc29uQnl0ZXMpO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgb2JzZXJ2aW5nIGFuIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdGhpcyBkaXNwYXRjaCB0byBhbiBhZGFwdGVyIHRvIG1vbml0b3IgaXRzIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIHtBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT59IG9ic2VydmVyIC0gVGhlIGFkYXB0ZXIgdG8gb2JzZXJ2ZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgb3ZlcnJpZGUgb2JzZXJ2ZShvYnNlcnZlcjogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+KTogKCkgPT4gdm9pZCB7XG4gICAgaWYgKCEob2JzZXJ2ZXIgaW5zdGFuY2VvZiBGYWJyaWNDbGllbnRBZGFwdGVyKSlcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBcIk9ubHkgRmFicmljQ2xpZW50QWRhcHRlciBjYW4gYmUgb2JzZXJ2ZWQgYnkgZGlzcGF0Y2hcIlxuICAgICAgKTtcbiAgICBzdXBlci5vYnNlcnZlKG9ic2VydmVyIGFzIEZhYnJpY0NsaWVudEFkYXB0ZXIpO1xuICAgIHJldHVybiAoKSA9PiB0aGlzLnVuT2JzZXJ2ZShvYnNlcnZlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgb2JzZXJ2ZXJzIGFib3V0IGEgZGF0YWJhc2UgZXZlbnRcbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGEgY2hhbmdlIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGNoYW5nZSBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gdGhhdCBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge2FueX0gcGF5bG9hZCAtIFRoZSBldmVudCBwYXlsb2FkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8YW55PiB8IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSBBZGFwdGVyLmxvZ0N0eDxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4oXG4gICAgICB0aGlzLnVwZGF0ZU9ic2VydmVycyxcbiAgICAgIGV2ZW50LFxuICAgICAgZmFsc2UsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaDsgc2tpcHBpbmcgb2JzZXJ2ZXIgdXBkYXRlIGZvciAke3R5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIiA/IG1vZGVsIDogTW9kZWwudGFibGVOYW1lKG1vZGVsKX06JHtldmVudH1gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLnJlZnJlc2gobW9kZWwsIGV2ZW50LCBpZCwgLi4uY3R4QXJncyk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIGRpc3BhdGNoOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgaW5jb21pbmcgY2hhaW5jb2RlIGV2ZW50c1xuICAgKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBldmVudHMgZnJvbSB0aGUgY2hhaW5jb2RlIGFuZCBkaXNwYXRjaGVzIHRoZW0gdG8gcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZXZlbnQgaGFuZGxpbmcgc3RvcHNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljRGlzcGF0Y2hcbiAgICogICBwYXJ0aWNpcGFudCBFdmVudFN0YWNrXG4gICAqICAgcGFydGljaXBhbnQgRXZlbnRQYXJzZXJcbiAgICogICBwYXJ0aWNpcGFudCBPYnNlcnZlcnNcbiAgICpcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBoYW5kbGVFdmVudHMoKVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RXZlbnRTdGFjazogZm9yIGF3YWl0IChjb25zdCBldnQgb2YgbGlzdGVuaW5nU3RhY2spXG4gICAqICAgRXZlbnRTdGFjay0tPj5GYWJyaWNEaXNwYXRjaDogQ2hhaW5jb2RlRXZlbnRcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkV2ZW50UGFyc2VyOiBwYXJzZUV2ZW50TmFtZShldnQuZXZlbnROYW1lKVxuICAgKiAgIEV2ZW50UGFyc2VyLS0+PkZhYnJpY0Rpc3BhdGNoOiB7IHRhYmxlLCBldmVudCwgb3duZXIgfVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IENoZWNrIGlmIGV2ZW50IGlzIGZvciB0aGlzIE1TUFxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHBhcnNlUGF5bG9hZChldnQucGF5bG9hZClcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+Pk9ic2VydmVyczogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgcGF5bG9hZC5pZClcbiAgICogICBPYnNlcnZlcnMtLT4+RmFicmljRGlzcGF0Y2g6IENhbGxiYWNrcyBleGVjdXRlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZUV2ZW50cyhcbiAgICBjdHhBcmc/OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMubGlzdGVuaW5nU3RhY2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEV2ZW50IHN0YWNrIG5vdCBpbml0aWFsaXplZC4gRW5zdXJlIHRoYXQgXCJzdGFydExpc3RlbmluZ1wiIGlzIGNhbGxlZCBiZWZvcmUgYXR0ZW1wdGluZyB0aGlzIG9wZXJhdGlvbi5gXG4gICAgICApO1xuXG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIgfHwgIXRoaXMuYWRhcHRlci5jb25maWcpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBmb3VuZC4gc2hvdWxkIGJlIGltcG9zc2libGVgKTtcblxuICAgIGNvbnN0IGN0eCA9XG4gICAgICBjdHhBcmcgfHxcbiAgICAgIChhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgICAodGhpcy5tb2RlbHMgJiYgdGhpcy5tb2RlbHNbMF0pIHx8IChNb2RlbCBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yKVxuICAgICAgKSk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuaGFuZGxlRXZlbnRzKTtcblxuICAgIGxvZy5pbmZvKFxuICAgICAgYExpc3RlbmluZyBmb3IgaW5jb21pbmcgZXZlbnRzIG9uIGNoYWluY29kZSBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lfVwiIG9uIGNoYW5uZWwgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhbm5lbH1cIi4uLmBcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgZXZ0IG9mIHRoaXMubGlzdGVuaW5nU3RhY2spIHtcbiAgICAgICAgY29uc3QgeyB0YWJsZSwgZXZlbnQsIG93bmVyIH0gPSBwYXJzZUV2ZW50TmFtZShldnQuZXZlbnROYW1lKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuYWRhcHRlci5jb25maWc/Lm1zcEV2ZW50T25seSAmJlxuICAgICAgICAgIG93bmVyICYmXG4gICAgICAgICAgb3duZXIgIT09IHRoaXMuYWRhcHRlci5jb25maWc/Lm1zcElkXG4gICAgICAgIClcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogeyBpZDogc3RyaW5nOyByZXN1bHQ/OiBhbnkgfSA9IHRoaXMucGFyc2VQYXlsb2FkKFxuICAgICAgICAgIGV2dC5wYXlsb2FkXG4gICAgICAgICk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0TW9kZWwgPSB0YWJsZVxuICAgICAgICAgICAgPyBNb2RlbC5nZXQodGFibGUpXG4gICAgICAgICAgICA6IE1vZGVsLmdldCh0aGlzLm1vZGVsc1swXS5uYW1lKTtcbiAgICAgICAgICBjb25zdCBtb2RlbFJlZiA9IHRhcmdldE1vZGVsID8/ICh0YWJsZSB8fCB0aGlzLm1vZGVsc1swXT8ubmFtZSk7XG4gICAgICAgICAgY29uc3Qgb2JzZXJ2ZXJBcmdzID0gcGF5bG9hZC5yZXN1bHQgPyBbcGF5bG9hZC5yZXN1bHQsIGN0eF0gOiBbY3R4XTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgICAgICAgIG1vZGVsUmVmIGFzIENvbnN0cnVjdG9yIHwgc3RyaW5nLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBwYXlsb2FkLmlkIGFzIHN0cmluZyxcbiAgICAgICAgICAgIC4uLihvYnNlcnZlckFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8YW55PilcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB1cGRhdGUgb2JzZXJ2YWJsZXMgZm9yIHRhYmxlICR7dGFibGV9IGV2ZW50ICR7ZXZlbnR9IGlkOiAke3BheWxvYWQuaWR9OiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZWFkIGV2ZW50IGZvciBjaGFpbmNvZGUgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZX1cIiBvbiBjaGFubmVsIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWx9XCI6ICR7ZX1gXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5jbG9zZShjdHgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGV2ZW50IGxpc3RlbmVyXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgZXZlbnQgZGlzcGF0Y2hpbmcgZm9yIHRoZSBvYnNlcnZlZCBhZGFwdGVyLiBXaGVuXG4gICAqIGBzeW50aGV0aWNFdmVudHNgIGlzIHRydWUgKHRoZSBkZWZhdWx0KSBubyBnYXRld2F5IGNvbm5lY3Rpb24gaXMgb3BlbmVkO1xuICAgKiBpbnN0ZWFkIGV2ZXJ5IENSVUQgb3BlcmF0aW9uIGlzIHdyYXBwZWQgd2l0aCBhIFByb3h5IHRoYXQgZmlyZXNcbiAgICogYHVwZGF0ZU9ic2VydmVyc2AgZm9yICoqYWxsKiogbW9kZWxzLiBXaGVuIGBzeW50aGV0aWNFdmVudHNgIGlzIGZhbHNlIHRoZVxuICAgKiBleGlzdGluZyBnYXRld2F5LWJhc2VkIGNoYWluY29kZS1ldmVudCBzdWJzY3JpcHRpb24gaXMgZXN0YWJsaXNoZWQgYW5kIHRoZVxuICAgKiBsb2NhbCBQcm94eSBmYWxsYmFjayBpcyBsaW1pdGVkIHRvIGZ1bGx5LXNlZ3JlZ2F0ZWQgKHRyYW5zaWVudCkgbW9kZWxzIG9ubHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIG9yIGNvbmZpZyBvYnNlcnZlZCBmb3IgZGlzcGF0Y2hgKTtcblxuICAgIGNvbnN0IHN5bnRoZXRpY0V2ZW50cyA9IHRoaXMuYWRhcHRlci5jb25maWcuc3ludGhldGljRXZlbnRzICE9PSBmYWxzZTtcblxuICAgIGlmICghc3ludGhldGljRXZlbnRzKSB7XG4gICAgICAvLyBHYXRld2F5LWJhc2VkIGNoYWluY29kZS1ldmVudCBzdWJzY3JpcHRpb24gKG5vbi1zeW50aGV0aWMgcGF0aClcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgXCJkaXNwYXRjaFwiLFxuICAgICAgICB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgICBNb2RlbCBhcyBhbnlcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLmluaXRpYWxpemUpO1xuICAgICAgY29uc3QgZ2F0ZXdheSA9IGF3YWl0IEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0R2F0ZXdheShcbiAgICAgICAgY3R4LFxuICAgICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnIGFzIFBlZXJDb25maWcsXG4gICAgICAgIHRoaXMuY2xpZW50XG4gICAgICApO1xuICAgICAgY29uc3QgbmV0d29yayA9IGdhdGV3YXkuZ2V0TmV0d29yayh0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWwpO1xuICAgICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaGApO1xuICAgICAgdGhpcy5saXN0ZW5pbmdTdGFjayA9IGF3YWl0IG5ldHdvcmsuZ2V0Q2hhaW5jb2RlRXZlbnRzKFxuICAgICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWVcbiAgICAgICk7XG4gICAgICB0aGlzLmhhbmRsZUV2ZW50cyhjdHgpO1xuICAgIH1cblxuICAgIC8vIFByb3h5IENSVUQgbWV0aG9kcy5cbiAgICAvLyDigKIgc3ludGhldGljRXZlbnRzID0gdHJ1ZSAg4oaSIG5vdGlmeSBmb3IgQUxMIG1vZGVscyAocmVwbGFjZXMgZ2F0ZXdheSBldmVudHMgZW50aXJlbHkpXG4gICAgLy8g4oCiIHN5bnRoZXRpY0V2ZW50cyA9IGZhbHNlIOKGkiBub3RpZnkgb25seSBmb3IgZnVsbHktc2VncmVnYXRlZCAodHJhbnNpZW50KSBtb2RlbHNcbiAgICAvLyAgICh0aGUgZ2F0ZXdheSBzdWJzY3JpcHRpb24gaGFuZGxlcyBwdWJsaWMgbW9kZWxzKVxuICAgIChcbiAgICAgIFtcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEwsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCxcbiAgICAgIF0gYXMgKGtleW9mIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PilbXVxuICAgICkuZm9yRWFjaCgodG9XcmFwKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlcilcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE5vIGFkYXB0ZXIgcHJvdmlkZWQgZm9yIHRoZSBmYWxsYmFjayBvZiBmdWxseSBzZWdyZWdhdGVkIG1vZGVsc2BcbiAgICAgICAgKTtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyW3RvV3JhcF0pXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNZXRob2QgJHt0b1dyYXB9IG5vdCBmb3VuZCBpbiAke3RoaXMuYWRhcHRlci5hbGlhc30gYWRhcHRlciB0byBiaW5kIE9ic2VydmFibGVzIERpc3BhdGNoYFxuICAgICAgICApO1xuXG4gICAgICBsZXQgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcy5hZGFwdGVyLCB0b1dyYXApO1xuICAgICAgbGV0IHByb3RvOiBhbnkgPSB0aGlzLmFkYXB0ZXI7XG4gICAgICB3aGlsZSAoIWRlc2NyaXB0b3IgJiYgcHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgICAgICBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgdG9XcmFwKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkZXNjcmlwdG9yIHx8ICFkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBtZXRob2QgJHt0b1dyYXB9IHRvIGJpbmQgT2JzZXJ2YWJsZXMgRGlzcGF0Y2hgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGJ1bGtUb1NpbmdsZShtZXRob2Q6IHN0cmluZykge1xuICAgICAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5DUkVBVEU7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLlVQREFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuREVMRVRFO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYmVjYXVzZSB0aGVyZSBhcmUgcmVhZCBvbmx5IHByb3BlcnRpZXNcbiAgICAgIHRoaXMuYWRhcHRlclt0b1dyYXBdID0gbmV3IFByb3h5KHRoaXMuYWRhcHRlclt0b1dyYXBdLCB7XG4gICAgICAgIGFwcGx5OiBhc3luYyAoXG4gICAgICAgICAgdGFyZ2V0OiBhbnksXG4gICAgICAgICAgdGhpc0FyZzogRmFicmljQ2xpZW50QWRhcHRlcixcbiAgICAgICAgICBhcmdBcnJheTogYW55W11cbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgLy8gUnVuIHRoZSBvcmlnaW5hbCBtZXRob2QgdW5jaGFuZ2VkIHNvIHRyYW5zaWVudCBkYXRhIGlzIHByZXNlcnZlZFxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhcmdldC5hcHBseSh0aGlzQXJnLCBhcmdBcnJheSk7XG5cbiAgICAgICAgICBjb25zdCBjbGF6ejogQ29uc3RydWN0b3I8YW55PiA9IGFyZ0FycmF5WzBdO1xuICAgICAgICAgIC8vIFdoZW4gc3ludGhldGljRXZlbnRzIGlzIGZhbHNlLCBwdWJsaWMgbW9kZWxzIGVtaXQgYSBjaGFpbmNvZGUgZXZlbnRcbiAgICAgICAgICAvLyBvbiB0aGUgY29udHJhY3Qgc2lkZTsgc2tpcCB0aGUgbG9jYWwgZmFsbGJhY2sgdG8gYXZvaWRcbiAgICAgICAgICAvLyBkb3VibGUtbm90aWZpY2F0aW9uLiBXaGVuIHN5bnRoZXRpY0V2ZW50cyBpcyB0cnVlIHdlIGhhbmRsZSBhbGwgbW9kZWxzLlxuICAgICAgICAgIGlmICghc3ludGhldGljRXZlbnRzICYmICFNb2RlbC5pc1RyYW5zaWVudChjbGF6eikpIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgICAvLyBDb250ZXh0IGlzIGFsd2F5cyB0aGUgbGFzdCBlbGVtZW50IG9mIGFyZ0FycmF5XG4gICAgICAgICAgY29uc3QgeyBsb2csIGN0eEFyZ3MsIGN0eCB9ID0gdGhpc0FyZ1tcImxvZ0N0eFwiXShcbiAgICAgICAgICAgIGFyZ0FycmF5LnNsaWNlKGFyZ0FycmF5Lmxlbmd0aCAtIDEpLFxuICAgICAgICAgICAgdGFyZ2V0XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBpZHMgPSBhcmdBcnJheVsxXTtcbiAgICAgICAgICBjb25zdCByZXN1bHRBcmdzOiBhbnlbXSA9IFtjbGF6eiwgYnVsa1RvU2luZ2xlKHRvV3JhcCksIGlkc107XG5cbiAgICAgICAgICBpZiAoY3R4LmdldE9yVW5kZWZpbmVkKFwib2JzZXJ2ZUZ1bGxSZXN1bHRcIikpIHtcbiAgICAgICAgICAgIHJlc3VsdEFyZ3MucHVzaChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgICAgICAgIC4uLihyZXN1bHRBcmdzIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHRoaXMudXBkYXRlT2JzZXJ2ZXJzPiksXG4gICAgICAgICAgICAuLi5jdHhBcmdzXG4gICAgICAgICAgKS5jYXRjaCgoZTogdW5rbm93bikgPT5cbiAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBkaXNwYXRjaCBvYnNlcnZlciByZWZyZXNoIGZvciAke3RvV3JhcH0gb24gJHtjbGF6ei5uYW1lIHx8IGNsYXp6fSBmb3IgJHtpZHN9OiAke2V9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5cbmlmIChGYWJyaWNDbGllbnRBZGFwdGVyKVxuICBGYWJyaWNDbGllbnRBZGFwdGVyW1wiX2Jhc2VEaXNwYXRjaFwiXSA9IEZhYnJpY0NsaWVudERpc3BhdGNoO1xuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0UjI1wiO1xuXG5NZXRhZGF0YS5yZWdpc3RlckxpYnJhcnkoUEFDS0FHRV9OQU1FLCBWRVJTSU9OKTtcbiJdLCJuYW1lcyI6WyJlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UiLCJmaWxlUGF0aCIsImZzIiwicmVxdWlyZSIsInBhdGgiLCJkaXJuYW1lIiwiZXhpc3RzU3luYyIsIm1rZGlyU3luYyIsImdlbmVyYXRlTW9kZWxJbmRleGVzIiwibSIsImdlbmVyYXRlSW5kZXhlcyIsImdlbmVyYXRlTW9kZWxEZXNpZ25Eb2NzIiwiYWNjdW0iLCJ2aWV3cyIsImdlbmVyYXRlVmlld3MiLCJzdG9yYWdlIiwiZm9yRWFjaCIsImRvYyIsIl9pZCIsInJlYWRNb2RlbEZpbGUiLCJmaWxlIiwiZXhwb3J0cyIsImpvaW4iLCJwcm9jZXNzIiwiY3dkIiwicGFyZW50UGF0aCIsIm5hbWUiLCJ2YWx1ZXMiLCJPYmplY3QiLCJmaWx0ZXIiLCJlIiwiTW9kZWwiLCJhc3luYyIsInJlYWRNb2RlbEZvbGRlcnMiLCJmb2xkZXJzIiwicmVzdWx0IiwiZm9sZGVyIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsIndpdGhGaWxlVHlwZXMiLCJyZWN1cnNpdmUiLCJmIiwiaXNGaWxlIiwiZW5kc1dpdGgiLCJwdXNoIiwid3JpdGVJbmRleGVzIiwiaW5kZXhlcyIsInAiLCJjb2xsZWN0aW9uIiwiaW5kZXgiLCJyZXNvbHZlIiwid3JpdGVGaWxlU3luYyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bmRlZmluZWQiLCJ3cml0ZURlc2lnbkRvY3MiLCJkZXNpZ25Eb2NzIiwibGVuZ3RoIiwiZG9jSWQiLCJyZXBsYWNlIiwicGF5bG9hZCIsIl9yZXYiLCJjb2xsZWN0aW9uRm9yIiwiY29sbGVjdGlvbk5hbWUiLCJwb2xpY3kiLCJyZXF1aXJlZFBlZXJDb3VudCIsIm1heFBlZXJDb3VudCIsImJsb2NrVG9MaXZlIiwibWVtYmVyT25seVJlYWQiLCJtZW1iZXJPbmx5V3JpdGUiLCJwcml2YXRlQ29sbGVjdGlvbkZvciIsIm1zcElkIiwiYyIsImVuZG9yc2VtZW50UG9saWN5Iiwic2lnbmF0dXJlUG9saWN5Iiwic2hhcmVkQ29sbGVjdGlvbkZvciIsIm1zcElkcyIsIm1hcCIsImV4dHJhY3RDb2xsZWN0aW9ucyIsIm92ZXJyaWRlcyIsIm1pcnJvciIsInByaXZhdGVDb2xzIiwic2hhcmVkQ29scyIsImNvbGxlY3Rpb25zRm9yIiwicmVzb2x2ZUNvbGxlY3Rpb24iLCJhcmciLCJJbnRlcm5hbEVycm9yIiwicHJpdmF0ZURlZmF1bHRzIiwiYXNzaWduIiwic2hhcmVkRGVmYXVsdHMiLCJtaXJyb3JNZXRhIiwibWlycm9yZWRBdCIsInByaXZhdGVzIiwiZmxhdCIsInJlc29sdmVkIiwicmVzb2x2ZXIiLCJzb21lIiwiaW5jbHVkZXMiLCJzaGFyZWQiLCJ3cml0ZUNvbGxlY3Rpb25zIiwiY29scyIsImZpbGVOYW1lIiwid3JpdGVDb2xsZWN0aW9uRGVzaWduRG9jcyIsImRvY3MiLCJGYWJyaWNDbGllbnRQYWdpbmF0b3IiLCJQYWdpbmF0b3IiLCJjb25zdHJ1Y3RvciIsImFkYXB0ZXIiLCJxdWVyeSIsInNpemUiLCJjbGF6eiIsInN1cGVyIiwicHJlcGFyZSIsInJhd1N0YXRlbWVudCIsIlVuc3VwcG9ydGVkRXJyb3IiLCJwYWdlIiwiYXJncyIsImlzU2VyaWFsaXplZFBhZ2UiLCJvYmoiLCJBcnJheSIsImlzQXJyYXkiLCJkYXRhIiwiRmFicmljQ2xpZW50UmVwb3NpdG9yeSIsIlJlcG9zaXRvcnkiLCJmb3JjZSIsInRoaXMiLCJfb3ZlcnJpZGVzIiwiaWdub3JlVmFsaWRhdGlvbiIsImlnbm9yZUhhbmRsZXJzIiwiYWxsb3dSYXdTdGF0ZW1lbnRzIiwiZm9yY2VQcmVwYXJlU2ltcGxlUXVlcmllcyIsImZvcmNlUHJlcGFyZUNvbXBsZXhRdWVyaWVzIiwiYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUiLCJyZWJ1aWxkV2l0aFRyYW5zaWVudCIsIm92ZXJyaWRlIiwiZmxhZ3MiLCJmb3IiLCJPYnNlcnZlckhhbmRsZXIiLCJwYWdpbmF0ZUJ5Iiwia2V5Iiwib3JkZXIiLCJyZWYiLCJvZmZzZXQiLCJsaW1pdCIsImxvZyIsImN0eEFyZ3MiLCJsb2dDdHgiLCJQcmVwYXJlZFN0YXRlbWVudEtleXMiLCJQQUdFX0JZIiwidmVyYm9zZSIsInRhYmxlTmFtZSIsImNsYXNzIiwic3RhdGVtZW50IiwiYm9va21hcmsiLCJsaXN0QnkiLCJMSVNUX0JZIiwiZmluZEJ5IiwidmFsdWUiLCJGSU5EX0JZIiwiZmluZE9uZUJ5IiwiRklORF9PTkVfQlkiLCJmaW5kIiwiT3JkZXJEaXJlY3Rpb24iLCJBU0MiLCJGSU5EIiwiZGlyZWN0aW9uIiwiUEFHRSIsImN0eCIsIlBlcnNpc3RlbmNlS2V5cyIsIlNUQVRFTUVOVCIsImNhbGxBcmdzIiwic2xpY2UiLCJwYXJzZSIsImRlY29kZSIsImV2YWx1YXRlVHJhbnNhY3Rpb24iLCJoeWRyYXRlZCIsInIiLCJDb3VjaERCS2V5cyIsIlRBQkxFIiwiZCIsImFwcGx5QWZ0ZXJSZWFkIiwiZ2V0T3JVbmRlZmluZWQiLCJlbmZvcmNlREJEZWNvcmF0b3JzIiwiT3BlcmF0aW9uS2V5cyIsIlJFQUQiLCJBRlRFUiIsIlByb21pc2UiLCJhbGwiLCJlbnRyeSIsImNvdW50T2YiLCJDT1VOVF9PRiIsInN0bXRBcmdzIiwibWF4T2YiLCJNQVhfT0YiLCJtaW5PZiIsIk1JTl9PRiIsImF2Z09mIiwiQVZHX09GIiwic3VtT2YiLCJTVU1fT0YiLCJkaXN0aW5jdE9mIiwiRElTVElOQ1RfT0YiLCJncm91cE9mIiwiR1JPVVBfT0YiLCJoZWFsdGhjaGVjayIsImNyZWF0ZSIsIm1vZGVsIiwiZGVidWciLCJlbnN1cmVMZWdhY3lNaXJyb3JGbGFnIiwicHJlcGFyZWQiLCJyZWNvcmQiLCJpZCIsInRyYW5zaWVudCIsInJldmVydCIsInVwZGF0ZSIsImNyZWF0ZUFsbFByZWZpeCIsIm1vZGVscyIsIkNSRUFURSIsImdldCIsImlnbm9yZVZhbGlkYXRlIiwiT04iLCJpZ25vcmVkUHJvcHMiLCJlcnJvcnMiLCJoYXNFcnJvcnMiLCJlcnJvck1lc3NhZ2VzIiwicmVkdWNlRXJyb3JzVG9QcmludCIsIlZhbGlkYXRpb25FcnJvciIsImNyZWF0ZUFsbCIsImlkcyIsInBheWxvYWRzIiwidHJhbnNpZW50cyIsImNyZWF0ZWQiLCJpIiwicmVhZEFsbCIsImtleXMiLCJyZWNvcmRzIiwidXBkYXRlQWxsIiwidXBkYXRlZCIsInUiLCJhY2N1bXVsYXRlIiwibGVnYWN5IiwiRVJDMjBUb2tlbiIsIkJhc2VNb2RlbCIsIl9fZGVjb3JhdGUiLCJwayIsInR5cGUiLCJTdHJpbmciLCJwcm90b3R5cGUiLCJjb2x1bW4iLCJyZXF1aXJlZCIsInRhYmxlIiwiRVJDMjBXYWxsZXQiLCJBbGxvd2FuY2UiLCJDbGllbnRTZXJpYWxpemVyIiwiSlNPTlNlcmlhbGl6ZXIiLCJwcmVTZXJpYWxpemUiLCJtb2RlbE5hbWUiLCJ0b1NlcmlhbGl6ZSIsIm1ldGFkYXRhIiwiTWV0YWRhdGEiLCJTZXJpYWxpemF0aW9uRXJyb3IiLCJNb2RlbEtleXMiLCJBTkNIT1IiLCJkZXNlcmlhbGl6ZSIsInN0ciIsImRlc2VyaWFsaXphdGlvbiIsImNsYXNzTmFtZSIsIkVycm9yIiwiYnVpbGQiLCJzZXJpYWxpemUiLCJGYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnkiLCJzZXJpYWxpemVyIiwiZGVjb2RlciIsIlRleHREZWNvZGVyIiwidXBkYXRlT2JzZXJ2ZXJzIiwiZXZlbnQiLCJvYnNlcnZlckhhbmRsZXIiLCJjb3VudCIsInBhcnNlZElkIiwiU2VxdWVuY2UiLCJwYXJzZVZhbHVlIiwic2VxdWVuY2VGb3IiLCJ0b2tlbk5hbWUiLCJzeW1ib2wiLCJkZWNpbWFscyIsIk51bWJlciIsInRvdGFsU3VwcGx5IiwidG90YWwiLCJiYWxhbmNlT2YiLCJvd25lciIsImJhbGFuY2UiLCJ0cmFuc2ZlciIsInRvIiwidHJhbnNmZXJyZWQiLCJzdWJtaXRUcmFuc2FjdGlvbiIsInRvU3RyaW5nIiwidHJhbnNmZXJGcm9tIiwiZnJvbSIsImNvbnRleHRBcmdzIiwiQ29udGV4dCIsImFwcHJvdmUiLCJzcGVuZGVyIiwiYXBwcm92ZWQiLCJhbGxvd2FuY2UiLCJpbml0aWFsaXplIiwidG9rZW4iLCJpbml0aWxpYXplZCIsImNoZWNrSW5pdGlhbGl6ZWQiLCJtaW50IiwiYW1vdW50IiwiYnVybiIsImJ1cm5Gcm9tIiwiYWNjb3VudCIsImNsaWVudEFjY291bnRCYWxhbmNlIiwic2VyaWFsaXplZEFjY291bnRCYWxhbmNlIiwiY2xpZW50QWNjb3VudElEIiwiZXh0cmFjdElkcyIsImNvbXBvc2VkIiwicGtQcm9wcyIsImV4dHJhY3RJZCIsImNvbXBvc2VBdHRyaWJ1dGVWYWx1ZSIsIklkZW50aXR5Q3JlZGVudGlhbHMiLCJkZXNjcmlwdGlvbiIsIkZhYnJpY01vZGVsS2V5cyIsIklkZW50aXR5VHlwZSIsIkZhYnJpY0ZsYXZvdXIiLCJJZGVudGl0eSIsIlg1MDkiLCJvbmVUb09uZSIsIkNhc2NhZGUiLCJDQVNDQURFIiwiZGVsZXRlIiwiQ29yZVV0aWxzIiwibG9nZ2VyIiwiTWluaUxvZ2dlciIsImNvbnRlbnRPZkxvYWRGaWxlIiwiY29udGVudE9yUGF0aCIsImZpbGVSZWFkZXIiLCJVaW50OEFycmF5IiwibWF0Y2giLCJyZWFkRmlsZSIsInByb21pc2VzIiwibm9ybWFsaXplSW1wb3J0IiwiaW1wb3J0IiwiZ2V0Q0FVc2VyIiwidXNlck5hbWUiLCJwcml2YXRlS2V5IiwiY2VydGlmaWNhdGUiLCJvcHRpb25zIiwic3RyaW5nRm9ybWF0IiwidXNlciIsIlVzZXIiLCJjb25maWciLCJoc20iLCJzb2Z0d2FyZSIsImxpYiIsImxpYnJhcnkiLCJzbG90IiwibGFiZWwiLCJ0b2tlbkxhYmVsIiwicGluIiwiY3J5cHRvU3VpdGUiLCJnZXRDcnlwdG9TdWl0ZSIsInNldENyeXB0b1N1aXRlIiwiZW5yb2xsbWVudEtleSIsImdldEhTTUVucm9sbG1lbnRLZXkiLCJnZXRTb2Z0d2FyZUVucm9sbG1lbnRLZXkiLCJzZXRFbnJvbGxtZW50IiwibmV3Q3J5cHRvU3VpdGUiLCJjcmVhdGVLZXlGcm9tUmF3Iiwic2tpIiwia2V5SWRIZXgiLCJ0cmltIiwiQnVmZmVyIiwiZ2V0Q2VydGlmaWNhdGVTS0kiLCJnZXRLZXkiLCJpc1ByaXZhdGUiLCJ4NTA5IiwiWDUwOUNlcnRpZmljYXRlIiwiandrIiwicHVibGljS2V5IiwiZXhwb3J0IiwiZm9ybWF0IiwicHJlZml4IiwieCIsInkiLCJjcnlwdG8iLCJjcmVhdGVIYXNoIiwiY29uY2F0IiwiZGlnZXN0IiwiZ2V0SWRlbnRpdHkiLCJjZXJ0RGlyZWN0b3J5UGF0aCIsImlkZW50aXR5RmlsZVJlYWRlciIsImNlcnRQYXRoIiwiZ2V0Rmlyc3REaXJGaWxlTmFtZSIsImNyZWRlbnRpYWxzIiwiZGlyUGF0aCIsInJlYWRkaXIiLCJnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudCIsImdldEZpbGVDb250ZW50IiwiZ2V0U2lnbmVyIiwia2V5RGlyZWN0b3J5UGF0aCIsInNpZ25lckZpbGVSZWFkZXIiLCJrZXlQYXRoIiwicHJpdmF0ZUtleVBlbSIsImV4dHJhY3RQcml2YXRlS2V5IiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiayIsInNpZ25lcnMiLCJuZXdQcml2YXRlS2V5U2lnbmVyIiwicGVtIiwibGliTmFtZSIsInN1YnRsZSIsImdsb2JhbFRoaXMiLCJ3aW5kb3ciLCJDcnlwdG8iLCJ3ZWJjcnlwdG8iLCJzdHIyYWIiLCJidWYiLCJBcnJheUJ1ZmZlciIsImJ1ZlZpZXciLCJzdHJMZW4iLCJjaGFyQ29kZUF0IiwicmVwbGFjZUFsbCIsImRlY29kZWQiLCJiaW5hcnlEZXIiLCJpbXBvcnRLZXkiLCJuYW1lZEN1cnZlIiwiZ2V0QWtpQW5kU2VyaWFsRnJvbUNlcnQiLCJjZXJ0IiwieDUwOUNlcnRpZmljYXRlIiwiWDUwOUNlcnQiLCJha2lFeHQiLCJleHRlbnNpb25zIiwiYWtpIiwidG9VcHBlckNhc2UiLCJzdGFydHNXaXRoIiwic2VyaWFsIiwic2VyaWFsTnVtYmVyIiwiY3J5cHRvUHJvdmlkZXIiLCJzZXQiLCJCQVNFX0FMUEhBQkVUIiwiQ1JZUFRPIiwiQmFzZUVuY29kZXIiLCJhbHBoYWJldCIsImJhc2VNYXAiLCJqIiwiY2hhckF0IiwieGMiLCJiYXNlIiwibGVhZGVyIiwiZmFjdG9yIiwiTWF0aCIsImlGYWN0b3IiLCJlbmNvZGUiLCJzb3VyY2UiLCJpc1ZpZXciLCJidWZmZXIiLCJieXRlT2Zmc2V0IiwiYnl0ZUxlbmd0aCIsInplcm9lcyIsInBiZWdpbiIsInBlbmQiLCJiNTgiLCJjYXJyeSIsIml0MSIsIml0MiIsInJlcGVhdCIsImRlY29kZVVuc2FmZSIsInBzeiIsImIyNTYiLCJpdDMiLCJpdDQiLCJ2Y2giLCJDcnlwdG9VdGlscyIsImI1OGVuY29kZXIiLCJCQVNFNTgiLCJmYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZSIsInN1YmplY3QiLCJpc3N1ZXIiLCJzdHJpbmdUb0FycmF5QnVmZmVyIiwiZXh0cmFjdEtleSIsInVzYWdlcyIsIlJlZ0V4cCIsImV4dHJhY3RQdWJsaWNLZXkiLCJzaWduIiwiYnVmZiIsImhhc2giLCJiIiwicGFkU3RhcnQiLCJ2ZXJpZnkiLCJzaWduYXR1cmUiLCJlbmNyeXB0IiwiZ2V0U3VidGxlQ3J5cHRvIiwiaXNCcm93c2VyIiwiZGVjcnlwdCIsImdldE1hc3RlciIsInRleHRFbmNvZGVyIiwiVGV4dEVuY29kZXIiLCJnZW5HZW5lc2lzIiwicmFuZG9tVVVJRCIsImltcG9ydGVkS2V5IiwiS0VZX0FMR09SWVRITSIsIml2IiwiZ2V0RGVyaXZhdGlvbktleSIsInNhbHQiLCJzYWx0QnVmZmVyIiwic2FsdEhhc2hlZCIsInBhcmFtcyIsIkhBU0giLCJpdGVyYXRpb25zIiwiSVRFUkFUSU9OUyIsImRlcml2YXRpb24iLCJkZXJpdmVCaXRzIiwiS0VZTEVOR1RIIiwiaXZsZW4iLCJrZXlsZW4iLCJkZXJpdmVkS2V5IiwiaW1wb3J0ZWRFbmNyeXB0aW9uS2V5IiwiQUxHT1JZVEhNIiwiZW5jcnlwdFBpbiIsInRleHQiLCJrZXlPYmplY3QiLCJ0ZXh0QnVmZmVyIiwiZW5jcnlwdGVkVGV4dCIsImRlY3J5cHRQaW4iLCJ0ZXh0RGVjb2RlciIsImRlY3J5cHRlZFRleHQiLCJPdmVyZmxvd0Vycm9yIiwibXNnIiwiQmFsYW5jZUVycm9yIiwiQWxsb3dhbmNlRXJyb3IiLCJSZWdpc3RyYXRpb25FcnJvciIsIkF1dGhvcml6YXRpb25FcnJvciIsIk1pc3NpbmdDb250ZXh0RXJyb3IiLCJVbmF1dGhvcml6ZWRQcml2YXRlRGF0YUFjY2VzcyIsIkJhc2VFcnJvciIsIk5vdEluaXRpYWxpemVkRXJyb3IiLCJNaXNzaW5nUEtDU1MxMUxpYiIsIkVuZG9yc2VtZW50RXJyb3IiLCJtZXNzYWdlIiwiTXZjY1JlYWRDb25mbGljdEVycm9yIiwiUGhhbnRvbVJlYWRDb25mbGljdEVycm9yIiwiRW5kb3JzZW1lbnRQb2xpY3lFcnJvciIsIlRyYW5zYWN0aW9uTGltaXRzRXJyb3IiLCJjb2RlIiwiVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IiLCJUcmFuc2FjdGlvbkJ1ZmZlclNpemVFcnJvciIsIkhGQ0FJZGVudGl0eVR5cGUiLCJIRkNBSWRlbnRpdHlBdHRyaWJ1dGVzIiwiRmFicmljRW5yb2xsbWVudFNlcnZpY2UiLCJMb2dnZWRDbGFzcyIsImNhQ29uZmlnIiwiY2FOYW1lIiwiY2FDZXJ0IiwiY2FLZXkiLCJ1cmwiLCJDQSIsImNhIiwidGxzIiwidHJ1c3RlZFJvb3RzIiwicm9vdCIsIkZhYnJpY0NBU2VydmljZXMiLCJDbGllbnQiLCJjbGllbnQiLCJDZXJ0aWZpY2F0ZSIsImNlcnRpZmljYXRlU2VydmljZSIsIm5ld0NlcnRpZmljYXRlU2VydmljZSIsIkFmZmlsaWF0aW9ucyIsImFmZmlsaWF0aW9uU2VydmljZSIsIm5ld0FmZmlsaWF0aW9uU2VydmljZSIsIklkZW50aXRpZXMiLCJpZGVudGl0eVNlcnZpY2UiLCJuZXdJZGVudGl0eVNlcnZpY2UiLCJnZXRDZXJ0aWZpY2F0ZXMiLCJyZXF1ZXN0IiwiZG9NYXAiLCJyZXNwb25zZSIsImNlcnRzIiwiUEVNIiwiZ2V0SWRlbnRpdGllcyIsImlkZW50aXRpZXNTZXJ2aWNlIiwiZ2V0QWxsIiwiaWRlbnRpdGllcyIsInBhcnNlRXJyb3IiLCJyZWdleHAiLCJleGVjIiwiQ29uZmxpY3RFcnJvciIsImdldEFmZmlsaWF0aW9ucyIsImEiLCJyZWFkIiwiZW5yb2xsbWVudElkIiwiZ2V0T25lIiwiTm90Rm91bmRFcnJvciIsInN1Y2Nlc3MiLCJyZWdpc3RlciIsImlzU3VwZXJVc2VyIiwiYWZmaWxpYXRpb24iLCJ1c2VyUm9sZSIsImF0dHJzIiwibWF4RW5yb2xsbWVudHMiLCJyZWdpc3RyYXRpb24iLCJwYXNzd29yZCIsInByb3BzIiwiZW5yb2xsbWVudElEIiwiZW5yb2xsbWVudFNlY3JldCIsImluZm8iLCJpZGVudGl0eUZyb21FbnJvbGxtZW50IiwiZW5yb2xsbWVudCIsInJvb3RDZXJ0aWZpY2F0ZSIsIkxvZ2dpbmciLCJjbGllbnRJZCIsIm5vdyIsIkRhdGUiLCJ0b0J5dGVzIiwiY3JlYXRlZE9uIiwidXBkYXRlZE9uIiwiZW5yb2xsIiwiaWRlbnRpdHkiLCJyZWdpc3RlckFuZEVucm9sbCIsInJldm9rZSIsInJlYXNvbiIsIlJlZ2lzdHJhdGlvblJlcXVlc3RCdWlsZGVyIiwiZXJycyIsInJvbGUiLCJzZXRBZmZpbGlhdGlvbiIsImFkZEF0dHIiLCJhdHRyIiwic2V0QXR0cnMiLCJzZXRFbnJvbGxtZW50SUQiLCJzZXRFbnJvbGxtZW50U2VjcmV0Iiwic2V0TWF4RW5yb2xsbWVudHMiLCJzZXRSb2xlIiwibWlubGVuZ3RoIiwibWluIiwiRVJDMjBFdmVudHMiLCJGYWJyaWNCYXNlTW9kZWwiLCJjcmVhdGVkQXQiLCJ1cGRhdGVkQXQiLCJ2ZXJzaW9uIiwidXNlcyIsIkZhYnJpY0lkZW50aWZpZWRCYXNlTW9kZWwiLCJjcmVhdGVkQnkiLCJ1cGRhdGVkQnkiLCJpc1NoYXJlZCIsInNlZ3JlZ2F0ZSIsImlzVHJhbnNpZW50IiwiZGVjb3JhdGVkUHJvcGVydGllcyIsImdldEF0dHJpYnV0ZXMiLCJ0cmFuc2llbnRQcm9wcyIsIkRCS2V5cyIsIlRSQU5TSUVOVCIsInByaXZhdGVQcm9wZXJ0aWVzIiwiUFJJVkFURSIsInNoYXJlZFByb3BlcnRpZXMiLCJTSEFSRUQiLCJwdWJsaWMiLCJ0cmFuc2llbnRLZXlzIiwicHJpdmF0ZUtleXMiLCJzaGFyZWRLZXlzIiwiaXNQdWJsaWMiLCJiaW5kIiwibWlycm9yZWQiLCJGQUJSSUMiLCJNSVJST1IiLCJvd25lck9mIiwibWV0YSIsIk9XTkVEX0JZIiwic2hhcmVkS2V5IiwiY29uc3RyIiwicHJpdmF0ZU1ldGEiLCJzaGFyZWRNZXRhIiwiY29sbGVjdGlvbnMiLCJleHRyYWN0TXNwSWQiLCJnZXRNU1BJRCIsIk93bmVyIiwidGFyZ2V0IiwicHJvcGVydHlLZXkiLCJkZXNjcmlwdG9yIiwib3JpZ2luYWxNZXRob2QiLCJhY291bnRJZCIsImNsaWVudElkZW50aXR5IiwiZ2V0SUQiLCJzZWxlY3QiLCJ0b2tlbnMiLCJleGVjdXRlIiwiYXBwbHkiLCJvd25lZEJ5T25DcmVhdGUiLCJjb250ZXh0Iiwic3R1YiIsImNyZWF0b3IiLCJnZXRDcmVhdG9yIiwibXNwaWQiLCJzZXRPd25lZEJ5S2V5VmFsdWUiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsIm93bmVkQnkiLCJhdHRyaWJ1dGUiLCJnZW5lcmF0ZWQiLCJyZWFkb25seSIsIm9uQ3JlYXRlIiwicHJvcE1ldGFkYXRhIiwiRGVjb3JhdGlvbiIsImRlZmluZSIsImRlY29yYXRvciIsInRyYW5zYWN0aW9uSWRPbkNyZWF0ZSIsImdldFR4SUQiLCJ0cmFuc2FjdGlvbklkIiwib25VcGRhdGUiLCJUUkFOU0FDVElPTl9JRCIsImV2YWxNaXJyb3JNZXRhZGF0YSIsImNyZWF0ZU1pcnJvckhhbmRsZXIiLCJmYWJyaWNDdHgiLCJzb3VyY2VNb2RlbCIsInB1dCIsInJlcG8iLCJtaXJyb3JDb2xsZWN0aW9uIiwidXBkYXRlTWlycm9ySGFuZGxlciIsImFwcGx5VXBkYXRlVmFsaWRhdGlvbiIsIm1lcmdlRm9yVXBkYXRlIiwiZGVsZXRlTWlycm9ySGFuZGxlciIsInBrUHJvcCIsInNlZ3JlZ2F0ZWQiLCJtaXJyb3JXcml0ZUd1YXJkIiwibXNwIiwiY29uZGl0aW9uIiwicmVhZE1pcnJvckhhbmRsZXIiLCJtYXRjaGVzIiwicmVhZEZyb20iLCJtc3BJZE9yQ29uZGl0aW9uIiwiaXNDb25kaXRpb25Pbmx5IiwiQm9vbGVhbiIsImNvbmQiLCJvblJlYWQiLCJwcmlvcml0eSIsIm9uRGVsZXRlIiwiTW9kZWxDb2xsZWN0aW9uIiwib3JnTmFtZSIsInRvUGFzY2FsQ2FzZSIsIk5hbWVzcGFjZUNvbGxlY3Rpb24iLCJuYW1lc3BhY2UiLCJJbXBsaWNpdFByaXZhdGVDb2xsZWN0aW9uIiwiU0VHUkVHQVRFRF9DT0xMRUNUSU9OX0VYVFJBQ1RJT05fUFJJT1JJVFkiLCJhcHBseVNlZ3JlZ2F0aW9uRmxhZ3MiLCJpc0Z1bGx5U2VncmVnYXRlZCIsImhhc1B1YmxpY1Byb3BlcnRpZXMiLCJtYXJrRnVsbHlTZWdyZWdhdGVkIiwiYXBwbHlNaXJyb3JGbGFncyIsImF0dHJpYnV0ZXMiLCJ0cmFuc2llbnRNZXRhIiwiZXh0cmFjdFNlZ3JlZ2F0ZWRDb2xsZWN0aW9ucyIsImRhdGFBcnJheSIsImNvbGxlY3Rpb25SZXNvbHZlciIsInNlcU5hbWUiLCJzZXF1ZW5jZU5hbWUiLCJzZXRTZXF1ZW5jZVNlZ3JlZ2F0aW9uIiwic2VncmVnYXRlZERhdGFPbkNyZWF0ZSIsImtleUFycmF5IiwiX2siLCJrZXlTdHJpbmdzIiwid3JpdGVUbyIsInNlZ3JlZ2F0ZWREYXRhT25SZWFkIiwic2VncmVnYXRlZERhdGFPblVwZGF0ZSIsIm9sZE1vZGVsIiwic2VncmVnYXRlZERhdGFPbkRlbGV0ZSIsImlubmVyU2VncmVnYXRlZCIsInNlZ3JlZ2F0ZWREZWMiLCJTZXQiLCJhZGQiLCJjb25zdHJNZXRhIiwiY29uc3RyQ29sbGVjdGlvbnMiLCJ1cGRhdGVkVHJhbnNpZW50TWV0YSIsImRlY3MiLCJwcm9wZXJ0aWVzIiwiZ3JvdXBOYW1lIiwiZXh0cmFjdEdyb3VwTmFtZSIsImRhdGFHcm91cE5hbWUiLCJlYXJseUV4dHJhY3Rpb25NZXRhIiwiZWFybHlFeHRyYWN0aW9uR3JvdXBTb3J0IiwiZ3JvdXAiLCJwcm9wIiwib24iLCJEQk9wZXJhdGlvbnMiLCJBTEwiLCJwcml2YXRlRGF0YSIsInNoYXJlZERhdGEiLCJzb3J0S2V5c09ubHlSZWN1cnNpdmUiLCJzb3J0IiwicmVkdWNlIiwiYWNjIiwiRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIiLCJlcnJvciIsInNlbGYiLCJvIiwiY2FsbCIsInJlbGF0aW9ucyIsImdlbmVyYXRlRmFicmljRXZlbnROYW1lIiwicGFyc2VFdmVudE5hbWUiLCJwYXJ0cyIsInNwbGl0Iiwic3ViIiwic2FmZVBhcnNlSW50Iiwic3RyaW5nIiwiZGlnaXRSZWdleCIsInRlc3QiLCJwYXJzZWRpbnQiLCJwYXJzZUludCIsImlzTmFOIiwiU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIiLCJwdXRBbmNob3IiLCJwcmVTZXJpYWxpemF0aW9uIiwiRmFicmljSWRlbnRpdHlTZXJ2aWNlIiwiQ2xpZW50QmFzZWRTZXJ2aWNlIiwicm9vdENsaWVudCIsIl91c2VyIiwiY2VydGlmaWNhdGVzIiwiYWZmaWxpYXRpb25zIiwiZ2V0VXNlciIsImNmZyIsIklOSVRJQUxJWkFUSU9OIiwiZ2V0TmFtZSIsInVwZGF0ZUlkZW50aXR5IiwiaWRlbnRpdHlSZXF1ZXN0IiwiY2FVc2VySWRlbnRpdHkiLCJyZWVucm9sbFVzZXIiLCJjcmVhdGVVc2VyIiwiZ2V0TXNwaWQiLCJlbnJvbGxtZW50QXR0cnMiLCJvcHRpb25hbCIsInJlZW5yb2xsIiwicmVuZXdlZElkZW50aXR5IiwicmV2b2tlT3B0aW9ucyIsInJldm9rZVJlcXVlc3QiLCJDQV9ST0xFIiwiRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzIiwiZXZhbHVhdGVUaW1lb3V0IiwiZW5kb3JzZVRpbWVvdXQiLCJzdWJtaXRUaW1lb3V0IiwiY29tbWl0VGltZW91dCIsImFsbG93TWFudWFsRW5kb3JzaW5nT3JncyIsImFsbG93R2F0ZXdheU92ZXJyaWRlIiwiZW5jcnlwdFRyYW5zaWVudCIsInN5bnRoZXRpY0V2ZW50cyIsImNyZWF0ZVByaXZhdGVLZXkiLCJlc2NhcGVSZWdFeHAiLCJuZXh0TGV4aWNvZ3JhcGhpY1N0cmluZyIsImNoYXJzIiwiY29kZVBvaW50QXQiLCJmcm9tQ29kZVBvaW50IiwicHJlZml4UmFuZ2UiLCJzdGFydCIsImVuZCIsIkZhYnJpY0NsaWVudFN0YXRlbWVudCIsIlN0YXRlbWVudCIsInNxdWFzaCIsInNxdWFzaGVkIiwibWV0aG9kIiwiZXhlY3V0ZVByZXBhcmVkIiwiYXJneiIsImZvck1vZGVsIiwiZnJvbVNlbGVjdG9yIiwiYWxpYXMiLCJRVUVSWSIsImlzU2ltcGxlUXVlcnkiLCJRdWVyeUNsYXVzZSIsIndoZXJlQ29uZGl0aW9uIiwicGFyc2VkIiwicHJlcGFyZUNvbmRpdGlvbiIsInNlbGVjdFNlbGVjdG9yIiwiU0VMRUNUIiwiQU5EIiwidG9Mb3dlckNhc2UiLCJvcmRlckJ5U2VsZWN0b3JzIiwiT1JERVJfQlkiLCJ0b0NhbWVsQ2FzZSIsInByb2Nlc3NSZWNvcmQiLCJwa0F0dHIiLCJJRCIsImtleUFyZ3MiLCJTRVBBUkFUT1IiLCJyYXciLCJyYXdJbnB1dCIsImFnZ3JlZ2F0b3IiLCJhZ2dyZWdhdGVJbmZvIiwiYWdncmVnYXRlIiwiZXhlY3V0ZUFnZ3JlZ2F0ZSIsInJlc3VsdHMiLCJwcm9jZXNzZWQiLCJhcHBseUFmdGVySGFuZGxlcnNUb1Jlc3VsdCIsImFnZ3JlZ2F0ZVF1ZXJ5IiwiYnVpbGRBZ2dyZWdhdGVRdWVyeSIsInNlbGVjdG9ycyIsInNlbGVjdG9yIiwiZmllbGRzIiwicGFyc2VDb25kaXRpb24iLCJDb25kaXRpb24iLCJhbmQiLCJlcSIsInNlbGVjdG9yS2V5cyIsIkNvdWNoREJHcm91cE9wZXJhdG9yIiwiaW5kZXhPZiIsInZhbCIsIk9SIiwicyIsImVudHJpZXMiLCJ3YXJuIiwic2VsZWN0b3JLZXkiLCJyZWMiLCJDb3VjaERCT3BlcmF0b3IiLCJCSUdHRVIiLCJsaW1pdFNlbGVjdG9yIiwiQ291Y2hEQlF1ZXJ5TGltaXQiLCJvZmZzZXRTZWxlY3RvciIsInNraXAiLCJtZXJnZSIsIm9wIiwib2JqMSIsIm9iajIiLCJhdHRyMSIsIm9wZXJhdG9yIiwiY29tcGFyaXNvbiIsIk9wZXJhdG9yIiwiU1RBUlRTX1dJVEgiLCJRdWVyeUVycm9yIiwicmFuZ2UiLCJCSUdHRVJfRVEiLCJTTUFMTEVSIiwiRU5EU19XSVRIIiwiUkVHRVhQIiwiQkVUV0VFTiIsIm1heCIsIm9wQmV0d2VlbiIsInRyYW5zbGF0ZU9wZXJhdG9ycyIsIlNNQUxMRVJfRVEiLCJHcm91cE9wZXJhdG9yIiwiTk9UIiwib3AxIiwib3AyIiwiYXZnU2VsZWN0b3IiLCJzdW1JbmZvIiwiY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvciIsImNvdW50SW5mbyIsImNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5Iiwia2luZCIsInN1bURlc2NyaXB0b3IiLCJjb3VudERlc2NyaXB0b3IiLCJjb3VudERpc3RpbmN0U2VsZWN0b3IiLCJjb3VudERpc3RpbmN0IiwiYWdncmVnYXRvclVzZWQiLCJjb3VudFNlbGVjdG9yIiwibWluU2VsZWN0b3IiLCJtYXhTZWxlY3RvciIsInN1bVNlbGVjdG9yIiwiZGlzdGluY3RTZWxlY3RvciIsImFnZ3JlZ2F0b3JDaGVja3MiLCJtZXRhcyIsImZpbmRWaWV3TWV0YWRhdGEiLCJ2aWV3TmFtZSIsImdlbmVyYXRlVmlld05hbWUiLCJkZG9jIiwiZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lIiwicmV0dXJuRG9jcyIsInZpZXciLCJnZXRGYWJyaWNBZGFwdGVyIiwiaXNWaWV3QWdncmVnYXRlIiwiaGFuZGxlQXZlcmFnZSIsImZhYnJpY0FkYXB0ZXIiLCJ2aWV3SW5mbyIsInByb2Nlc3NWaWV3UmVzcG9uc2UiLCJzdW1EZXNjIiwiY291bnREZXNjIiwic3VtUmVzcG9uc2UiLCJjb3VudFJlc3BvbnNlIiwic3VtIiwicm93cyIsInJvdyIsIkZhYnJpY0NsaWVudEFkYXB0ZXIiLCJBZGFwdGVyIiwib3BlcmF0aW9uIiwibWVyZ2VkRmxhZ3MiLCJzaWxseSIsInBvcCIsInRvT3ZlcnJpZGVzIiwibmV3Q3R4IiwicGFyZW50Q29udGV4dCIsImNoaWxkQ29udGV4dHMiLCJjdXJyZW50T3AiLCJjdXJyZW50TW9kZWwiLCJyZXBvc2l0b3J5IiwiY3JlYXRlUHJlZml4IiwidXBkYXRlQWxsUHJlZml4Iiwic2hpZnQiLCJoYXNUcmFuc2llbnQiLCJuZWVkc0Z1bGxQYXlsb2FkIiwic2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uIiwidHJhbnNpZW50UGF5bG9hZCIsIkJ1bGtDcnVkT3BlcmF0aW9uS2V5cyIsIkNSRUFURV9BTEwiLCJnZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zIiwicmVzIiwic2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUiLCJSRUFEX0FMTCIsIlVQREFURV9BTEwiLCJkZWxldGVBbGwiLCJzaG91bGRIeWRyYXRlIiwiREVMRVRFX0FMTCIsIk1FVEFEQVRBIiwibWlycm9yTXNwIiwibXNwcyIsIm1lcmdlZCIsImVuZG9yc2luZ09yZ3MiLCJlbmRvcnNpbmdPcmdhbml6YXRpb25zIiwic2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQiLCJ2IiwiY2hpbGRSZWJ1aWxkIiwiZ2V0RnJvbUNoaWxkcmVuIiwicmVzb2x2ZWRPcCIsInJlc29sdmVPcGVyYXRpb24iLCJoYXNJZCIsImRpcmVjdCIsImRlc2VyaWFsaXplZCIsInVwZGF0ZVByZWZpeCIsIlVQREFURSIsIkRFTEVURSIsImRvY3NPbmx5IiwidHJhbnNhY3Rpb25SZXN1bHQiLCJwYXJzZVJlY29yZCIsImlzTW9kZWwiLCJlbCIsImdldENsaWVudCIsIl9jbGllbnQiLCJHYXRld2F5IiwiZ2V0R2F0ZXdheSIsImdldENvbnRyYWN0TmFtZSIsIkNvbnRyYWN0IiwiY29udHJhY3ROYW1lIiwiZ2V0Q29udHJhY3QiLCJ0cmFuc2FjdGlvbiIsImFwaSIsInN1Ym1pdCIsInRyYW5zaWVudERhdGEiLCJnYXRld2F5IiwiY29udHJhY3QiLCJldmFsdWF0ZSIsInByb3Bvc2FsT3B0aW9ucyIsImFyZ3VtZW50cyIsImNsb3NlIiwic2hvdWxkVXNlTGVnYWN5R2F0ZXdheSIsInByZXBhcmVMZWdhY3lBcmdzIiwiYnVpbGRMZWdhY3lUcmFuc2llbnQiLCJyZXNvbHZlTGVnYWN5TXNwQ291bnQiLCJjb25maWd1cmVkIiwibGVnYWN5TXNwQ291bnQiLCJpc0Zpbml0ZSIsImZsb29yIiwicGlja0xlZ2FjeUNhbmRpZGF0ZXMiLCJjYW5kaWRhdGVzIiwiYXZhaWxhYmxlIiwicGlja2VkIiwiaWR4IiwicmFuZG9tIiwic2VsZWN0aW9uIiwic3BsaWNlIiwiYnVpbGRMZWdhY3lQZWVyQ29uZmlncyIsInBlZXJzIiwicGVlckVuZHBvaW50IiwicGVlckhvc3RBbGlhcyIsInRsc0NlcnQiLCJlbmRvcnNlcnMiLCJvcmciLCJleHRyYXMiLCJtc3BNYXAiLCJsZWdhY3lDb3VudCIsInNlbGVjdGlvbnMiLCJjaG9pY2UiLCJlbmRwb2ludCIsInN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyIsImZjbiIsInRyYW5zaWVudE1hcCIsInBlZXJDb25maWdzIiwibm9ybWFsaXplTGVnYWN5UGVlcnMiLCJpZGVudGl0eU1hdGVyaWFsIiwicmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwiLCJ3YWxsZXQiLCJXYWxsZXRzIiwibmV3SW5NZW1vcnlXYWxsZXQiLCJpZGVudGl0eUxhYmVsIiwiY29ubmVjdGlvblByb2ZpbGUiLCJidWlsZExlZ2FjeUNvbm5lY3Rpb25Qcm9maWxlIiwiTGVnYWN5R2F0ZXdheSIsImNvbm5lY3QiLCJkaXNjb3ZlcnkiLCJlbmFibGVkIiwiYXNMb2NhbGhvc3QiLCJzaG91bGRUcmVhdFBlZXJzQXNMb2NhbGhvc3QiLCJ0bHNJbmZvIiwibmV0d29yayIsImdldE5ldHdvcmsiLCJjaGFubmVsIiwiY2hhaW5jb2RlTmFtZSIsImNyZWF0ZVRyYW5zYWN0aW9uIiwic2V0VHJhbnNpZW50IiwicGVlciIsImdldENoYW5uZWwiLCJnZXRFbmRvcnNlciIsImVuZG9yc2VyIiwic2V0RW5kb3JzaW5nUGVlcnMiLCJkaXNjb25uZWN0IiwiZGVkdXBlZCIsIk1hcCIsImFkZFBlZXIiLCJoYXMiLCJyZWFkUGVtSW5wdXQiLCJjZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aCIsImtleUNlcnRPckRpcmVjdG9yeVBhdGgiLCJwZWVyRW50cmllcyIsImNoYW5uZWxQZWVycyIsIm9yZ3MiLCJ0bHNQZW0iLCJob3N0bmFtZSIsImV4dHJhY3RIb3N0IiwiZW5zdXJlR3JwY1VybCIsInRsc0NBQ2VydHMiLCJncnBjT3B0aW9ucyIsImhvc3RuYW1lT3ZlcnJpZGUiLCJlbmRvcnNpbmdQZWVyIiwiY2hhaW5jb2RlUXVlcnkiLCJsZWRnZXJRdWVyeSIsImV2ZW50U291cmNlIiwib3JnYW5pemF0aW9uIiwib3JnYW5pemF0aW9ucyIsIm9yZGVyZXJzIiwiY2hhbm5lbHMiLCJldmVyeSIsImlzTG9jYWxFbmRwb2ludCIsImhvc3QiLCJzYW5pdGl6ZWQiLCJpc0J1ZmZlciIsInRyaW1tZWQiLCJzdGF0cyIsInN0YXQiLCJjYXRjaCIsImlzRGlyZWN0b3J5IiwicmVhZEZzRmlsZSIsImVyciIsImxlZ2FjeUFyZ3MiLCJzaHV0ZG93biIsImNoYW5uZWxOYW1lIiwiZ2V0Q29ubmVjdGlvbiIsInBhdGhPckNlcnQiLCJyZWFkRmlsZVN5bmMiLCJ0bHNDcmVkZW50aWFscyIsImdycGMiLCJjcmVhdGVTc2wiLCJzaXplTGltaXQiLCJzaWduZXIiLCJldmFsdWF0ZU9wdGlvbnMiLCJkZWFkbGluZSIsImVuZG9yc2VPcHRpb25zIiwic3VibWl0T3B0aW9ucyIsImNvbW1pdFN0YXR1c09wdGlvbnMiLCJQcm94eSIsInRoaXNBcmciLCJhcmdBcnJheSIsIlJlZmxlY3QiLCJEaXNwYXRjaCIsIkdhdGV3YXlFcnJvciIsImRldGFpbHMiLCJFbmRvcnNlRXJyb3IiLCJCYWRSZXF1ZXN0RXJyb3IiLCJQYWdpbmdFcnJvciIsIk1pZ3JhdGlvbkVycm9yIiwiT2JzZXJ2ZXJFcnJvciIsIkZvcmJpZGRlbkVycm9yIiwiQ29ubmVjdGlvbkVycm9yIiwiZmluYWwiLCJEIiwiX2EiLCJkZWNvcmF0aW9uIiwic2V0Q3VycmVudCIsIkZhYnJpY0NsaWVudERpc3BhdGNoIiwibG9nZ2VkQXJncyIsIlNIVVRET1dOIiwibGlzdGVuaW5nU3RhY2siLCJwYXJzZVBheWxvYWQiLCJqc29uQnl0ZXMiLCJqc29uIiwib2JzZXJ2ZSIsIm9ic2VydmVyIiwidW5PYnNlcnZlIiwicmVmcmVzaCIsImhhbmRsZUV2ZW50cyIsImN0eEFyZyIsImNvcnJlbGF0aW9uSWQiLCJldnQiLCJldmVudE5hbWUiLCJtc3BFdmVudE9ubHkiLCJ0YXJnZXRNb2RlbCIsIm1vZGVsUmVmIiwib2JzZXJ2ZXJBcmdzIiwiZ2V0Q2hhaW5jb2RlRXZlbnRzIiwidG9XcmFwIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwicHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsImJ1bGtUb1NpbmdsZSIsInJlc3VsdEFyZ3MiLCJWRVJTSU9OIiwiUEFD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