@decaf-ts/for-fabric 0.5.1 → 0.5.2

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.
@@ -1666,7 +1666,7 @@ async function ownedByOnCreate(context, data, key, model) {
1666
1666
  const allowGenerationOverride = context.getOrUndefined("allowGenerationOverride") || false;
1667
1667
  const creator = await stub.getCreator();
1668
1668
  let owner = creator.mspid;
1669
- context.log.info(`Expected mspid to be ${model[key]} | ${owner}. \n Using allowGenerationOverride: ${allowGenerationOverride}`);
1669
+ context.logger.info(`Expected mspid to be ${model[key]} | ${owner}. \n Using allowGenerationOverride: ${allowGenerationOverride}`);
1670
1670
  if (allowGenerationOverride) owner = model[key] ? model[key] : owner;
1671
1671
  const setOwnedByKeyValue = function(target, propertyKey, value) {
1672
1672
  Object.defineProperty(target, propertyKey, {
@@ -3884,11 +3884,11 @@ class FabricClientDispatch extends Dispatch {
3884
3884
 
3885
3885
  if (FabricClientAdapter) FabricClientAdapter["_baseDispatch"] = FabricClientDispatch;
3886
3886
 
3887
- const VERSION = "0.5.1";
3887
+ const VERSION = "0.5.2";
3888
3888
 
3889
3889
  const PACKAGE_NAME = "@decaf-ts/for-fabric";
3890
3890
 
3891
3891
  Metadata.registerLibrary(PACKAGE_NAME, VERSION);
3892
3892
 
3893
3893
  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 };
3894
- //# 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+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHN0dWIgfSA9IGNvbnRleHQgYXMgYW55O1xuXG4gIGNvbnN0IGFsbG93R2VuZXJhdGlvbk92ZXJyaWRlID1cbiAgICBjb250ZXh0LmdldE9yVW5kZWZpbmVkKFwiYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGVcIikgfHwgZmFsc2U7XG5cbiAgY29uc3QgY3JlYXRvciA9IGF3YWl0IHN0dWIuZ2V0Q3JlYXRvcigpO1xuICBsZXQgb3duZXIgPSBjcmVhdG9yLm1zcGlkO1xuICBjb250ZXh0LmxvZy5pbmZvKFxuICAgIGBFeHBlY3RlZCBtc3BpZCB0byBiZSAke21vZGVsW2tleV19IHwgJHtvd25lcn0uIFxcbiBVc2luZyBhbGxvd0dlbmVyYXRpb25PdmVycmlkZTogJHthbGxvd0dlbmVyYXRpb25PdmVycmlkZX1gXG4gICk7XG5cbiAgaWYgKGFsbG93R2VuZXJhdGlvbk92ZXJyaWRlKSBvd25lciA9IG1vZGVsW2tleV0gPyBtb2RlbFtrZXldIDogb3duZXI7XG5cbiAgY29uc3Qgc2V0T3duZWRCeUtleVZhbHVlID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgdGFyZ2V0OiBNLFxuICAgIHByb3BlcnR5S2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludFxuICApIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICB9KTtcbiAgfTtcblxuICBzZXRPd25lZEJ5S2V5VmFsdWUobW9kZWwsIGtleSBhcyBzdHJpbmcsIG93bmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG93bmVkQnkoKSB7XG4gIGZ1bmN0aW9uIG93bmVkQnkoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmo6IGFueSwgYXR0cmlidXRlPzogYW55KSB7XG4gICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgIHJlcXVpcmVkKCksXG4gICAgICAgIGdlbmVyYXRlZCgpLFxuICAgICAgICByZWFkb25seSgpLFxuICAgICAgICBvbkNyZWF0ZShvd25lZEJ5T25DcmVhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoXG4gICAgICAgICAgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsIEZhYnJpY01vZGVsS2V5cy5PV05FRF9CWSksXG4gICAgICAgICAgYXR0cmlidXRlXG4gICAgICAgIClcbiAgICAgICkob2JqLCBhdHRyaWJ1dGUpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLk9XTkVEX0JZKVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBvd25lZEJ5LFxuICAgICAgYXJnczogW10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYW5zYWN0aW9uSWRPbkNyZWF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBSIGV4dGVuZHMgUmVwbzxNPixcbiAgVixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHRPZjxSPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc3R1YiB9ID0gY29udGV4dCBhcyBhbnk7XG4gIG1vZGVsW2tleV0gPSBzdHViLmdldFR4SUQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zYWN0aW9uSWQoKSB7XG4gIGZ1bmN0aW9uIHRyYW5zYWN0aW9uSWQoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmo6IGFueSwgYXR0cmlidXRlPzogYW55KSB7XG4gICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgIHJlcXVpcmVkKCksXG4gICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgIG9uQ3JlYXRlKHRyYW5zYWN0aW9uSWRPbkNyZWF0ZSksXG4gICAgICAgIG9uVXBkYXRlKHRyYW5zYWN0aW9uSWRPbkNyZWF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YShcbiAgICAgICAgICBNZXRhZGF0YS5rZXkoXG4gICAgICAgICAgICBGYWJyaWNNb2RlbEtleXMuRkFCUklDLFxuICAgICAgICAgICAgYXR0cmlidXRlLFxuICAgICAgICAgICAgRmFicmljTW9kZWxLZXlzLlRSQU5TQUNUSU9OX0lEXG4gICAgICAgICAgKSxcbiAgICAgICAgICBhdHRyaWJ1dGVcbiAgICAgICAgKVxuICAgICAgKShvYmosIGF0dHJpYnV0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuVFJBTlNBQ1RJT05fSUQpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHRyYW5zYWN0aW9uSWQsXG4gICAgICBhcmdzOiBbXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgdHlwZSBNaXJyb3JDb25kaXRpb24gPSAobXNwOiBzdHJpbmcpID0+IGJvb2xlYW47XG5cbmV4cG9ydCB0eXBlIE1pcnJvck1ldGFkYXRhID0ge1xuICBjb25kaXRpb24/OiBNaXJyb3JDb25kaXRpb247XG4gIHJlc29sdmVyOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmc7XG4gIG1zcElkOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXZhbE1pcnJvck1ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNLFxuICByZXNvbHZlcjogdW5kZWZpbmVkIHwgc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyLFxuICBjdHg6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz5cbikge1xuICBsZXQgY29sbGVjdGlvbjogQ29sbGVjdGlvblJlc29sdmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkID0gcmVzb2x2ZXI7XG4gIGlmICh0eXBlb2YgY29sbGVjdGlvbiAhPT0gXCJzdHJpbmdcIikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvd25lciA9XG4gICAgICAgIE1vZGVsLm93bmVyT2YobW9kZWwpIHx8IGN0eC5nZXQoXCJzdHViXCIpLmdldENyZWF0b3IoKS50b1N0cmluZygpO1xuICAgICAgaWYgKHJlc29sdmVyICYmIHR5cGVvZiByZXNvbHZlciA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBjb2xsZWN0aW9uID0gYXdhaXQgcmVzb2x2ZXIobW9kZWwsIG93bmVyLCBjdHgpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gcmVzb2x2ZSBjb2xsZWN0aW9uIG1pcnJvciBuYW1lOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb2xsZWN0aW9uIHx8IHR5cGVvZiBjb2xsZWN0aW9uICE9PSBcInN0cmluZ1wiKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE5vIGNvbGxlY3Rpb24gZm91bmQgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuICByZXR1cm4gY29sbGVjdGlvbjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU1pcnJvckhhbmRsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29sbGVjdGlvbiA9IGF3YWl0IGV2YWxNaXJyb3JNZXRhZGF0YShtb2RlbCwgZGF0YS5yZXNvbHZlciwgY29udGV4dCk7XG4gIGNvbnN0IGZhYnJpY0N0eCA9IGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0O1xuICBjb25zdCBzb3VyY2VNb2RlbCA9IG1vZGVsO1xuICAvLyBQdXQgbWlycm9yIGZsYWdzIGRpcmVjdGx5IG9uIGNvbnRleHQgc28gYWRhcHRlci5wcmVwYXJlKCkgYW5kIGFkYXB0ZXIuY3JlYXRlKCkgY2FuIHNlZSB0aGVtXG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBtaXJyb3JDb2xsZWN0aW9uOiBjb2xsZWN0aW9uLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgIH0gYXMgYW55KVxuICAgICk7XG4gICAgY29uc3QgbWlycm9yID0gYXdhaXQgcmVwby5jcmVhdGUoc291cmNlTW9kZWwsIGNvbnRleHQpO1xuICAgIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgICBgTWlycm9yIGZvciAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gY3JlYXRlZCB3aXRoICR7TW9kZWwucGsobW9kZWwpIGFzIHN0cmluZ306ICR7bWlycm9yW01vZGVsLnBrKG1vZGVsKV19YFxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gQ2xlYW4gdXAgbWlycm9yIGZsYWdzIGZyb20gY29udGV4dFxuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZU1pcnJvckhhbmRsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29sbGVjdGlvbiA9IGF3YWl0IGV2YWxNaXJyb3JNZXRhZGF0YShtb2RlbCwgZGF0YS5yZXNvbHZlciwgY29udGV4dCk7XG4gIGNvbnN0IGZhYnJpY0N0eCA9IGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0O1xuICBjb25zdCBzb3VyY2VNb2RlbCA9IG1vZGVsO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG8gPSB0aGlzLm92ZXJyaWRlKFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgKHRoaXMgYXMgYW55KS5fb3ZlcnJpZGVzLCB7XG4gICAgICAgIG1pcnJvcjogdHJ1ZSxcbiAgICAgICAgbWlycm9yQ29sbGVjdGlvbjogY29sbGVjdGlvbixcbiAgICAgICAgaWdub3JlVmFsaWRhdGlvbjogdHJ1ZSxcbiAgICAgICAgaWdub3JlSGFuZGxlcnM6IHRydWUsXG4gICAgICAgIGFwcGx5VXBkYXRlVmFsaWRhdGlvbjogZmFsc2UsXG4gICAgICAgIG1lcmdlRm9yVXBkYXRlOiBmYWxzZSxcbiAgICAgIH0gYXMgYW55KVxuICAgICk7XG4gICAgYXdhaXQgcmVwby51cGRhdGUoc291cmNlTW9kZWwsIGNvbnRleHQpO1xuICAgIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgICBgTWlycm9yIGZvciAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gdXBkYXRlZDogJHsobW9kZWwgYXMgYW55KVtNb2RlbC5wayhtb2RlbCldfWBcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1pcnJvckhhbmRsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29sbGVjdGlvbiA9IGF3YWl0IGV2YWxNaXJyb3JNZXRhZGF0YShtb2RlbCwgZGF0YS5yZXNvbHZlciwgY29udGV4dCk7XG4gIGNvbnN0IGZhYnJpY0N0eCA9IGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0O1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICBmYWJyaWNDdHgucHV0KFwic2VncmVnYXRlZFwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIHRyeSB7XG4gICAgY29uc3QgcGtQcm9wID0gTW9kZWwucGsobW9kZWwpIGFzIGtleW9mIE07XG4gICAgY29uc3QgaWQgPSBtb2RlbFtwa1Byb3BdO1xuICAgIGNvbnN0IHJlcG8gPSB0aGlzLm92ZXJyaWRlKFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgKHRoaXMgYXMgYW55KS5fb3ZlcnJpZGVzLCB7XG4gICAgICAgIHNlZ3JlZ2F0ZWQ6IGNvbGxlY3Rpb24sXG4gICAgICAgIG1pcnJvcjogdHJ1ZSxcbiAgICAgICAgaWdub3JlVmFsaWRhdGlvbjogdHJ1ZSxcbiAgICAgICAgaWdub3JlSGFuZGxlcnM6IHRydWUsXG4gICAgICB9IGFzIGFueSlcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCByZXBvLmRlbGV0ZShpZCBhcyBhbnksIGNvbnRleHQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWF5IGFscmVhZHkgYmUgZGVsZXRlZCBieSBhZGFwdGVyLmRlbGV0ZVNlZ3JlZ2F0ZWRDb2xsZWN0aW9uc1xuICAgIH1cbiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgICAgYE1pcnJvciBmb3IgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGRlbGV0ZWQ6ICR7U3RyaW5nKGlkKX1gXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJzZWdyZWdhdGVkXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtaXJyb3JXcml0ZUd1YXJkPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBrZXk6IGtleW9mIE0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBtc3AgPSBleHRyYWN0TXNwSWQoXG4gICAgY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSBhcyBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuICApO1xuICBpZiAoIW1zcCkgcmV0dXJuO1xuICBpZiAobXNwID09PSBkYXRhLm1zcElkIHx8IChkYXRhLmNvbmRpdGlvbiAmJiBkYXRhLmNvbmRpdGlvbihtc3ApKSkge1xuICAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgICBgT3JnYW5pemF0aW9uICR7bXNwfSBpcyBub3QgYXV0aG9yaXplZCB0byBtb2RpZnkgbWlycm9yZWQgZGF0YWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBtc3AgPSBleHRyYWN0TXNwSWQoXG4gICAgY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSBhcyBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuICApO1xuXG4gIGlmICghbXNwKSByZXR1cm47XG5cbiAgY29uc3QgY29sbGVjdGlvbiA9IGF3YWl0IGV2YWxNaXJyb3JNZXRhZGF0YShtb2RlbCwgZGF0YS5yZXNvbHZlciwgY29udGV4dCk7XG4gIGNvbnN0IGZhYnJpY0N0eCA9IGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0O1xuICBjb25zdCBtYXRjaGVzID0gbXNwID09PSBkYXRhLm1zcElkIHx8IChkYXRhLmNvbmRpdGlvbiAmJiBkYXRhLmNvbmRpdGlvbihtc3ApKTtcblxuICBpZiAobWF0Y2hlcykge1xuICAgIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgICBgTWlycm9yIHJlYWQ6IE1TUCAke21zcH0gbWF0Y2hlcywgcm91dGluZyByZWFkcyB0byBtaXJyb3IgY29sbGVjdGlvbiAke2NvbGxlY3Rpb259YFxuICAgICk7XG4gICAgLy8gUm91dGUgcmVhZHMgZXhjbHVzaXZlbHkgdGhyb3VnaCB0aGUgbWlycm9yIGNvbGxlY3Rpb25cbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gICAgZmFicmljQ3R4LnB1dChcImZ1bGx5U2VncmVnYXRlZFwiLCB0cnVlKTtcbiAgICBmYWJyaWNDdHgucmVhZEZyb20oY29sbGVjdGlvbik7XG4gIH1cbiAgLy8gV2hlbiBNU1AgZG9lcyBOT1QgbWF0Y2gsIG5vcm1hbCByZWFkIGZsb3cg4oCUIGFsbCBkYXRhIGlzIGluIHB1YmxpYyBzdGF0ZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWlycm9yKFxuICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcsXG4gIG1zcElkT3JDb25kaXRpb24/OiBzdHJpbmcgfCBNaXJyb3JDb25kaXRpb24sXG4gIGNvbmRpdGlvbj86IE1pcnJvckNvbmRpdGlvblxuKSB7XG4gIGNvbnN0IGlzQ29uZGl0aW9uT25seSA9XG4gICAgdHlwZW9mIG1zcElkT3JDb25kaXRpb24gIT09IFwic3RyaW5nXCIgJiYgQm9vbGVhbihtc3BJZE9yQ29uZGl0aW9uKTtcbiAgY29uc3QgbXNwSWQgPSBpc0NvbmRpdGlvbk9ubHlcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogKG1zcElkT3JDb25kaXRpb24gYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcbiAgY29uc3QgY29uZCA9IGlzQ29uZGl0aW9uT25seVxuICAgID8gKG1zcElkT3JDb25kaXRpb24gYXMgTWlycm9yQ29uZGl0aW9uKVxuICAgIDogY29uZGl0aW9uO1xuXG4gIGZ1bmN0aW9uIG1pcnJvcihcbiAgICByZXNvbHZlcjogQ29sbGVjdGlvblJlc29sdmVyIHwgc3RyaW5nLFxuICAgIG1zcElkOiBzdHJpbmcsXG4gICAgY29uZGl0aW9uPzogTWlycm9yQ29uZGl0aW9uXG4gICkge1xuICAgIGNvbnN0IG1ldGE6IE1pcnJvck1ldGFkYXRhID0ge1xuICAgICAgY29uZGl0aW9uOiBjb25kaXRpb24sXG4gICAgICBtc3BJZDogbXNwSWQsXG4gICAgICByZXNvbHZlcjogcmVzb2x2ZXIsXG4gICAgfTtcbiAgICByZXR1cm4gYXBwbHkoXG4gICAgICBtZXRhZGF0YShcbiAgICAgICAgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsIEZhYnJpY01vZGVsS2V5cy5NSVJST1IpLFxuICAgICAgICBtZXRhXG4gICAgICApLFxuICAgICAgLy8gUmVhZCBoYW5kbGVyIHJ1bnMgZWFybHkgKHByaW9yaXR5IDMwKSB0byBzZXQgdXAgY29udGV4dCBiZWZvcmUgYW55IHJlYWRzXG4gICAgICBvblJlYWQocmVhZE1pcnJvckhhbmRsZXIgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAzMCB9KSxcbiAgICAgIC8vIFdyaXRlIGd1YXJkcyDigJQgcmVqZWN0IG1hdGNoaW5nIE1TUHMgYmVmb3JlIGFueSBwcm9jZXNzaW5nXG4gICAgICBvbkNyZWF0ZShtaXJyb3JXcml0ZUd1YXJkIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMjAgfSksXG4gICAgICBvblVwZGF0ZShtaXJyb3JXcml0ZUd1YXJkIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMjAgfSksXG4gICAgICBvbkRlbGV0ZShtaXJyb3JXcml0ZUd1YXJkIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMjAgfSksXG4gICAgICAvLyBNaXJyb3Igc3luYyBoYW5kbGVycyDigJQgd3JpdGUgZnVsbCBtb2RlbCBhZnRlciBvdGhlciBoYW5kbGVycyAocHJpb3JpdHkgMTAwKVxuICAgICAgb25DcmVhdGUoY3JlYXRlTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDEwMCB9KSxcbiAgICAgIG9uVXBkYXRlKHVwZGF0ZU1pcnJvckhhbmRsZXIgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAxMDAgfSksXG4gICAgICBvbkRlbGV0ZShkZWxldGVNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMTAwIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuTUlSUk9SKVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBtaXJyb3IsXG4gICAgICBhcmdzOiBbY29sbGVjdGlvbiwgbXNwSWQsIGNvbmRdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25SZXNvbHZlciA9IDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuICBtc3A/OiBzdHJpbmcsXG4gIC4uLmFyZ3M6IGFueVtdXG4pID0+IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IE1vZGVsQ29sbGVjdGlvbjogQ29sbGVjdGlvblJlc29sdmVyID0gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIG1zcElkPzogc3RyaW5nXG4pID0+IHtcbiAgY29uc3Qgb3JnTmFtZSA9XG4gICAgbXNwSWQgfHwgKHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gTW9kZWwub3duZXJPZihtb2RlbCkgOiB1bmRlZmluZWQpO1xuICBjb25zdCBjb25zdHIgPSB0eXBlb2YgbW9kZWwgPT09IFwiZnVuY3Rpb25cIiA/IG1vZGVsIDogbW9kZWwuY29uc3RydWN0b3I7XG4gIGlmICghb3JnTmFtZSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBNb2RlbCAke2NvbnN0ci5uYW1lfSBpcyBub3Qgb3duZWQgYnkgYW55IG9yZ2FuaXphdGlvbi4gZGlkIHlvdSB1c2UgQG93bmVkQnkoKSAob3IgcHJvdmlkZSB0aGUgbmFtZSk/YFxuICAgICk7XG4gIHJldHVybiBgJHt0b1Bhc2NhbENhc2UoY29uc3RyLm5hbWUpfSR7b3JnTmFtZSA/IHRvUGFzY2FsQ2FzZShvcmdOYW1lKSA6IFwiXCJ9YDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBOYW1lc3BhY2VDb2xsZWN0aW9uKG5hbWVzcGFjZTogc3RyaW5nKTogQ29sbGVjdGlvblJlc29sdmVyIHtcbiAgcmV0dXJuIDxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sIG1zcElkPzogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgb3JnTmFtZSA9XG4gICAgICBtc3BJZCB8fCAodHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyBNb2RlbC5vd25lck9mKG1vZGVsKSA6IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgY29uc3RyID0gdHlwZW9mIG1vZGVsID09PSBcImZ1bmN0aW9uXCIgPyBtb2RlbCA6IG1vZGVsLmNvbnN0cnVjdG9yO1xuICAgIGlmICghb3JnTmFtZSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTW9kZWwgJHtjb25zdHIubmFtZX0gaXMgbm90IG93bmVkIGJ5IGFueSBvcmdhbml6YXRpb24uIGRpZCB5b3UgdXNlIEBvd25lZEJ5KCkgKG9yIHByb3ZpZGUgdGhlIG5hbWUpP2BcbiAgICAgICk7XG4gICAgcmV0dXJuIGAke25hbWVzcGFjZX0ke29yZ05hbWUgPyB0b1Bhc2NhbENhc2Uob3JnTmFtZSkgOiBcIlwifWA7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBJbXBsaWNpdFByaXZhdGVDb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgPSA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwSWQ/OiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBvcmdOYW1lID1cbiAgICBtc3BJZCB8fCAodHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyBNb2RlbC5vd25lck9mKG1vZGVsKSA6IHVuZGVmaW5lZCk7XG4gIGlmICghb3JnTmFtZSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBNb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9IGlzIG5vdCBvd25lZCBieSBhbnkgb3JnYW5pemF0aW9uLiBkaWQgeW91IHVzZSBAb3duZWRCeSgpIChvciBwcm92aWRlIHRoZSBuYW1lKT9gXG4gICAgKTtcbiAgcmV0dXJuIGBfXyR7dG9QYXNjYWxDYXNlKG9yZ05hbWUpfVByaXZhdGVDb2xsZWN0aW9uYDtcbn07XG5cbmV4cG9ydCB0eXBlIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgPSB7XG4gIGNvbGxlY3Rpb25zOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXI7XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcmlvcml0eSBmb3IgZWFybHkgY29sbGVjdGlvbiBleHRyYWN0aW9uIChiZWZvcmUgcGsgZ2VuZXJhdGlvbiBhdCBwcmlvcml0eSA2MClcbiAqIEBzdW1tYXJ5IFRoaXMgcHJpb3JpdHkgZW5zdXJlcyBjb2xsZWN0aW9ucyBhcmUgcmVnaXN0ZXJlZCBpbiBjb250ZXh0IGJlZm9yZSBhbnkgc2VxdWVuY2VcbiAqIG9wZXJhdGlvbnMgb2NjdXIsIGFsbG93aW5nIHNlcXVlbmNlcyB0byBiZSByZXBsaWNhdGVkIHRvIHByaXZhdGUvc2hhcmVkIGNvbGxlY3Rpb25zLlxuICovXG5leHBvcnQgY29uc3QgU0VHUkVHQVRFRF9DT0xMRUNUSU9OX0VYVFJBQ1RJT05fUFJJT1JJVFkgPSAzNTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U2VncmVnYXRpb25GbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogTSxcbiAgY29sbGVjdGlvbnM6IHN0cmluZ1tdLFxuICBjdHg6IGFueVxuKSB7XG4gIC8vIFJlZ2lzdGVyIGNvbGxlY3Rpb25zIGVhcmx5IHVzaW5nIHJlYWRGcm9tIC0gdGhpcyBhbGxvd3Mgc2VxdWVuY2UgY29kZVxuICAvLyB0byBrbm93IHdoaWNoIGNvbGxlY3Rpb25zIHRvIHJlcGxpY2F0ZSB0byBkdXJpbmcgcGsgZ2VuZXJhdGlvblxuICBpZiAoY29sbGVjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgIChjdHggYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9ucyk7XG4gIH1cblxuICAvLyBDaGVjayBpZiBtb2RlbCBpcyBmdWxseSBzZWdyZWdhdGVkIChhbGwgbm9uLXBrIHByb3BlcnRpZXMgYXJlIHByaXZhdGUvc2hhcmVkL3RyYW5zaWVudCkuXG4gIC8vIFVzZSBNb2RlbC5zZWdyZWdhdGUoKSB3aGljaCBpcyB0aGUgY2Fub25pY2FsIHdheSB0byBkZXRlcm1pbmUgd2hhdCdzIHRyYW5zaWVudCxcbiAgLy8gcmF0aGVyIHRoYW4gcmVhZGluZyBEQktleXMuVFJBTlNJRU5UIG1ldGFkYXRhIHdoaWNoIG1heSBub3QgYWNjdW11bGF0ZSBjb3JyZWN0bHlcbiAgLy8gd2hlbiBjbGFzcy1sZXZlbCBAcHJpdmF0ZURhdGEgYXBwbGllcyBkZWNvcmF0b3JzIGl0ZXJhdGl2ZWx5LlxuICBpZiAoIWN0eC5pc0Z1bGx5U2VncmVnYXRlZCAmJiBjb2xsZWN0aW9ucy5sZW5ndGgpIHtcbiAgICBpZiAoIWhhc1B1YmxpY1Byb3BlcnRpZXMoY2xhenouY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pKSB7XG4gICAgICBjdHgubWFya0Z1bGx5U2VncmVnYXRlZCgpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlNaXJyb3JGbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gIG1zcDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBjdHg6IEZhYnJpY0NvbnRyYWN0Q29udGV4dFxuKSB7XG4gIGlmICghbXNwKSByZXR1cm47XG4gIGNvbnN0IG1pcnJvck1ldGEgPSBNb2RlbC5taXJyb3JlZEF0KGNsYXp6KTtcbiAgaWYgKCFtaXJyb3JNZXRhKSByZXR1cm47XG4gIGNvbnN0IG1hdGNoZXMgPVxuICAgIG1zcCA9PT0gbWlycm9yTWV0YS5tc3BJZCB8fFxuICAgIChtaXJyb3JNZXRhLmNvbmRpdGlvbiAmJiBtaXJyb3JNZXRhLmNvbmRpdGlvbihtc3ApKTtcbiAgaWYgKCFtYXRjaGVzKSByZXR1cm47XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEoXG4gICAgbmV3IGNsYXp6KCksXG4gICAgbWlycm9yTWV0YS5yZXNvbHZlcixcbiAgICBjdHhcbiAgKTtcbiAgLy8gTWlycm9yIE1TUCBtYXRjaGVzIOKAlCByb3V0ZSByZWFkcyBleGNsdXNpdmVseSB0aHJvdWdoIHRoZSBtaXJyb3JcbiAgLy8gY29sbGVjdGlvbi4gQ2xlYXIgYW55IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjb2xsZWN0aW9ucyBzbyBxdWVyaWVzXG4gIC8vIGdvIE9OTFkgdG8gdGhlIG1pcnJvciwgbm90IHRvIHRoZSByZWd1bGFyIHByaXZhdGUvc2hhcmVkIG9uZXMuXG4gIGN0eC5wdXQoXCJzZWdyZWdhdGVSZWFkXCIsIHVuZGVmaW5lZCk7XG4gIGN0eC5wdXQoXCJzZWdyZWdhdGVSZWFkU3RhY2tcIiwgdW5kZWZpbmVkKTtcbiAgY3R4LnB1dChcImZ1bGx5U2VncmVnYXRlZFwiLCB0cnVlKTtcbiAgY3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGN0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgY3R4LnJlYWRGcm9tKGNvbGxlY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBoYXNQdWJsaWNQcm9wZXJ0aWVzPE0gZXh0ZW5kcyBNb2RlbD4oY2xheno6IENvbnN0cnVjdG9yPE0+KTogYm9vbGVhbiB7XG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSBNZXRhZGF0YS5nZXRBdHRyaWJ1dGVzKGNsYXp6KSB8fCBbXTtcbiAgY29uc3QgcGsgPSBNb2RlbC5wayhjbGF6eik7XG4gIGNvbnN0IHRyYW5zaWVudE1ldGEgPSBNZXRhZGF0YS5nZXQoY2xhenogYXMgYW55LCBEQktleXMuVFJBTlNJRU5UKSB8fCB7fTtcbiAgY29uc3QgcHJpdmF0ZU1ldGEgPVxuICAgIE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuUFJJVkFURSkpIHx8IHt9O1xuICBjb25zdCBzaGFyZWRNZXRhID1cbiAgICBNZXRhZGF0YS5nZXQoY2xhenogYXMgYW55LCBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLlNIQVJFRCkpIHx8IHt9O1xuXG4gIHJldHVybiBhdHRyaWJ1dGVzLnNvbWUoKGF0dHIpID0+IHtcbiAgICBpZiAoYXR0ciA9PT0gcGspIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYXR0ciBpbiB0cmFuc2llbnRNZXRhKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGF0dHIgaW4gcHJpdmF0ZU1ldGEpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYXR0ciBpbiBzaGFyZWRNZXRhKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFYXJseSBoYW5kbGVyIHRvIGV4dHJhY3QgYW5kIHJlZ2lzdGVyIGNvbGxlY3Rpb25zIGluIGNvbnRleHRcbiAqIEBzdW1tYXJ5IFJ1bnMgd2l0aCBwcmlvcml0eSA8IDQwIHRvIGV4dHJhY3QgY29sbGVjdGlvbiBuYW1lcyBiZWZvcmUgcGsgZ2VuZXJhdGlvbiAocHJpb3JpdHkgNjApLlxuICogVGhpcyBhbGxvd3MgRmFicmljQ29udHJhY3RTZXF1ZW5jZSB0byBrbm93IHdoaWNoIGNvbGxlY3Rpb25zIHRvIHJlcGxpY2F0ZSB0by5cbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSB0aGF0IGV4dGVuZHMgTW9kZWxcbiAqIEBwYXJhbSB7Q29udGV4dE9mPFJlcG9zaXRvcnk8TSwgYW55Pj59IGNvbnRleHQgLSBUaGUgZXhlY3V0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB7U2VncmVnYXRlZERhdGFNZXRhZGF0YSB8IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXX0gZGF0YSAtIFRoZSBzZWdyZWdhdGVkIGRhdGEgbWV0YWRhdGFcbiAqIEBwYXJhbSB7c3RyaW5nIHwgc3RyaW5nW119IGtleXMgLSBUaGUgcHJvcGVydHkga2V5KHMpIGJlaW5nIHNlZ3JlZ2F0ZWRcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHRyYWN0U2VncmVnYXRlZENvbGxlY3Rpb25zPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dE9mPHR5cGVvZiB0aGlzPixcbiAgZGF0YTogU2VncmVnYXRlZERhdGFNZXRhZGF0YSB8IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXSxcbiAga2V5czoga2V5b2YgTSB8IChrZXlvZiBNKVtdLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRhdGFBcnJheSA9IChcbiAgICBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXVxuICApIGFzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXTtcblxuICBjb25zdCBtc3AgPVxuICAgIE1vZGVsLm93bmVyT2YobW9kZWwpIHx8XG4gICAgZXh0cmFjdE1zcElkKFxuICAgICAgY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSBhcyBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuICAgICk7XG4gIGlmICghbXNwKSB7XG4gICAgLy8gQ2FuJ3QgZXh0cmFjdCBjb2xsZWN0aW9ucyB3aXRob3V0IE1TUCwgd2lsbCBiZSBjYXVnaHQgYnkgbGF0ZXIgaGFuZGxlcnNcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjb2xsZWN0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBtZXRhZGF0YSBvZiBkYXRhQXJyYXkpIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uUmVzb2x2ZXIgPSBtZXRhZGF0YS5jb2xsZWN0aW9ucztcbiAgICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICAgIHR5cGVvZiBjb2xsZWN0aW9uUmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG4gICAgaWYgKGNvbGxlY3Rpb24gJiYgIWNvbGxlY3Rpb25zLmluY2x1ZGVzKGNvbGxlY3Rpb24pKSB7XG4gICAgICBjb2xsZWN0aW9ucy5wdXNoKGNvbGxlY3Rpb24pO1xuICAgIH1cbiAgfVxuICBhcHBseVNlZ3JlZ2F0aW9uRmxhZ3MobW9kZWwsIGNvbGxlY3Rpb25zLCBjb250ZXh0KTtcblxuICAvLyBTdG9yZSBzZWdyZWdhdGlvbiBtZXRhZGF0YSBwZXItc2VxdWVuY2Ugc28gRmFicmljQ29udHJhY3RTZXF1ZW5jZSBjYW4gZGVjaWRlXG4gIC8vIHdoZXJlIHRvIHN0b3JlL3JlcGxpY2F0ZSBzZXF1ZW5jZSByZWNvcmRzIChwdWJsaWMgdnMgcHJpdmF0ZS9zaGFyZWQpLlxuICAvL1xuICAvLyAtIGBAcGsoKWAgc2VxdWVuY2VzIHVzZSB0aGUgc2hhcmVkIG5hbWUgYCR7dGFibGV9X3BrYCAobm8gaWQgY29tcG9uZW50KS5cbiAgLy8gLSBgQHNlcXVlbmNlKClgIC8gcGVyc2lzdGVudCBgQHZlcnNpb24odHJ1ZSlgIHNlcXVlbmNlcyBhcmUgcGVyLW1vZGVsLWluc3RhbmNlOlxuICAvLyAgIGAke3RhYmxlfV8ke2lkfV8ke3Byb3BlcnR5fWAuXG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdKSBhcyAoa2V5b2YgTSlbXTtcbiAgY29uc3QgcGtLZXkgPSBNb2RlbC5wayhtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIGFzIGtleW9mIE07XG4gIGNvbnN0IHBrU2VxTmFtZSA9IE1vZGVsLnNlcXVlbmNlTmFtZShtb2RlbCwgXCJwa1wiKTtcblxuICBjb25zdCBpZFZhbHVlID0gKG1vZGVsIGFzIGFueSlbcGtLZXkgYXMgYW55XTtcbiAgY29uc3QgY2FuQnVpbGRQZXJJbnN0YW5jZSA9XG4gICAgdHlwZW9mIGlkVmFsdWUgIT09IFwidW5kZWZpbmVkXCIgJiYgaWRWYWx1ZSAhPT0gbnVsbDtcblxuICAvLyBBbHdheXMgdW5pb24gY29sbGVjdGlvbnMgZm9yIHRoZSBwayBzZXF1ZW5jZSB3aGVuIHRoZSBtb2RlbCB1c2VzIHNlZ3JlZ2F0ZWQgZGF0YS5cbiAgKGNvbnRleHQgYXMgYW55KS5zZXRTZXF1ZW5jZVNlZ3JlZ2F0aW9uKFxuICAgIHBrU2VxTmFtZSxcbiAgICAoY29udGV4dCBhcyBhbnkpLmlzRnVsbHlTZWdyZWdhdGVkLFxuICAgIGNvbGxlY3Rpb25zXG4gICk7XG5cbiAgLy8gRm9yIHBlci1wcm9wZXJ0eSBzZXF1ZW5jZXMsIG9ubHkgcmVnaXN0ZXIgd2hlbiB3ZSBjYW4gY29tcHV0ZSBhbiBpZC1zY29wZWQgbmFtZS5cbiAgLy8gVGhpcyBrZWVwcyBzZXF1ZW5jZXMgY29uc3RyYWluZWQgdG8gdGhlIGNvbGxlY3Rpb25zIHRoZSBhdHRyaWJ1dGUgZXhpc3RzIGluLlxuICBpZiAoY2FuQnVpbGRQZXJJbnN0YW5jZSkge1xuICAgIGZvciAoY29uc3QgayBvZiBrZXlBcnJheSkge1xuICAgICAgY29uc3QgcHJvcFNlcU5hbWUgPSBNb2RlbC5zZXF1ZW5jZU5hbWUobW9kZWwsIFN0cmluZyhpZFZhbHVlKSwgU3RyaW5nKGspKTtcbiAgICAgIChjb250ZXh0IGFzIGFueSkuc2V0U2VxdWVuY2VTZWdyZWdhdGlvbihcbiAgICAgICAgcHJvcFNlcU5hbWUsXG4gICAgICAgIChjb250ZXh0IGFzIGFueSkuaXNGdWxseVNlZ3JlZ2F0ZWQsXG4gICAgICAgIGNvbGxlY3Rpb25zXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VncmVnYXRlZERhdGFPbkNyZWF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIGNvbnRleHQ6IENvbnRleHRPZjx0eXBlb2YgdGhpcz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleXM6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgLy8gVmFsaWRhdGUgYWxsIGtleXMgcmVzb2x2ZSB0byB0aGUgc2FtZSBjb2xsZWN0aW9uXG4gIGtleUFycmF5LmZvckVhY2goKF9rLCBpKSA9PiB7XG4gICAgY29uc3QgYyA9XG4gICAgICB0eXBlb2YgZGF0YUFycmF5W2ldLmNvbGxlY3Rpb25zID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gZGF0YUFycmF5W2ldLmNvbGxlY3Rpb25zXG4gICAgICAgIDogZGF0YUFycmF5W2ldLmNvbGxlY3Rpb25zKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuICAgIGlmIChjICE9PSBjb2xsZWN0aW9uKVxuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgIGBTZWdyZWdhdGVkIGRhdGEgY29sbGVjdGlvbiBtaXNtYXRjaDogJHtjfSB2cyAke2NvbGxlY3Rpb259YFxuICAgICAgKTtcbiAgfSk7XG5cbiAgY29uc3Qga2V5U3RyaW5ncyA9IGtleUFycmF5Lm1hcCgoa2V5KSA9PiBTdHJpbmcoa2V5KSk7XG4gIC8vIFN0b3JlIHRoZSBzZWdyZWdhdGVkIG1vZGVsIOKAlCBwcmVwYXJlKCkgd2lsbCBmaWx0ZXIgdG8gY29sbGVjdGlvbi1zcGVjaWZpYyBmaWVsZHNcbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS53cml0ZVRvKGNvbGxlY3Rpb24sIGtleVN0cmluZ3MpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VncmVnYXRlZERhdGFPblJlYWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0ZsYWdzPixcbiAgZGF0YTogU2VncmVnYXRlZERhdGFNZXRhZGF0YSB8IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXSxcbiAga2V5czoga2V5b2YgTSB8IChrZXlvZiBNKVtdLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRhdGFBcnJheSA9IChcbiAgICBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXVxuICApIGFzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXTtcbiAgY29uc3Qga2V5QXJyYXkgPSAoQXJyYXkuaXNBcnJheShrZXlzKSA/IGtleXMgOiBba2V5c10pIGFzIChrZXlvZiBNKVtdO1xuICBpZiAoa2V5QXJyYXkubGVuZ3RoICE9PSBkYXRhQXJyYXkubGVuZ3RoKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBrZXlzIGFuZCBtZXRhZGF0YSBsZW5ndGggbWlzbWF0Y2hgXG4gICAgKTtcblxuICBjb25zdCBtc3AgPSBNb2RlbC5vd25lck9mKG1vZGVsKSB8fCBleHRyYWN0TXNwSWQoY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSk7XG4gIGlmICghbXNwKVxuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgVGhlcmUncyBubyBhc3NpZ25lZCBvcmdhbml6YXRpb24gZm9yIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgKTtcblxuICBjb25zdCBjb2xsZWN0aW9uUmVzb2x2ZXIgPSBkYXRhQXJyYXlbMF0uY29sbGVjdGlvbnM7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPVxuICAgIHR5cGVvZiBjb2xsZWN0aW9uUmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICA6IGF3YWl0IGNvbGxlY3Rpb25SZXNvbHZlcihtb2RlbCwgbXNwLCBjb250ZXh0KTtcblxuICAoY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLnJlYWRGcm9tKGNvbGxlY3Rpb24pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VncmVnYXRlZERhdGFPblVwZGF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIGNvbnRleHQ6IENvbnRleHRPZjx0eXBlb2YgdGhpcz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleToga2V5b2YgTSB8IChrZXlvZiBNKVtdLFxuICBtb2RlbDogTSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBvbGRNb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRhdGFBcnJheSA9IChcbiAgICBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXVxuICApIGFzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXTtcbiAgY29uc3Qga2V5QXJyYXkgPSAoQXJyYXkuaXNBcnJheShrZXkpID8ga2V5IDogW2tleV0pIGFzIChrZXlvZiBNKVtdO1xuICBpZiAoa2V5QXJyYXkubGVuZ3RoICE9PSBkYXRhQXJyYXkubGVuZ3RoKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBrZXlzIGFuZCBtZXRhZGF0YSBsZW5ndGggbWlzbWF0Y2hgXG4gICAgKTtcblxuICBjb25zdCBtc3AgPVxuICAgIE1vZGVsLm93bmVyT2YobW9kZWwpIHx8XG4gICAgZXh0cmFjdE1zcElkKFxuICAgICAgY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSBhcyBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuICAgICk7XG4gIGlmICghbXNwKVxuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgVGhlcmUncyBubyBhc3NpZ25lZCBvcmdhbml6YXRpb24gZm9yIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgKTtcblxuICBjb25zdCBjb2xsZWN0aW9uUmVzb2x2ZXIgPSBkYXRhQXJyYXlbMF0uY29sbGVjdGlvbnM7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPVxuICAgIHR5cGVvZiBjb2xsZWN0aW9uUmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICA6IGNvbGxlY3Rpb25SZXNvbHZlcihtb2RlbCwgbXNwLCBjb250ZXh0KTtcblxuICBrZXlBcnJheS5mb3JFYWNoKChrLCBpKSA9PiB7XG4gICAgY29uc3QgYyA9XG4gICAgICB0eXBlb2YgZGF0YUFycmF5W2ldLmNvbGxlY3Rpb25zID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gZGF0YUFycmF5W2ldLmNvbGxlY3Rpb25zXG4gICAgICAgIDogZGF0YUFycmF5W2ldLmNvbGxlY3Rpb25zKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuICAgIGlmIChjICE9PSBjb2xsZWN0aW9uKVxuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgIGBTZWdyZWdhdGVkIGRhdGEgY29sbGVjdGlvbiBtaXNtYXRjaDogJHtjfSB2cyAke2NvbGxlY3Rpb259YFxuICAgICAgKTtcbiAgfSk7XG5cbiAgY29uc3Qga2V5U3RyaW5ncyA9IChrZXlBcnJheSBhcyAoa2V5b2YgTSlbXSkubWFwKChrZXkpID0+IFN0cmluZyhrZXkpKTtcbiAgLy8gU3RvcmUgdGhlIG9yaWdpbmFsIG1vZGVsIOKAlCBwcmVwYXJlKCkgd2lsbCBmaWx0ZXIgdG8gY29sbGVjdGlvbi1zcGVjaWZpYyBmaWVsZHNcbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS53cml0ZVRvKGNvbGxlY3Rpb24sIGtleVN0cmluZ3MpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VncmVnYXRlZERhdGFPbkRlbGV0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBWIGV4dGVuZHMgU2VncmVnYXRlZERhdGFNZXRhZGF0YSxcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHRPZjxSPixcbiAgZGF0YTogViB8IFZbXSxcbiAga2V5OiAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV0pIGFzIFZbXTtcbiAgY29uc3Qga2V5QXJyYXkgPSAoQXJyYXkuaXNBcnJheShrZXkpID8ga2V5IDogW2tleV0pIGFzIChrZXlvZiBNKVtdO1xuICBpZiAoa2V5QXJyYXkubGVuZ3RoICE9PSBkYXRhQXJyYXkubGVuZ3RoKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBrZXlzIGFuZCBtZXRhZGF0YSBsZW5ndGggbWlzbWF0Y2hgXG4gICAgKTtcblxuICBjb25zdCBtc3AgPVxuICAgIE1vZGVsLm93bmVyT2YobW9kZWwpIHx8XG4gICAgZXh0cmFjdE1zcElkKFxuICAgICAgY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSBhcyBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuICAgICk7XG4gIGlmICghbXNwKVxuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgVGhlcmUncyBubyBhc3NpZ25lZCBvcmdhbml6YXRpb24gZm9yIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgKTtcblxuICBjb25zdCBjb2xsZWN0aW9uUmVzb2x2ZXIgPSBkYXRhQXJyYXlbMF0uY29sbGVjdGlvbnM7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPVxuICAgIHR5cGVvZiBjb2xsZWN0aW9uUmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICA6IGNvbGxlY3Rpb25SZXNvbHZlcihtb2RlbCwgbXNwLCBjb250ZXh0KTtcblxuICAoY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLnJlYWRGcm9tKGNvbGxlY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBzZWdyZWdhdGVkKFxuICBjb2xsZWN0aW9uOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIsXG4gIHR5cGU6IEZhYnJpY01vZGVsS2V5cy5QUklWQVRFIHwgRmFicmljTW9kZWxLZXlzLlNIQVJFRCxcbiAgZmlsdGVyPzogKHByb3BOYW1lOiBzdHJpbmcpID0+IGJvb2xlYW5cbikge1xuICByZXR1cm4gZnVuY3Rpb24gaW5uZXJTZWdyZWdhdGVkKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREZWModGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5PzogYW55KSB7XG4gICAgICBjb25zdCBrZXkgPSBNZXRhZGF0YS5rZXkodHlwZSwgcHJvcGVydHlLZXkpO1xuICAgICAgY29uc3QgY29uc3RyOiBDb25zdHJ1Y3RvciA9IHRhcmdldC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjtcblxuICAgICAgY29uc3QgbWV0YSA9IE1ldGFkYXRhLmdldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIGtleSkgfHwge307XG4gICAgICBjb25zdCBjb2xsZWN0aW9ucyA9IG5ldyBTZXQobWV0YS5jb2xsZWN0aW9ucyB8fCBbXSk7XG4gICAgICBjb2xsZWN0aW9ucy5hZGQoY29sbGVjdGlvbik7XG4gICAgICBtZXRhLmNvbGxlY3Rpb25zID0gWy4uLmNvbGxlY3Rpb25zXTtcbiAgICAgIE1ldGFkYXRhLnNldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIGtleSwgbWV0YSk7XG5cbiAgICAgIGNvbnN0IGNvbnN0ck1ldGEgPSBNZXRhZGF0YS5nZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCB0eXBlKSB8fCB7fTtcbiAgICAgIGNvbnN0IGNvbnN0ckNvbGxlY3Rpb25zID0gbmV3IFNldChjb25zdHJNZXRhLmNvbGxlY3Rpb25zIHx8IFtdKTtcbiAgICAgIGNvbnN0ckNvbGxlY3Rpb25zLmFkZChjb2xsZWN0aW9uKTtcbiAgICAgIGNvbnN0ck1ldGEuY29sbGVjdGlvbnMgPSBbLi4uY29uc3RyQ29sbGVjdGlvbnNdO1xuICAgICAgTWV0YWRhdGEuc2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgdHlwZSwgY29uc3RyTWV0YSk7XG5cbiAgICAgIGNvbnN0IHRyYW5zaWVudE1ldGEgPVxuICAgICAgICBNZXRhZGF0YS5nZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBEQktleXMuVFJBTlNJRU5UKSB8fCB7fTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRUcmFuc2llbnRNZXRhID0ge1xuICAgICAgICAuLi50cmFuc2llbnRNZXRhLFxuICAgICAgICBbcHJvcGVydHlLZXkgYXMgYW55XToge30sXG4gICAgICB9O1xuICAgICAgTWV0YWRhdGEuc2V0KFxuICAgICAgICBjb25zdHIgYXMgQ29uc3RydWN0b3IsXG4gICAgICAgIERCS2V5cy5UUkFOU0lFTlQsXG4gICAgICAgIHVwZGF0ZWRUcmFuc2llbnRNZXRhXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY3M6IGFueVtdID0gW107XG4gICAgaWYgKCFwcm9wZXJ0eUtleSkge1xuICAgICAgLy8gZGVjb3JhdGVkIGF0IHRoZSBjbGFzcyBsZXZlbFxuICAgICAgY29uc3QgcHJvcGVydGllcyA9IE1ldGFkYXRhLmdldEF0dHJpYnV0ZXModGFyZ2V0IGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIHByb3BlcnRpZXM/LmZvckVhY2goKHApID0+IHtcbiAgICAgICAgaWYgKCFmaWx0ZXIgfHwgZmlsdGVyKHApKSB7XG4gICAgICAgICAgc2VncmVnYXRlZChjb2xsZWN0aW9uLCB0eXBlKSgodGFyZ2V0IGFzIGFueSkucHJvdG90eXBlLCBwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBncm91cE5hbWUgPVxuICAgICAgICB0eXBlb2YgY29sbGVjdGlvbiA9PT0gXCJzdHJpbmdcIiA/IGNvbGxlY3Rpb24gOiBjb2xsZWN0aW9uLnRvU3RyaW5nKCk7XG4gICAgICAvLyBVc2UgZGlmZmVyZW50IGdyb3VwIG5hbWVzIGZvciBleHRyYWN0aW9uIHZzIGRhdGEgaGFuZGxlcnMgdG8gcHJldmVudCBtZXJnaW5nXG4gICAgICBjb25zdCBleHRyYWN0R3JvdXBOYW1lID0gYCR7Z3JvdXBOYW1lfTpleHRyYWN0YDtcbiAgICAgIGNvbnN0IGRhdGFHcm91cE5hbWUgPSBgJHtncm91cE5hbWV9OmRhdGFgO1xuICAgICAgY29uc3QgZWFybHlFeHRyYWN0aW9uTWV0YSA9IHsgY29sbGVjdGlvbnM6IGNvbGxlY3Rpb24gfTtcbiAgICAgIGNvbnN0IGVhcmx5RXh0cmFjdGlvbkdyb3VwU29ydCA9IHtcbiAgICAgICAgcHJpb3JpdHk6IFNFR1JFR0FURURfQ09MTEVDVElPTl9FWFRSQUNUSU9OX1BSSU9SSVRZLFxuICAgICAgICBncm91cDogZXh0cmFjdEdyb3VwTmFtZSxcbiAgICAgIH07XG4gICAgICBkZWNzLnB1c2goXG4gICAgICAgIHByb3AoKSxcbiAgICAgICAgdHJhbnNpZW50KCksXG4gICAgICAgIHNlZ3JlZ2F0ZWREZWMsXG4gICAgICAgIC8vIEVhcmx5IGV4dHJhY3Rpb24gaGFuZGxlcnMgLSBydW4gQkVGT1JFIHBrIGdlbmVyYXRpb24gKHByaW9yaXR5IDYwKVxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgY29sbGVjdGlvbnMgYXJlIHJlZ2lzdGVyZWQgaW4gY29udGV4dCBmb3Igc2VxdWVuY2UgcmVwbGljYXRpb25cbiAgICAgICAgLy8gV2UgcmVnaXN0ZXIgZm9yIGVhY2ggb3BlcmF0aW9uIGV4cGxpY2l0bHkgdG8gZW5zdXJlIHByb3BlciBoYW5kbGVyIGxvb2t1cFxuICAgICAgICBvbihcbiAgICAgICAgICBEQk9wZXJhdGlvbnMuQUxMLFxuICAgICAgICAgIGV4dHJhY3RTZWdyZWdhdGVkQ29sbGVjdGlvbnMgYXMgYW55LFxuICAgICAgICAgIGVhcmx5RXh0cmFjdGlvbk1ldGEsXG4gICAgICAgICAgZWFybHlFeHRyYWN0aW9uR3JvdXBTb3J0XG4gICAgICAgICksXG4gICAgICAgIC8vIE1haW4gaGFuZGxlcnMgZm9yIHNlZ3JlZ2F0ZWQgZGF0YSBvcGVyYXRpb25zIChwcmlvcml0eSA5NSlcbiAgICAgICAgb25DcmVhdGUoXG4gICAgICAgICAgc2VncmVnYXRlZERhdGFPbkNyZWF0ZSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvblJlYWQoXG4gICAgICAgICAgc2VncmVnYXRlZERhdGFPblJlYWQgYXMgYW55LFxuICAgICAgICAgIHsgY29sbGVjdGlvbnM6IGNvbGxlY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmlvcml0eTogOTUsXG4gICAgICAgICAgICBncm91cDogZGF0YUdyb3VwTmFtZSxcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICAgIG9uVXBkYXRlKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25VcGRhdGUgYXMgYW55LFxuICAgICAgICAgIHsgY29sbGVjdGlvbnM6IGNvbGxlY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmlvcml0eTogOTUsXG4gICAgICAgICAgICBncm91cDogZGF0YUdyb3VwTmFtZSxcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICAgIG9uRGVsZXRlKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25EZWxldGUgYXMgYW55LFxuICAgICAgICAgIHsgY29sbGVjdGlvbnM6IGNvbGxlY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmlvcml0eTogOTUsXG4gICAgICAgICAgICBncm91cDogZGF0YUdyb3VwTmFtZSxcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBhcHBseSguLi5kZWNzKSh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVEYXRhKFxuICBjb2xsZWN0aW9uOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIgPSBJbXBsaWNpdFByaXZhdGVDb2xsZWN0aW9uXG4pIHtcbiAgZnVuY3Rpb24gcHJpdmF0ZURhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gICAgcmV0dXJuIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgRmFicmljTW9kZWxLZXlzLlBSSVZBVEUpO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBwcml2YXRlRGF0YSxcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkRGF0YShjb2xsZWN0aW9uOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpIHtcbiAgZnVuY3Rpb24gc2hhcmVkRGF0YShjb2xsZWN0aW9uOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpIHtcbiAgICByZXR1cm4gc2VncmVnYXRlZChjb2xsZWN0aW9uLCBGYWJyaWNNb2RlbEtleXMuU0hBUkVEKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuU0hBUkVEKVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBzaGFyZWREYXRhLFxuICAgICAgYXJnczogW2NvbGxlY3Rpb25dLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzICovXG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIEpTT05TZXJpYWxpemVyLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlY3Vyc2l2ZWx5IHNvcnRzIG9iamVjdCBrZXlzIHdpdGhvdXQgcmVvcmRlcmluZyBhcnJheXNcbiAqIEBwYXJhbSB7YW55fSBvYmogLSBUaGUgdmFsdWUgdG8gcHJvY2Vzc1xuICogQHJldHVybiB7YW55fSBBIGNvcHkgd2l0aCBzb3J0ZWQgb2JqZWN0IGtleXMgYnV0IHByZXNlcnZlZCBhcnJheSBvcmRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXNPbmx5UmVjdXJzaXZlKG9iajogYW55KTogYW55IHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKSByZXR1cm4gb2JqO1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcChzb3J0S2V5c09ubHlSZWN1cnNpdmUpO1xuICBpZiAob2JqLmNvbnN0cnVjdG9yICE9PSBPYmplY3QpIHJldHVybiBvYmo7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopXG4gICAgLnNvcnQoKVxuICAgIC5yZWR1Y2UoKGFjYzogUmVjb3JkPHN0cmluZywgYW55Piwga2V5KSA9PiB7XG4gICAgICBhY2Nba2V5XSA9IHNvcnRLZXlzT25seVJlY3Vyc2l2ZShvYmpba2V5XSk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5pc3RpYyBKU09OIHNlcmlhbGl6ZXIgZm9yIEZhYnJpYyBtb2RlbHNcbiAqIEBzdW1tYXJ5IEVuc3VyZXMgc3RhYmxlLCBkZXRlcm1pbmlzdGljIEpTT04gb3V0cHV0IGJ5IHNvcnRpbmcgb2JqZWN0IGtleXMgcmVjdXJzaXZlbHkgYmVmb3JlIHN0cmluZ2lmaWNhdGlvbiwgd2hpY2ggaXMgaW1wb3J0YW50IGZvciBGYWJyaWMgZW5kb3JzZW1lbnQgYW5kIGhhc2hpbmcuIEV4dGVuZHMgSlNPTlNlcmlhbGl6ZXIgdG8gcGx1ZyBpbnRvIGV4aXN0aW5nIERlY2FmIG1vZGVsIHNlcmlhbGl6YXRpb24gZmxvdy5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIERlY2FmIE1vZGVsIHN1YnR5cGUgc2VyaWFsaXplZCBieSB0aGlzIGluc3RhbmNlXG4gKiBAcGFyYW0ge3ZvaWR9IFtjb25zdHJ1Y3Rvcl0gTm8gcHVibGljIGNvbnN0cnVjdG9yIGFyZ3VtZW50c1xuICogQGNsYXNzIERldGVybWluaXN0aWNTZXJpYWxpemVyXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc2VyaWFsaXplciA9IG5ldyBEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxNeU1vZGVsPigpO1xuICogY29uc3QganNvbiA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKG1vZGVsKTtcbiAqIGNvbnN0IHJlYnVpbHQgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGpzb24pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgRFMgYXMgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXJcbiAqICAgQ2FsbGVyLT4+RFM6IHNlcmlhbGl6ZShtb2RlbClcbiAqICAgRFMtPj5EUzogcHJlU2VyaWFsaXplKG1vZGVsKVxuICogICBEUy0+PkRTOiBzb3J0LWtleXMtcmVjdXJzaXZlXG4gKiAgIERTLT4+RFM6IGpzb24tc3RyaW5naWZ5LWRldGVybWluaXN0aWNcbiAqICAgRFMtLT4+Q2FsbGVyOiBzdHJpbmdcbiAqICAgQ2FsbGVyLT4+RFM6IGRlc2VyaWFsaXplKHN0cmluZylcbiAqICAgRFMtLT4+Q2FsbGVyOiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbj4gZXh0ZW5kcyBKU09OU2VyaWFsaXplcjxNPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHByZVNlcmlhbGl6ZShtb2RlbDogTSkge1xuICAgIC8vIFRPRE86IG5lc3RlZCBwcmVzZXJpYWxpemF0aW9uIChzbyBpbmNyZWFzZSBwZXJmb3JtYW5jZSB3aGVuIGRlc2VyaWFsaXppbmcpXG4gICAgLy8gVE9ETzogVmVyaWZ5IHdoeSB0aGVyZSBpcyBubyBtZXRhZGF0YVxuICAgIGNvbnN0IHRvU2VyaWFsaXplOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwpO1xuICAgIGxldCBtZXRhZGF0YTtcbiAgICB0cnkge1xuICAgICAgbWV0YWRhdGEgPSBNZXRhZGF0YS5tb2RlbE5hbWUobW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3IpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBtZXRhZGF0YSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdG9TZXJpYWxpemVbTW9kZWxLZXlzLkFOQ0hPUl0gPSBtZXRhZGF0YSB8fCBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lO1xuXG4gICAgY29uc3QgcHJlU2VyaWFsaXplID0gZnVuY3Rpb24gcHJlU2VyaWFsaXplKFxuICAgICAgdGhpczogRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8YW55PixcbiAgICAgIG9iajogYW55XG4gICAgKTogYW55IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICBpZiAodHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG9iajtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoubWFwKChvKSA9PiBwcmVTZXJpYWxpemUuY2FsbChzZWxmLCBvKSk7XG4gICAgICByZXR1cm4gdGhpcy5wcmVTZXJpYWxpemUuY2FsbCh0aGlzLCBvYmopO1xuICAgIH0uYmluZCh0aGlzKTtcblxuICAgIE1vZGVsLnJlbGF0aW9ucyhtb2RlbCkuZm9yRWFjaCgocikgPT4ge1xuICAgICAgdG9TZXJpYWxpemVbcl0gPSBwcmVTZXJpYWxpemUodG9TZXJpYWxpemVbcl0pO1xuICAgIH0pO1xuICAgIHJldHVybiB0b1NlcmlhbGl6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWJ1aWxkcyBhIG1vZGVsIGZyb20gYSBzZXJpYWxpemF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIGl0IGZhaWxzIHRvIHBhcnNlIHRoZSBzdHJpbmcsIG9yIHRvIGJ1aWxkIHRoZSBtb2RlbFxuICAgKi9cbiAgb3ZlcnJpZGUgZGVzZXJpYWxpemUoc3RyOiBzdHJpbmcpOiBNIHtcbiAgICBjb25zdCBkZXNlcmlhbGl6YXRpb24gPSBKU09OLnBhcnNlKHN0cik7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gZGVzZXJpYWxpemF0aW9uW01vZGVsS2V5cy5BTkNIT1JdO1xuICAgIGlmICghY2xhc3NOYW1lKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgY2xhc3MgcmVmZXJlbmNlIGluIHNlcmlhbGl6ZWQgbW9kZWxcIik7XG4gICAgY29uc3QgbW9kZWw6IE0gPSBNb2RlbC5idWlsZChkZXNlcmlhbGl6YXRpb24sIGNsYXNzTmFtZSkgYXMgdW5rbm93biBhcyBNO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2VyaWFsaXplIGEgbW9kZWwgaW50byBhIGRldGVybWluaXN0aWMgSlNPTiBzdHJpbmdcbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIG1vZGVsIHdpdGggcHJlU2VyaWFsaXplLCBzb3J0cyBrZXlzIHJlY3Vyc2l2ZWx5LCBhbmQgc3RyaW5naWZpZXMgZGV0ZXJtaW5pc3RpY2FsbHkgZm9yIHN0YWJsZSBvcmRlcmluZ1xuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHNlcmlhbGl6ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IERldGVybWluaXN0aWMgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWxcbiAgICovXG4gIG92ZXJyaWRlIHNlcmlhbGl6ZShtb2RlbDogTSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RyaW5naWZ5ID0gcmVxdWlyZShcImpzb24tc3RyaW5naWZ5LWRldGVybWluaXN0aWNcIik7XG4gICAgcmV0dXJuIHN0cmluZ2lmeShzb3J0S2V5c09ubHlSZWN1cnNpdmUodGhpcy5wcmVTZXJpYWxpemUobW9kZWwpKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cywgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBGYWJyaWMgZXZlbnQgbmFtZSBmcm9tIGNvbXBvbmVudHNcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzdGFuZGFyZGl6ZWQgZXZlbnQgbmFtZSBieSBqb2luaW5nIHRhYmxlLCBldmVudCwgYW5kIG9wdGlvbmFsIG93bmVyIHdpdGggdW5kZXJzY29yZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSB0YWJsZS9jb2xsZWN0aW9uIG5hbWVcbiAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZ30gZXZlbnQgLSBUaGUgZXZlbnQgdHlwZVxuICogQHBhcmFtIHtzdHJpbmd9IFtvd25lcl0gLSBPcHRpb25hbCBvd25lciBpZGVudGlmaWVyXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgZXZlbnQgbmFtZSBpbiBmb3JtYXQgXCJ0YWJsZV9ldmVudFwiIG9yIFwidGFibGVfZXZlbnRfb3duZXJcIlxuICogQGZ1bmN0aW9uIGdlbmVyYXRlRmFicmljRXZlbnROYW1lXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZShcbiAgdGFibGU6IHN0cmluZyxcbiAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gIG93bmVyPzogc3RyaW5nXG4pIHtcbiAgY29uc3QgcGFyYW1zID0gW3RhYmxlLCBldmVudF07XG4gIGlmIChvd25lcikgcGFyYW1zLnB1c2gob3duZXIpO1xuICByZXR1cm4gcGFyYW1zLmpvaW4oXCJfXCIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBGYWJyaWMgZXZlbnQgbmFtZSBpbnRvIGl0cyBjb21wb25lbnRzXG4gKiBAc3VtbWFyeSBTcGxpdHMgYW4gZXZlbnQgbmFtZSBieSB1bmRlcnNjb3JlcyBhbmQgZXh0cmFjdHMgdGFibGUsIGV2ZW50LCBhbmQgb3B0aW9uYWwgb3duZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGV2ZW50IG5hbWUgdG8gcGFyc2VcbiAqIEByZXR1cm4ge3t0YWJsZTogc3RyaW5nLCBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZywgb3duZXI6IHN0cmluZ319IFRoZSBwYXJzZWQgY29tcG9uZW50cyBhcyBhIHN0cnVjdHVyZWQgb2JqZWN0XG4gKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgZXZlbnQgbmFtZSBmb3JtYXQgaXMgaW52YWxpZFxuICogQGZ1bmN0aW9uIHBhcnNlRXZlbnROYW1lXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBQYXJzZXIgYXMgcGFyc2VFdmVudE5hbWVcbiAqICAgQ2FsbGVyLT4+UGFyc2VyOiBwYXJzZUV2ZW50TmFtZShuYW1lKVxuICogICBQYXJzZXItPj5QYXJzZXI6IHNwbGl0IG5hbWUgYnkgXCJfXCJcbiAqICAgYWx0IHBhcnRzIGxlbmd0aCBpbnZhbGlkXG4gKiAgICAgUGFyc2VyLS0+PkNhbGxlcjogdGhyb3cgSW50ZXJuYWxFcnJvclxuICogICBlbHNlXG4gKiAgICAgUGFyc2VyLS0+PkNhbGxlcjogeyB0YWJsZSwgZXZlbnQsIG93bmVyPyB9XG4gKiAgIGVuZFxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFdmVudE5hbWUobmFtZTogc3RyaW5nKToge1xuICB0YWJsZT86IHN0cmluZztcbiAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmc7XG4gIG93bmVyPzogc3RyaW5nO1xufSB7XG4gIGNvbnN0IHBhcnRzID0gbmFtZS5zcGxpdChcIl9cIik7XG4gIGlmIChwYXJ0cy5sZW5ndGggPCAyIHx8IHBhcnRzLmxlbmd0aCA+IDMpXG4gICAgcmV0dXJuIHsgdGFibGU6IHVuZGVmaW5lZCwgZXZlbnQ6IG5hbWUsIG93bmVyOiB1bmRlZmluZWQgfTtcbiAgcmV0dXJuIHtcbiAgICB0YWJsZTogcGFydHNbMF0sXG4gICAgZXZlbnQ6IHBhcnRzWzFdLFxuICAgIG93bmVyOiBwYXJ0c1syXSxcbiAgfSBhcyB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZztcbiAgICBvd25lcj86IHN0cmluZztcbiAgfTtcbn1cbiIsImltcG9ydCB7IHN0cmluZ0Zvcm1hdCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE92ZXJmbG93RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBPdmVyZmxvdy1zYWZlIGFkZGl0aW9uIG9wZXJhdGlvblxuICogQHN1bW1hcnkgQWRkcyB0d28gbnVtYmVycyBhbmQgdmVyaWZpZXMgbm8gb3ZlcmZsb3cgYnkgcmV2ZXJzZS1jaGVja2luZyB0aGUgb3BlcmFuZHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBhIC0gRmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtudW1iZXJ9IGIgLSBTZWNvbmQgb3BlcmFuZFxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgc3VtIG9mIGEgYW5kIGJcbiAqIEBmdW5jdGlvbiBhZGRcbiAqIEB0aHJvd3Mge092ZXJmbG93RXJyb3J9IG9uIGFkZGl0aW9uIG92ZXJmbG93XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGQoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBjID0gYSArIGI7XG4gIGlmIChhICE9PSBjIC0gYiB8fCBiICE9PSBjIC0gYSkge1xuICAgIHRocm93IG5ldyBPdmVyZmxvd0Vycm9yKGBBZGRpdGlvbiBvdmVyZmxvdzogJHthfSArICR7Yn1gKTtcbiAgfVxuICByZXR1cm4gYztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gT3ZlcmZsb3ctc2FmZSBzdWJ0cmFjdGlvbiBvcGVyYXRpb25cbiAqIEBzdW1tYXJ5IFN1YnRyYWN0cyBiIGZyb20gYSBhbmQgdmFsaWRhdGVzIG5vIG92ZXJmbG93IGJ5IHJldmVyc2UtY2hlY2tpbmcgdGhlIG9wZXJhbmRzXG4gKiBAcGFyYW0ge251bWJlcn0gYSAtIE1pbnVlbmRcbiAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gU3VidHJhaGVuZFxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgZGlmZmVyZW5jZSBhIC0gYlxuICogQGZ1bmN0aW9uIHN1YlxuICogQHRocm93cyB7T3ZlcmZsb3dFcnJvcn0gb24gc3VidGFjdGlvbiBvdmVyZmxvd1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3ViKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgYyA9IGEgLSBiO1xuICBpZiAoYSAhPT0gYyArIGIgfHwgYiAhPT0gYSAtIGMpIHtcbiAgICB0aHJvdyBuZXcgT3ZlcmZsb3dFcnJvcihgU3VidHJhY3Rpb24gb3ZlcmZsb3c6ICR7YX0gLSAke2J9YCk7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgU2FmZSBJbnRlZ2VyIFBhcnNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICpcbiAqIEBmdW5jdGlvbiBzYWZlUGFyc2VJbnRcbiAqXG4gKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IGlmIHBhcnNlSW50IHJldHVybnMgTmFOXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2FmZVBhcnNlSW50KHN0cmluZzogc3RyaW5nKTogbnVtYmVyIHtcbiAgLy8gUmVndWxhciBleHByZXNzaW9uIHRvIGNoZWNrIGlmIHN0cmluZyBvbmx5IGhhdmUgZGlnaXRzXG4gIGNvbnN0IGRpZ2l0UmVnZXggPSAvXlxcZCskLztcbiAgaWYgKCFkaWdpdFJlZ2V4LnRlc3Qoc3RyaW5nKSkge1xuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBzdHJpbmdGb3JtYXQoXCJGYWlsZWQgdG8gcGFyc2U6IHswfVwiLCBcInN0cmluZyBjb250YWlucyBkaWdpdHNcIilcbiAgICApO1xuICB9XG4gIGNvbnN0IHBhcnNlZGludCA9IHBhcnNlSW50KHN0cmluZyk7XG4gIGlmIChpc05hTihwYXJzZWRpbnQpKSB7XG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIHN0cmluZ0Zvcm1hdChcIkZhaWxlZCB0byBwYXJzZTogezB9XCIsIFwic3RyaW5nIGlzIG5vdCBhIHBhcnNhYmxlIGludGVnZXJcIilcbiAgICApO1xuICB9XG4gIHJldHVybiBwYXJzZWRpbnQ7XG59XG4iLCJpbXBvcnQge1xuICBKU09OU2VyaWFsaXplcixcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBzb3J0S2V5c09ubHlSZWN1cnNpdmUgfSBmcm9tIFwiLi9EZXRlcm1pbmlzdGljU2VyaWFsaXplclwiO1xuXG5leHBvcnQgY2xhc3MgU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbj4gZXh0ZW5kcyBKU09OU2VyaWFsaXplcjxNPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nLCB0YWJsZU5hbWU/OiBzdHJpbmcpOiBNIHtcbiAgICBjb25zdCBkZXNlcmlhbGl6YXRpb24gPSBKU09OLnBhcnNlKHN0cik7XG4gICAgLy8gY29uc3QgY2xhc3NOYW1lID0gdGFibGVOYW1lO1xuICAgIC8vIGlmICghY2xhc3NOYW1lKVxuICAgIC8vICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgY2xhc3MgcmVmZXJlbmNlIGluIHNlcmlhbGl6ZWQgbW9kZWxcIik7XG5cbiAgICAvLyAvLyB0aGlzIHdpbGwgcmV0dXJuIHVuZGVmaW5lZCB2YWx1ZXNcbiAgICAvLyBjb25zdCBtb2RlbDogTSA9IE1vZGVsLmJ1aWxkKGRlc2VyaWFsaXphdGlvbiwgY2xhc3NOYW1lKSBhcyB1bmtub3duIGFzIE07XG5cbiAgICAvLyAvLyBQb3B1bGF0ZSBNb2RlbFxuICAgIC8vIGNvbnN0IHByb2Nlc3NlZERlc2VhbGl6YXRpb24gPSBPYmplY3Qua2V5cyhtb2RlbCkucmVkdWNlKFxuICAgIC8vICAgKGFjY3VtOiBNLCBrZXkpID0+IHtcbiAgICAvLyAgICAgKGFjY3VtIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tleV0gPVxuICAgIC8vICAgICAgIGRlc2VyaWFsaXphdGlvbltSZXBvc2l0b3J5LmNvbHVtbihhY2N1bSwga2V5KV07XG4gICAgLy8gICAgIHJldHVybiBhY2N1bTtcbiAgICAvLyAgIH0sXG4gICAgLy8gICBtb2RlbFxuICAgIC8vICk7XG5cbiAgICAvLyBjb25zdCByZXN1bHQgPSBNb2RlbC5idWlsZChcbiAgICAvLyAgIHByb2Nlc3NlZERlc2VhbGl6YXRpb24sXG4gICAgLy8gICBjbGFzc05hbWVcbiAgICAvLyApIGFzIHVua25vd24gYXMgTTtcblxuICAgIC8vIHJldHVybiByZXN1bHQ7XG4gICAgcmV0dXJuIGRlc2VyaWFsaXphdGlvbjtcbiAgfVxuXG4gIG92ZXJyaWRlIHNlcmlhbGl6ZShtb2RlbDogTSwgcHV0QW5jaG9yID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBzdHJpbmdpZnkgPSByZXF1aXJlKFwianNvbi1zdHJpbmdpZnktZGV0ZXJtaW5pc3RpY1wiKTtcbiAgICBjb25zdCBwcmVTZXJpYWxpemF0aW9uID0gdGhpcy5wcmVTZXJpYWxpemUobW9kZWwsIHB1dEFuY2hvcik7XG4gICAgcmV0dXJuIHN0cmluZ2lmeShzb3J0S2V5c09ubHlSZWN1cnNpdmUocHJlU2VyaWFsaXphdGlvbikpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHByZVNlcmlhbGl6ZShtb2RlbDogTSwgcHV0QW5jaG9yOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIC8vIFRPRE86IG5lc3RlZCBwcmVzZXJpYWxpemF0aW9uIChzbyBpbmNyZWFzZSBwZXJmb3JtYW5jZSB3aGVuIGRlc2VyaWFsaXppbmcpXG4gICAgLy8gVE9ETzogVmVyaWZ5IHdoeSB0aGVyZSBpcyBubyBtZXRhZGF0YVxuICAgIGNvbnN0IHRvU2VyaWFsaXplOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwpO1xuICAgIGxldCBtZXRhZGF0YTtcbiAgICB0cnkge1xuICAgICAgbWV0YWRhdGEgPSBNZXRhZGF0YS5tb2RlbE5hbWUobW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3IpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBtZXRhZGF0YSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHB1dEFuY2hvcilcbiAgICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGEgfHwgbW9kZWwuY29uc3RydWN0b3IubmFtZTtcblxuICAgIGZ1bmN0aW9uIHByZVNlcmlhbGl6ZShcbiAgICAgIHRoaXM6IFNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyPGFueT4sXG4gICAgICBvYmo6IGFueVxuICAgICk6IGFueSB7XG4gICAgICBpZiAodHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG9iajtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoubWFwKHByZVNlcmlhbGl6ZSk7XG4gICAgICByZXR1cm4gdGhpcy5wcmVTZXJpYWxpemUob2JqKTtcbiAgICB9XG4gICAgTW9kZWwucmVsYXRpb25zKG1vZGVsKS5mb3JFYWNoKChyKSA9PiB7XG4gICAgICB0b1NlcmlhbGl6ZVtyXSA9IHByZVNlcmlhbGl6ZS5jYWxsKHRoaXMsIHRvU2VyaWFsaXplW3JdKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG9TZXJpYWxpemU7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgQ2xpZW50QmFzZWRTZXJ2aWNlLFxuICBDb250ZXh0LFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgRmFicmljQ0FTZXJ2aWNlcywge1xuICBBZmZpbGlhdGlvblNlcnZpY2UsXG4gIElBdHRyaWJ1dGVSZXF1ZXN0LFxuICBJZGVudGl0eVNlcnZpY2UsXG4gIElFbnJvbGxSZXNwb25zZSxcbiAgSUlkZW50aXR5UmVxdWVzdCxcbiAgSVJlZ2lzdGVyUmVxdWVzdCxcbiAgSVJldm9rZVJlcXVlc3QsXG4gIElTZXJ2aWNlUmVzcG9uc2UsXG4gIFRMU09wdGlvbnMsXG59IGZyb20gXCJmYWJyaWMtY2EtY2xpZW50XCI7XG5pbXBvcnQgeyBDQUNvbmZpZywgQ3JlZGVudGlhbHMgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQge1xuICBDb25mbGljdEVycm9yLFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvcmVVdGlscywgZ2V0QWtpQW5kU2VyaWFsRnJvbUNlcnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7XG4gIENlcnRpZmljYXRlUmVzcG9uc2UsXG4gIEZhYnJpY0lkZW50aXR5LFxuICBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICBJZGVudGl0eVJlc3BvbnNlLFxufSBmcm9tIFwiLi4vLi4vc2hhcmVkL2ZhYnJpYy10eXBlc1wiO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gXCJmYWJyaWMtY29tbW9uXCI7XG5pbXBvcnQgeyBSZWdpc3RyYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBDQV9ST0xFIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBJS2V5VmFsdWVBdHRyaWJ1dGUgfSBmcm9tIFwiLi9GYWJyaWNFbnJvbGxtZW50U2VydmljZVwiO1xuaW1wb3J0IHsgSWRlbnRpdHkgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2luZGV4XCI7XG5pbXBvcnQgeyBDcnlwdG9VdGlscyB9IGZyb20gXCIuLi9jcnlwdG9cIjtcblxuZXhwb3J0IGNsYXNzIEZhYnJpY0lkZW50aXR5U2VydmljZSBleHRlbmRzIENsaWVudEJhc2VkU2VydmljZTxcbiAgRmFicmljQ0FTZXJ2aWNlcyxcbiAgQ0FDb25maWdcbj4ge1xuICBwcm90ZWN0ZWQgX3VzZXIhOiBVc2VyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHJvb3RDbGllbnQoKTogeyBuZXdDZXJ0aWZpY2F0ZVNlcnZpY2U6IGFueSB9IHtcbiAgICByZXR1cm4gKHRoaXMuY2xpZW50IGFzIGFueSlbXCJfRmFicmljQ2FTZXJ2aWNlc1wiXSBhcyBhbnk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHVzZXIoKTogVXNlciB7XG4gICAgaWYgKCF0aGlzLl91c2VyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiRmFicmljIGlkZW50aXR5IHNlcnZpY2Ugbm90IHByb3Blcmx5IHNldHVwOiBtaXNzaW5nIHVzZXJcIlxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5fdXNlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgY2VydGlmaWNhdGVzKCkge1xuICAgIHJldHVybiB0aGlzLnJvb3RDbGllbnQubmV3Q2VydGlmaWNhdGVTZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGFmZmlsaWF0aW9ucygpOiBBZmZpbGlhdGlvblNlcnZpY2Uge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5uZXdBZmZpbGlhdGlvblNlcnZpY2UoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaWRlbnRpdGllcygpOiBJZGVudGl0eVNlcnZpY2Uge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5uZXdJZGVudGl0eVNlcnZpY2UoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZXRVc2VyKGNmZzogQ0FDb25maWcsIGN0eDogQ29udGV4dCkge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuZ2V0VXNlcik7XG4gICAgY29uc3QgeyBjYU5hbWUsIGNhQ2VydCwgY2FLZXksIHVybCwgaHNtIH0gPSBjZmc7XG5cbiAgICBsb2cuaW5mbyhgQ3JlYXRpbmcgQ0EgdXNlciBmb3IgJHtjYU5hbWV9IGF0ICR7dXJsfWApO1xuICAgIGxvZy52ZXJib3NlKGBSZXRyaWV2aW5nIENBIGNlcnRpZmljYXRlIGZyb20gJHtjYUNlcnR9YCk7XG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoY2FDZXJ0KTtcbiAgICBsZXQga2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFoc20pIHtcbiAgICAgIGlmICghY2FLZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE1pc3NpbmcgY2FLZXkgY29uZmlndXJhdGlvbiBmb3IgQ0EgJHtjYU5hbWV9LiBQcm92aWRlIGEga2V5IGRpcmVjdG9yeSBvciBjb25maWd1cmUgSFNNIHN1cHBvcnQuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIENBIGtleSBmcm9tICR7Y2FLZXl9YCk7XG4gICAgICBrZXkgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoY2FLZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBVc2luZyBIU00gY29uZmlndXJhdGlvbiBmb3IgQ0EgJHtjYU5hbWV9IHdpdGggbGlicmFyeSAke2hzbS5saWJyYXJ5fWBcbiAgICAgICk7XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgTG9hZGluZyBBZG1pbiB1c2VyIGZvciBjYSAke2NhTmFtZX1gKTtcbiAgICB0aGlzLl91c2VyID0gYXdhaXQgQ29yZVV0aWxzLmdldENBVXNlcihcImFkbWluXCIsIGtleSwgY2VydGlmaWNhdGUsIGNhTmFtZSwge1xuICAgICAgaHNtLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLl91c2VyO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgaW5pdGlhbGl6ZShcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHsgY29uZmlnOiBDQUNvbmZpZzsgY2xpZW50OiBGYWJyaWNDQVNlcnZpY2VzIH0+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQZXJzaXN0ZW5jZUtleXMuSU5JVElBTElaQVRJT04sIHRydWUpXG4gICAgKS5mb3IodGhpcy5pbml0aWFsaXplKTtcbiAgICBjb25zdCBbY29uZmlnXSA9IGFyZ3M7XG4gICAgaWYgKCFjb25maWcpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTWlzc2luZyBGYWJyaWMgQ0EgY29uZmlndXJhdGlvblwiKTtcblxuICAgIGNvbnN0IHsgdXJsLCB0bHMsIGNhTmFtZSB9ID0gY29uZmlnO1xuICAgIGxvZy5pbmZvKGBJbml0aWFsaXppbmcgQ0EgQ2xpZW50IGZvciBDQSAke2NvbmZpZy5jYU5hbWV9IGF0ICR7Y29uZmlnLnVybH1gKTtcbiAgICBjb25zdCB7IHRydXN0ZWRSb290cywgdmVyaWZ5IH0gPSB0bHMgYXMgVExTT3B0aW9ucztcblxuICAgIGNvbnN0IHJvb3QgPSAodHJ1c3RlZFJvb3RzIGFzIHN0cmluZ1tdKVswXSBhcyBzdHJpbmc7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIENBIGNlcnRpZmljYXRlIGZyb20gJHtyb290fS4gY3dkOiAke3Byb2Nlc3MuY3dkKCl9YCk7XG5cbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGF3YWl0IENvcmVVdGlscy5nZXRGaWxlQ29udGVudChyb290KTtcblxuICAgIGxvZy5kZWJ1ZyhgQ0EgQ2VydGlmaWNhdGU6ICR7Y2VydGlmaWNhdGUudG9TdHJpbmcoKX1gKTtcblxuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBGYWJyaWNDQVNlcnZpY2VzKFxuICAgICAgdXJsLFxuICAgICAge1xuICAgICAgICB0cnVzdGVkUm9vdHM6IEJ1ZmZlci5mcm9tKGNlcnRpZmljYXRlKSxcbiAgICAgICAgdmVyaWZ5LFxuICAgICAgfSBhcyBUTFNPcHRpb25zLFxuICAgICAgY2FOYW1lXG4gICAgKTtcblxuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmdldFVzZXIoY29uZmlnLCBjdHgpO1xuICAgIGxvZy5kZWJ1ZyhgQ0EgdXNlciBsb2FkZWQ6ICR7dXNlci5nZXROYW1lKCl9YCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbmZpZyxcbiAgICAgIGNsaWVudCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzKC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+KTogUHJvbWlzZTxzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlcyhcbiAgICByZXF1ZXN0OiBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8c3RyaW5nW10+O1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXM8TUFQIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgZG9NYXA6IE1BUCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPE1BUCBleHRlbmRzIGZhbHNlID8gQ2VydGlmaWNhdGVSZXNwb25zZSA6IHN0cmluZ1tdPjtcbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzPE1BUCBleHRlbmRzIGJvb2xlYW4+KFxuICAgIHJlcXVlc3Q6IEdldENlcnRpZmljYXRlc1JlcXVlc3QsXG4gICAgZG9NYXA6IE1BUCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPE1BUCBleHRlbmRzIGZhbHNlID8gQ2VydGlmaWNhdGVSZXNwb25zZSA6IHN0cmluZ1tdPjtcbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzPE1BUCBleHRlbmRzIGJvb2xlYW4+KFxuICAgIHJlcXVlc3Q/OiBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0IHwgTUFQLFxuICAgIGRvTWFwOiBNQVAgPSB0cnVlIGFzIE1BUCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPE1BUCBleHRlbmRzIGZhbHNlID8gQ2VydGlmaWNhdGVSZXNwb25zZSA6IHN0cmluZ1tdPiB7XG4gICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBDb250ZXh0KSB7XG4gICAgICBhcmdzID0gW3JlcXVlc3RdO1xuICAgICAgZG9NYXAgPSB0cnVlIGFzIE1BUDtcbiAgICAgIHJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmVxdWVzdCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGRvTWFwID0gcmVxdWVzdDtcbiAgICAgIHJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZG9NYXAgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBhcmdzID0gW2RvTWFwIGFzIE1heWJlQ29udGV4dHVhbEFyZzxhbnk+LCAuLi5hcmdzXTtcbiAgICAgIGRvTWFwID0gdHJ1ZSBhcyBNQVA7XG4gICAgfVxuXG4gICAgY29uc3QgeyBsb2cgfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBPcGVyYXRpb25LZXlzLlJFQUQsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLmdldENlcnRpZmljYXRlc1xuICAgICk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYFJldHJpZXZpbmcgY2VydGlmaWNhdGVzJHtyZXF1ZXN0ID8gYCBmb3IgJHtyZXF1ZXN0LmlkfWAgOiBcIlwifSBmb3IgQ0EgJHt0aGlzLmNvbmZpZy5jYU5hbWV9YFxuICAgICk7XG4gICAgY29uc3QgcmVzcG9uc2U6IENlcnRpZmljYXRlUmVzcG9uc2UgPSAoXG4gICAgICBhd2FpdCB0aGlzLmNlcnRpZmljYXRlcy5nZXRDZXJ0aWZpY2F0ZXMocmVxdWVzdCB8fCB7fSwgdGhpcy51c2VyKVxuICAgICkucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmNlcnRzLmxlbmd0aH0gY2VydGlmaWNhdGVzYCk7XG4gICAgbG9nLmRlYnVnKHJlc3BvbnNlLmNlcnRzKTtcbiAgICByZXR1cm4gKFxuICAgICAgZG9NYXAgPyByZXNwb25zZS5jZXJ0cy5tYXAoKGMpID0+IGMuUEVNKSA6IHJlc3BvbnNlXG4gICAgKSBhcyBNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXTtcbiAgfVxuXG4gIGFzeW5jIGdldElkZW50aXRpZXMoY3R4OiBDb250ZXh0KTogUHJvbWlzZTxGYWJyaWNJZGVudGl0eVtdPiB7XG4gICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IodGhpcy5nZXRJZGVudGl0aWVzKTtcbiAgICBsb2cudmVyYm9zZShgUmV0cmlldmluZyBJZGVudGl0aWVzIHVuZGVyIENBICR7dGhpcy5jb25maWcuY2FOYW1lfWApO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBJZGVudGl0eVJlc3BvbnNlID0gKGF3YWl0IHRoaXMuaWRlbnRpdGllcy5nZXRBbGwodGhpcy51c2VyKSlcbiAgICAgIC5yZXN1bHQ7XG4gICAgbG9nLnZlcmJvc2UoYEZvdW5kICR7cmVzcG9uc2UuaWRlbnRpdGllcy5sZW5ndGh9IElkZW50aXRpZXNgKTtcbiAgICBsb2cuZGVidWcocmVzcG9uc2UuaWRlbnRpdGllcyk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmlkZW50aXRpZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlIGFmZmlsaWF0aW9ucyBmcm9tIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgUXVlcmllcyB0aGUgQ0EgZm9yIHRoZSBsaXN0IG9mIGFmZmlsaWF0aW9ucyBhdmFpbGFibGUgdW5kZXIgdGhlIGNvbmZpZ3VyZWQgQ0EuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGFmZmlsaWF0aW9ucyByZXN1bHQgcGF5bG9hZC5cbiAgICovXG4gIGFzeW5jIGdldEFmZmlsaWF0aW9ucyhjdHg6IENvbnRleHQpIHtcbiAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyLmZvcih0aGlzLmdldEFmZmlsaWF0aW9ucyk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgQWZmaWxpYXRpb25zIHVuZGVyIENBICR7dGhpcy5jb25maWcuY2FOYW1lfWApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IHRoaXMuYWZmaWxpYXRpb25zLmdldEFsbCh0aGlzLnVzZXIpKS5yZXN1bHQ7XG4gICAgbG9nLnZlcmJvc2UoYEZvdW5kICR7cmVzcG9uc2UuYS5sZW5ndGh9IEFmZmlsaWF0aW9uc2ApO1xuICAgIGxvZy5kZWJ1ZyhKU09OLnN0cmluZ2lmeShyZXNwb25zZSkpO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUVycm9yKGU6IEVycm9yKSB7XG4gICAgY29uc3QgcmVnZXhwID0gLy4qY29kZTpcXHMoXFxkKykuKj9tZXNzYWdlOlxcc1tcIiddKC4rKVtcIiddL2dzO1xuICAgIGNvbnN0IG1hdGNoID0gcmVnZXhwLmV4ZWMoZS5tZXNzYWdlKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gbmV3IFJlZ2lzdHJhdGlvbkVycm9yKGUpO1xuICAgIGNvbnN0IFssIGNvZGUsIG1lc3NhZ2VdID0gbWF0Y2g7XG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICBjYXNlIFwiNzRcIjpcbiAgICAgIGNhc2UgXCI3MVwiOlxuICAgICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IobWVzc2FnZSk7XG4gICAgICBjYXNlIFwiMjBcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBBdXRob3JpemF0aW9uRXJyb3IobWVzc2FnZSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbmV3IFJlZ2lzdHJhdGlvbkVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZCBpZGVudGl0eSBkZXRhaWxzIGZyb20gdGhlIENBIGJ5IGVucm9sbG1lbnQgSUQuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhbmQgdmFsaWRhdGVzIGEgc2luZ2xlIGlkZW50aXR5LCB0aHJvd2luZyBOb3RGb3VuZEVycm9yIHdoZW4gbWlzc2luZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVucm9sbG1lbnRJZCAtIEVucm9sbG1lbnQgSUQgdG8gbG9va3VwLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEZhYnJpY0lkZW50aXR5Pn0gVGhlIGlkZW50aXR5IGRldGFpbHMgc3RvcmVkIGluIHRoZSBDQS5cbiAgICovXG4gIGFzeW5jIHJlYWQoXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxGYWJyaWNJZGVudGl0eT4ge1xuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgT3BlcmF0aW9uS2V5cy5SRUFELCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5yZWFkXG4gICAgKTtcbiAgICBsb2cudmVyYm9zZShgUmV0cmlldmluZyBpZGVudGl0eSB3aXRoIGVucm9sbG1lbnQgSUQgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgbGV0IHJlc3VsdDogSVNlcnZpY2VSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5pZGVudGl0aWVzLmdldE9uZShlbnJvbGxtZW50SWQsIHRoaXMudXNlcik7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkbid0IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXN1bHQuc3VjY2VzcylcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGRuJ3QgZmluZCBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke3Jlc3VsdC5lcnJvcnMuam9pbihcIlxcblwiKX1gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQgYXMgRmFicmljSWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGEgbmV3IGlkZW50aXR5IHdpdGggdGhlIENBLlxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgcmVnaXN0cmF0aW9uIHJlcXVlc3QgZm9yIGEgbmV3IGVucm9sbG1lbnQgSUQsIHJldHVybmluZyB0aGUgZW5yb2xsbWVudCBzZWNyZXQgdXBvbiBzdWNjZXNzLlxuICAgKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBtb2RlbCAtIENyZWRlbnRpYWxzIGNvbnRhaW5pbmcgdXNlck5hbWUgYW5kIHBhc3N3b3JkIGZvciB0aGUgbmV3IGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N1cGVyVXNlcj1mYWxzZV0gLSBXaGV0aGVyIHRvIHJlZ2lzdGVyIHRoZSBpZGVudGl0eSBhcyBhIHN1cGVyIHVzZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWZmaWxpYXRpb249XCJcIl0gLSBBZmZpbGlhdGlvbiBzdHJpbmcgKGUuZy4sIG9yZzEuZGVwYXJ0bWVudDEpLlxuICAgKiBAcGFyYW0ge0NBX1JPTEUgfCBzdHJpbmd9IFt1c2VyUm9sZV0gLSBSb2xlIHRvIGFzc2lnbiB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7SUtleVZhbHVlQXR0cmlidXRlfSBbYXR0cnNdIC0gT3B0aW9uYWwgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW21heEVucm9sbG1lbnRzXSAtIE1heGltdW0gbnVtYmVyIG9mIGVucm9sbG1lbnRzIGFsbG93ZWQgZm9yIHRoZSBpZGVudGl0eS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSBUaGUgZW5yb2xsbWVudCBzZWNyZXQgZm9yIHRoZSByZWdpc3RlcmVkIGlkZW50aXR5LlxuICAgKi9cbiAgYXN5bmMgcmVnaXN0ZXIoXG4gICAgbW9kZWw6IENyZWRlbnRpYWxzLFxuICAgIGlzU3VwZXJVc2VyOiBib29sZWFuID0gZmFsc2UsXG4gICAgYWZmaWxpYXRpb246IHN0cmluZyA9IFwiXCIsXG4gICAgdXNlclJvbGU/OiBDQV9ST0xFIHwgc3RyaW5nLFxuICAgIGF0dHJzPzogSUtleVZhbHVlQXR0cmlidXRlLFxuICAgIG1heEVucm9sbG1lbnRzPzogbnVtYmVyLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInJlZ2lzdGVyXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLnJlZ2lzdGVyXG4gICAgKTtcblxuICAgIGxldCByZWdpc3RyYXRpb246IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyB1c2VyTmFtZSwgcGFzc3dvcmQgfSA9IG1vZGVsO1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIGVucm9sbG1lbnRJRDogdXNlck5hbWUgYXMgc3RyaW5nLFxuICAgICAgICBlbnJvbGxtZW50U2VjcmV0OiBwYXNzd29yZCxcbiAgICAgICAgYWZmaWxpYXRpb246IGFmZmlsaWF0aW9uLFxuICAgICAgICB1c2VyUm9sZTogdXNlclJvbGUsXG4gICAgICAgIGF0dHJzOiBhdHRycyxcbiAgICAgICAgbWF4RW5yb2xsbWVudHM6IG1heEVucm9sbG1lbnRzLFxuICAgICAgfSBhcyBJUmVnaXN0ZXJSZXF1ZXN0O1xuICAgICAgcmVnaXN0cmF0aW9uID0gYXdhaXQgdGhpcy5jbGllbnQucmVnaXN0ZXIocHJvcHMsIHRoaXMudXNlcik7XG4gICAgICBsb2cuaW5mbyhcbiAgICAgICAgYFJlZ2lzdHJhdGlvbiBmb3IgJHt1c2VyTmFtZX0gY3JlYXRlZCB3aXRoIHVzZXIgdHlwZSAke3VzZXJSb2xlID8/IFwiVW5kZWZpbmVkIFJvbGVcIn0gJHtpc1N1cGVyVXNlciA/IFwiYXMgc3VwZXIgdXNlclwiIDogXCJcIn1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVnaXN0cmF0aW9uO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBpZGVudGl0eUZyb21FbnJvbGxtZW50KFxuICAgIGVucm9sbG1lbnQ6IElFbnJvbGxSZXNwb25zZSxcbiAgICBtc3BJZDogc3RyaW5nLFxuICAgIGN0eDogQ29udGV4dFxuICApOiBJZGVudGl0eSB7XG4gICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IodGhpcy5pZGVudGl0eUZyb21FbnJvbGxtZW50KTtcbiAgICBjb25zdCB7IGNlcnRpZmljYXRlLCBrZXksIHJvb3RDZXJ0aWZpY2F0ZSB9ID0gZW5yb2xsbWVudDtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBHZW5lcmF0aW5nIElkZW50aXR5IGZyb20gY2VydGlmaWNhdGUgJHtjZXJ0aWZpY2F0ZX0gaW4gbXNwICR7bXNwSWR9YFxuICAgICk7XG4gICAgY29uc3QgY2xpZW50SWQgPSBDcnlwdG9VdGlscy5mYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3QgaWQgPSBDcnlwdG9VdGlscy5lbmNvZGUoY2xpZW50SWQpO1xuICAgIGxvZy5kZWJ1ZyhgSWRlbnRpdHkgJHtjbGllbnRJZH0gYW5kIGVuY29kZWRJZCAke2lkfWApO1xuICAgIHJldHVybiBuZXcgSWRlbnRpdHkoe1xuICAgICAgaWQ6IGlkLFxuICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBjZXJ0aWZpY2F0ZTogY2VydGlmaWNhdGUsXG4gICAgICAgIHByaXZhdGVLZXk6IGtleS50b0J5dGVzKCksXG4gICAgICAgIHJvb3RDZXJ0aWZpY2F0ZTogcm9vdENlcnRpZmljYXRlLFxuICAgICAgfSxcbiAgICAgIG1zcElkOiBtc3BJZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRW5yb2xsIGFuIGlkZW50aXR5IHdpdGggdGhlIENBIHVzaW5nIGEgcmVnaXN0cmF0aW9uIHNlY3JldC5cbiAgICogQHN1bW1hcnkgRXhjaGFuZ2VzIHRoZSBlbnJvbGxtZW50IElEIGFuZCBzZWNyZXQgZm9yIGNlcnRpZmljYXRlcywgcmV0dXJuaW5nIGEgY29uc3RydWN0ZWQgSWRlbnRpdHkgbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGVucm9sbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbiAtIEVucm9sbG1lbnQgc2VjcmV0IHJldHVybmVkIGF0IHJlZ2lzdHJhdGlvbiB0aW1lLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPElkZW50aXR5Pn0gVGhlIGVucm9sbGVkIGlkZW50aXR5IG9iamVjdCB3aXRoIGNyZWRlbnRpYWxzLlxuICAgKi9cbiAgYXN5bmMgZW5yb2xsKFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIHJlZ2lzdHJhdGlvbjogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8SWRlbnRpdHk+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJlbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMuZW5yb2xsXG4gICAgKTtcbiAgICBsZXQgaWRlbnRpdHk6IElkZW50aXR5O1xuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoYEVucm9sbGluZyAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIGNvbnN0IGVucm9sbG1lbnQ6IElFbnJvbGxSZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmVucm9sbCh7XG4gICAgICAgIGVucm9sbG1lbnRJRDogZW5yb2xsbWVudElkLFxuICAgICAgICBlbnJvbGxtZW50U2VjcmV0OiByZWdpc3RyYXRpb24sXG4gICAgICB9KTtcbiAgICAgIGlkZW50aXR5ID0gRmFicmljSWRlbnRpdHlTZXJ2aWNlLmlkZW50aXR5RnJvbUVucm9sbG1lbnQoXG4gICAgICAgIGVucm9sbG1lbnQsXG4gICAgICAgIHRoaXMuY29uZmlnLmNhTmFtZSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBTdWNjZXNzZnVsbHkgZW5yb2xsZWQgJHtlbnJvbGxtZW50SWR9IHVuZGVyICR7dGhpcy5jb25maWcuY2FOYW1lfSBhcyAke2lkZW50aXR5LmlkfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiBpZGVudGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgYW5kIGVucm9sbCBhIG5ldyBpZGVudGl0eSBpbiBvbmUgc3RlcC5cbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIGEgbmV3IGVucm9sbG1lbnQgSUQgd2l0aCB0aGUgQ0EgYW5kIGltbWVkaWF0ZWx5IGV4Y2hhbmdlcyB0aGUgc2VjcmV0IHRvIGVucm9sbCwgcmV0dXJuaW5nIHRoZSBjcmVhdGVkIElkZW50aXR5LlxuICAgKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBtb2RlbCAtIENyZWRlbnRpYWxzIGZvciB0aGUgbmV3IGlkZW50aXR5IGNvbnRhaW5pbmcgdXNlck5hbWUgYW5kIHBhc3N3b3JkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N1cGVyVXNlcj1mYWxzZV0gLSBXaGV0aGVyIHRvIHJlZ2lzdGVyIHRoZSBpZGVudGl0eSBhcyBhIHN1cGVyIHVzZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWZmaWxpYXRpb249XCJcIl0gLSBBZmZpbGlhdGlvbiBzdHJpbmcgKGUuZy4sIG9yZzEuZGVwYXJ0bWVudDEpLlxuICAgKiBAcGFyYW0ge0NBX1JPTEUgfCBzdHJpbmd9IFt1c2VyUm9sZV0gLSBSb2xlIHRvIGFzc2lnbiB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7SUtleVZhbHVlQXR0cmlidXRlfSBbYXR0cnNdIC0gT3B0aW9uYWwgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW21heEVucm9sbG1lbnRzXSAtIE1heGltdW0gbnVtYmVyIG9mIGVucm9sbG1lbnRzIGFsbG93ZWQgZm9yIHRoZSBpZGVudGl0eS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBlbnJvbGxlZCBpZGVudGl0eS5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyQW5kRW5yb2xsKFxuICAgIG1vZGVsOiBDcmVkZW50aWFscyxcbiAgICBpc1N1cGVyVXNlcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiLFxuICAgIHVzZXJSb2xlPzogQ0FfUk9MRSB8IHN0cmluZyxcbiAgICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZSxcbiAgICBtYXhFbnJvbGxtZW50cz86IG51bWJlcixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInJlZ2lzdGVyLWVucm9sbFwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5yZWdpc3RlckFuZEVucm9sbFxuICAgICk7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gYXdhaXQgdGhpcy5yZWdpc3RlcihcbiAgICAgIG1vZGVsLFxuICAgICAgaXNTdXBlclVzZXIsXG4gICAgICBhZmZpbGlhdGlvbixcbiAgICAgIHVzZXJSb2xlLFxuICAgICAgYXR0cnMsXG4gICAgICBtYXhFbnJvbGxtZW50cyxcbiAgICAgIGN0eFxuICAgICk7XG4gICAgY29uc3QgeyB1c2VyTmFtZSB9ID0gbW9kZWw7XG4gICAgcmV0dXJuIHRoaXMuZW5yb2xsKHVzZXJOYW1lIGFzIHN0cmluZywgcmVnaXN0cmF0aW9uLCBjdHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZS1lbnJvbGwgYW4gZXhpc3RpbmcgaWRlbnRpdHkgdXNpbmcgaXRzIGN1cnJlbnQgZW5yb2xsbWVudC5cbiAgICogQHN1bW1hcnkgUmVuZXdzIHRoZSBlbnJvbGxtZW50IGNlcnRpZmljYXRlIGJ5IGNhbGxpbmcgdGhlIENBIHJlZW5yb2xsLlxuICAgKiBAcGFyYW0ge1VzZXJ9IGN1cnJlbnRVc2VyIC0gQWxyZWFkeSBlbnJvbGxlZCB1c2VyLCBtdXN0IGhhdmUgYSBzaWduaW5nIGlkZW50aXR5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPElkZW50aXR5Pn0gVGhlIHJlbmV3ZWQgaWRlbnRpdHkgb2JqZWN0IHdpdGggbmV3IGNyZWRlbnRpYWxzLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlSWRlbnRpdHkoXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgaWRlbnRpdHk6IHsgY2VydGlmaWNhdGU6IHN0cmluZzsgcHJpdmF0ZUtleTogc3RyaW5nIH0sXG4gICAgaWRlbnRpdHlSZXF1ZXN0OiBJSWRlbnRpdHlSZXF1ZXN0LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8SWRlbnRpdHk+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWVucm9sbFwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy51cGRhdGVJZGVudGl0eVxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgbG9nLmluZm8oYFJlbmV3aW5nIGlkZW50aXR5IGZvciAke2Vucm9sbG1lbnRJZH1gKTtcblxuICAgICAgLy8gVXBkYXRlIGF0dHJpYnV0ZXMgaW4gdGhlIENBIHJlZ2lzdHJ5IChhZG1pbiBvcGVyYXRpb24pLiBUaGlzIGNoYW5nZXMgdGhlIFwic291cmNlIG9mIHRydXRoXCIuXG4gICAgICBjb25zdCBpZGVudGl0eVNlcnZpY2UgPSB0aGlzLmNsaWVudC5uZXdJZGVudGl0eVNlcnZpY2UoKTtcblxuICAgICAgY29uc3QgY2FVc2VySWRlbnRpdHkgPSAoYXdhaXQgaWRlbnRpdHlTZXJ2aWNlLmdldE9uZShcbiAgICAgICAgZW5yb2xsbWVudElkLFxuICAgICAgICB0aGlzLnVzZXJcbiAgICAgICkpIGFzIHsgcmVzdWx0OiB7IGF0dHJzPzogSUtleVZhbHVlQXR0cmlidXRlW10gfSB9O1xuXG4gICAgICBhd2FpdCBpZGVudGl0eVNlcnZpY2UudXBkYXRlKGVucm9sbG1lbnRJZCwgaWRlbnRpdHlSZXF1ZXN0LCB0aGlzLnVzZXIpOyAvLyBhcyBJU2VydmljZVJlc3BvbnNlICYgeyByZXN1bHQ6IElJZGVudGl0eVJlcXVlc3QgfTtcblxuICAgICAgLy8gUmVlbnJvbGwgYXMgdGhlIHVzZXIuIFJlcXVlc3QgbXVzdCBiZSBzaWduZWQgdXNpbmcgdGhlIGV4aXN0aW5nIGNlcnRpZmljYXRlLlxuICAgICAgY29uc3QgcmVlbnJvbGxVc2VyID0gVXNlci5jcmVhdGVVc2VyKFxuICAgICAgICBlbnJvbGxtZW50SWQsXG4gICAgICAgIFwiXCIsIC8vIGVucm9sbG1lbnRTZWNyZXQgbm90IHJlcXVpcmVkIGZvciByZWVucm9sbFxuICAgICAgICB0aGlzLnVzZXIuZ2V0TXNwaWQoKSxcbiAgICAgICAgaWRlbnRpdHkuY2VydGlmaWNhdGUsXG4gICAgICAgIGlkZW50aXR5LnByaXZhdGVLZXlcbiAgICAgICk7XG4gICAgICByZWVucm9sbFVzZXIuc2V0Q3J5cHRvU3VpdGUodGhpcy51c2VyLmdldENyeXB0b1N1aXRlKCkpO1xuXG4gICAgICBjb25zdCBlbnJvbGxtZW50QXR0cnM6IElBdHRyaWJ1dGVSZXF1ZXN0W10gPSAoXG4gICAgICAgIGNhVXNlcklkZW50aXR5LnJlc3VsdC5hdHRycyB8fCBbXVxuICAgICAgKS5tYXAoKHsgbmFtZSB9KSA9PiAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBvcHRpb25hbDogZmFsc2UsXG4gICAgICB9KSk7XG5cbiAgICAgIGNvbnN0IGVucm9sbG1lbnQgPSBhd2FpdCB0aGlzLmNsaWVudC5yZWVucm9sbChcbiAgICAgICAgcmVlbnJvbGxVc2VyLFxuICAgICAgICBlbnJvbGxtZW50QXR0cnNcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJlbmV3ZWRJZGVudGl0eSA9IEZhYnJpY0lkZW50aXR5U2VydmljZS5pZGVudGl0eUZyb21FbnJvbGxtZW50KFxuICAgICAgICBlbnJvbGxtZW50LFxuICAgICAgICB0aGlzLmNvbmZpZy5jYU5hbWUsXG4gICAgICAgIGN0eFxuICAgICAgKTtcblxuICAgICAgLy8gUmV2b2tlIHRoZSBwcmV2aW91cyBjZXJ0aWZpY2F0ZSBvbmx5LCBzbyB0aGUgb2xkIGNlcnQgYmVjb21lcyBpbnZhbGlkLlxuICAgICAgbG9nLmRlYnVnKGBSZXZva2luZyBwcmV2aW91cyBjZXJ0aWZpY2F0ZXMgZm9yICR7ZW5yb2xsbWVudElkfWApO1xuICAgICAgY29uc3QgeyBha2ksIHNlcmlhbCB9ID0gZ2V0QWtpQW5kU2VyaWFsRnJvbUNlcnQoaWRlbnRpdHkuY2VydGlmaWNhdGUpO1xuICAgICAgYXdhaXQgdGhpcy5yZXZva2UoZW5yb2xsbWVudElkLCB7IGFraSwgc2VyaWFsIH0sIGFyZ3MpO1xuXG4gICAgICBsb2cuZGVidWcoYFJlbmV3IGlkZW50aXR5IHN1Y2Nlc3NmdWwgZm9yICR7ZW5yb2xsbWVudElkfWApO1xuICAgICAgcmV0dXJuIHJlbmV3ZWRJZGVudGl0eTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV2b2tlcyB0aGUgZW5yb2xsbWVudCBvZiBhbiBpZGVudGl0eSB3aXRoIHRoZSBzcGVjaWZpZWQgZW5yb2xsbWVudCBJRC5cbiAgICpcbiAgICogQHBhcmFtIGVucm9sbG1lbnRJZCAtIFRoZSBlbnJvbGxtZW50IElEIG9mIHRoZSBpZGVudGl0eSB0byBiZSByZXZva2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVzdWx0IG9mIHRoZSByZXZvY2F0aW9uIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHRocm93cyB7Tm90Rm91bmRFcnJvcn0gSWYgdGhlIGVucm9sbG1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIElEIGRvZXMgbm90IGV4aXN0LlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGVyZSBpcyBhbiBlcnJvciBkdXJpbmcgdGhlIHJldm9jYXRpb24gcHJvY2Vzcy5cbiAgICovXG4gIGFzeW5jIHJldm9rZShcbiAgICBlbnJvbGxtZW50SWQ6IHN0cmluZyxcbiAgICByZXZva2VPcHRpb25zOiBPbWl0PElSZXZva2VSZXF1ZXN0LCBcImVucm9sbG1lbnRJRFwiPixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElTZXJ2aWNlUmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IGxvZyB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwicmV2b2tlXCIsIHRydWUpKS5mb3IodGhpcy5yZXZva2UpO1xuICAgIGxvZy52ZXJib3NlKGBSZXZva2luZyBpZGVudGl0eSB3aXRoIGVucm9sbG1lbnQgSUQgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBhd2FpdCB0aGlzLnJlYWQoZW5yb2xsbWVudElkKTtcbiAgICBpZiAoIWlkZW50aXR5KVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgZmluZCBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9YFxuICAgICAgKTtcbiAgICBsZXQgcmVzdWx0OiBJU2VydmljZVJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWFzb24gPVxuICAgICAgICBCb29sZWFuKHJldm9rZU9wdGlvbnMuc2VyaWFsKSB8fCBCb29sZWFuKHJldm9rZU9wdGlvbnMuYWtpKVxuICAgICAgICAgID8gXCJSZXZva2UgVXNlciBDZXJ0aWZpY2F0ZVwiXG4gICAgICAgICAgOiBcIlVzZXIgRGVsZXRpb25cIjtcblxuICAgICAgY29uc3QgcmV2b2tlUmVxdWVzdDogSVJldm9rZVJlcXVlc3QgPSB7XG4gICAgICAgIHJlYXNvbixcbiAgICAgICAgLi4ucmV2b2tlT3B0aW9ucyxcbiAgICAgICAgZW5yb2xsbWVudElEOiBpZGVudGl0eS5pZCxcbiAgICAgIH07XG5cbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuY2xpZW50LnJldm9rZShyZXZva2VSZXF1ZXN0LCB0aGlzLnVzZXIpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IHJldm9rZSBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke2V9YFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFyZXN1bHQuc3VjY2VzcylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IHJldm9rZSBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke3Jlc3VsdC5lcnJvcnMuam9pbihcIlxcblwiKX1gXG4gICAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIENlcnRpZmljYXRlIEF1dGhvcml0eSByb2xlIHR5cGVzIHVzZWQgZHVyaW5nIGVucm9sbG1lbnQgYW5kIHJlZ2lzdHJhdGlvbi5cbiAqIEBzdW1tYXJ5IEVudW1lcmF0ZXMgdGhlIHN0YW5kYXJkIEh5cGVybGVkZ2VyIEZhYnJpYyBDQSByb2xlcyB0aGF0IGNhbiBiZSBhc3NpZ25lZCB0byBpZGVudGl0aWVzIHdoZW4gcmVnaXN0ZXJpbmcgd2l0aCB0aGUgQ0Egc2VydmljZS5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGVudW0gQ0FfUk9MRSB7XG4gIC8qKiBBZG1pbmlzdHJhdG9yIHJvbGUgd2l0aCBlbGV2YXRlZCBwcml2aWxlZ2VzIGZvciBtYW5hZ2luZyBpZGVudGl0aWVzIGFuZCBhZmZpbGlhdGlvbnMgKi9cbiAgQURNSU4gPSBcImFkbWluXCIsXG4gIC8qKiBTdGFuZGFyZCB1c2VyIHJvbGUgZm9yIGFwcGxpY2F0aW9uIGNsaWVudHMgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgbmV0d29yayAqL1xuICBVU0VSID0gXCJ1c2VyXCIsXG4gIC8qKiBDbGllbnQgcm9sZSB0eXBpY2FsbHkgdXNlZCBmb3IgU0RLLWJhc2VkIGludGVyYWN0aW9ucyBhbmQgc2VydmljZSBhY2NvdW50cyAqL1xuICBDTElFTlQgPSBcImNsaWVudFwiLFxufVxuIiwiaW1wb3J0IHsgRmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzOiBGYWJyaWNDbGllbnRGbGFncyA9IE9iamVjdC5hc3NpZ24oe1xuICBldmFsdWF0ZVRpbWVvdXQ6IDUsXG4gIGVuZG9yc2VUaW1lb3V0OiAxNSxcbiAgc3VibWl0VGltZW91dDogNSxcbiAgY29tbWl0VGltZW91dDogNjAsXG4gIGxlZ2FjeTogZmFsc2UsXG4gIGFsbG93TWFudWFsRW5kb3JzaW5nT3JnczogZmFsc2UsXG4gIGFsbG93R2F0ZXdheU92ZXJyaWRlOiBmYWxzZSxcbiAgcmVidWlsZFdpdGhUcmFuc2llbnQ6IHRydWUsXG4gIGVuY3J5cHRUcmFuc2llbnQ6IGZhbHNlLFxuICBzeW50aGV0aWNFdmVudHM6IHRydWUsXG59KSBhcyBhbnk7XG4iLCJpbXBvcnQgeyBpc0Jyb3dzZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgSWRlbnRpdHksIFNpZ25lciwgc2lnbmVycyB9IGZyb20gXCJAaHlwZXJsZWRnZXIvZmFicmljLWdhdGV3YXlcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUltcG9ydCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5jb25zdCBsb2cgPSBuZXcgTWluaUxvZ2dlcihcImZhYnJpYy1mc1wiKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTG9hZHMgY29udGVudCBmcm9tIGEgZmlsZSBvciByZXR1cm5zIHRoZSBjb250ZW50IGlmIGFscmVhZHkgbG9hZGVkXG4gKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIHRoZSBpbnB1dCBpcyBhbHJlYWR5IGNvbnRlbnQgb3IgYSBwYXRoIHRvIGEgZmlsZSwgYW5kIGxvYWRzIHRoZSBmaWxlIGlmIG5lZWRlZFxuICogQHBhcmFtIHtzdHJpbmcgfCBVaW50OEFycmF5fSBjb250ZW50T3JQYXRoIC0gVGhlIGNvbnRlbnQgb3IgcGF0aCB0byBsb2FkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaWxlUmVhZGVyIC0gRnVuY3Rpb24gdG8gcmVhZCB0aGUgZmlsZSBpZiBjb250ZW50T3JQYXRoIGlzIGEgcGF0aFxuICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmcgfCBVaW50OEFycmF5IHwgQnVmZmVyPn0gVGhlIGNvbnRlbnRcbiAqIEBmdW5jdGlvbiBjb250ZW50T2ZMb2FkRmlsZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29udGVudE9mTG9hZEZpbGUoXG4gIGNvbnRlbnRPclBhdGg6IHN0cmluZyB8IFVpbnQ4QXJyYXksXG4gIGZpbGVSZWFkZXI6IChwYXRoOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nIHwgVWludDhBcnJheSB8IEJ1ZmZlcj5cbikge1xuICBpZiAoY29udGVudE9yUGF0aCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHJldHVybiBjb250ZW50T3JQYXRoO1xuICBpZiAoXG4gICAgY29udGVudE9yUGF0aC5tYXRjaChcbiAgICAgIC8tLS0tLUJFR0lOIChDRVJUSUZJQ0FURXxLRVl8UFJJVkFURSBLRVkpLS0tLS0uKz8tLS0tLUVORCBcXDEtLS0tLSQvZ21zXG4gICAgKVxuICApXG4gICAgcmV0dXJuIGNvbnRlbnRPclBhdGg7XG4gIHJldHVybiBhd2FpdCBmaWxlUmVhZGVyKGNvbnRlbnRPclBhdGgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIGZpbGUgZnJvbSB0aGUgZmlsZSBzeXN0ZW1cbiAqIEBzdW1tYXJ5IExvYWRzIGEgZmlsZSB1c2luZyB0aGUgTm9kZS5qcyBmaWxlIHN5c3RlbSBtb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nIHwgQnVmZmVyfSBjb250ZW50T3JQYXRoIC0gVGhlIGNvbnRlbnQgb3IgcGF0aCB0byBsb2FkXG4gKiBAcmV0dXJuIHtQcm9taXNlPEJ1ZmZlcj59IFRoZSBmaWxlIGNvbnRlbnQgYXMgYSBCdWZmZXJcbiAqIEBmdW5jdGlvbiByZWFkRmlsZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEZpbGUoY29udGVudE9yUGF0aDogc3RyaW5nIHwgQnVmZmVyKSB7XG4gIGlmICh0eXBlb2YgY29udGVudE9yUGF0aCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGNvbnRlbnRPclBhdGg7XG5cbiAgY29uc3QgZmlsZVJlYWRlciA9IGFzeW5jIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgIHJldHVybiBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShwYXRoKTtcbiAgfTtcblxuICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIENlcnRpZmljYXRlIEF1dGhvcml0eSB1c2VyXG4gKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIHVzZXIgd2l0aCB0aGUgZ2l2ZW4gY3JlZGVudGlhbHMgZm9yIGludGVyYWN0aW5nIHdpdGggYSBGYWJyaWMgQ0FcbiAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyTmFtZSAtIFRoZSB1c2VyIG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcml2YXRlS2V5IC0gVGhlIHByaXZhdGUga2V5IGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gY2VydGlmaWNhdGUgLSBUaGUgY2VydGlmaWNhdGUgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc3BJZCAtIFRoZSBNZW1iZXJzaGlwIFNlcnZpY2UgUHJvdmlkZXIgSURcbiAqIEByZXR1cm4ge1Byb21pc2U8VXNlcj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIHVzZXJcbiAqIEBmdW5jdGlvbiBnZXRDQVVzZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENBVXNlcihcbiAgdXNlck5hbWU6IHN0cmluZyxcbiAgcHJpdmF0ZUtleTogc3RyaW5nLFxuICBjZXJ0aWZpY2F0ZTogc3RyaW5nLFxuICBtc3BJZDogc3RyaW5nXG4pOiBQcm9taXNlPFVzZXI+IHtcbiAgbG9nLmRlYnVnKFxuICAgIGBDcmVhdGluZyBhIENBICR7bXNwSWR9IHVzZXIgJHt1c2VyTmFtZX0gd2l0aCBjZXJ0aWZpY2F0ZSAke2NlcnRpZmljYXRlfWBcbiAgKTtcbiAgY29uc3QgdXNlciA9IG5ldyBVc2VyKHVzZXJOYW1lKTtcbiAgY29uc3QgY3J5cHRvU3VpdGUgPSBVc2VyLm5ld0NyeXB0b1N1aXRlKCk7XG4gIHVzZXIuc2V0Q3J5cHRvU3VpdGUoY3J5cHRvU3VpdGUpO1xuICBjb25zdCBpbXBvcnRlZEtleSA9IGNyeXB0b1N1aXRlLmNyZWF0ZUtleUZyb21SYXcocHJpdmF0ZUtleSk7XG4gIGF3YWl0IHVzZXIuc2V0RW5yb2xsbWVudChpbXBvcnRlZEtleSwgY2VydGlmaWNhdGUsIG1zcElkKTtcbiAgcmV0dXJuIHVzZXI7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgYW4gaWRlbnRpdHkgZnJvbSBhIGNlcnRpZmljYXRlIGRpcmVjdG9yeVxuICogQHN1bW1hcnkgTG9hZHMgYSBjZXJ0aWZpY2F0ZSBmcm9tIGEgZGlyZWN0b3J5IGFuZCBjcmVhdGVzIGFuIElkZW50aXR5IG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gVGhlIE1lbWJlcnNoaXAgU2VydmljZSBQcm92aWRlciBJRFxuICogQHBhcmFtIHtzdHJpbmd9IGNlcnREaXJlY3RvcnlQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGNlcnRpZmljYXRlXG4gKiBAcmV0dXJuIHtQcm9taXNlPElkZW50aXR5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGlkZW50aXR5XG4gKiBAZnVuY3Rpb24gZ2V0SWRlbnRpdHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldElkZW50aXR5KFxuICBtc3BJZDogc3RyaW5nLFxuICBjZXJ0RGlyZWN0b3J5UGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPElkZW50aXR5PiB7XG4gIGNvbnN0IGlkZW50aXR5RmlsZVJlYWRlciA9IGFzeW5jIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgIGNvbnN0IGNlcnRQYXRoID0gYXdhaXQgZ2V0Rmlyc3REaXJGaWxlTmFtZShwYXRoKTtcbiAgICBjb25zdCBjcmVkZW50aWFscyA9IGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGNlcnRQYXRoKTtcbiAgICByZXR1cm4gY3JlZGVudGlhbHM7XG4gIH07XG5cbiAgY29uc3QgY3JlZGVudGlhbHM6IFVpbnQ4QXJyYXkgPSAoYXdhaXQgY29udGVudE9mTG9hZEZpbGUoXG4gICAgY2VydERpcmVjdG9yeVBhdGgsXG4gICAgaWRlbnRpdHlGaWxlUmVhZGVyXG4gICkpIGFzIFVpbnQ4QXJyYXk7XG5cbiAgcmV0dXJuIHsgbXNwSWQsIGNyZWRlbnRpYWxzIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgZmlyc3QgZmlsZSBpbiBhIGRpcmVjdG9yeVxuICogQHN1bW1hcnkgUmVhZHMgYSBkaXJlY3RvcnkgYW5kIHJldHVybnMgdGhlIHBhdGggdG8gdGhlIGZpcnN0IGZpbGUgZm91bmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXJQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBmdWxsIHBhdGggb2YgdGhlIGZpcnN0IGZpbGVcbiAqIEBmdW5jdGlvbiBnZXRGaXJzdERpckZpbGVOYW1lXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGaXJzdERpckZpbGVOYW1lKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcInBhdGhcIikpO1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gIHJldHVybiBqb2luKGRpclBhdGgsIGZpbGVzWzBdKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY29udGVudCBvZiB0aGUgZmlyc3QgZmlsZSBpbiBhIGRpcmVjdG9yeVxuICogQHN1bW1hcnkgUmVhZHMgYSBkaXJlY3RvcnksIGZpbmRzIHRoZSBmaXJzdCBmaWxlLCBhbmQgcmV0dXJucyBpdHMgY29udGVudCBhcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IGRpclBhdGggLSBQYXRoIHRvIHRoZSBkaXJlY3RvcnlcbiAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGZpcnN0IGZpbGVcbiAqIEBmdW5jdGlvbiBnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudFxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoXG4gIGRpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgY29uc3QgeyBqb2luIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwicGF0aFwiKSk7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgcHJvbWlzZXMucmVhZGRpcihkaXJQYXRoKTtcbiAgcmV0dXJuIChhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShqb2luKGRpclBhdGgsIGZpbGVzWzBdKSkpLnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgYSBzaWduZXIgZnJvbSBhIGtleSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IExvYWRzIGEgcHJpdmF0ZSBrZXkgZnJvbSBhIGRpcmVjdG9yeSBhbmQgY3JlYXRlcyBhIFNpZ25lciBmb3IgRmFicmljIHRyYW5zYWN0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IGtleURpcmVjdG9yeVBhdGggLSBQYXRoIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgcHJpdmF0ZSBrZXlcbiAqIEByZXR1cm4ge1Byb21pc2U8U2lnbmVyPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHNpZ25lclxuICogQGZ1bmN0aW9uIGdldFNpZ25lclxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2lnbmVyKGtleURpcmVjdG9yeVBhdGg6IHN0cmluZyk6IFByb21pc2U8U2lnbmVyPiB7XG4gIGNvbnN0IHNpZ25lckZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCBrZXlQYXRoID0gYXdhaXQgZ2V0Rmlyc3REaXJGaWxlTmFtZShwYXRoKTtcbiAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoa2V5UGF0aCk7XG4gIH07XG5cbiAgY29uc3QgcHJpdmF0ZUtleVBlbSA9IChhd2FpdCBjb250ZW50T2ZMb2FkRmlsZShcbiAgICBrZXlEaXJlY3RvcnlQYXRoLFxuICAgIHNpZ25lckZpbGVSZWFkZXJcbiAgKSkgYXMgQnVmZmVyO1xuICAvLyBOb2RlIGJhc2VkIGltcGxlbWVudGF0aW9uXG4gIC8vIHByaXZhdGVLZXkgPSBjcmVhdGVQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICAvLyAtLVxuXG4gIC8vIHdlYiBiYXNlZCBpbXBsZW1lbnRhdGlvblxuICBjb25zdCBwcml2YXRlS2V5ID0gYXdhaXQgZXh0cmFjdFByaXZhdGVLZXkocHJpdmF0ZUtleVBlbSk7XG4gIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByaXZhdGVLZXkpO1xuICBjb25zdCBrID0gKHByaXZhdGVLZXkgYXMgYW55KVtrZXlzWzBdXTtcbiAgLy8gLS1cblxuICByZXR1cm4gc2lnbmVycy5uZXdQcml2YXRlS2V5U2lnbmVyKGsgYXMgYW55KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXh0cmFjdHMgYSBwcml2YXRlIGtleSBmcm9tIGEgUEVNIGJ1ZmZlclxuICogQHN1bW1hcnkgQ29udmVydHMgYSBQRU0tZW5jb2RlZCBwcml2YXRlIGtleSB0byBhIENyeXB0b0tleSBvYmplY3RcbiAqIEBwYXJhbSB7QnVmZmVyfSBwZW0gLSBUaGUgUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXlcbiAqIEByZXR1cm4ge1Byb21pc2U8Q3J5cHRvS2V5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIENyeXB0b0tleVxuICogQGZ1bmN0aW9uIGV4dHJhY3RQcml2YXRlS2V5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBFeHRyYWN0UHJpdmF0ZUtleVxuICogICBwYXJ0aWNpcGFudCBTdWJ0bGVDcnlwdG9cbiAqXG4gKiAgIENhbGxlci0+PkV4dHJhY3RQcml2YXRlS2V5OiBleHRyYWN0UHJpdmF0ZUtleShwZW0pXG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+RXh0cmFjdFByaXZhdGVLZXk6IEdldCBTdWJ0bGVDcnlwdG8gaW1wbGVtZW50YXRpb25cbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5FeHRyYWN0UHJpdmF0ZUtleTogUGFyc2UgUEVNIGZvcm1hdFxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PkV4dHJhY3RQcml2YXRlS2V5OiBDb252ZXJ0IHRvIGJpbmFyeSBERVJcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5TdWJ0bGVDcnlwdG86IGltcG9ydEtleShwa2NzOCwgYmluYXJ5RGVyLCBvcHRpb25zKVxuICogICBTdWJ0bGVDcnlwdG8tLT4+RXh0cmFjdFByaXZhdGVLZXk6IENyeXB0b0tleVxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0tPj5DYWxsZXI6IENyeXB0b0tleVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0cmFjdFByaXZhdGVLZXkocGVtOiBCdWZmZXIpIHtcbiAgY29uc3QgbGliTmFtZSA9IFwiY3J5cHRvXCI7XG4gIGxldCBzdWJ0bGU7XG4gIGlmIChpc0Jyb3dzZXIoKSkge1xuICAgIHN1YnRsZSA9IChnbG9iYWxUaGlzIGFzIGFueSkuY3J5cHRvLnN1YnRsZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBsaWIgPSAoYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChsaWJOYW1lKSkpIGFzIGFueTtcbiAgICBzdWJ0bGUgPSBsaWIuc3VidGxlIHx8IGxpYi53ZWJjcnlwdG8uc3VidGxlO1xuICB9XG5cbiAgaWYgKCFzdWJ0bGUpIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBsb2FkIFN1YnRsZUNyeXB0byBtb2R1bGVcIik7XG5cbiAgZnVuY3Rpb24gc3RyMmFiKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVmID0gbmV3IEFycmF5QnVmZmVyKHN0ci5sZW5ndGgpO1xuICAgIGNvbnN0IGJ1ZlZpZXcgPSBuZXcgVWludDhBcnJheShidWYpO1xuICAgIGZvciAobGV0IGkgPSAwLCBzdHJMZW4gPSBzdHIubGVuZ3RoOyBpIDwgc3RyTGVuOyBpKyspIHtcbiAgICAgIGJ1ZlZpZXdbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIGNvbnN0IHN0ciA9IHBlbVxuICAgIC50b1N0cmluZyhcInV0ZjhcIilcbiAgICAucmVwbGFjZShcIi0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLVwiLCBcIlwiKVxuICAgIC5yZXBsYWNlQWxsKFwiXFxuXCIsIFwiXCIpXG4gICAgLnJlcGxhY2UoXCItLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpO1xuICBjb25zdCBkZWNvZGVkID0gQnVmZmVyLmZyb20oc3RyLCBcImJhc2U2NFwiKS50b1N0cmluZyhcImJpbmFyeVwiKTtcbiAgY29uc3QgYmluYXJ5RGVyID0gc3RyMmFiKGRlY29kZWQpO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgc3VidGxlLmltcG9ydEtleShcbiAgICAgIFwicGtjczhcIixcbiAgICAgIGJpbmFyeURlcixcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJFQ0RTQVwiLFxuICAgICAgICBuYW1lZEN1cnZlOiBcIlAtMjU2XCIsXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICAgIFtcInNpZ25cIl1cbiAgICApO1xuXG4gICAgcmV0dXJuIGtleTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEFkYXB0ZXJGbGFncyxcbiAgQ29uZGl0aW9uLFxuICBDb250ZXh0LFxuICBHcm91cE9wZXJhdG9yLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIE9wZXJhdG9yLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBQcmVwYXJlZFN0YXRlbWVudCxcbiAgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLFxuICBRdWVyeUNsYXVzZSxcbiAgUXVlcnlFcnJvcixcbiAgUmVwb3NpdG9yeSxcbiAgU2VsZWN0U2VsZWN0b3IsXG4gIFNlcXVlbmNlLFxuICBTdGF0ZW1lbnQsXG4gIFN0YXRlbWVudEV4ZWN1dG9yLFxuICBWaWV3S2luZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRBZGFwdGVyXCI7XG5pbXBvcnQge1xuICBDb3VjaERCS2V5cyxcbiAgQ291Y2hEQk9wZXJhdG9yLFxuICBDb3VjaERCR3JvdXBPcGVyYXRvcixcbiAgQ291Y2hEQlF1ZXJ5TGltaXQsXG4gIE1hbmdvUXVlcnksXG4gIE1hbmdvT3BlcmF0b3IsXG4gIE1hbmdvU2VsZWN0b3IsXG4gIHRyYW5zbGF0ZU9wZXJhdG9ycyxcbiAgZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lLFxuICBnZW5lcmF0ZVZpZXdOYW1lLFxuICBmaW5kVmlld01ldGFkYXRhLFxuICBDb3VjaERCVmlld01ldGFkYXRhLFxuICBWaWV3UmVzcG9uc2UsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IHRvQ2FtZWxDYXNlIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBEQktleXMsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbnR5cGUgRmFicmljVmlld0Rlc2NyaXB0b3IgPSB7XG4gIGRkb2M6IHN0cmluZztcbiAgdmlldzogc3RyaW5nO1xuICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufTtcblxudHlwZSBGYWJyaWNBZ2dyZWdhdGVJbmZvID1cbiAgfCB7XG4gICAgICBraW5kOiBWaWV3S2luZDtcbiAgICAgIG1ldGE6IENvdWNoREJWaWV3TWV0YWRhdGE7XG4gICAgICBkZXNjcmlwdG9yOiBGYWJyaWNWaWV3RGVzY3JpcHRvcjtcbiAgICAgIGNvdW50RGlzdGluY3Q/OiBib29sZWFuO1xuICAgIH1cbiAgfCB7XG4gICAgICBraW5kOiBcImF2Z1wiO1xuICAgICAgYXR0cmlidXRlOiBzdHJpbmc7XG4gICAgICBzdW1EZXNjcmlwdG9yOiBGYWJyaWNWaWV3RGVzY3JpcHRvcjtcbiAgICAgIGNvdW50RGVzY3JpcHRvcjogRmFicmljVmlld0Rlc2NyaXB0b3I7XG4gICAgfTtcblxuY29uc3QgZXNjYXBlUmVnRXhwID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgdmFsdWUucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFwiXFxcXCQmXCIpO1xuXG5mdW5jdGlvbiBuZXh0TGV4aWNvZ3JhcGhpY1N0cmluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiXFx1MDAwMFwiO1xuICBjb25zdCBjaGFycyA9IEFycmF5LmZyb20odmFsdWUpO1xuICBmb3IgKGxldCBpID0gY2hhcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICBjb25zdCBjb2RlID0gY2hhcnNbaV0uY29kZVBvaW50QXQoMCk7XG4gICAgaWYgKGNvZGUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgaWYgKGNvZGUgPCAweDEwZmZmZikge1xuICAgICAgY2hhcnNbaV0gPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlICsgMSk7XG4gICAgICByZXR1cm4gY2hhcnMuc2xpY2UoMCwgaSArIDEpLmpvaW4oXCJcIik7XG4gICAgfVxuICB9XG4gIHJldHVybiBgJHt2YWx1ZX1cXHUwMDAwYDtcbn1cblxuZnVuY3Rpb24gcHJlZml4UmFuZ2UocHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBzdGFydDogcHJlZml4LFxuICAgIGVuZDogbmV4dExleGljb2dyYXBoaWNTdHJpbmcocHJlZml4KSxcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgU3RhdGVtZW50PFxuICBNLFxuICBGYWJyaWNDbGllbnRBZGFwdGVyLFxuICBSLFxuICBNYW5nb1F1ZXJ5XG4+IHtcbiAgY29uc3RydWN0b3IoYWRhcHRlcjogRmFicmljQ2xpZW50QWRhcHRlciwgb3ZlcnJpZGVzPzogUGFydGlhbDxBZGFwdGVyRmxhZ3M+KSB7XG4gICAgc3VwZXIoYWRhcHRlciwgb3ZlcnJpZGVzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzcXVhc2goXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcmVwYXJlZFN0YXRlbWVudDxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzcXVhc2hlZDogUHJlcGFyZWRTdGF0ZW1lbnQ8TT4gfCB1bmRlZmluZWQgPSBzdXBlci5zcXVhc2goXG4gICAgICBjdHggYXMgbmV2ZXJcbiAgICApO1xuICAgIGlmICghc3F1YXNoZWQpIHJldHVybiBzcXVhc2hlZDtcblxuICAgIGNvbnN0IHsgbWV0aG9kLCBwYXJhbXMsIGFyZ3MgfSA9IHNxdWFzaGVkO1xuICAgIGNvbnN0IHsgZGlyZWN0aW9uLCBsaW1pdCB9ID0gcGFyYW1zO1xuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0U6XG4gICAgICAgIGFyZ3MucHVzaChkaXJlY3Rpb24sIGxpbWl0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlk6XG4gICAgICAgIGFyZ3MucHVzaChkaXJlY3Rpb24pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlk6XG4gICAgICAgIGFyZ3MucHVzaChkaXJlY3Rpb24sIGxpbWl0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWTpcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgbWV0aG9kICR7bWV0aG9kfWApO1xuICAgIH1cblxuICAgIHJldHVybiBzcXVhc2hlZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBleGVjdXRlUHJlcGFyZWQoXG4gICAgLi4uYXJnejogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCByZXBvID0gUmVwb3NpdG9yeS5mb3JNb2RlbCh0aGlzLmZyb21TZWxlY3RvciwgdGhpcy5hZGFwdGVyLmFsaWFzKTtcbiAgICBjb25zdCB7IG1ldGhvZCwgYXJncyB9ID0gdGhpcy5wcmVwYXJlZCBhcyBQcmVwYXJlZFN0YXRlbWVudDxhbnk+O1xuICAgIHJldHVybiByZXBvLnN0YXRlbWVudChtZXRob2QsIC4uLmFyZ3MsIC4uLmFyZ3opO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcHJlcGFyZShcbiAgICBjdHg/OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcm9taXNlPFN0YXRlbWVudEV4ZWN1dG9yPE0sIFI+PiB7XG4gICAgY3R4ID1cbiAgICAgIGN0eCB8fFxuICAgICAgKGF3YWl0IHRoaXMuYWRhcHRlci5jb250ZXh0KFxuICAgICAgICBQZXJzaXN0ZW5jZUtleXMuUVVFUlksXG4gICAgICAgIHRoaXMub3ZlcnJpZGVzIHx8IHt9LFxuICAgICAgICB0aGlzLmZyb21TZWxlY3RvclxuICAgICAgKSk7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmlzU2ltcGxlUXVlcnkoKSAmJlxuICAgICAgKGN0eCBhcyBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPikuZ2V0KFwiZm9yY2VQcmVwYXJlU2ltcGxlUXVlcmllc1wiKVxuICAgICkge1xuICAgICAgY29uc3Qgc3F1YXNoZWQgPSB0aGlzLnNxdWFzaChjdHggYXMgQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4pO1xuICAgICAgaWYgKHNxdWFzaGVkKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZWQgPSBzcXVhc2hlZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXTtcbiAgICBjb25zdCBwYXJhbXM6IGFueSA9IHt9IGFzIGFueTtcblxuICAgIGNvbnN0IHByZXBhcmVkOiBQcmVwYXJlZFN0YXRlbWVudDxhbnk+ID0ge1xuICAgICAgY2xhc3M6IHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgYXJncyxcbiAgICAgIHBhcmFtcyxcbiAgICB9IGFzIGFueTtcblxuICAgIGNvbnN0IG1ldGhvZDogc3RyaW5nW10gPSBbUXVlcnlDbGF1c2UuRklORF9CWV07XG5cbiAgICBpZiAodGhpcy53aGVyZUNvbmRpdGlvbikge1xuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wcmVwYXJlQ29uZGl0aW9uKHRoaXMud2hlcmVDb25kaXRpb24sIGN0eCBhcyBuZXZlcik7XG4gICAgICBtZXRob2QucHVzaChwYXJzZWQubWV0aG9kKTtcbiAgICAgIGlmIChwYXJzZWQuYXJncyAmJiBwYXJzZWQuYXJncy5sZW5ndGgpXG4gICAgICAgIGFyZ3MucHVzaCguLi4ocGFyc2VkLmFyZ3MgYXMgKHN0cmluZyB8IG51bWJlcilbXSkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RTZWxlY3RvcilcbiAgICAgIG1ldGhvZC5wdXNoKFxuICAgICAgICBRdWVyeUNsYXVzZS5TRUxFQ1QsXG4gICAgICAgIHRoaXMuc2VsZWN0U2VsZWN0b3Iuam9pbihgICR7UXVlcnlDbGF1c2UuQU5ELnRvTG93ZXJDYXNlKCl9IGApXG4gICAgICApO1xuICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcnM/Lmxlbmd0aCkge1xuICAgICAgbWV0aG9kLnB1c2goUXVlcnlDbGF1c2UuT1JERVJfQlksIHRoaXMub3JkZXJCeVNlbGVjdG9yc1swXVswXSBhcyBzdHJpbmcpO1xuICAgICAgYXJncy5wdXNoKHRoaXMub3JkZXJCeVNlbGVjdG9yc1swXVsxXSBhcyBhbnkpO1xuICAgIH1cbiAgICBwcmVwYXJlZC5tZXRob2QgPSB0b0NhbWVsQ2FzZShtZXRob2Quam9pbihcIiBcIikpO1xuICAgIHByZXBhcmVkLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLnByZXBhcmVkID0gcHJlcGFyZWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhIHJlY29yZCBmcm9tIENvdWNoREIvRmFicmljXG4gICAqIEBzdW1tYXJ5IEV4dHJhY3RzIHRoZSBJRCBmcm9tIGEgQ291Y2hEQiBkb2N1bWVudCBhbmQgcmV2ZXJ0cyBpdCB0byBhIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJvY2Vzc1JlY29yZChcbiAgICByZWNvcmQ6IGFueSxcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IE0ge1xuICAgIGNvbnN0IHBrQXR0ciA9IE1vZGVsLnBrKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCB0eXBlID0gTWV0YWRhdGEuZ2V0KFxuICAgICAgdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICBNZXRhZGF0YS5rZXkoREJLZXlzLklELCBwa0F0dHIgYXMgc3RyaW5nKVxuICAgICk/LnR5cGU7XG5cbiAgICBpZiAocmVjb3JkW0NvdWNoREJLZXlzLklEXSkge1xuICAgICAgY29uc3QgWywgLi4ua2V5QXJnc10gPSByZWNvcmRbQ291Y2hEQktleXMuSURdLnNwbGl0KENvdWNoREJLZXlzLlNFUEFSQVRPUik7XG4gICAgICBjb25zdCBpZCA9IGtleUFyZ3Muam9pbihcIl9cIik7XG4gICAgICByZWNvcmRbcGtBdHRyXSA9IFNlcXVlbmNlLnBhcnNlVmFsdWUodHlwZSBhcyBhbnksIGlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIucHJvY2Vzc1JlY29yZChyZWNvcmQsIGN0eCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IE1hbmdvIHF1ZXJ5XG4gICAqIEBzdW1tYXJ5IFNlbmRzIGEgcmF3IE1hbmdvIHF1ZXJ5IHRvIEZhYnJpYyBhbmQgcHJvY2Vzc2VzIHRoZSByZXN1bHRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByYXc8Uj4ocmF3SW5wdXQ6IE1hbmdvUXVlcnksIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmF3KTtcbiAgICBjb25zdCBhZ2dyZWdhdG9yID0gKHJhd0lucHV0IGFzIGFueSk/LmFnZ3JlZ2F0ZUluZm87XG4gICAgaWYgKChyYXdJbnB1dCBhcyBhbnkpPy5hZ2dyZWdhdGUgJiYgYWdncmVnYXRvcikge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUFnZ3JlZ2F0ZTxSPihhZ2dyZWdhdG9yLCBjdHgpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRzOiBhbnlbXSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoXG4gICAgICByYXdJbnB1dCxcbiAgICAgIHRydWUsXG4gICAgICB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIGN0eFxuICAgICk7XG5cbiAgICBpZiAoIXRoaXMuc2VsZWN0U2VsZWN0b3IpIHtcbiAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IHJlc3VsdHMubWFwKChyKSA9PiB0aGlzLnByb2Nlc3NSZWNvcmQociwgY3R4KSk7XG4gICAgICBpZiAoIWN0eC5nZXRPclVuZGVmaW5lZChcImFmdGVyUXVlcnlIYW5kbGVyc1wiKSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzc2VkIGFzIHVua25vd24gYXMgUjtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5hcHBseUFmdGVySGFuZGxlcnNUb1Jlc3VsdChwcm9jZXNzZWQsIGN0eCkpIGFzIFI7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhIENvdWNoREIgTWFuZ28gcXVlcnkgZnJvbSB0aGUgc3RhdGVtZW50XG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIHRoZSBzdGF0ZW1lbnQncyBjb25kaXRpb25zLCBzZWxlY3RvcnMsIGFuZCBvcHRpb25zIGludG8gYSBDb3VjaERCIE1hbmdvIHF1ZXJ5XG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGQoKTogTWFuZ29RdWVyeSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuYnVpbGQpO1xuICAgIGNvbnN0IGFnZ3JlZ2F0ZVF1ZXJ5ID0gdGhpcy5idWlsZEFnZ3JlZ2F0ZVF1ZXJ5KCk7XG4gICAgaWYgKGFnZ3JlZ2F0ZVF1ZXJ5KSByZXR1cm4gYWdncmVnYXRlUXVlcnk7XG4gICAgY29uc3Qgc2VsZWN0b3JzOiBNYW5nb1NlbGVjdG9yID0ge307XG4gICAgc2VsZWN0b3JzW0NvdWNoREJLZXlzLlRBQkxFXSA9IHt9O1xuICAgIHNlbGVjdG9yc1tDb3VjaERCS2V5cy5UQUJMRV0gPSBNb2RlbC50YWJsZU5hbWUodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHF1ZXJ5OiBNYW5nb1F1ZXJ5ID0geyBzZWxlY3Rvcjogc2VsZWN0b3JzIH07XG4gICAgaWYgKHRoaXMuc2VsZWN0U2VsZWN0b3IpIHF1ZXJ5LmZpZWxkcyA9IHRoaXMuc2VsZWN0U2VsZWN0b3IgYXMgc3RyaW5nW107XG5cbiAgICBpZiAodGhpcy53aGVyZUNvbmRpdGlvbikge1xuICAgICAgY29uc3QgY29uZGl0aW9uOiBNYW5nb1NlbGVjdG9yID0gdGhpcy5wYXJzZUNvbmRpdGlvbihcbiAgICAgICAgQ29uZGl0aW9uLmFuZChcbiAgICAgICAgICB0aGlzLndoZXJlQ29uZGl0aW9uLFxuICAgICAgICAgIENvbmRpdGlvbi5hdHRyaWJ1dGU8TT4oQ291Y2hEQktleXMuVEFCTEUgYXMga2V5b2YgTSkuZXEoXG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvcltDb3VjaERCS2V5cy5UQUJMRV1cbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICkuc2VsZWN0b3I7XG4gICAgICBjb25zdCBzZWxlY3RvcktleXMgPSBPYmplY3Qua2V5cyhjb25kaXRpb24pIGFzIE1hbmdvT3BlcmF0b3JbXTtcbiAgICAgIGlmIChcbiAgICAgICAgc2VsZWN0b3JLZXlzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBPYmplY3QudmFsdWVzKENvdWNoREJHcm91cE9wZXJhdG9yKS5pbmRleE9mKHNlbGVjdG9yS2V5c1swXSkgIT09IC0xXG4gICAgICApXG4gICAgICAgIHN3aXRjaCAoc2VsZWN0b3JLZXlzWzBdKSB7XG4gICAgICAgICAgY2FzZSBDb3VjaERCR3JvdXBPcGVyYXRvci5BTkQ6XG4gICAgICAgICAgICBjb25kaXRpb25bQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSA9IFtcbiAgICAgICAgICAgICAgLi4uT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgICAgICAgICBjb25kaXRpb25bQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSBhcyBNYW5nb1NlbGVjdG9yXG4gICAgICAgICAgICAgICkucmVkdWNlKChhY2N1bTogTWFuZ29TZWxlY3RvcltdLCB2YWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJUb28gbWFueSBrZXlzIGluIHF1ZXJ5IHNlbGVjdG9yLiBzaG91bGQgYmUgb25lXCJcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgayA9IGtleXNbMF07XG4gICAgICAgICAgICAgICAgaWYgKGsgPT09IENvdWNoREJHcm91cE9wZXJhdG9yLkFORClcbiAgICAgICAgICAgICAgICAgIGFjY3VtLnB1c2goLi4uKHZhbFtrXSBhcyBhbnlbXSkpO1xuICAgICAgICAgICAgICAgIGVsc2UgYWNjdW0ucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgICAgICAgfSwgW10pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yID0gY29uZGl0aW9uO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBDb3VjaERCR3JvdXBPcGVyYXRvci5PUjoge1xuICAgICAgICAgICAgY29uc3QgczogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgICAgICAgc1tDb3VjaERCR3JvdXBPcGVyYXRvci5BTkRdID0gW1xuICAgICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgICAgIC4uLk9iamVjdC5lbnRyaWVzKHF1ZXJ5LnNlbGVjdG9yKS5tYXAoKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxhbnksIGFueT4gPSB7fTtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvciA9IHM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgc2hvdWxkIGJlIGltcG9zc2libGVcIik7XG4gICAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBPYmplY3QuZW50cmllcyhjb25kaXRpb24pLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAocXVlcnkuc2VsZWN0b3Jba2V5XSlcbiAgICAgICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgICAgICBgQSAke2tleX0gcXVlcnkgcGFyYW0gaXMgYWJvdXQgdG8gYmUgb3ZlcnJpZGRlbjogJHtxdWVyeS5zZWxlY3RvcltrZXldfSBieSAke3ZhbH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yW2tleV0gPSB2YWw7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcnM/Lmxlbmd0aCkge1xuICAgICAgcXVlcnkuc29ydCA9IHF1ZXJ5LnNvcnQgfHwgW107XG4gICAgICBxdWVyeS5zZWxlY3RvciA9IHF1ZXJ5LnNlbGVjdG9yIHx8ICh7fSBhcyBNYW5nb1NlbGVjdG9yKTtcbiAgICAgIGZvciAoY29uc3QgW3NlbGVjdG9yS2V5LCBkaXJlY3Rpb25dIG9mIHRoaXMub3JkZXJCeVNlbGVjdG9ycykge1xuICAgICAgICBjb25zdCBzZWxlY3RvciA9IHNlbGVjdG9yS2V5IGFzIHN0cmluZztcbiAgICAgICAgY29uc3QgcmVjOiBSZWNvcmQ8c3RyaW5nLCBPcmRlckRpcmVjdGlvbj4gPSB7fTtcbiAgICAgICAgcmVjW3NlbGVjdG9yXSA9IGRpcmVjdGlvbiBhcyBPcmRlckRpcmVjdGlvbjtcbiAgICAgICAgKHF1ZXJ5LnNvcnQgYXMgUmVjb3JkPHN0cmluZywgT3JkZXJEaXJlY3Rpb24+W10pLnB1c2gocmVjKTtcbiAgICAgICAgaWYgKCFxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0pIHtcbiAgICAgICAgICBxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgICAgIChxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0gYXMgTWFuZ29TZWxlY3RvcilbQ291Y2hEQk9wZXJhdG9yLkJJR0dFUl0gPVxuICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmxpbWl0U2VsZWN0b3IpIHtcbiAgICAgIHF1ZXJ5LmxpbWl0ID0gdGhpcy5saW1pdFNlbGVjdG9yO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cud2FybihcbiAgICAgICAgYE5vIGxpbWl0IHNlbGVjdG9yIGRlZmluZWQuIFVzaW5nIGRlZmF1bHQgY291Y2hkYiBsaW1pdCBvZiAke0NvdWNoREJRdWVyeUxpbWl0fWBcbiAgICAgICk7XG4gICAgICBxdWVyeS5saW1pdCA9IENvdWNoREJRdWVyeUxpbWl0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9mZnNldFNlbGVjdG9yKSBxdWVyeS5za2lwID0gdGhpcy5vZmZzZXRTZWxlY3RvcjtcblxuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgY29uZGl0aW9uIGludG8gYSBDb3VjaERCIE1hbmdvIHF1ZXJ5IHNlbGVjdG9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgQ29uZGl0aW9uIG9iamVjdCBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeSBzZWxlY3RvciBzdHJ1Y3R1cmVcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwYXJzZUNvbmRpdGlvbihjb25kaXRpb246IENvbmRpdGlvbjxNPik6IE1hbmdvUXVlcnkge1xuICAgIGZ1bmN0aW9uIG1lcmdlKFxuICAgICAgb3A6IE1hbmdvT3BlcmF0b3IsXG4gICAgICBvYmoxOiBNYW5nb1NlbGVjdG9yLFxuICAgICAgb2JqMjogTWFuZ29TZWxlY3RvclxuICAgICk6IE1hbmdvUXVlcnkge1xuICAgICAgY29uc3QgcmVzdWx0OiBNYW5nb1F1ZXJ5ID0geyBzZWxlY3Rvcjoge30gYXMgTWFuZ29TZWxlY3RvciB9O1xuICAgICAgcmVzdWx0LnNlbGVjdG9yW29wXSA9IFtvYmoxLCBvYmoyXTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgeyBhdHRyMSwgb3BlcmF0b3IsIGNvbXBhcmlzb24gfSA9IGNvbmRpdGlvbiBhcyB1bmtub3duIGFzIHtcbiAgICAgIGF0dHIxOiBzdHJpbmcgfCBDb25kaXRpb248TT47XG4gICAgICBvcGVyYXRvcjogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yO1xuICAgICAgY29tcGFyaXNvbjogYW55O1xuICAgIH07XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLlNUQVJUU19XSVRIKSB7XG4gICAgICBpZiAodHlwZW9mIGF0dHIxICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIlNUQVJUU19XSVRIIHJlcXVpcmVzIGFuIGF0dHJpYnV0ZSBuYW1lXCIpO1xuICAgICAgaWYgKHR5cGVvZiBjb21wYXJpc29uICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIlNUQVJUU19XSVRIIHJlcXVpcmVzIGEgc3RyaW5nIGNvbXBhcmlzb25cIik7XG4gICAgICBjb25zdCByYW5nZSA9IHByZWZpeFJhbmdlKGNvbXBhcmlzb24pO1xuICAgICAgY29uc3Qgc2VsZWN0b3I6IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgc2VsZWN0b3JbYXR0cjFdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChzZWxlY3RvclthdHRyMV0gYXMgTWFuZ29TZWxlY3RvcilbQ291Y2hEQk9wZXJhdG9yLkJJR0dFUl9FUV0gPSByYW5nZS5zdGFydDtcbiAgICAgIChzZWxlY3RvclthdHRyMV0gYXMgTWFuZ29TZWxlY3RvcilbQ291Y2hEQk9wZXJhdG9yLlNNQUxMRVJdID0gcmFuZ2UuZW5kO1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3IgfTtcbiAgICB9XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLkVORFNfV0lUSCkge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyMSAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJFTkRTX1dJVEggcmVxdWlyZXMgYW4gYXR0cmlidXRlIG5hbWVcIik7XG4gICAgICBpZiAodHlwZW9mIGNvbXBhcmlzb24gIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiRU5EU19XSVRIIHJlcXVpcmVzIGEgc3RyaW5nIGNvbXBhcmlzb25cIik7XG4gICAgICBjb25zdCBzZWxlY3RvcjogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBzZWxlY3RvclthdHRyMV0gPSB7XG4gICAgICAgIFtDb3VjaERCT3BlcmF0b3IuUkVHRVhQXTogYCR7ZXNjYXBlUmVnRXhwKGNvbXBhcmlzb24pfSRgLFxuICAgICAgfSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3IgfTtcbiAgICB9XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLkJFVFdFRU4pIHtcbiAgICAgIGNvbnN0IGF0dHIgPSBhdHRyMSBhcyBzdHJpbmc7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29tcGFyaXNvbikgfHwgY29tcGFyaXNvbi5sZW5ndGggIT09IDIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiQkVUV0VFTiBvcGVyYXRvciByZXF1aXJlcyBbbWluLCBtYXhdIGNvbXBhcmlzb25cIik7XG4gICAgICBjb25zdCBbbWluLCBtYXhdID0gY29tcGFyaXNvbjtcbiAgICAgIGNvbnN0IG9wQmV0d2VlbjogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBvcEJldHdlZW5bYXR0cl0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wQmV0d2VlblthdHRyXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLkJJR0dFUl9FUSlcbiAgICAgIF0gPSBtaW47XG4gICAgICAob3BCZXR3ZWVuW2F0dHJdIGFzIE1hbmdvU2VsZWN0b3IpW1xuICAgICAgICB0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuU01BTExFUl9FUSlcbiAgICAgIF0gPSBtYXg7XG4gICAgICByZXR1cm4geyBzZWxlY3Rvcjogb3BCZXR3ZWVuIH07XG4gICAgfVxuXG4gICAgbGV0IG9wOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICBpZiAoXG4gICAgICBbR3JvdXBPcGVyYXRvci5BTkQsIEdyb3VwT3BlcmF0b3IuT1IsIE9wZXJhdG9yLk5PVF0uaW5kZXhPZihcbiAgICAgICAgb3BlcmF0b3IgYXMgR3JvdXBPcGVyYXRvclxuICAgICAgKSA9PT0gLTFcbiAgICApIHtcbiAgICAgIG9wW2F0dHIxIGFzIHN0cmluZ10gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wW2F0dHIxIGFzIHN0cmluZ10gYXMgTWFuZ29TZWxlY3RvcilbdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKV0gPVxuICAgICAgICBjb21wYXJpc29uO1xuICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLk5PVCkge1xuICAgICAgb3AgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGF0dHIxIGFzIENvbmRpdGlvbjxNPikuc2VsZWN0b3IgYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIG9wW3RyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5OT1QpXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAob3BbdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLk5PVCldIGFzIE1hbmdvU2VsZWN0b3IpW1xuICAgICAgICAoYXR0cjEgYXMgdW5rbm93biBhcyB7IGF0dHIxOiBzdHJpbmcgfSkuYXR0cjFcbiAgICAgIF0gPSBjb21wYXJpc29uO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcDE6IGFueSA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uPE0+KS5zZWxlY3RvcjtcbiAgICAgIGNvbnN0IG9wMjogYW55ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihjb21wYXJpc29uIGFzIENvbmRpdGlvbjxNPikuc2VsZWN0b3I7XG4gICAgICBvcCA9IG1lcmdlKHRyYW5zbGF0ZU9wZXJhdG9ycyhvcGVyYXRvciksIG9wMSwgb3AyKS5zZWxlY3RvcjtcbiAgICB9XG5cbiAgICByZXR1cm4geyBzZWxlY3Rvcjogb3AgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGRzIGFuIGFnZ3JlZ2F0ZSBxdWVyeSBpZiBhZ2dyZWdhdGlvbiBpcyByZXF1ZXN0ZWRcbiAgICogQHN1bW1hcnkgQ2hlY2tzIGZvciBhZ2dyZWdhdGUgb3BlcmF0aW9ucyBhbmQgcmV0dXJucyBhIHNwZWNpYWwgTWFuZ29RdWVyeSBmb3IgdGhlbVxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEFnZ3JlZ2F0ZVF1ZXJ5KCk6IE1hbmdvUXVlcnkgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5mcm9tU2VsZWN0b3IpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuYXZnU2VsZWN0b3IpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IFN0cmluZyh0aGlzLmF2Z1NlbGVjdG9yKTtcbiAgICAgIGNvbnN0IHN1bUluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXCJzdW1cIiwgYXR0cmlidXRlKTtcbiAgICAgIGNvbnN0IGNvdW50SW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcImNvdW50XCIsIGF0dHJpYnV0ZSk7XG4gICAgICBpZiAoIXN1bUluZm8gfHwgIWNvdW50SW5mbylcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgICAgYEF2ZyBvcGVyYXRpb24gcmVxdWlyZXMgc3VtIGFuZCBjb3VudCB2aWV3cyBmb3IgYXR0cmlidXRlICR7YXR0cmlidXRlfWBcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KHtcbiAgICAgICAga2luZDogXCJhdmdcIixcbiAgICAgICAgYXR0cmlidXRlLFxuICAgICAgICBzdW1EZXNjcmlwdG9yOiBzdW1JbmZvLmRlc2NyaXB0b3IsXG4gICAgICAgIGNvdW50RGVzY3JpcHRvcjogY291bnRJbmZvLmRlc2NyaXB0b3IsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMuY291bnREaXN0aW5jdFNlbGVjdG9yICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPVxuICAgICAgICB0aGlzLmNvdW50RGlzdGluY3RTZWxlY3RvciA9PSBudWxsXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IFN0cmluZyh0aGlzLmNvdW50RGlzdGluY3RTZWxlY3Rvcik7XG4gICAgICBjb25zdCBpbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFwiZGlzdGluY3RcIiwgYXR0cmlidXRlKTtcbiAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgIGluZm8uY291bnREaXN0aW5jdCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KGluZm8pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFnZ3JlZ2F0b3JVc2VkID1cbiAgICAgIHR5cGVvZiB0aGlzLmNvdW50U2VsZWN0b3IgIT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIHR5cGVvZiB0aGlzLmNvdW50RGlzdGluY3RTZWxlY3RvciAhPT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgISF0aGlzLm1pblNlbGVjdG9yIHx8XG4gICAgICAhIXRoaXMubWF4U2VsZWN0b3IgfHxcbiAgICAgICEhdGhpcy5zdW1TZWxlY3RvciB8fFxuICAgICAgISF0aGlzLmRpc3RpbmN0U2VsZWN0b3I7XG5cbiAgICBjb25zdCBhZ2dyZWdhdG9yQ2hlY2tzOiBBcnJheTxbVmlld0tpbmQsIFNlbGVjdFNlbGVjdG9yPE0+IHwgdW5kZWZpbmVkXT4gPSBbXG4gICAgICBbXG4gICAgICAgIFwiY291bnRcIixcbiAgICAgICAgKHRoaXMuY291bnRTZWxlY3RvciA/PyB1bmRlZmluZWQpIGFzIFNlbGVjdFNlbGVjdG9yPE0+IHwgdW5kZWZpbmVkLFxuICAgICAgXSxcbiAgICAgIFtcIm1heFwiLCB0aGlzLm1heFNlbGVjdG9yXSxcbiAgICAgIFtcIm1pblwiLCB0aGlzLm1pblNlbGVjdG9yXSxcbiAgICAgIFtcInN1bVwiLCB0aGlzLnN1bVNlbGVjdG9yXSxcbiAgICAgIFtcImRpc3RpbmN0XCIsIHRoaXMuZGlzdGluY3RTZWxlY3Rvcl0sXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgW2tpbmQsIHNlbGVjdG9yXSBvZiBhZ2dyZWdhdG9yQ2hlY2tzKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBzZWxlY3RvciA/IFN0cmluZyhzZWxlY3RvcikgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBpbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKGtpbmQsIGF0dHJpYnV0ZSk7XG4gICAgICBpZiAoaW5mbykgcmV0dXJuIHRoaXMuY3JlYXRlQWdncmVnYXRlUXVlcnkoaW5mbyk7XG4gICAgfVxuXG4gICAgaWYgKGFnZ3JlZ2F0b3JVc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgYE5vIENvdWNoREIgdmlldyBtZXRhZGF0YSBmb3VuZCBmb3IgdGFibGUgJHtNb2RlbC50YWJsZU5hbWUoXG4gICAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICAgKX0gYWdncmVnYXRvcmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gYWdncmVnYXRlIGRlc2NyaXB0b3IgZm9yIGEgdmlldy1iYXNlZCBhZ2dyZWdhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFxuICAgIGtpbmQ6IFZpZXdLaW5kLFxuICAgIGF0dHJpYnV0ZT86IHN0cmluZ1xuICApOiBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT4gfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5mcm9tU2VsZWN0b3IpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWV0YXMgPSBmaW5kVmlld01ldGFkYXRhKHRoaXMuZnJvbVNlbGVjdG9yLCBraW5kLCBhdHRyaWJ1dGUpO1xuICAgIGlmICghbWV0YXMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1ldGEgPSBtZXRhc1swXTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHZpZXdOYW1lID0gZ2VuZXJhdGVWaWV3TmFtZSh0YWJsZU5hbWUsIG1ldGEuYXR0cmlidXRlLCBraW5kLCBtZXRhKTtcbiAgICBjb25zdCBkZG9jID0gbWV0YS5kZG9jIHx8IGdlbmVyYXRlRGVzaWduRG9jTmFtZSh0YWJsZU5hbWUsIHZpZXdOYW1lKTtcbiAgICBjb25zdCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgcmVkdWNlOiBtZXRhLnJlZHVjZSAhPT0gdW5kZWZpbmVkID8gdHJ1ZSA6ICFtZXRhLnJldHVybkRvY3MsXG4gICAgfTtcbiAgICBpZiAoa2luZCA9PT0gXCJkaXN0aW5jdFwiIHx8IGtpbmQgPT09IFwiZ3JvdXBCeVwiKSBvcHRpb25zLmdyb3VwID0gdHJ1ZTtcbiAgICByZXR1cm4ge1xuICAgICAga2luZCxcbiAgICAgIG1ldGEsXG4gICAgICBkZXNjcmlwdG9yOiB7XG4gICAgICAgIGRkb2MsXG4gICAgICAgIHZpZXc6IHZpZXdOYW1lLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIHRoZSBzcGVjaWFsIGFnZ3JlZ2F0ZSBNYW5nb1F1ZXJ5IG1hcmtlclxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBZ2dyZWdhdGVRdWVyeShcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvXG4gICk6IE1hbmdvUXVlcnkgJiB7IGFnZ3JlZ2F0ZTogdHJ1ZTsgYWdncmVnYXRlSW5mbzogRmFicmljQWdncmVnYXRlSW5mbyB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0b3I6IHt9LFxuICAgICAgYWdncmVnYXRlOiB0cnVlLFxuICAgICAgYWdncmVnYXRlSW5mbzogaW5mbyxcbiAgICB9IGFzIE1hbmdvUXVlcnkgJiB7IGFnZ3JlZ2F0ZTogdHJ1ZTsgYWdncmVnYXRlSW5mbzogRmFicmljQWdncmVnYXRlSW5mbyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBhZGFwdGVyIGNhc3QgdG8gRmFicmljQ2xpZW50QWRhcHRlciBmb3IgdmlldyBhY2Nlc3NcbiAgICovXG4gIHByaXZhdGUgZ2V0RmFicmljQWRhcHRlcigpOiBGYWJyaWNDbGllbnRBZGFwdGVyIHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyIGFzIEZhYnJpY0NsaWVudEFkYXB0ZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGFuIGFnZ3JlZ2F0ZSBxdWVyeSB2aWEgYWRhcHRlcidzIHZpZXcgbWV0aG9kXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVBZ2dyZWdhdGU8Uj4oXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mbyxcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IFByb21pc2U8Uj4ge1xuICAgIGlmICghdGhpcy5pc1ZpZXdBZ2dyZWdhdGUoaW5mbykpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUF2ZXJhZ2U8Uj4oaW5mbywgY3R4KTtcbiAgICB9XG4gICAgY29uc3QgZmFicmljQWRhcHRlciA9IHRoaXMuZ2V0RmFicmljQWRhcHRlcigpO1xuICAgIGNvbnN0IHZpZXdJbmZvID0gaW5mbyBhcyBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT47XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmYWJyaWNBZGFwdGVyLnZpZXc8Vmlld1Jlc3BvbnNlPihcbiAgICAgIHZpZXdJbmZvLmRlc2NyaXB0b3IuZGRvYyxcbiAgICAgIHZpZXdJbmZvLmRlc2NyaXB0b3IudmlldyxcbiAgICAgIHZpZXdJbmZvLmRlc2NyaXB0b3Iub3B0aW9ucyxcbiAgICAgIGN0eFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzc1ZpZXdSZXNwb25zZTxSPihpbmZvLCByZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgYXZlcmFnZSBjYWxjdWxhdGlvbiBmcm9tIHN1bSBhbmQgY291bnQgdmlld3NcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQXZlcmFnZTxSPihcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvLFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogUHJvbWlzZTxSPiB7XG4gICAgaWYgKGluZm8ua2luZCAhPT0gXCJhdmdcIilcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiQXZlcmFnZSBkZXNjcmlwdG9yIGlzIG5vdCB2YWxpZFwiKTtcbiAgICBjb25zdCBmYWJyaWNBZGFwdGVyID0gdGhpcy5nZXRGYWJyaWNBZGFwdGVyKCk7XG4gICAgY29uc3QgW3N1bURlc2MsIGNvdW50RGVzY10gPSBbaW5mby5zdW1EZXNjcmlwdG9yLCBpbmZvLmNvdW50RGVzY3JpcHRvcl07XG4gICAgY29uc3QgW3N1bVJlc3BvbnNlLCBjb3VudFJlc3BvbnNlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZhYnJpY0FkYXB0ZXIudmlldzxWaWV3UmVzcG9uc2U+KFxuICAgICAgICBzdW1EZXNjLmRkb2MsXG4gICAgICAgIHN1bURlc2MudmlldyxcbiAgICAgICAgc3VtRGVzYy5vcHRpb25zLFxuICAgICAgICBjdHhcbiAgICAgICksXG4gICAgICBmYWJyaWNBZGFwdGVyLnZpZXc8Vmlld1Jlc3BvbnNlPihcbiAgICAgICAgY291bnREZXNjLmRkb2MsXG4gICAgICAgIGNvdW50RGVzYy52aWV3LFxuICAgICAgICBjb3VudERlc2Mub3B0aW9ucyxcbiAgICAgICAgY3R4XG4gICAgICApLFxuICAgIF0pO1xuICAgIGNvbnN0IHN1bSA9IHN1bVJlc3BvbnNlLnJvd3M/LlswXT8udmFsdWUgPz8gMDtcbiAgICBjb25zdCBjb3VudCA9IGNvdW50UmVzcG9uc2Uucm93cz8uWzBdPy52YWx1ZSA/PyAwO1xuICAgIGlmICghY291bnQpIHJldHVybiAwIGFzIHVua25vd24gYXMgUjtcbiAgICByZXR1cm4gKHN1bSAvIGNvdW50KSBhcyB1bmtub3duIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyB0aGUgdmlldyByZXNwb25zZSBiYXNlZCBvbiBhZ2dyZWdhdGUga2luZFxuICAgKi9cbiAgcHJpdmF0ZSBwcm9jZXNzVmlld1Jlc3BvbnNlPFI+KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8sXG4gICAgcmVzcG9uc2U6IFZpZXdSZXNwb25zZVxuICApOiBSIHtcbiAgICBpZiAoaW5mby5raW5kID09PSBcImF2Z1wiKVxuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgIFwiQXZlcmFnZSByZXN1bHRzIHNob3VsZCBiZSBoYW5kbGVkIGJlZm9yZSBwcm9jZXNzaW5nIHJvd3NcIlxuICAgICAgKTtcbiAgICBjb25zdCByb3dzID0gcmVzcG9uc2Uucm93cyB8fCBbXTtcbiAgICBjb25zdCB2aWV3SW5mbyA9IGluZm8gYXMgRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+O1xuICAgIGNvbnN0IG1ldGEgPSB2aWV3SW5mby5tZXRhO1xuICAgIGlmICh2aWV3SW5mby5jb3VudERpc3RpbmN0KSB7XG4gICAgICByZXR1cm4gKHJvd3MubGVuZ3RoIHx8IDApIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgaWYgKHZpZXdJbmZvLmtpbmQgPT09IFwiZGlzdGluY3RcIiB8fCB2aWV3SW5mby5raW5kID09PSBcImdyb3VwQnlcIikge1xuICAgICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IHJvdy5rZXkgPz8gcm93LnZhbHVlKSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmIChtZXRhLnJldHVybkRvY3MpIHtcbiAgICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiByb3cudmFsdWUgPz8gcm93LmRvYyA/PyByb3cpIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgaWYgKCFyb3dzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuICh2aWV3SW5mby5raW5kID09PSBcImNvdW50XCIgPyAwIDogbnVsbCkgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICByZXR1cm4gKHJvd3NbMF0udmFsdWUgPz8gcm93c1swXS5rZXkgPz8gbnVsbCkgYXMgdW5rbm93biBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGluZm8gaXMgYSB2aWV3LWJhc2VkIGFnZ3JlZ2F0ZVxuICAgKi9cbiAgcHJpdmF0ZSBpc1ZpZXdBZ2dyZWdhdGUoXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mb1xuICApOiBpbmZvIGlzIEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PiB7XG4gICAgcmV0dXJuIGluZm8ua2luZCAhPT0gXCJhdmdcIjtcbiAgfVxufVxuIiwiaW1wb3J0IFwiLi4vc2hhcmVkL292ZXJyaWRlc1wiO1xuaW1wb3J0IHtcbiAgQ291Y2hEQktleXMsXG4gIHR5cGUgTWFuZ29RdWVyeSxcbiAgdHlwZSBWaWV3UmVzcG9uc2UsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7IENsaWVudCB9IGZyb20gXCJAZ3JwYy9ncnBjLWpzXCI7XG5pbXBvcnQgKiBhcyBncnBjIGZyb20gXCJAZ3JwYy9ncnBjLWpzXCI7XG5pbXBvcnQge1xuICBNb2RlbCxcbiAgdHlwZSBNb2RlbENvbnN0cnVjdG9yLFxuICB0eXBlIFNlcmlhbGl6ZXIsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGRlYnVnLCBmaW5hbCwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBQZWVyQ29uZmlnLFxuICB0eXBlIFNlZ3JlZ2F0ZWRNb2RlbCxcbiAgdHlwZSBNc3BEZXRhaWxzLFxufSBmcm9tIFwiLi4vc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQge1xuICBjb25uZWN0LFxuICB0eXBlIENvbm5lY3RPcHRpb25zLFxuICBHYXRld2F5LFxuICBOZXR3b3JrLFxuICBQcm9wb3NhbE9wdGlvbnMsXG4gIENvbnRyYWN0IGFzIENvbnRyYWt0LFxuICB0eXBlIFNpZ25lcixcbiAgR2F0ZXdheUVycm9yLFxuICBFbmRvcnNlRXJyb3IsXG59IGZyb20gXCJAaHlwZXJsZWRnZXIvZmFicmljLWdhdGV3YXlcIjtcbmltcG9ydCB7IEdhdGV3YXkgYXMgTGVnYWN5R2F0ZXdheSwgV2FsbGV0cyB9IGZyb20gXCJmYWJyaWMtbmV0d29ya1wiO1xuaW1wb3J0IHR5cGUgeyBFbmRvcnNlciB9IGZyb20gXCJmYWJyaWMtY29tbW9uXCI7XG5pbXBvcnQge1xuICBnZXRJZGVudGl0eSxcbiAgZ2V0U2lnbmVyLFxuICBnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudCxcbiAgcmVhZEZpbGUgYXMgcmVhZEZzRmlsZSxcbn0gZnJvbSBcIi4vZmFicmljLWZzXCI7XG5pbXBvcnQge1xuICBCYXNlRXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG4gIFNlcmlhbGl6YXRpb25FcnJvcixcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBOb3RGb3VuZEVycm9yLFxuICBDb25mbGljdEVycm9yLFxuICBCYWRSZXF1ZXN0RXJyb3IsXG4gIHR5cGUgUHJpbWFyeUtleVR5cGUsXG4gIFZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDb250ZXh0LFxuICBBZGFwdGVyLFxuICB0eXBlIEFkYXB0ZXJGbGFncyxcbiAgQXV0aG9yaXphdGlvbkVycm9yLFxuICBDb25uZWN0aW9uRXJyb3IsXG4gIEZvcmJpZGRlbkVycm9yLFxuICBNaWdyYXRpb25FcnJvcixcbiAgT2JzZXJ2ZXJFcnJvcixcbiAgUGFnaW5nRXJyb3IsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUXVlcnlFcnJvcixcbiAgUmVwb3NpdG9yeSxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbiAgU3RhdGVtZW50LFxuICB0eXBlIFByZXBhcmVkU3RhdGVtZW50LFxuICBQYWdpbmF0b3IsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgQ29udGV4dHVhbEFyZ3MsXG4gIHR5cGUgUHJlcGFyZWRNb2RlbCxcbiAgQWxsT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGF2b3VyIH0gZnJvbSBcIi4uL3NoYXJlZC9jb25zdGFudHNcIjtcbmltcG9ydCB7IENsaWVudFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vc2hhcmVkL0NsaWVudFNlcmlhbGl6ZXJcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudERpc3BhdGNoIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50RGlzcGF0Y2hcIjtcbi8vIGltcG9ydCB7IEhTTVNpZ25lckZhY3RvcnlDdXN0b20gfSBmcm9tIFwiLi9mYWJyaWMtaHNtXCI7XG5pbXBvcnQgeyB0eXBlIENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRTdGF0ZW1lbnQgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRTdGF0ZW1lbnRcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudFBhZ2luYXRvciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudFBhZ2luYXRvclwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50UmVwb3NpdG9yeSB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudFJlcG9zaXRvcnlcIjtcbmltcG9ydCB7XG4gIEVuZG9yc2VtZW50RXJyb3IsXG4gIEVuZG9yc2VtZW50UG9saWN5RXJyb3IsXG4gIE12Y2NSZWFkQ29uZmxpY3RFcnJvcixcbiAgUGhhbnRvbVJlYWRDb25mbGljdEVycm9yLFxuICBUcmFuc2FjdGlvblRpbWVvdXRFcnJvcixcbn0gZnJvbSBcIi4uL3NoYXJlZC9lcnJvcnNcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlZmF1bHRGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgQ3J5cHRvVXRpbHMgfSBmcm9tIFwiLi9jcnlwdG9cIjtcbmltcG9ydCB7IGV4dHJhY3RJZHMgfSBmcm9tIFwiLi9pZHMvaWQtZXh0cmFjdGlvblwiO1xuaW1wb3J0IHsgSWRlbnRpdHkgfSBmcm9tIFwiLi4vc2hhcmVkL2luZGV4XCI7XG5cbnR5cGUgTGVnYWN5UGVlclRhcmdldCA9IHtcbiAgbXNwSWQ6IHN0cmluZztcbiAgcGVlckVuZHBvaW50OiBzdHJpbmc7XG4gIHBlZXJIb3N0QWxpYXM/OiBzdHJpbmc7XG4gIHRsc0NlcnQ/OiBzdHJpbmcgfCBCdWZmZXI7XG59O1xuXG50eXBlIExlZ2FjeVBlZXJXaXRoTmFtZSA9IExlZ2FjeVBlZXJUYXJnZXQgJiB7IG5hbWU6IHN0cmluZyB9O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBZGFwdGVyIGZvciBpbnRlcmFjdGluZyB3aXRoIEh5cGVybGVkZ2VyIEZhYnJpYyBuZXR3b3Jrc1xuICogQHN1bW1hcnkgVGhlIEZhYnJpY0FkYXB0ZXIgZXh0ZW5kcyBDb3VjaERCQWRhcHRlciB0byBwcm92aWRlIGEgc2VhbWxlc3MgaW50ZXJmYWNlIGZvciBpbnRlcmFjdGluZyB3aXRoIEh5cGVybGVkZ2VyIEZhYnJpYyBuZXR3b3Jrcy5cbiAqIEl0IGhhbmRsZXMgY29ubmVjdGlvbiBtYW5hZ2VtZW50LCB0cmFuc2FjdGlvbiBzdWJtaXNzaW9uLCBhbmQgQ1JVRCBvcGVyYXRpb25zIGFnYWluc3QgRmFicmljIGNoYWluY29kZS5cbiAqIEB0ZW1wbGF0ZSBQZWVyQ29uZmlnIC0gQ29uZmlndXJhdGlvbiB0eXBlIGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAqIEB0ZW1wbGF0ZSBGYWJyaWNGbGFncyAtIEZsYWdzIHNwZWNpZmljIHRvIEZhYnJpYyBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgQ29udGV4dDxGYWJyaWNGbGFncz4gLSBDb250ZXh0IHR5cGUgY29udGFpbmluZyBGYWJyaWMtc3BlY2lmaWMgZmxhZ3NcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAqIEBwYXJhbSBhbGlhcyAtIE9wdGlvbmFsIGFsaWFzIGZvciB0aGUgYWRhcHRlciBpbnN0YW5jZVxuICogQGNsYXNzIEZhYnJpY0NsaWVudEFkYXB0ZXJcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgRmFicmljQWRhcHRlciBpbnN0YW5jZVxuICogY29uc3QgY29uZmlnOiBQZWVyQ29uZmlnID0ge1xuICogICBtc3BJZDogJ09yZzFNU1AnLFxuICogICBwZWVyRW5kcG9pbnQ6ICdsb2NhbGhvc3Q6NzA1MScsXG4gKiAgIGNoYW5uZWxOYW1lOiAnbXljaGFubmVsJyxcbiAqICAgY2hhaW5jb2RlTmFtZTogJ215Y2MnLFxuICogICBjb250cmFjdE5hbWU6ICdteWNvbnRyYWN0JyxcbiAqICAgdGxzQ2VydFBhdGg6ICcvcGF0aC90by90bHMvY2VydCcsXG4gKiAgIGNlcnREaXJlY3RvcnlQYXRoOiAnL3BhdGgvdG8vY2VydC9kaXInLFxuICogICBrZXlEaXJlY3RvcnlQYXRoOiAnL3BhdGgvdG8va2V5L2RpcidcbiAqIH07XG4gKlxuICogY29uc3QgYWRhcHRlciA9IG5ldyBGYWJyaWNBZGFwdGVyKGNvbmZpZywgJ29yZzEtYWRhcHRlcicpO1xuICpcbiAqIC8vIFVzZSB0aGUgYWRhcHRlciB0byBpbnRlcmFjdCB3aXRoIHRoZSBGYWJyaWMgbmV0d29ya1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgYWRhcHRlci5yZWFkKCd1c2VycycsICd1c2VyMScsIG15U2VyaWFsaXplcik7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICogICBwYXJ0aWNpcGFudCBOZXR3b3JrXG4gKiAgIHBhcnRpY2lwYW50IENvbnRyYWN0XG4gKiAgIHBhcnRpY2lwYW50IENoYWluY29kZVxuICpcbiAqICAgQ2xpZW50LT4+RmFicmljQWRhcHRlcjogY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsLCB0cmFuc2llbnQsIHNlcmlhbGl6ZXIpXG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBzdWJtaXRUcmFuc2FjdGlvbihPcGVyYXRpb25LZXlzLkNSRUFURSwgW3NlcmlhbGl6ZWRNb2RlbF0sIHRyYW5zaWVudClcbiAqICAgRmFicmljQWRhcHRlci0+PkdhdGV3YXk6IGNvbm5lY3QoKVxuICogICBHYXRld2F5LT4+TmV0d29yazogZ2V0TmV0d29yayhjaGFubmVsTmFtZSlcbiAqICAgTmV0d29yay0+PkNvbnRyYWN0OiBnZXRDb250cmFjdChjaGFpbmNvZGVOYW1lLCBjb250cmFjdE5hbWUpXG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5Db250cmFjdDogc3VibWl0KGFwaSwgcHJvcG9zYWxPcHRpb25zKVxuICogICBDb250cmFjdC0+PkNoYWluY29kZTogaW52b2tlXG4gKiAgIENoYWluY29kZS0tPj5Db250cmFjdDogcmVzcG9uc2VcbiAqICAgQ29udHJhY3QtLT4+RmFicmljQWRhcHRlcjogcmVzdWx0XG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBkZWNvZGUocmVzdWx0KVxuICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkZWNvZGVkUmVzdWx0KVxuICogICBGYWJyaWNBZGFwdGVyLS0+PkNsaWVudDogZGVzZXJpYWxpemVkUmVzdWx0XG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnRBZGFwdGVyIGV4dGVuZHMgQWRhcHRlcjxcbiAgUGVlckNvbmZpZyxcbiAgQ2xpZW50LFxuICBNYW5nb1F1ZXJ5LFxuICBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhdGljIHRleHQgZGVjb2RlciBmb3IgY29udmVydGluZyBVaW50OEFycmF5IHRvIHN0cmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc2VyaWFsaXplciA9IG5ldyBDbGllbnRTZXJpYWxpemVyKCk7XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBsb2cgPSBMb2dnaW5nLmZvcihGYWJyaWNDbGllbnRBZGFwdGVyKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VyaWFsaXplcjogU2VyaWFsaXplcjxhbnk+ID1cbiAgICBGYWJyaWNDbGllbnRBZGFwdGVyLnNlcmlhbGl6ZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IEZhYnJpY0FkYXB0ZXIgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgYWRhcHRlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhIEh5cGVybGVkZ2VyIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyIGluc3RhbmNlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IFBlZXJDb25maWcsIGFsaWFzPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0RmFicmljQ2xpZW50RmxhZ3MsIGNvbmZpZyksXG4gICAgICBGYWJyaWNGbGF2b3VyLFxuICAgICAgYWxpYXNcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3ZlcnJpZGVzPzogUGFydGlhbDxBZGFwdGVyRmxhZ3M+XG4gICk6IFN0YXRlbWVudDxNLCBGYWJyaWNDbGllbnRBZGFwdGVyLCBhbnksIE1hbmdvUXVlcnk+IHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY0NsaWVudFN0YXRlbWVudCh0aGlzLCBvdmVycmlkZXMpO1xuICB9XG5cbiAgUGFnaW5hdG9yPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgcXVlcnk6IFByZXBhcmVkU3RhdGVtZW50PGFueT4gfCBNYW5nb1F1ZXJ5LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKTogUGFnaW5hdG9yPE0sIGFueSwgTWFuZ29RdWVyeT4ge1xuICAgIHJldHVybiBuZXcgRmFicmljQ2xpZW50UGFnaW5hdG9yKHRoaXMsIHF1ZXJ5LCBzaXplLCBjbGF6eik7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+IHwgQ29uc3RydWN0b3I8TT5bXSB8IHVuZGVmaW5lZCxcbiAgICBmbGFnczogUGFydGlhbDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGYWJyaWNDbGllbnRGbGFncz4ge1xuICAgIGNvbnN0IG1lcmdlZEZsYWdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jb25maWcsIGZsYWdzKTtcbiAgICBjb25zdCBmID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIGF3YWl0IHN1cGVyLmZsYWdzKG9wZXJhdGlvbiwgbW9kZWwsIG1lcmdlZEZsYWdzLCAuLi5hcmdzKVxuICAgICk7XG4gICAgcmV0dXJuIGY7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjb250ZXh0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiAoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgQWxsT3BlcmF0aW9uS2V5cyxcbiAgICBvdmVycmlkZXM6IFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiB8IENvbnN0cnVjdG9yPE0+W10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHQ8YW55Pj5cbiAgKTogUHJvbWlzZTxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNvbnRleHQpO1xuICAgIGxvZy5zaWxseShcbiAgICAgIGBjcmVhdGluZyBuZXcgY29udGV4dCBmb3IgJHtvcGVyYXRpb259IG9wZXJhdGlvbiBvbiAke21vZGVsID8gKEFycmF5LmlzQXJyYXkobW9kZWwpID8gbW9kZWwubWFwKChtKSA9PiBNb2RlbC50YWJsZU5hbWUobSkpIDogTW9kZWwudGFibGVOYW1lKG1vZGVsKSkgOiBcIm5vXCJ9IHRhYmxlICR7b3ZlcnJpZGVzICYmIE9iamVjdC5rZXlzKG92ZXJyaWRlcykgPyBPYmplY3Qua2V5cyhvdmVycmlkZXMpLmxlbmd0aCA6IFwibm9cIn0gd2l0aCBmbGFnIG92ZXJyaWRlc2BcbiAgICApO1xuICAgIGxldCBjdHggPSBhcmdzLnBvcCgpO1xuICAgIGlmICh0eXBlb2YgY3R4ICE9PSBcInVuZGVmaW5lZFwiICYmICEoY3R4IGluc3RhbmNlb2YgQ29udGV4dCkpIHtcbiAgICAgIGFyZ3MucHVzaChjdHgpO1xuICAgICAgY3R4ID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIG92ZXJyaWRlcyA9IGN0eFxuICAgICAgPyBPYmplY3QuYXNzaWduKHt9LCBjdHgudG9PdmVycmlkZXMoKSwgb3ZlcnJpZGVzKVxuICAgICAgOiBvdmVycmlkZXM7XG4gICAgY29uc3QgZmxhZ3MgPSBhd2FpdCB0aGlzLmZsYWdzKFxuICAgICAgdHlwZW9mIG9wZXJhdGlvbiA9PT0gXCJzdHJpbmdcIiA/IG9wZXJhdGlvbiA6IG9wZXJhdGlvbi5uYW1lLFxuICAgICAgbW9kZWwsXG4gICAgICBvdmVycmlkZXMgYXMgUGFydGlhbDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgICAuLi5bLi4uYXJncywgY3R4XS5maWx0ZXIoQm9vbGVhbilcbiAgICApO1xuXG4gICAgaWYgKGN0eCkge1xuICAgICAgaWYgKCEoY3R4IGluc3RhbmNlb2YgdGhpcy5Db250ZXh0KSkge1xuICAgICAgICBjb25zdCBuZXdDdHggPSBuZXcgdGhpcy5Db250ZXh0KCkuYWNjdW11bGF0ZSh7XG4gICAgICAgICAgLi4uY3R4W1wiY2FjaGVcIl0sXG4gICAgICAgICAgLi4uZmxhZ3MsXG4gICAgICAgICAgcGFyZW50Q29udGV4dDogY3R4LFxuICAgICAgICB9KSBhcyBhbnk7XG4gICAgICAgIGN0eC5hY2N1bXVsYXRlKHtcbiAgICAgICAgICBjaGlsZENvbnRleHRzOiBbXG4gICAgICAgICAgICAuLi4oY3R4LmdldE9yVW5kZWZpbmVkKFwiY2hpbGRDb250ZXh0c1wiKSB8fCBbXSksXG4gICAgICAgICAgICBuZXdDdHgsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXdDdHg7XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50T3AgPSBjdHguZ2V0T3JVbmRlZmluZWQoXCJvcGVyYXRpb25cIik7XG4gICAgICBjb25zdCBjdXJyZW50TW9kZWwgPSBjdHguZ2V0T3JVbmRlZmluZWQoXCJhZmZlY3RlZFRhYmxlc1wiKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWN1cnJlbnRPcCB8fFxuICAgICAgICBjdXJyZW50T3AgIT09IG9wZXJhdGlvbiB8fFxuICAgICAgICAobW9kZWwgJiYgbW9kZWwgIT09IGN1cnJlbnRNb2RlbClcbiAgICAgICkge1xuICAgICAgICBjb25zdCBuZXdDdHggPSBuZXcgdGhpcy5Db250ZXh0KCkuYWNjdW11bGF0ZSh7XG4gICAgICAgICAgLi4uY3R4W1wiY2FjaGVcIl0sXG4gICAgICAgICAgLi4uZmxhZ3MsXG4gICAgICAgICAgcGFyZW50Q29udGV4dDogY3R4LFxuICAgICAgICB9KSBhcyBhbnk7XG5cbiAgICAgICAgY3R4LmFjY3VtdWxhdGUoe1xuICAgICAgICAgIGNoaWxkQ29udGV4dHM6IFtcbiAgICAgICAgICAgIC4uLihjdHguZ2V0T3JVbmRlZmluZWQoXCJjaGlsZENvbnRleHRzXCIpIHx8IFtdKSxcbiAgICAgICAgICAgIG5ld0N0eCxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ld0N0eDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdHguYWNjdW11bGF0ZShmbGFncykgYXMgYW55O1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgdGhpcy5Db250ZXh0KCkuYWNjdW11bGF0ZSh7XG4gICAgICAuLi5mbGFncyxcbiAgICB9KSBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlY29kZXMgYSBVaW50OEFycmF5IHRvIGEgc3RyaW5nXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGJpbmFyeSBkYXRhIHJlY2VpdmVkIGZyb20gRmFicmljIHRvIGEgc3RyaW5nIHVzaW5nIFVURi04IGVuY29kaW5nXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YSAtIFRoZSBiaW5hcnkgZGF0YSB0byBkZWNvZGVcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGVjb2RlZCBzdHJpbmdcbiAgICovXG4gIGRlY29kZShkYXRhOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5kZWNvZGVyLmRlY29kZShkYXRhKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlcG9zaXRvcnk8XG4gICAgUiBleHRlbmRzIFJlcG9zaXRvcnk8XG4gICAgICBhbnksXG4gICAgICBBZGFwdGVyPFBlZXJDb25maWcsIENsaWVudCwgTWFuZ29RdWVyeSwgQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICAgPixcbiAgPigpOiBDb25zdHJ1Y3RvcjxSPiB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxSPjtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogW0NvbnN0cnVjdG9yPE0+LCBQcmltYXJ5S2V5VHlwZSwgUmVjb3JkPHN0cmluZywgYW55PiwgLi4uYW55W10sIENvbnRleHRdIHtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuY3JlYXRlUHJlZml4KTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsKTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZCwgcmVjb3JkLCAuLi5jdHhBcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgbXVsdGlwbGUgcmVjb3JkcyBmb3IgY3JlYXRpb25cbiAgICogQHN1bW1hcnkgQWRkcyBuZWNlc3NhcnkgQ291Y2hEQiBmaWVsZHMgdG8gbXVsdGlwbGUgcmVjb3JkcyBiZWZvcmUgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBpZHMgLSBUaGUgSURzIG9mIHRoZSByZWNvcmRzXG4gICAqIEBwYXJhbSBtb2RlbHMgLSBUaGUgbW9kZWxzIHRvIHByZXBhcmVcbiAgICogQHJldHVybiBBIHR1cGxlIGNvbnRhaW5pbmcgdGhlIHRhYmxlTmFtZSwgaWRzLCBhbmQgcHJlcGFyZWQgcmVjb3Jkc1xuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBpZHMgYW5kIG1vZGVscyBhcnJheXMgaGF2ZSBkaWZmZXJlbnQgbGVuZ3Roc1xuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUFsbFByZWZpeDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGVBbGxQcmVmaXgpO1xuICAgIGNvbnN0IHJlY29yZHMgPSBpZHMubWFwKChpZCwgY291bnQpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbHNbY291bnRdKTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIFtjbGF6eiwgaWRzLCByZWNvcmRzLCAuLi5jdHhBcmdzXTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVBbGxQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlQWxsUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmRzID0gaWRzLm1hcCgoKSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH0pO1xuICAgIHJldHVybiBbY2xhenosIGlkcywgcmVjb3JkcywgLi4uY3R4QXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gY3JlYXRlIG11bHRpcGxlIHJlY29yZHMgaW4gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0gaWRzIC0gQXJyYXkgb2YgcmVjb3JkIGlkZW50aWZpZXJzXG4gICAqIEBwYXJhbSB7QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj59IG1vZGVscyAtIEFycmF5IG9mIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNyZWF0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICAvL0hFUkUhXG4gICAgY29uc3QgY3R4QXJncyA9IFsuLi4oYXJncyBhcyB1bmtub3duIGFzIGFueVtdKV07XG4gICAgY29uc3QgdHJhbnNpZW50ID0gY3R4QXJncy5zaGlmdCgpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoXG4gICAgICBjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PixcbiAgICAgIHRoaXMuY3JlYXRlQWxsXG4gICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgbG9nLmluZm8oYGFkZGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHRyYW5zaWVudFBheWxvYWQgPSBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHt9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLFxuICAgICAgW1xuICAgICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBtb2RlbHMubWFwKChtKSA9PiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG0sIGNsYXp6Lm5hbWUpKVxuICAgICAgICApLFxuICAgICAgXSxcbiAgICAgIHRyYW5zaWVudFBheWxvYWQgYXMgYW55LFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcblxuICAgIGxldCByZXM6IFJlY29yZDxzdHJpbmcsIGFueT5bXTtcbiAgICB0cnkge1xuICAgICAgcmVzID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgY3R4LFxuICAgICAgICBuZWVkc0Z1bGxQYXlsb2FkLFxuICAgICAgICByZXNbMF1bTW9kZWwucGsoY2xhenopIGFzIHN0cmluZ10gfHwgaWRzWzBdXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQWxsKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICAgICAgTW9kZWwubWVyZ2UoT2JqZWN0LmFzc2lnbih7fSwgbSBhcyBhbnksIHRyYW5zaWVudFtpXSB8fCB7fSksIHJlc1tpXSlcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkc1xuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgbXVsdGlwbGUgcmVjb3JkcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gcmVhZCBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0gaWRzIC0gQXJyYXkgb2YgcmVjb3JkIGlkZW50aWZpZXJzIHRvIHJlYWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3Jkc1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkQWxsKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy5pbmZvKGByZWFkaW5nICR7aWRzLmxlbmd0aH0gZW50cmllcyB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cudmVyYm9zZShgcGtzOiAke2lkc31gKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuUkVBRF9BTEwsXG4gICAgICBbSlNPTi5zdHJpbmdpZnkoaWRzKV0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzdWx0KSkubWFwKChyOiBhbnkpID0+IEpTT04ucGFyc2UocikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHVwZGF0ZSBtdWx0aXBsZSByZWNvcmRzIGluIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVyc1xuICAgKiBAcGFyYW0ge0FycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+fSBtb2RlbHMgLSBBcnJheSBvZiB1cGRhdGVkIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHVwZGF0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCBjdHhBcmdzID0gWy4uLihhcmdzIGFzIHVua25vd24gYXMgYW55W10pXTtcbiAgICBjb25zdCB0cmFuc2llbnQgPSBjdHhBcmdzLnNoaWZ0KCkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChcbiAgICAgIGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+LFxuICAgICAgdGhpcy51cGRhdGVBbGxcbiAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgbG9nLmluZm8oYHVwZGF0aW5nICR7aWRzLmxlbmd0aH0gZW50cmllcyB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cudmVyYm9zZShgcGtzOiAke2lkc31gKTtcbiAgICBjb25zdCBoYXNUcmFuc2llbnQgPSB0cmFuc2llbnQgJiYgT2JqZWN0LmtleXModHJhbnNpZW50KS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgaGFzVHJhbnNpZW50IHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgY29uc3QgdHJhbnNpZW50UGF5bG9hZCA9IGhhc1RyYW5zaWVudCA/IHsgW3RhYmxlTmFtZV06IHRyYW5zaWVudCB9IDoge307XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsXG4gICAgICBbXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIG1vZGVscy5tYXAoKG0pID0+IHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUobSwgY2xhenoubmFtZSkpXG4gICAgICAgICksXG4gICAgICBdLFxuICAgICAgdHJhbnNpZW50UGF5bG9hZCBhcyBhbnksXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuXG4gICAgbGV0IHJlczogYW55O1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlc3VsdCkpLm1hcCgocjogYW55KSA9PiBKU09OLnBhcnNlKHIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKGNsYXp6LCBjdHgsIG5lZWRzRnVsbFBheWxvYWQsIGlkc1swXSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWRBbGwoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBleHRyYWN0SWRzKFxuICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgIG1vZGVscy5tYXAoKG0sIGkpID0+XG4gICAgICAgICAgICBNb2RlbC5tZXJnZShPYmplY3QuYXNzaWduKHt9LCBtIGFzIGFueSwgdHJhbnNpZW50W2ldIHx8IHt9KSwgcmVzW2ldKVxuICAgICAgICAgICksXG4gICAgICAgICAgaWRzXG4gICAgICAgICksXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byBkZWxldGUgbXVsdGlwbGUgcmVjb3JkcyBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD59IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVycyB0byBkZWxldGVcbiAgICogQHBhcmFtIHtTZXJpYWxpemVyPGFueT59IHNlcmlhbGl6ZXIgLSBTZXJpYWxpemVyIGZvciB0aGUgbW9kZWwgZGF0YVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGRlbGV0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4LCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmRlbGV0ZUFsbCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgTW9kZWwuaXNUcmFuc2llbnQoY2xhenopIHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIGNvbnN0IHNob3VsZEh5ZHJhdGUgPSB0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKFxuICAgICAgY2xhenosXG4gICAgICBjdHgsXG4gICAgICBuZWVkc0Z1bGxQYXlsb2FkLFxuICAgICAgaWRzWzBdXG4gICAgKTtcbiAgICBpZiAoc2hvdWxkSHlkcmF0ZSkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZWFkQWxsKGNsYXp6LCBpZHMsIC4uLmN0eEFyZ3MpO1xuICAgIH1cblxuICAgIGxvZy5pbmZvKGBkZWxldGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMLFxuICAgICAgW0pTT04uc3RyaW5naWZ5KGlkcyldLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHNob3VsZEh5ZHJhdGVcbiAgICAgICAgPyByZXN1bHRcbiAgICAgICAgOiBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlcykpLm1hcCgocjogYW55KSA9PiBKU09OLnBhcnNlKHIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgcGVyc2lzdGVuY2VcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBtb2RlbCBpbnN0YW5jZSBpbnRvIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBkYXRhYmFzZSBzdG9yYWdlLFxuICAgKiBoYW5kbGluZyBjb2x1bW4gbWFwcGluZyBhbmQgc2VwYXJhdGluZyB0cmFuc2llbnQgcHJvcGVydGllc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gcHJlcGFyZVxuICAgKiBAcGFyYW0gcGsgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAcmV0dXJuIFRoZSBwcmVwYXJlZCBkYXRhXG4gICAqL1xuICBvdmVycmlkZSBwcmVwYXJlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFNlZ3JlZ2F0ZWRNb2RlbDxNPiAmIFByZXBhcmVkTW9kZWwge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucHJlcGFyZSk7XG4gICAgY29uc3Qgc3BsaXQgPSBNb2RlbC5zZWdyZWdhdGUobW9kZWwpO1xuICAgIGlmICgobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdKSB7XG4gICAgICBsb2cuc2lsbHkoXG4gICAgICAgIGBQYXNzaW5nIGFsb25nIHBlcnNpc3RlbmNlIG1ldGFkYXRhIGZvciAkeyhtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV19YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGxpdC5tb2RlbCwgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBLCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBtaXJyb3JNZXRhID0gTW9kZWwubWlycm9yZWRBdChtb2RlbCk7XG4gICAgaWYgKG1pcnJvck1ldGEpIHtcbiAgICAgIGNvbnN0IG1pcnJvck1zcCA9IG1pcnJvck1ldGEubXNwSWQ7XG4gICAgICBpZiAoIW1pcnJvck1zcCkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIG1pcnJvciBNU1AgY291bGQgYmUgZm91bmRgKTtcbiAgICAgIGxldCBtc3BzID0gdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCkgfHwgW107XG4gICAgICBtc3BzID0gQXJyYXkuaXNBcnJheShtc3BzKSA/IG1zcHMgOiBbbXNwc107XG4gICAgICBjb25zdCBtZXJnZWQgPSBbLi4ubmV3IFNldChbLi4ubXNwcywgbWlycm9yTXNwXSldO1xuICAgICAgY3R4LmFjY3VtdWxhdGUoe1xuICAgICAgICBlbmRvcnNpbmdPcmdzOiBtZXJnZWQsXG4gICAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnM6IG1lcmdlZCxcbiAgICAgICAgbGVnYWN5OiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlY29yZDogc3BsaXQubW9kZWwsXG4gICAgICBtb2RlbDogc3BsaXQubW9kZWwsXG4gICAgICBpZDogbW9kZWxbTW9kZWwucGsobW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pXSBhcyBzdHJpbmcsXG4gICAgICB0cmFuc2llbnQ6IHNwbGl0LnRyYW5zaWVudCxcbiAgICAgIHByaXZhdGVzOiBzcGxpdC5wcml2YXRlcyxcbiAgICAgIHNoYXJlZDogc3BsaXQuc2hhcmVkLFxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSByZXZlcnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBNIHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJldmVydCk7XG4gICAgaWYgKFxuICAgICAgdHJhbnNpZW50ICYmXG4gICAgICB0aGlzLnNob3VsZFJlYnVpbGRXaXRoVHJhbnNpZW50KFxuICAgICAgICBjdHgsXG4gICAgICAgIGN0eC5nZXRPclVuZGVmaW5lZChcIm9wZXJhdGlvblwiKSBhcyBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgcmUtYWRkaW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzOiAke09iamVjdC5rZXlzKHRyYW5zaWVudCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZW50cmllcyh0cmFuc2llbnQgYXMgUmVjb3JkPHN0cmluZywgYW55PilcbiAgICAgICAgLmZpbHRlcigoWywgdl0pID0+IHR5cGVvZiB2ICE9PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgaW4gb2JqICYmIChvYmogYXMgYW55KVtrZXldICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBsb2cud2FybihcbiAgICAgICAgICAgICAgYG92ZXJ3cml0aW5nIGV4aXN0aW5nICR7a2V5fS4gaWYgdGhpcyBpcyBub3QgYSBkZWZhdWx0IHZhbHVlLCB0aGlzIG1heSBwb3NlIGEgcHJvYmxlbWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgKG9iaiBhcyBNKVtrZXkgYXMga2V5b2YgTV0gPSB2YWw7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8TT4pKG9iaik7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRSZWJ1aWxkV2l0aFRyYW5zaWVudChcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIG9wZXJhdGlvbj86IHN0cmluZ1xuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWN0eCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChjdHguZ2V0T3JVbmRlZmluZWQoXCJyZWJ1aWxkV2l0aFRyYW5zaWVudFwiKSkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgY2hpbGRSZWJ1aWxkID1cbiAgICAgIHR5cGVvZiAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuKFwicmVidWlsZFdpdGhUcmFuc2llbnRcIilcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKGNoaWxkUmVidWlsZCkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgcmVzb2x2ZWRPcCA9IHRoaXMucmVzb2x2ZU9wZXJhdGlvbihjdHgsIG9wZXJhdGlvbik7XG4gICAgaWYgKCFyZXNvbHZlZE9wKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qgb3AgPSByZXNvbHZlZE9wLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gKFxuICAgICAgb3AuaW5jbHVkZXMoXCJyZWFkXCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcImZpbmRcIikgfHxcbiAgICAgIG9wLmluY2x1ZGVzKFwicXVlcnlcIikgfHxcbiAgICAgIG9wLmluY2x1ZGVzKFwic3RhdGVtZW50XCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcInBhZ2VcIilcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlT3BlcmF0aW9uKFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgb3BlcmF0aW9uPzogc3RyaW5nXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKG9wZXJhdGlvbikgcmV0dXJuIG9wZXJhdGlvbjtcbiAgICBpZiAodHlwZW9mIChjdHggYXMgYW55KS5nZXRGcm9tQ2hpbGRyZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIChjdHggYXMgYW55KS5nZXRGcm9tQ2hpbGRyZW4oXCJvcGVyYXRpb25cIik7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFJlZnJlc2hBZnRlcldyaXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgaGFzVHJhbnNpZW50OiBib29sZWFuLFxuICAgIGlkPzogUHJpbWFyeUtleVR5cGVcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFoYXNUcmFuc2llbnQpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBwayA9IE1vZGVsLnBrKGNsYXp6KTtcbiAgICBjb25zdCBjb21wb3NlZCA9IE1vZGVsLmNvbXBvc2VkKGNsYXp6LCBwayk7XG4gICAgY29uc3QgZ2VuZXJhdGVkID0gTW9kZWwuZ2VuZXJhdGVkKGNsYXp6LCBwayk7XG4gICAgY29uc3QgaGFzSWQgPSBpZCAhPT0gdW5kZWZpbmVkICYmIGlkICE9PSBudWxsO1xuICAgIGlmICghaGFzSWQgJiYgY29tcG9zZWQpIHJldHVybiB0cnVlO1xuICAgIGlmICghaGFzSWQgJiYgZ2VuZXJhdGVkKSB7XG4gICAgICBjdHgubG9nZ2VyLndhcm4oXG4gICAgICAgIGBDYW5ub3QgcmVmcmVzaCByZWNvcmQgd2l0aCBwcml2YXRlIGdlbmVyYXRlZCBwcmltYXJ5IGtleWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBoYXNJZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkaXJlY3QgPVxuICAgICAgY3R4LmdldE9yVW5kZWZpbmVkKFwiZW5kb3JzaW5nT3Jnc1wiKSB8fFxuICAgICAgKGN0eC5nZXRPclVuZGVmaW5lZChcImVuZG9yc2luZ09yZ3NcIikgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpO1xuICAgIGlmIChkaXJlY3QgJiYgZGlyZWN0Lmxlbmd0aCkgcmV0dXJuIGRpcmVjdDtcbiAgICByZXR1cm4gKFxuICAgICAgKGN0eC5nZXRGcm9tQ2hpbGRyZW4oXCJlbmRvcnNpbmdPcmdzXCIpIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB8fFxuICAgICAgKGN0eC5nZXRGcm9tQ2hpbGRyZW4oXCJlbmRvcnNpbmdPcmdzXCIpIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmNvbmZpZy5hbGxvd0dhdGV3YXlPdmVycmlkZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGNyZWF0ZSBhIHJlY29yZCBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgcmVjb3JkIGRhdGFcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0cmFuc2llbnQgLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIHJlY29yZFxuICAgKi9cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICB0cmFuc2llbnQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgY3R4QXJncyA9IFsuLi4oYXJncyBhcyB1bmtub3duIGFzIGFueVtdKV07XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoXG4gICAgICBjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PixcbiAgICAgIHRoaXMuY3JlYXRlXG4gICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy52ZXJib3NlKGBhZGRpbmcgZW50cnkgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCBoYXNUcmFuc2llbnQgPSB0cmFuc2llbnQgJiYgT2JqZWN0LmtleXModHJhbnNpZW50KS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgaGFzVHJhbnNpZW50IHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgY29uc3QgdHJhbnNpZW50UGF5bG9hZCA9IGhhc1RyYW5zaWVudCA/IHsgW3RhYmxlTmFtZV06IHRyYW5zaWVudCB9IDoge307XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgW3RoaXMuc2VyaWFsaXplci5zZXJpYWxpemUobW9kZWwsIGNsYXp6Lm5hbWUpXSxcbiAgICAgIHRyYW5zaWVudFBheWxvYWQgYXMgYW55LFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICBjb25zdCBkZXNlcmlhbGl6ZWQgPSB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gICAgaWYgKHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoY2xhenosIGN0eCwgbmVlZHNGdWxsUGF5bG9hZCwgaWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBNb2RlbC5tZXJnZShcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oe30sIG1vZGVsLCB0cmFuc2llbnQgfHwge30pLFxuICAgICAgICAgICAgZGVzZXJpYWxpemVkLFxuICAgICAgICAgICAgY2xhenpcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkXG4gICAgICAgICksXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplZDtcbiAgfVxuXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIGFzeW5jIGhlYWx0aGNoZWNrPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmhlYWx0aGNoZWNrKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgbG9nLnZlcmJvc2UoYHJlYWRpbmcgZW50cnkgZnJvbSAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcImhlYWx0aGNoZWNrXCIsXG4gICAgICBbXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlc3VsdCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gdG8gcmVhZCBhIHJlY29yZCBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJldHJpZXZlZCByZWNvcmRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIGFzeW5jIHJlYWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJlYWQpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBsb2cudmVyYm9zZShgcmVhZGluZyBlbnRyeSBmcm9tICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGs6ICR7aWR9YCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgW2lkLnRvU3RyaW5nKCldLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZSh0aGlzLmRlY29kZShyZXN1bHQpKTtcbiAgfVxuXG4gIHVwZGF0ZVByZWZpeDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGVQcmVmaXgpO1xuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgLy8gcmVjb3JkW0NvdWNoREJLZXlzLklEXSA9IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKTtcbiAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWwpO1xuICAgIHJldHVybiBbY2xhenosIGlkLCByZWNvcmQsIC4uLmN0eEFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGEgc2luZ2xlIHJlY29yZFxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gdXBkYXRlIGEgcmVjb3JkIGluIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSB1cGRhdGVkIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdXBkYXRlZCByZWNvcmRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIGFzeW5jIHVwZGF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgdHJhbnNpZW50OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4sXG4gICAgICB0aGlzLnVwZGF0ZVxuICAgICk7XG4gICAgbG9nLmluZm8oYENMSUVOVCBVUERBVEUgY2xhc3MgOiAke3R5cGVvZiBjbGF6en1gKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy52ZXJib3NlKGB1cGRhdGluZyBlbnRyeSB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrOiAke2lkfWApO1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudCA9IHRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyh0cmFuc2llbnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBoYXNUcmFuc2llbnQgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBjb25zdCB0cmFuc2llbnRQYXlsb2FkID0gaGFzVHJhbnNpZW50ID8geyBbdGFibGVOYW1lXTogdHJhbnNpZW50IH0gOiB7fTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICBbdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShtb2RlbCwgY2xhenoubmFtZSB8fCBjbGF6eildLCAvLyBUT0RPIHNob3VsZCBiZSByZWNldmluZyBjbGFzcyBidXQgaXMgcmVjZWl2aW5nIHN0cmluZ1xuICAgICAgdHJhbnNpZW50UGF5bG9hZCBhcyBhbnksXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIGNvbnN0IGRlc2VyaWFsaXplZCA9IHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZSh0aGlzLmRlY29kZShyZXN1bHQpKTtcbiAgICBpZiAodGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShjbGF6eiwgY3R4LCBuZWVkc0Z1bGxQYXlsb2FkLCBpZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWQoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBleHRyYWN0SWRzKFxuICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgIE1vZGVsLm1lcmdlKFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwsIHRyYW5zaWVudCB8fCB7fSksXG4gICAgICAgICAgICBkZXNlcmlhbGl6ZWQsXG4gICAgICAgICAgICBjbGF6elxuICAgICAgICAgICksXG4gICAgICAgICAgaWRcbiAgICAgICAgKSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZGVzZXJpYWxpemVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgc2luZ2xlIHJlY29yZFxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gZGVsZXRlIGEgcmVjb3JkIGZyb20gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllciB0byBkZWxldGVcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGRlbGV0ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBvdmVycmlkZSBhc3luYyBkZWxldGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmRlbGV0ZSk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIE1vZGVsLmlzVHJhbnNpZW50KGNsYXp6KSB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICBjb25zdCBzaG91bGRIeWRyYXRlID0gdGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShcbiAgICAgIGNsYXp6LFxuICAgICAgY3R4LFxuICAgICAgbmVlZHNGdWxsUGF5bG9hZCxcbiAgICAgIGlkXG4gICAgKTtcbiAgICBpZiAoc2hvdWxkSHlkcmF0ZSkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZWFkKGNsYXp6LCBpZCwgY3R4KTtcbiAgICB9XG5cbiAgICBsb2cudmVyYm9zZShgZGVsZXRpbmcgZW50cnkgZnJvbSAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrOiAke2lkfWApO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIFtpZC50b1N0cmluZygpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgcmV0dXJuIHNob3VsZEh5ZHJhdGVcbiAgICAgID8gcmVzdWx0XG4gICAgICA6IHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZSh0aGlzLmRlY29kZShyZXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgcXVlcnkgYWdhaW5zdCB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAc3VtbWFyeSBFdmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiB0byBwZXJmb3JtIGEgcXVlcnkgdXNpbmcgTWFuZ28gUXVlcnkgc3ludGF4XG4gICAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJldHVybiB0eXBlXG4gICAqIEBwYXJhbSB7TWFuZ29RdWVyeX0gcmF3SW5wdXQgLSBUaGUgTWFuZ28gUXVlcnkgdG8gZXhlY3V0ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHByb2Nlc3MgLSBXaGV0aGVyIHRvIHByb2Nlc3MgdGhlIHJlc3VsdFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFY+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcXVlcnkgcmVzdWx0XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICAgKiAgIHBhcnRpY2lwYW50IENoYWluY29kZVxuICAgKlxuICAgKiAgIENsaWVudC0+PkZhYnJpY0FkYXB0ZXI6IHJhdyhyYXdJbnB1dCwgcHJvY2VzcylcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogSlNPTi5zdHJpbmdpZnkocmF3SW5wdXQpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IGV2YWx1YXRlVHJhbnNhY3Rpb24oXCJxdWVyeVwiLCBbaW5wdXRdKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5Db250cmFjdDogZXZhbHVhdGUoXCJxdWVyeVwiLCBwcm9wb3NhbE9wdGlvbnMpXG4gICAqICAgQ29udHJhY3QtPj5DaGFpbmNvZGU6IGludm9rZVxuICAgKiAgIENoYWluY29kZS0tPj5Db250cmFjdDogcmVzcG9uc2VcbiAgICogICBDb250cmFjdC0tPj5GYWJyaWNBZGFwdGVyOiByZXN1bHRcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogSlNPTi5wYXJzZShkZWNvZGUocmVzdWx0KSlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogUHJvY2VzcyByZXN1bHQgYmFzZWQgb24gdHlwZVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItLT4+Q2xpZW50OiBwcm9jZXNzZWQgcmVzdWx0XG4gICAqL1xuICBAZGVidWcoKVxuICBhc3luYyByYXc8ViwgRCBleHRlbmRzIGJvb2xlYW4+KFxuICAgIHJhd0lucHV0OiBNYW5nb1F1ZXJ5LFxuICAgIGRvY3NPbmx5OiBEID0gdHJ1ZSBhcyBELFxuICAgIGNsYXp6OiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8Vj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmF3KTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBjbGF6ei5uYW1lO1xuICAgIGxvZy5pbmZvKGBQZXJmb3JtaW5nIHJhdyBzdGF0ZW1lbnQgb24gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUoY2xhenopfWApO1xuICAgIGxldCB0cmFuc2FjdGlvblJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICB0cmFuc2FjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgY3R4LFxuICAgICAgICBcInJhd1wiLFxuICAgICAgICBbSlNPTi5zdHJpbmdpZnkocmF3SW5wdXQpLCBkb2NzT25seV0sXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB0YWJsZU5hbWVcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0OiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGUodHJhbnNhY3Rpb25SZXN1bHQpKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoYEZhaWxlZCB0byBwcm9jZXNzIHJlc3VsdDogJHtlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlUmVjb3JkID0gKHJlY29yZDogUmVjb3JkPGFueSwgYW55PikgPT4ge1xuICAgICAgaWYgKE1vZGVsLmlzTW9kZWwocmVjb3JkKSkgcmV0dXJuIE1vZGVsLmJ1aWxkKHJlY29yZCk7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH07XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHJldHVybiByZXN1bHQgYXMgVjtcbiAgICAgIGNvbnN0IGVsID0gcmVzdWx0WzBdO1xuICAgICAgaWYgKE1vZGVsLmlzTW9kZWwoZWwpKVxuICAgICAgICAvLyBpZiB0aGUgZmlyc3Qgb25lIGlzIGEgbW9kZWwsIGFsbCBhcmUgbW9kZWxzXG4gICAgICAgIHJldHVybiByZXN1bHQubWFwKChlbCkgPT4gTW9kZWwuYnVpbGQoZWwpKSBhcyBWO1xuICAgICAgcmV0dXJuIHJlc3VsdCBhcyBWO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJzZVJlY29yZChyZXN1bHQgYXMgYW55KSBhcyBWO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIENvdWNoREIgdmlldyBxdWVyeSBhZ2FpbnN0IHRoZSBGYWJyaWMgY2hhaW5jb2RlXG4gICAqIEBzdW1tYXJ5IEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIHRvIHF1ZXJ5IGEgZGVzaWduIGRvY3VtZW50IHZpZXdcbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgdmlldyByZXNwb25zZSB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZG9jIC0gRGVzaWduIGRvY3VtZW50IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZpZXdOYW1lIC0gVmlldyBuYW1lXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb3B0aW9ucyAtIFZpZXcgcXVlcnkgb3B0aW9uc1xuICAgKiBAcGFyYW0gey4uLkNvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+Pn0gYXJncyAtIE9wdGlvbmFsIGNvbnRleHR1YWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Vmlld1Jlc3BvbnNlPFI+Pn0gVGhlIHZpZXcgcmVzcG9uc2VcbiAgICovXG4gIEBkZWJ1ZygpXG4gIGFzeW5jIHZpZXc8Uj4oXG4gICAgZGRvYzogc3RyaW5nLFxuICAgIHZpZXdOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxWaWV3UmVzcG9uc2U8Uj4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnZpZXcpO1xuICAgIGxvZy5pbmZvKGBRdWVyeWluZyB2aWV3ICR7ZGRvY30vJHt2aWV3TmFtZX1gKTtcbiAgICBsZXQgdHJhbnNhY3Rpb25SZXN1bHQ6IGFueTtcbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgIGN0eCxcbiAgICAgICAgXCJ2aWV3XCIsXG4gICAgICAgIFtkZG9jLCB2aWV3TmFtZSwgSlNPTi5zdHJpbmdpZnkob3B0aW9ucyldLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDogVmlld1Jlc3BvbnNlPFI+O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHRyYW5zYWN0aW9uUmVzdWx0KSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyB2aWV3IHJlc3VsdDogJHtlfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIG9yIGNyZWF0ZXMgYSBnUlBDIGNsaWVudCBmb3IgdGhlIEZhYnJpYyBwZWVyXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBjYWNoZWQgY2xpZW50IG9yIGNyZWF0ZXMgYSBuZXcgb25lIGlmIG5vbmUgZXhpc3RzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q2xpZW50Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGdSUEMgY2xpZW50XG4gICAqL1xuICBvdmVycmlkZSBnZXRDbGllbnQoKTogQ2xpZW50IHtcbiAgICBpZiAoIXRoaXMuX2NsaWVudClcbiAgICAgIHRoaXMuX2NsaWVudCA9IEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0Q2xpZW50KHRoaXMuY29uZmlnKTtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgR2F0ZXdheSBpbnN0YW5jZSBmb3IgdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgR2F0ZXdheSBpbnN0YW5jZSB1c2luZyB0aGUgY3VycmVudCBjbGllbnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxHYXRld2F5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBHYXRld2F5KGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4pOiBQcm9taXNlPEdhdGV3YXk+IHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5nZXRHYXRld2F5KGN0eCwgdGhpcy5jb25maWcsIHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29udHJhY3ROYW1lKGNsYXNzTmFtZT86IHN0cmluZykge1xuICAgIGlmICghY2xhc3NOYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBgJHtjbGFzc05hbWV9Q29udHJhY3RgO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgQ29udHJhY3QgaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgY2hhaW5jb2RlXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgQ29udHJhY3QgaW5zdGFuY2UgdXNpbmcgdGhlIGN1cnJlbnQgR2F0ZXdheVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPENvbnRyYWt0Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIENvbnRyYWN0IGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgQ29udHJhY3QoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBjb250cmFjdE5hbWU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxDb250cmFrdD4ge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLmdldENvbnRyYWN0KFxuICAgICAgYXdhaXQgdGhpcy5HYXRld2F5KGN0eCksXG4gICAgICB0aGlzLmNvbmZpZyxcbiAgICAgIGNvbnRyYWN0TmFtZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgdHJhbnNhY3Rpb24gb24gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgb3IgZXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gb24gdGhlIEZhYnJpYyBjaGFpbmNvZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwaSAtIFRoZSBjaGFpbmNvZGUgZnVuY3Rpb24gdG8gY2FsbFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN1Ym1pdCAtIFdoZXRoZXIgdG8gc3VibWl0ICh0cnVlKSBvciBldmFsdWF0ZSAoZmFsc2UpIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge2FueVtdfSBbYXJnc10gLSBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY2hhaW5jb2RlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW3RyYW5zaWVudERhdGFdIC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtlbmRvcnNpbmdPcmdhbml6YXRpb25zXSAtIE9yZ2FuaXphdGlvbnMgdGhhdCBtdXN0IGVuZG9yc2UgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8VWludDhBcnJheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB0cmFuc2FjdGlvbiByZXN1bHRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAgICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICAgKiAgIHBhcnRpY2lwYW50IENoYWluY29kZVxuICAgKlxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KClcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IGdldENvbnRyYWN0KClcbiAgICogICBhbHQgc3VibWl0IHRyYW5zYWN0aW9uXG4gICAqICAgICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IHN1Ym1pdChhcGksIHByb3Bvc2FsT3B0aW9ucylcbiAgICogICBlbHNlIGV2YWx1YXRlIHRyYW5zYWN0aW9uXG4gICAqICAgICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IGV2YWx1YXRlKGFwaSwgcHJvcG9zYWxPcHRpb25zKVxuICAgKiAgIGVuZFxuICAgKiAgIENvbnRyYWN0LT4+Q2hhaW5jb2RlOiBpbnZva2VcbiAgICogICBDaGFpbmNvZGUtLT4+Q29udHJhY3Q6IHJlc3BvbnNlXG4gICAqICAgQ29udHJhY3QtLT4+RmFicmljQWRhcHRlcjogcmVzdWx0XG4gICAqICAgRmFicmljQWRhcHRlci0+PkdhdGV3YXk6IGNsb3NlKClcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyB0cmFuc2FjdGlvbihcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGFwaTogc3RyaW5nLFxuICAgIHN1Ym1pdCA9IHRydWUsXG4gICAgYXJncz86IGFueVtdLFxuICAgIHRyYW5zaWVudERhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSxcbiAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zPzogc3RyaW5nW10sXG4gICAgY2xhc3NOYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnRyYW5zYWN0aW9uKTtcbiAgICBjb25zdCBnYXRld2F5ID0gYXdhaXQgdGhpcy5HYXRld2F5KGN0eCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRyYWN0ID0gYXdhaXQgdGhpcy5Db250cmFjdChcbiAgICAgICAgY3R4LFxuICAgICAgICB0aGlzLmdldENvbnRyYWN0TmFtZShjbGFzc05hbWUpXG4gICAgICApO1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGAke3N1Ym1pdCA/IFwiU3VibWl0XCIgOiBcIkV2YWx1YXRlXCJ9dGluZyB0cmFuc2FjdGlvbiAke3RoaXMuZ2V0Q29udHJhY3ROYW1lKGNsYXNzTmFtZSkgfHwgdGhpcy5jb25maWcuY29udHJhY3ROYW1lfS4ke2FwaX1gXG4gICAgICApO1xuICAgICAgbG9nLmRlYnVnKGBhcmdzOiAke2FyZ3M/Lm1hcCgoYSkgPT4gYS50b1N0cmluZygpKS5qb2luKFwiXFxuXCIpIHx8IFwibm9uZVwifWApO1xuICAgICAgY29uc3QgbWV0aG9kID0gc3VibWl0ID8gY29udHJhY3Quc3VibWl0IDogY29udHJhY3QuZXZhbHVhdGU7XG5cbiAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnMgPSBlbmRvcnNpbmdPcmdhbml6YXRpb25zPy5sZW5ndGhcbiAgICAgICAgPyBlbmRvcnNpbmdPcmdhbml6YXRpb25zXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcHJvcG9zYWxPcHRpb25zOiBQcm9wb3NhbE9wdGlvbnMgPSB7XG4gICAgICAgIGFyZ3VtZW50czogYXJncyB8fCBbXSxcbiAgICAgICAgdHJhbnNpZW50RGF0YTogT2JqZWN0LmVudHJpZXModHJhbnNpZW50RGF0YSkucmVkdWNlKFxuICAgICAgICAgIChhY2MsIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICAgIGFjY1trZXldID0gSlNPTi5zdHJpbmdpZnkodmFsKTtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7fSBhcyB0eXBlb2YgdHJhbnNpZW50RGF0YVxuICAgICAgICApLFxuICAgICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zOiBjdHguZ2V0T3JVbmRlZmluZWQoXCJhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3NcIilcbiAgICAgICAgICA/IGVuZG9yc2luZ09yZ2FuaXphdGlvbnMgfHwgdW5kZWZpbmVkXG4gICAgICAgICAgOiB1bmRlZmluZWQsIC8vIG1zcElkIGxpc3RcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhd2FpdCBtZXRob2QuY2FsbChjb250cmFjdCwgYXBpLCBwcm9wb3NhbE9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgQ2xvc2luZyAke3RoaXMuY29uZmlnLm1zcElkfSBnYXRld2F5IGNvbm5lY3Rpb25gKTtcbiAgICAgIGdhdGV3YXkuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFVzZUxlZ2FjeUdhdGV3YXkoY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWN0eC5nZXRPclVuZGVmaW5lZChcImxlZ2FjeVwiKSAmJiAhIXRoaXMuY29uZmlnLmFsbG93R2F0ZXdheU92ZXJyaWRlO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlTGVnYWN5QXJncyhhcmdzPzogYW55W10pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIChhcmdzIHx8IFtdKS5tYXAoKGFyZykgPT5cbiAgICAgIHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIgPyBhcmcgOiBKU09OLnN0cmluZ2lmeShhcmcpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRMZWdhY3lUcmFuc2llbnQoXG4gICAgdHJhbnNpZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgKTogUmVjb3JkPHN0cmluZywgQnVmZmVyPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0cmFuc2llbnREYXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh0cmFuc2llbnREYXRhKTtcbiAgICBpZiAoIWVudHJpZXMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1hcDogUmVjb3JkPHN0cmluZywgQnVmZmVyPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgIG1hcFtrZXldID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUxlZ2FjeU1zcENvdW50KCk6IG51bWJlciB7XG4gICAgY29uc3QgY29uZmlndXJlZCA9IHRoaXMuY29uZmlnLmxlZ2FjeU1zcENvdW50ID8/IDE7XG4gICAgY29uc3QgcGFyc2VkID0gTnVtYmVyKGNvbmZpZ3VyZWQpO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgfHwgcGFyc2VkIDwgMSkgcmV0dXJuIDE7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IocGFyc2VkKTtcbiAgfVxuXG4gIHByaXZhdGUgcGlja0xlZ2FjeUNhbmRpZGF0ZXMoXG4gICAgY2FuZGlkYXRlczogTXNwRGV0YWlsc1tdLFxuICAgIGxpbWl0OiBudW1iZXJcbiAgKTogTXNwRGV0YWlsc1tdIHtcbiAgICBpZiAoIWNhbmRpZGF0ZXMubGVuZ3RoIHx8IGxpbWl0IDw9IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBbLi4uY2FuZGlkYXRlc107XG4gICAgY29uc3QgdGFyZ2V0ID0gTWF0aC5taW4obGltaXQsIGF2YWlsYWJsZS5sZW5ndGgpO1xuICAgIGNvbnN0IHBpY2tlZDogTXNwRGV0YWlsc1tdID0gW107XG4gICAgd2hpbGUgKHBpY2tlZC5sZW5ndGggPCB0YXJnZXQgJiYgYXZhaWxhYmxlLmxlbmd0aCkge1xuICAgICAgY29uc3QgaWR4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXZhaWxhYmxlLmxlbmd0aCk7XG4gICAgICBjb25zdCBbc2VsZWN0aW9uXSA9IGF2YWlsYWJsZS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgcGlja2VkLnB1c2goc2VsZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBpY2tlZDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRMZWdhY3lQZWVyQ29uZmlncyhcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IExlZ2FjeVBlZXJUYXJnZXRbXSB7XG4gICAgY29uc3QgcGVlcnM6IExlZ2FjeVBlZXJUYXJnZXRbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgbXNwSWQ6IHRoaXMuY29uZmlnLm1zcElkLFxuICAgICAgICBwZWVyRW5kcG9pbnQ6IHRoaXMuY29uZmlnLnBlZXJFbmRwb2ludCxcbiAgICAgICAgcGVlckhvc3RBbGlhczogdGhpcy5jb25maWcucGVlckhvc3RBbGlhcyxcbiAgICAgICAgdGxzQ2VydDogdGhpcy5jb25maWcudGxzQ2VydCxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGxldCBlbmRvcnNpbmdPcmdzID0gdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCkgfHwgW107XG4gICAgZW5kb3JzaW5nT3JncyA9IEFycmF5LmlzQXJyYXkoZW5kb3JzaW5nT3JncylcbiAgICAgID8gZW5kb3JzaW5nT3Jnc1xuICAgICAgOiBbZW5kb3JzaW5nT3Jnc107XG4gICAgY29uc3QgZW5kb3JzZXJzID1cbiAgICAgIGVuZG9yc2luZ09yZ3MuZmlsdGVyKChvcmcpOiBvcmcgaXMgc3RyaW5nID0+IEJvb2xlYW4ob3JnKSkgfHwgW107XG4gICAgY29uc3QgZXh0cmFzID0gZW5kb3JzZXJzLmZpbHRlcigob3JnKSA9PiBvcmcgIT09IHRoaXMuY29uZmlnLm1zcElkKTtcbiAgICBpZiAoIWV4dHJhcy5sZW5ndGgpIHJldHVybiBwZWVycztcblxuICAgIGNvbnN0IG1hcCA9IHRoaXMuY29uZmlnLm1zcE1hcDtcbiAgICBjb25zdCBsZWdhY3lDb3VudCA9IHRoaXMucmVzb2x2ZUxlZ2FjeU1zcENvdW50KCk7XG4gICAgZm9yIChjb25zdCBtc3Agb2YgZXh0cmFzKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVzID0gbWFwPy5bbXNwXTtcbiAgICAgIGlmICghY2FuZGlkYXRlcz8ubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgIGBObyBwZWVyIG1hcHBpbmcgYXZhaWxhYmxlIGZvciBNU1AgJHttc3B9LiBQcm92aWRlIGl0IHZpYSBjb25maWcubXNwTWFwYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMucGlja0xlZ2FjeUNhbmRpZGF0ZXMoY2FuZGlkYXRlcywgbGVnYWN5Q291bnQpO1xuICAgICAgaWYgKCFzZWxlY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICBgTm8gdmFsaWQgcGVlciBtYXBwaW5nIGF2YWlsYWJsZSBmb3IgTVNQICR7bXNwfS4gUHJvdmlkZSBpdCB2aWEgY29uZmlnLm1zcE1hcGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgY2hvaWNlIG9mIHNlbGVjdGlvbnMpIHtcbiAgICAgICAgaWYgKCFjaG9pY2UuZW5kcG9pbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICAgIGBJbnZhbGlkIHBlZXIgbWFwcGluZyBmb3IgTVNQICR7bXNwfTogbWlzc2luZyBlbmRwb2ludGBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHBlZXJzLnB1c2goe1xuICAgICAgICAgIG1zcElkOiBtc3AsXG4gICAgICAgICAgcGVlckVuZHBvaW50OiBjaG9pY2UuZW5kcG9pbnQsXG4gICAgICAgICAgcGVlckhvc3RBbGlhczogY2hvaWNlLmFsaWFzLFxuICAgICAgICAgIHRsc0NlcnQ6IGNob2ljZS50bHNDZXJ0IHx8IHRoaXMuY29uZmlnLnRsc0NlcnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwZWVycztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3VibWl0TGVnYWN5V2l0aEV4cGxpY2l0RW5kb3JzZXJzKFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgZmNuOiBzdHJpbmcsXG4gICAgYXJnczogc3RyaW5nW10sXG4gICAgdHJhbnNpZW50TWFwOiBSZWNvcmQ8c3RyaW5nLCBCdWZmZXI+IHwgdW5kZWZpbmVkLFxuICAgIHBlZXJDb25maWdzOiBMZWdhY3lQZWVyVGFyZ2V0W10sXG4gICAgY2xhc3NOYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2Vycyk7XG4gICAgY29uc3QgcGVlcnMgPSB0aGlzLm5vcm1hbGl6ZUxlZ2FjeVBlZXJzKHBlZXJDb25maWdzKTtcbiAgICBjb25zdCBpZGVudGl0eU1hdGVyaWFsID0gYXdhaXQgdGhpcy5yZXNvbHZlTGVnYWN5SWRlbnRpdHlNYXRlcmlhbCgpO1xuICAgIGNvbnN0IHdhbGxldCA9IGF3YWl0IFdhbGxldHMubmV3SW5NZW1vcnlXYWxsZXQoKTtcbiAgICBjb25zdCBpZGVudGl0eUxhYmVsID0gYCR7dGhpcy5jb25maWcubXNwSWR9LWxlZ2FjeWA7XG4gICAgYXdhaXQgd2FsbGV0LnB1dChpZGVudGl0eUxhYmVsLCB7XG4gICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICBjZXJ0aWZpY2F0ZTogaWRlbnRpdHlNYXRlcmlhbC5jZXJ0aWZpY2F0ZSxcbiAgICAgICAgcHJpdmF0ZUtleTogaWRlbnRpdHlNYXRlcmlhbC5wcml2YXRlS2V5LFxuICAgICAgfSxcbiAgICAgIG1zcElkOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgIHR5cGU6IFwiWC41MDlcIixcbiAgICB9IGFzIElkZW50aXR5KTtcblxuICAgIGNvbnN0IGNvbm5lY3Rpb25Qcm9maWxlID0gYXdhaXQgdGhpcy5idWlsZExlZ2FjeUNvbm5lY3Rpb25Qcm9maWxlKHBlZXJzKTtcbiAgICBjb25zdCBnYXRld2F5ID0gbmV3IExlZ2FjeUdhdGV3YXkoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBnYXRld2F5LmNvbm5lY3QoY29ubmVjdGlvblByb2ZpbGUsIHtcbiAgICAgICAgaWRlbnRpdHk6IGlkZW50aXR5TGFiZWwsXG4gICAgICAgIHdhbGxldCxcbiAgICAgICAgZGlzY292ZXJ5OiB7XG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBhc0xvY2FsaG9zdDogdGhpcy5zaG91bGRUcmVhdFBlZXJzQXNMb2NhbGhvc3QocGVlcnMpLFxuICAgICAgICB9LFxuICAgICAgICB0bHNJbmZvOiB7XG4gICAgICAgICAgY2VydGlmaWNhdGU6IGlkZW50aXR5TWF0ZXJpYWwuY2VydGlmaWNhdGUsXG4gICAgICAgICAga2V5OiBpZGVudGl0eU1hdGVyaWFsLnByaXZhdGVLZXksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbmV0d29yayA9IGF3YWl0IGdhdGV3YXkuZ2V0TmV0d29yayh0aGlzLmNvbmZpZy5jaGFubmVsKTtcbiAgICAgIGNvbnN0IGNvbnRyYWN0ID0gbmV0d29yay5nZXRDb250cmFjdChcbiAgICAgICAgdGhpcy5jb25maWcuY2hhaW5jb2RlTmFtZSxcbiAgICAgICAgdGhpcy5nZXRDb250cmFjdE5hbWUoY2xhc3NOYW1lKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gY29udHJhY3QuY3JlYXRlVHJhbnNhY3Rpb24oZmNuKTtcblxuICAgICAgaWYgKHRyYW5zaWVudE1hcCkge1xuICAgICAgICB0cmFuc2FjdGlvbi5zZXRUcmFuc2llbnQodHJhbnNpZW50TWFwKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZW5kb3JzZXJzID0gcGVlcnNcbiAgICAgICAgLm1hcCgocGVlcikgPT4gbmV0d29yay5nZXRDaGFubmVsKCkuZ2V0RW5kb3JzZXIocGVlci5uYW1lKSlcbiAgICAgICAgLmZpbHRlcigoZW5kb3JzZXIpOiBlbmRvcnNlciBpcyBFbmRvcnNlciA9PiBCb29sZWFuKGVuZG9yc2VyKSk7XG4gICAgICBpZiAoZW5kb3JzZXJzLmxlbmd0aCkge1xuICAgICAgICB0cmFuc2FjdGlvbi5zZXRFbmRvcnNpbmdQZWVycyhlbmRvcnNlcnMpO1xuICAgICAgfVxuXG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYExlZ2FjeSBzdWJtaXR0aW5nICR7dGhpcy5nZXRDb250cmFjdE5hbWUoY2xhc3NOYW1lKSB8fCB0aGlzLmNvbmZpZy5jb250cmFjdE5hbWV9LiR7ZmNufSB2aWEgcGVlcnMgJHtwZWVycy5tYXAoKHApID0+IHAucGVlckVuZHBvaW50KS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNhY3Rpb24uc3VibWl0KC4uLmFyZ3MpO1xuICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShyZXN1bHQpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBnYXRld2F5LmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUxlZ2FjeVBlZXJzKFxuICAgIHBlZXJzOiBMZWdhY3lQZWVyVGFyZ2V0W11cbiAgKTogTGVnYWN5UGVlcldpdGhOYW1lW10ge1xuICAgIGNvbnN0IGRlZHVwZWQgPSBuZXcgTWFwPHN0cmluZywgTGVnYWN5UGVlcldpdGhOYW1lPigpO1xuICAgIGNvbnN0IGFkZFBlZXIgPSAocGVlcjogTGVnYWN5UGVlclRhcmdldCkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gYCR7cGVlci5wZWVyRW5kcG9pbnR9fCR7cGVlci5wZWVySG9zdEFsaWFzIHx8IFwiXCJ9YDtcbiAgICAgIGlmIChkZWR1cGVkLmhhcyhrZXkpKSByZXR1cm47XG4gICAgICBjb25zdCBuYW1lID0gYHBlZXItJHtwZWVyLm1zcElkfS0ke2RlZHVwZWQuc2l6ZX1gO1xuICAgICAgZGVkdXBlZC5zZXQoa2V5LCB7XG4gICAgICAgIC4uLnBlZXIsXG4gICAgICAgIG5hbWUsXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcGVlcnMuZm9yRWFjaChhZGRQZWVyKTtcbiAgICBhZGRQZWVyKHtcbiAgICAgIG1zcElkOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgIHBlZXJFbmRwb2ludDogdGhpcy5jb25maWcucGVlckVuZHBvaW50LFxuICAgICAgcGVlckhvc3RBbGlhczogdGhpcy5jb25maWcucGVlckhvc3RBbGlhcyxcbiAgICB9KTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKGRlZHVwZWQudmFsdWVzKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlTGVnYWN5SWRlbnRpdHlNYXRlcmlhbCgpOiBQcm9taXNlPHtcbiAgICBjZXJ0aWZpY2F0ZTogc3RyaW5nO1xuICAgIHByaXZhdGVLZXk6IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgdGhpcy5yZWFkUGVtSW5wdXQoXG4gICAgICB0aGlzLmNvbmZpZy5jZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aFxuICAgICk7XG4gICAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IHRoaXMucmVhZFBlbUlucHV0KFxuICAgICAgdGhpcy5jb25maWcua2V5Q2VydE9yRGlyZWN0b3J5UGF0aFxuICAgICk7XG4gICAgcmV0dXJuIHsgY2VydGlmaWNhdGUsIHByaXZhdGVLZXkgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRMZWdhY3lDb25uZWN0aW9uUHJvZmlsZShwZWVyczogTGVnYWN5UGVlcldpdGhOYW1lW10pIHtcbiAgICBjb25zdCBwZWVyRW50cmllczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGNvbnN0IGNoYW5uZWxQZWVyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGNvbnN0IG9yZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHBlZXIgb2YgcGVlcnMpIHtcbiAgICAgIGNvbnN0IHRsc1BlbSA9IGF3YWl0IHRoaXMucmVhZFBlbUlucHV0KFxuICAgICAgICBwZWVyLnRsc0NlcnQgfHwgdGhpcy5jb25maWcudGxzQ2VydFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGhvc3RuYW1lID1cbiAgICAgICAgcGVlci5wZWVySG9zdEFsaWFzIHx8IHRoaXMuZXh0cmFjdEhvc3QocGVlci5wZWVyRW5kcG9pbnQpO1xuICAgICAgcGVlckVudHJpZXNbcGVlci5uYW1lXSA9IHtcbiAgICAgICAgdXJsOiB0aGlzLmVuc3VyZUdycGNVcmwocGVlci5wZWVyRW5kcG9pbnQpLFxuICAgICAgICB0bHNDQUNlcnRzOiB7IHBlbTogdGxzUGVtIH0sXG4gICAgICAgIGdycGNPcHRpb25zOiB7XG4gICAgICAgICAgXCJzc2wtdGFyZ2V0LW5hbWUtb3ZlcnJpZGVcIjogaG9zdG5hbWUsXG4gICAgICAgICAgaG9zdG5hbWVPdmVycmlkZTogaG9zdG5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY2hhbm5lbFBlZXJzW3BlZXIubmFtZV0gPSB7XG4gICAgICAgIGVuZG9yc2luZ1BlZXI6IHRydWUsXG4gICAgICAgIGNoYWluY29kZVF1ZXJ5OiB0cnVlLFxuICAgICAgICBsZWRnZXJRdWVyeTogdHJ1ZSxcbiAgICAgICAgZXZlbnRTb3VyY2U6IHRydWUsXG4gICAgICB9O1xuICAgICAgb3Jnc1twZWVyLm1zcElkXSA9IG9yZ3NbcGVlci5tc3BJZF0gfHwge1xuICAgICAgICBtc3BpZDogcGVlci5tc3BJZCxcbiAgICAgICAgcGVlcnM6IFtdLFxuICAgICAgfTtcbiAgICAgIG9yZ3NbcGVlci5tc3BJZF0ucGVlcnMucHVzaChwZWVyLm5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBcImxlZ2FjeS1tYW51YWxcIixcbiAgICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAgICAgIGNsaWVudDoge1xuICAgICAgICBvcmdhbml6YXRpb246IHRoaXMuY29uZmlnLm1zcElkLFxuICAgICAgfSxcbiAgICAgIG9yZ2FuaXphdGlvbnM6IG9yZ3MsXG4gICAgICBwZWVyczogcGVlckVudHJpZXMsXG4gICAgICBvcmRlcmVyczoge30sXG4gICAgICBjaGFubmVsczoge1xuICAgICAgICBbdGhpcy5jb25maWcuY2hhbm5lbF06IHtcbiAgICAgICAgICBwZWVyczogY2hhbm5lbFBlZXJzLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRUcmVhdFBlZXJzQXNMb2NhbGhvc3QocGVlcnM6IExlZ2FjeVBlZXJXaXRoTmFtZVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBlZXJzLmV2ZXJ5KChwZWVyKSA9PiB0aGlzLmlzTG9jYWxFbmRwb2ludChwZWVyLnBlZXJFbmRwb2ludCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0xvY2FsRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLmV4dHJhY3RIb3N0KGVuZHBvaW50KS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBob3N0ID09PSBcImxvY2FsaG9zdFwiIHx8IGhvc3QgPT09IFwiMTI3LjAuMC4xXCI7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RIb3N0KGVuZHBvaW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNhbml0aXplZCA9IGVuZHBvaW50LnJlcGxhY2UoL15ncnBjcz86XFwvXFwvLywgXCJcIik7XG4gICAgcmV0dXJuIHNhbml0aXplZC5zcGxpdChcIjpcIilbMF07XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUdycGNVcmwoZW5kcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKC9eZ3JwY3M/OlxcL1xcLy9pLnRlc3QoZW5kcG9pbnQpKSByZXR1cm4gZW5kcG9pbnQ7XG4gICAgcmV0dXJuIGBncnBjczovLyR7ZW5kcG9pbnR9YDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZFBlbUlucHV0KHNvdXJjZT86IHN0cmluZyB8IEJ1ZmZlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFzb3VyY2UpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTWlzc2luZyBjZXJ0aWZpY2F0ZSBvciBrZXkgbWF0ZXJpYWxcIik7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzb3VyY2UpKSByZXR1cm4gc291cmNlLnRvU3RyaW5nKFwidXRmOFwiKTtcbiAgICBjb25zdCB0cmltbWVkID0gc291cmNlLnRyaW0oKTtcbiAgICBpZiAoLy0tLS0tQkVHSU4gW0EtWiBdKy0tLS0tLy50ZXN0KHRyaW1tZWQpKSByZXR1cm4gdHJpbW1lZDtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQoc291cmNlKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIGlmIChzdGF0cz8uaXNEaXJlY3RvcnkoKSkge1xuICAgICAgcmV0dXJuIGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KHNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiAoYXdhaXQgcmVhZEZzRmlsZShzb3VyY2UpKS50b1N0cmluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYW4gZXJyb3IgaW50byBhIEJhc2VFcnJvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhbnkgZXJyb3IgaW50byBhIHN0YW5kYXJkaXplZCBCYXNlRXJyb3JcbiAgICogQHBhcmFtIHtFcnJvciB8IHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIHBhcnNlZCBlcnJvclxuICAgKi9cbiAgb3ZlcnJpZGUgcGFyc2VFcnJvcjxFIGV4dGVuZHMgQmFzZUVycm9yPihlcnI6IEVycm9yIHwgc3RyaW5nKTogRSB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIucGFyc2VFcnJvcjxFPihlcnIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIGEgdHJhbnNhY3Rpb24gdGhhdCBtb2RpZmllcyB0aGUgbGVkZ2VyIHN0YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcGkgLSBUaGUgY2hhaW5jb2RlIGZ1bmN0aW9uIHRvIGNhbGxcbiAgICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdIC0gQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNoYWluY29kZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFt0cmFuc2llbnREYXRhXSAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbZW5kb3JzaW5nT3JnYW5pemF0aW9uc10gLSBPcmdhbml6YXRpb25zIHRoYXQgbXVzdCBlbmRvcnNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFVpbnQ4QXJyYXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdHJhbnNhY3Rpb24gcmVzdWx0XG4gICAqL1xuICBhc3luYyBzdWJtaXRUcmFuc2FjdGlvbihcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGFwaTogc3RyaW5nLFxuICAgIGFyZ3M/OiBhbnlbXSxcbiAgICB0cmFuc2llbnREYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zPzogQXJyYXk8c3RyaW5nPixcbiAgICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgaWYgKHRoaXMuc2hvdWxkVXNlTGVnYWN5R2F0ZXdheShjdHgpKSB7XG4gICAgICBjb25zdCBsZWdhY3lBcmdzID0gdGhpcy5wcmVwYXJlTGVnYWN5QXJncyhhcmdzKTtcbiAgICAgIGNvbnN0IHRyYW5zaWVudE1hcCA9IHRoaXMuYnVpbGRMZWdhY3lUcmFuc2llbnQodHJhbnNpZW50RGF0YSk7XG4gICAgICBjb25zdCBwZWVyQ29uZmlncyA9IHRoaXMuYnVpbGRMZWdhY3lQZWVyQ29uZmlncyhjdHgpO1xuICAgICAgcmV0dXJuIHRoaXMuc3VibWl0TGVnYWN5V2l0aEV4cGxpY2l0RW5kb3JzZXJzKFxuICAgICAgICBjdHgsXG4gICAgICAgIGFwaSxcbiAgICAgICAgbGVnYWN5QXJncyxcbiAgICAgICAgdHJhbnNpZW50TWFwLFxuICAgICAgICBwZWVyQ29uZmlncyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIGFwaSxcbiAgICAgIHRydWUsXG4gICAgICBhcmdzLFxuICAgICAgdHJhbnNpZW50RGF0YSxcbiAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnMsXG4gICAgICBjbGFzc05hbWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiBvbiB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMgYSB0cmFuc2FjdGlvbiB0aGF0IGRvZXMgbm90IG1vZGlmeSB0aGUgbGVkZ2VyIHN0YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcGkgLSBUaGUgY2hhaW5jb2RlIGZ1bmN0aW9uIHRvIGNhbGxcbiAgICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdIC0gQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNoYWluY29kZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFt0cmFuc2llbnREYXRhXSAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbZW5kb3JzaW5nT3JnYW5pemF0aW9uc10gLSBPcmdhbml6YXRpb25zIHRoYXQgbXVzdCBlbmRvcnNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFVpbnQ4QXJyYXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdHJhbnNhY3Rpb24gcmVzdWx0XG4gICAqL1xuICBhc3luYyBldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgYXBpOiBzdHJpbmcsXG4gICAgYXJncz86IGFueVtdLFxuICAgIHRyYW5zaWVudERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnM/OiBBcnJheTxzdHJpbmc+LFxuICAgIGNsYXNzTmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIGFwaSxcbiAgICAgIGZhbHNlLFxuICAgICAgYXJncyxcbiAgICAgIHRyYW5zaWVudERhdGEsXG4gICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zLFxuICAgICAgY2xhc3NOYW1lXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2h1dHMgZG93biB0aGUgY29ubmVjdGlvbiB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ2xvc2VzIHRoZSBhY3RpdmUgZGlzcGF0Y2ggKHdoaWNoIGluIHR1cm4gY2xvc2VzIGFueSBnYXRld2F5XG4gICAqIGV2ZW50IHN1YnNjcmlwdGlvbikgdmlhIHRoZSBiYXNlIGNsYXNzLCB0aGVuIGNsb3NlcyB0aGUgZ1JQQyBjbGllbnQuXG4gICAqIFdvcmtzIGNvcnJlY3RseSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYHN5bnRoZXRpY0V2ZW50c2AgaXMgZW5hYmxlZC5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHNodXRkb3duKC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBCYXNlIGNsYXNzIGhhbmRsZXMgZGlzcGF0Y2guY2xvc2UoKSBpbnRlcm5hbGx5LlxuICAgIGF3YWl0IHN1cGVyLnNodXRkb3duKC4uLmFyZ3MpO1xuICAgIGlmICh0aGlzLmNsaWVudCkge1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShgQ2xvc2luZyAke3RoaXMuY29uZmlnLm1zcElkfSBnYXRld2F5IGNsaWVudGApO1xuICAgICAgdGhpcy5jbGllbnQuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBDb250cmFjdCBpbnN0YW5jZSBmcm9tIGEgR2F0ZXdheVxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBjaGFpbmNvZGUgY29udHJhY3QgZnJvbSB0aGUgc3BlY2lmaWVkIG5ldHdvcmtcbiAgICogQHBhcmFtIHtHYXRld2F5fSBnYXRld2F5IC0gVGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm4ge0NvbnRyYWt0fSBUaGUgQ29udHJhY3QgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBnZXRDb250cmFjdChcbiAgICBnYXRld2F5OiBHYXRld2F5LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICBjb250cmFjdE5hbWU/OiBzdHJpbmdcbiAgKTogQ29udHJha3Qge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldENvbnRyYWN0KTtcbiAgICBjb25zdCBuZXR3b3JrID0gdGhpcy5nZXROZXR3b3JrKGdhdGV3YXksIGNvbmZpZy5jaGFubmVsKTtcbiAgICBsZXQgY29udHJhY3Q6IENvbnRyYWt0O1xuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBSZXRyaWV2aW5nIGNoYWluY29kZSAke2NvbmZpZy5jaGFpbmNvZGVOYW1lfSBjb250cmFjdCAke2NvbnRyYWN0TmFtZSB8fCBjb25maWcuY29udHJhY3ROYW1lfSBmcm9tIG5ldHdvcmsgJHtjb25maWcuY2hhbm5lbH1gXG4gICAgICApO1xuICAgICAgY29udHJhY3ROYW1lID0gY29udHJhY3ROYW1lID8gY29udHJhY3ROYW1lIDogY29uZmlnLmNvbnRyYWN0TmFtZTtcbiAgICAgIGNvbnRyYWN0ID0gbmV0d29yay5nZXRDb250cmFjdChjb25maWcuY2hhaW5jb2RlTmFtZSwgY29udHJhY3ROYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyYWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgTmV0d29yayBpbnN0YW5jZSBmcm9tIGEgR2F0ZXdheVxuICAgKiBAc3VtbWFyeSBDb25uZWN0cyB0byBhIHNwZWNpZmljIGNoYW5uZWwgb24gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBwYXJhbSB7R2F0ZXdheX0gZ2F0ZXdheSAtIFRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjaGFubmVsIHRvIGNvbm5lY3QgdG9cbiAgICogQHJldHVybiB7TmV0d29ya30gVGhlIE5ldHdvcmsgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBnZXROZXR3b3JrKGdhdGV3YXk6IEdhdGV3YXksIGNoYW5uZWxOYW1lOiBzdHJpbmcpOiBOZXR3b3JrIHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0aGlzLmdldE5ldHdvcmspO1xuICAgIGxldCBuZXR3b3JrOiBOZXR3b3JrO1xuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoYENvbm5lY3RpbmcgdG8gY2hhbm5lbCAke2NoYW5uZWxOYW1lfWApO1xuICAgICAgbmV0d29yayA9IGdhdGV3YXkuZ2V0TmV0d29yayhjaGFubmVsTmFtZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldHdvcms7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBHYXRld2F5IGluc3RhbmNlIGZvciBjb25uZWN0aW5nIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgR2F0ZXdheSB1c2luZyB0aGUgcHJvdmlkZWQgY29uZmlndXJhdGlvbiBhbmQgY2xpZW50XG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0ge0NsaWVudH0gW2NsaWVudF0gLSBPcHRpb25hbCBnUlBDIGNsaWVudCwgd2lsbCBiZSBjcmVhdGVkIGlmIG5vdCBwcm92aWRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEdhdGV3YXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldEdhdGV3YXkoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgY2xpZW50PzogQ2xpZW50XG4gICkge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5nZXRDb25uZWN0aW9uKFxuICAgICAgY2xpZW50IHx8IChhd2FpdCB0aGlzLmdldENsaWVudChjb25maWcpKSxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGN0eFxuICAgICkpIGFzIEdhdGV3YXk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBnUlBDIGNsaWVudCBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgY2xpZW50IHdpdGggVExTIGNyZWRlbnRpYWxzIGZvciBzZWN1cmUgY29tbXVuaWNhdGlvblxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybiB7Q2xpZW50fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZ1JQQyBjbGllbnRcbiAgICovXG4gIHN0YXRpYyBnZXRDbGllbnQoY29uZmlnOiBQZWVyQ29uZmlnKTogQ2xpZW50IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRDbGllbnQpO1xuICAgIGxvZy5kZWJ1ZyhgZ2VuZXJhdGluZyBUTFMgY3JlZGVudGlhbHMgZm9yIG1zcCAke2NvbmZpZy5tc3BJZH1gKTtcbiAgICBsZXQgcGF0aE9yQ2VydDogc3RyaW5nIHwgQnVmZmVyID0gY29uZmlnLnRsc0NlcnQgYXMgc3RyaW5nIHwgQnVmZmVyO1xuXG4gICAgaWYgKHR5cGVvZiBwYXRoT3JDZXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHBhdGhPckNlcnQubWF0Y2goXG4gICAgICAgICAgLy0tLS0tQkVHSU4gKENFUlRJRklDQVRFfEtFWXxQUklWQVRFIEtFWSktLS0tLS4rPy0tLS0tRU5EIFxcMS0tLS0tJC9nbXNcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHBhdGhPckNlcnQgPSBCdWZmZXIuZnJvbShwYXRoT3JDZXJ0LCBcInV0ZjhcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhdGhPckNlcnQgPSBCdWZmZXIuZnJvbShmcy5yZWFkRmlsZVN5bmMocGF0aE9yQ2VydCwgXCJ1dGY4XCIpKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byByZWFkIHRoZSB0bHMgY2VydGlmaWNhdGUgZnJvbSAke3BhdGhPckNlcnR9OiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0bHNDcmVkZW50aWFscyA9IGdycGMuY3JlZGVudGlhbHMuY3JlYXRlU3NsKHBhdGhPckNlcnQpO1xuICAgIGxvZy5kZWJ1ZyhgZ2VuZXJhdGluZyBHYXRld2F5IENsaWVudCBmb3IgdXJsICR7Y29uZmlnLnBlZXJFbmRwb2ludH1gKTtcbiAgICByZXR1cm4gbmV3IENsaWVudChjb25maWcucGVlckVuZHBvaW50LCB0bHNDcmVkZW50aWFscywge1xuICAgICAgXCJncnBjLm1heF9yZWNlaXZlX21lc3NhZ2VfbGVuZ3RoXCI6IChjb25maWcuc2l6ZUxpbWl0IHx8IDE1KSAqIDEwMjQgKiAxMDI0LFxuICAgICAgXCJncnBjLm1heF9zZW5kX21lc3NhZ2VfbGVuZ3RoXCI6IChjb25maWcuc2l6ZUxpbWl0IHx8IDE1KSAqIDEwMjQgKiAxMDI0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFc3RhYmxpc2hlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBHYXRld2F5IGNvbm5lY3Rpb24gd2l0aCBpZGVudGl0eSBhbmQgc2lnbmVyXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgLSBUaGUgZ1JQQyBjbGllbnRcbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8R2F0ZXdheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjb25uZWN0ZWQgR2F0ZXdheVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgSWRlbnRpdHlcbiAgICogICBwYXJ0aWNpcGFudCBTaWduZXJcbiAgICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gICAqXG4gICAqICAgQ2FsbGVyLT4+RmFicmljQWRhcHRlcjogZ2V0Q29ubmVjdGlvbihjbGllbnQsIGNvbmZpZylcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+SWRlbnRpdHk6IGdldElkZW50aXR5KG1zcElkLCBjZXJ0RGlyZWN0b3J5UGF0aClcbiAgICogICBJZGVudGl0eS0tPj5GYWJyaWNBZGFwdGVyOiBpZGVudGl0eVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5TaWduZXI6IGdldFNpZ25lcihrZXlEaXJlY3RvcnlQYXRoKVxuICAgKiAgIFNpZ25lci0tPj5GYWJyaWNBZGFwdGVyOiBzaWduZXJcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogQ3JlYXRlIENvbm5lY3RPcHRpb25zXG4gICAqICAgRmFicmljQWRhcHRlci0+PkdhdGV3YXk6IGNvbm5lY3Qob3B0aW9ucylcbiAgICogICBHYXRld2F5LS0+PkZhYnJpY0FkYXB0ZXI6IGdhdGV3YXlcbiAgICogICBGYWJyaWNBZGFwdGVyLS0+PkNhbGxlcjogZ2F0ZXdheVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldENvbm5lY3Rpb24oXG4gICAgY2xpZW50OiBDbGllbnQsXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKSB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5nZXRDb25uZWN0aW9uKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgUmV0cmlldmluZyBQZWVyIElkZW50aXR5IGZvciAke2NvbmZpZy5tc3BJZH0gdW5kZXIgJHtjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGh9YFxuICAgICk7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBnZXRJZGVudGl0eShcbiAgICAgIGNvbmZpZy5tc3BJZCxcbiAgICAgIGNvbmZpZy5jZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aCBhcyBhbnlcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBwcmVwYXJpbmcgdHJhbnNhY3Rpb24gc2lnbmVyIGZvciAke0NyeXB0b1V0aWxzLmZhYnJpY0lkRnJvbUNlcnRpZmljYXRlKGlkZW50aXR5LmNyZWRlbnRpYWxzLnRvU3RyaW5nKCkpfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gZXh0cmFjdCBGYWJyaWMgSUQgZnJvbSBjZXJ0aWZpY2F0ZWAsIGUgYXMgRXJyb3IpO1xuICAgIH1cblxuICAgIGxldCBzaWduZXI6IFNpZ25lcjtcbiAgICBjb25zdCBjbG9zZSA9ICgpID0+IHt9O1xuICAgIGlmICghY29uZmlnLmhzbSkge1xuICAgICAgc2lnbmVyID0gYXdhaXQgZ2V0U2lnbmVyKGNvbmZpZy5rZXlDZXJ0T3JEaXJlY3RvcnlQYXRoIGFzIGFueSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnN0IGhzbSA9IG5ldyBIU01TaWduZXJGYWN0b3J5Q3VzdG9tKGNvbmZpZy5oc20ubGlicmFyeSk7XG4gICAgICAvLyBjb25zdCBpZGVudGlmaWVyID0gaHNtLmdldFNLSUZyb21DZXJ0aWZpY2F0ZVBhdGgoXG4gICAgICAvLyAgIGNvbmZpZy5jZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aCBhcyBhbnlcbiAgICAgIC8vICk7XG4gICAgICAvLyBjb25zdCBwa2NzMTFTaWduZXIgPSBoc20ubmV3U2lnbmVyKHtcbiAgICAgIC8vICAgbGFiZWw6IGNvbmZpZy5oc20udG9rZW5MYWJlbCBhcyBzdHJpbmcsXG4gICAgICAvLyAgIHBpbjogU3RyaW5nKGNvbmZpZy5oc20ucGluKSBhcyBzdHJpbmcsXG4gICAgICAvLyAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICAvLyAgIC8vIHVzZXJUeXBlOiAxIC8qQ0tVX1VTRVIgKi8sXG4gICAgICAvLyB9KTtcbiAgICAgIC8vIHNpZ25lciA9IHBrY3MxMVNpZ25lci5zaWduZXI7XG4gICAgICAvLyBjbG9zZSA9IHBrY3MxMVNpZ25lci5jbG9zZTtcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFwiSFNNIE5PVCBJTVBMRU1FTlRFRFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgY2xpZW50LFxuICAgICAgaWRlbnRpdHk6IGlkZW50aXR5LFxuICAgICAgc2lnbmVyOiBzaWduZXIsXG4gICAgICAvLyBEZWZhdWx0IHRpbWVvdXRzIGZvciBkaWZmZXJlbnQgZ1JQQyBjYWxsc1xuICAgICAgZXZhbHVhdGVPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJldmFsdWF0ZVRpbWVvdXRcIikgfTsgLy8gZGVmYXVsdHMgdG8gNSBzZWNvbmRzXG4gICAgICB9LFxuICAgICAgZW5kb3JzZU9wdGlvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZGVhZGxpbmU6IERhdGUubm93KCkgKyAxMDAwICogY3R4LmdldChcImVuZG9yc2VUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDE1IHNlY29uZHNcbiAgICAgIH0sXG4gICAgICBzdWJtaXRPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJzdWJtaXRUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDUgc2Vjb25kc1xuICAgICAgfSxcbiAgICAgIGNvbW1pdFN0YXR1c09wdGlvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZGVhZGxpbmU6IERhdGUubm93KCkgKyAxMDAwICogY3R4LmdldChcImNvbW1pdFRpbWVvdXRcIikgfTsgLy8gZGVmYXVsdHMgdG8gMSBtaW51dGVcbiAgICAgIH0sXG4gICAgfSBhcyBDb25uZWN0T3B0aW9ucztcblxuICAgIGxvZy5kZWJ1ZyhgQ29ubmVjdGluZyB0byAke2NvbmZpZy5tc3BJZH1gKTtcbiAgICBjb25zdCBnYXRld2F5ID0gY29ubmVjdChvcHRpb25zKTtcblxuICAgIC8vIFRPRE86IHJlcGxhY2U/XG4gICAgaWYgKGNvbmZpZy5oc20pIHtcbiAgICAgIGdhdGV3YXkuY2xvc2UgPSBuZXcgUHJveHkoZ2F0ZXdheS5jbG9zZSwge1xuICAgICAgICBhcHBseSh0YXJnZXQ6ICgpID0+IHZvaWQsIHRoaXNBcmc6IGFueSwgYXJnQXJyYXk6IGFueVtdKTogYW55IHtcbiAgICAgICAgICBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJnQXJyYXkpO1xuICAgICAgICAgIGNsb3NlKCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2F0ZXdheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBEaXNwYXRjaCBpbnN0YW5jZSBmb3IgdGhlIEZhYnJpYyBjbGllbnQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGEgbmV3IEZhYnJpY0NsaWVudERpc3BhdGNoIGluc3RhbmNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgRmFicmljIG5ldHdvcmsuXG4gICAqIEByZXR1cm5zIHtEaXNwYXRjaH0gQSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2UgY29uZmlndXJlZCBmb3IgdGhlIEZhYnJpYyBjbGllbnQuXG4gICAqIEByZW1hcmtzIFRoZSBEaXNwYXRjaCBpbnN0YW5jZSBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSBsb2dpYyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgRmFicmljIG5ldHdvcmssIHN1Y2ggYXMgc3VibWl0dGluZyB0cmFuc2FjdGlvbnMgb3IgcXVlcnlpbmcgZGF0YS5cbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgZmFicmljRGlzcGF0Y2ggPSBmYWJyaWNDbGllbnRBZGFwdGVyLkRpc3BhdGNoKCk7XG4gICAqIGZhYnJpY0Rpc3BhdGNoLnN1Ym1pdFRyYW5zYWN0aW9uKCdjcmVhdGVQcm9kdWN0JywgeyBuYW1lOiAnUHJvZHVjdCBBJywgcHJpY2U6IDEwMCB9KTtcbiAgICovXG4gIG92ZXJyaWRlIERpc3BhdGNoKCk6IEZhYnJpY0NsaWVudERpc3BhdGNoIHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY0NsaWVudEFkYXB0ZXJbXCJfYmFzZURpc3BhdGNoXCJdKHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuIGVycm9yIGludG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYW55IGVycm9yIGludG8gYSBzdGFuZGFyZGl6ZWQgQmFzZUVycm9yIHVzaW5nIHRoZSBwYXJlbnQgY2xhc3MgaW1wbGVtZW50YXRpb25cbiAgICogQHBhcmFtIHtFcnJvciB8IHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIHBhcnNlZCBlcnJvclxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBwYXJzZUVycm9yPEUgZXh0ZW5kcyBCYXNlRXJyb3I+KFxuICAgIGVycjogRXJyb3IgfCBzdHJpbmcgfCBHYXRld2F5RXJyb3JcbiAgKTogRSB7XG4gICAgLy8gaWYgKFxuICAgIC8vICAgTUlTU0lOR19QUklWQVRFX0RBVEFfUkVHRVgudGVzdChcbiAgICAvLyAgICAgdHlwZW9mIGVyciA9PT0gXCJzdHJpbmdcIiA/IGVyciA6IGVyci5tZXNzYWdlXG4gICAgLy8gICApXG4gICAgLy8gKVxuICAgIC8vICAgcmV0dXJuIG5ldyBVbmF1dGhvcml6ZWRQcml2YXRlRGF0YUFjY2VzcyhlcnIpIGFzIEU7XG5cbiAgICBsZXQgbXNnID0gdHlwZW9mIGVyciA9PT0gXCJzdHJpbmdcIiA/IGVyciA6IGVyci5tZXNzYWdlO1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBHYXRld2F5RXJyb3IgJiYgZXJyLmRldGFpbHMubGVuZ3RoICYmIGVyci5jb2RlID09PSAxMCkge1xuICAgICAgbXNnID0gYCR7ZXJyLmRldGFpbHNbMF0ubWVzc2FnZX1gO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGVyciBpbnN0YW5jZW9mIEVuZG9yc2VFcnJvciAmJlxuICAgICAgZXJyLmRldGFpbHMubGVuZ3RoICYmXG4gICAgICBlcnIuY29kZSA9PT0gMTAgJiZcbiAgICAgIGVyci5kZXRhaWxzWzBdLm1lc3NhZ2U/LmluY2x1ZGVzKFVuc3VwcG9ydGVkRXJyb3IubmFtZSlcbiAgICApIHtcbiAgICAgIG1zZyA9IGAke2Vyci5kZXRhaWxzWzBdLm1lc3NhZ2V9YDtcbiAgICB9XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFwiTVZDQ19SRUFEX0NPTkZMSUNUXCIpKVxuICAgICAgcmV0dXJuIG5ldyBNdmNjUmVhZENvbmZsaWN0RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIkRFQURMSU5FX0VYQ0VFREVEXCIpKVxuICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvblRpbWVvdXRFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFwiRU5ET1JTRU1FTlRfUE9MSUNZX0ZBSUxVUkVcIikpXG4gICAgICByZXR1cm4gbmV3IEVuZG9yc2VtZW50UG9saWN5RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIlBIQU5UT01fUkVBRF9DT05GTElDVFwiKSlcbiAgICAgIHJldHVybiBuZXcgUGhhbnRvbVJlYWRDb25mbGljdEVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiAoZXJyIGFzIGFueSkuY29kZSkge1xuICAgICAgc3dpdGNoICgoZXJyIGFzIGFueSkuY29kZSkge1xuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgcmV0dXJuIG5ldyBFbmRvcnNlbWVudEVycm9yKGVycikgYXMgRTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFZhbGlkYXRpb25FcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgVmFsaWRhdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE5vdEZvdW5kRXJyb3IubmFtZSkpIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhDb25mbGljdEVycm9yLm5hbWUpKSByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQmFkUmVxdWVzdEVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBCYWRSZXF1ZXN0RXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoUXVlcnlFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBRdWVyeUVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFBhZ2luZ0Vycm9yLm5hbWUpKSByZXR1cm4gbmV3IFBhZ2luZ0Vycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFVuc3VwcG9ydGVkRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFVuc3VwcG9ydGVkRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoTWlncmF0aW9uRXJyb3IubmFtZSkpIHJldHVybiBuZXcgTWlncmF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoT2JzZXJ2ZXJFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBPYnNlcnZlckVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEF1dGhvcml6YXRpb25FcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEZvcmJpZGRlbkVycm9yLm5hbWUpKSByZXR1cm4gbmV3IEZvcmJpZGRlbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKENvbm5lY3Rpb25FcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFNlcmlhbGl6YXRpb25FcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKSBhcyBFO1xuICB9XG59XG5cbkZhYnJpY0NsaWVudEFkYXB0ZXIuZGVjb3JhdGlvbigpO1xuQWRhcHRlci5zZXRDdXJyZW50KEZhYnJpY0ZsYXZvdXIpO1xuIiwiaW1wb3J0IHtcbiAgQWRhcHRlcixcbiAgQ29udGV4dHVhbEFyZ3MsXG4gIERpc3BhdGNoLFxuICBFdmVudElkcyxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbiAgQ29udGV4dCxcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBQZXJzaXN0ZW5jZUtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUGVlckNvbmZpZyB9IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7IENsaWVudCB9IGZyb20gXCJAZ3JwYy9ncnBjLWpzXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENoYWluY29kZUV2ZW50LFxuICBDbG9zZWFibGVBc3luY0l0ZXJhYmxlLFxufSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBwYXJzZUV2ZW50TmFtZSB9IGZyb20gXCIuLi9zaGFyZWQvZXZlbnRzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV2ZW50IGRpc3BhdGNoZXIgZm9yIEh5cGVybGVkZ2VyIEZhYnJpYyBjaGFpbmNvZGUgZXZlbnRzXG4gKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBhbmQgcHJvY2Vzc2VzIGV2ZW50cyBlbWl0dGVkIGJ5IEZhYnJpYyBjaGFpbmNvZGUsIGRpc3BhdGNoaW5nIHRoZW0gdG8gcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAqIEB0ZW1wbGF0ZSBQZWVyQ29uZmlnIC0gQ29uZmlndXJhdGlvbiB0eXBlIGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAqIEBwYXJhbSBjbGllbnQgLSBnUlBDIGNsaWVudCBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAqIEBjbGFzcyBGYWJyaWNDbGllbnREaXNwYXRjaFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBGYWJyaWNEaXNwYXRjaCBpbnN0YW5jZVxuICogY29uc3QgY2xpZW50ID0gYXdhaXQgRmFicmljQWRhcHRlci5nZXRDbGllbnQocGVlckNvbmZpZyk7XG4gKiBjb25zdCBkaXNwYXRjaCA9IG5ldyBGYWJyaWNEaXNwYXRjaChjbGllbnQpO1xuICpcbiAqIC8vIENvbmZpZ3VyZSB0aGUgZGlzcGF0Y2ggd2l0aCBwZWVyIGNvbmZpZ3VyYXRpb25cbiAqIGRpc3BhdGNoLmNvbmZpZ3VyZShwZWVyQ29uZmlnKTtcbiAqXG4gKiAvLyBSZWdpc3RlciBhbiBvYnNlcnZlciBmb3IgYSBzcGVjaWZpYyB0YWJsZSBhbmQgZXZlbnRcbiAqIGRpc3BhdGNoLm9ic2VydmUoJ3VzZXJzJywgJ2NyZWF0ZScsIChpZCkgPT4ge1xuICogICBjb25zb2xlLmxvZyhgVXNlciBjcmVhdGVkOiAke2lkfWApO1xuICogfSk7XG4gKlxuICogLy8gU3RhcnQgbGlzdGVuaW5nIGZvciBldmVudHNcbiAqIGF3YWl0IGRpc3BhdGNoLnN0YXJ0KCk7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEZhYnJpY0Rpc3BhdGNoXG4gKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAqICAgcGFydGljaXBhbnQgTmV0d29ya1xuICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAqXG4gKiAgIENsaWVudC0+PkZhYnJpY0Rpc3BhdGNoOiBuZXcgRmFicmljRGlzcGF0Y2goY2xpZW50KVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogY29uZmlndXJlKHBlZXJDb25maWcpXG4gKiAgIENsaWVudC0+PkZhYnJpY0Rpc3BhdGNoOiBvYnNlcnZlKHRhYmxlLCBldmVudCwgY2FsbGJhY2spXG4gKiAgIENsaWVudC0+PkZhYnJpY0Rpc3BhdGNoOiBzdGFydCgpXG4gKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IGluaXRpYWxpemUoKVxuICogICBGYWJyaWNEaXNwYXRjaC0+PkdhdGV3YXk6IGdldEdhdGV3YXkoY29uZmlnLCBjbGllbnQpXG4gKiAgIEdhdGV3YXktPj5OZXR3b3JrOiBnZXROZXR3b3JrKGNoYW5uZWwpXG4gKiAgIE5ldHdvcmstPj5OZXR3b3JrOiBnZXRDaGFpbmNvZGVFdmVudHMoY2hhaW5jb2RlTmFtZSlcbiAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogaGFuZGxlRXZlbnRzKClcbiAqICAgbG9vcCBGb3IgZWFjaCBldmVudFxuICogICAgIENoYWluY29kZS0tPj5GYWJyaWNEaXNwYXRjaDogQ2hhaW5jb2RlRXZlbnRcbiAqICAgICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBwYXJzZUV2ZW50TmFtZShldmVudE5hbWUpXG4gKiAgICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogcGFyc2VQYXlsb2FkKHBheWxvYWQpXG4gKiAgICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQpXG4gKiAgICAgRmFicmljRGlzcGF0Y2gtLT4+Q2xpZW50OiBjYWxsYmFjayhpZClcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnREaXNwYXRjaCBleHRlbmRzIERpc3BhdGNoPEZhYnJpY0NsaWVudEFkYXB0ZXI+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBsaXN0ZW5pbmcgc3RhY2sgZm9yIGNoYWluY29kZSBldmVudHNcbiAgICovXG4gIHByaXZhdGUgbGlzdGVuaW5nU3RhY2s/OiBDbG9zZWFibGVBc3luY0l0ZXJhYmxlPENoYWluY29kZUV2ZW50PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRleHQgZGVjb2RlciBmb3IgY29udmVydGluZyBldmVudCBwYXlsb2FkcyBmcm9tIGJ5dGVzIHRvIHN0cmluZ3NcbiAgICovXG4gIHByaXZhdGUgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IEZhYnJpY0Rpc3BhdGNoIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgZGlzcGF0Y2hlciBmb3IgRmFicmljIGNoYWluY29kZSBldmVudHNcbiAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCAtIGdSUEMgY2xpZW50IGZvciBjb25uZWN0aW5nIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNsaWVudDogQ2xpZW50KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2xvc2VzIHRoZSBldmVudCBsaXN0ZW5pbmcgY29ubmVjdGlvblxuICAgKiBAc3VtbWFyeSBTdG9wcyBsaXN0ZW5pbmcgZm9yIGNoYWluY29kZSBldmVudHMgYW5kIHJlbGVhc2VzIHJlc291cmNlc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNsb3NlKFxuICAgIC4uLmN0eEFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJnczogbG9nZ2VkQXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoY3R4QXJncywgUGVyc2lzdGVuY2VLZXlzLlNIVVRET1dOLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuY2xvc2UpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzdXBlci5jbG9zZSguLi5sb2dnZWRBcmdzKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBjbG9zZSBGYWJyaWMgcHJveGllcyBldmVudCBsaXN0ZW5lcmAsIGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICBpZiAodGhpcy5saXN0ZW5pbmdTdGFjaykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5saXN0ZW5pbmdTdGFjay5jbG9zZSgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBjbG9zZSBGYWJyaWMgZXZlbnQgbGlzdGVuZXJgLCBlIGFzIEVycm9yKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMubGlzdGVuaW5nU3RhY2sgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgZXZlbnQgcGF5bG9hZCBmcm9tIGJpbmFyeSBmb3JtYXRcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBVaW50OEFycmF5IGNvbnRhaW5pbmcgSlNPTiB0byBhbiBvYmplY3Qgd2l0aCBhbiBpZCBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGpzb25CeXRlcyAtIFRoZSBiaW5hcnkgcGF5bG9hZCBmcm9tIHRoZSBjaGFpbmNvZGUgZXZlbnRcbiAgICogQHJldHVybiB7eyBpZDogc3RyaW5nIH19IFRoZSBwYXJzZWQgcGF5bG9hZCBjb250YWluaW5nIHRoZSByZWNvcmQgSURcbiAgICovXG4gIHByaXZhdGUgcGFyc2VQYXlsb2FkKGpzb25CeXRlczogVWludDhBcnJheSk6IHsgaWQ6IHN0cmluZzsgcmVzdWx0PzogYW55IH0ge1xuICAgIGNvbnN0IGpzb24gPSB0aGlzLmRlY29kZXIuZGVjb2RlKGpzb25CeXRlcyk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoanNvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXJ0cyBvYnNlcnZpbmcgYW4gYWRhcHRlclxuICAgKiBAc3VtbWFyeSBDb25uZWN0cyB0aGlzIGRpc3BhdGNoIHRvIGFuIGFkYXB0ZXIgdG8gbW9uaXRvciBpdHMgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0ge0FkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pn0gb2JzZXJ2ZXIgLSBUaGUgYWRhcHRlciB0byBvYnNlcnZlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBvdmVycmlkZSBvYnNlcnZlKG9ic2VydmVyOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4pOiAoKSA9PiB2b2lkIHtcbiAgICBpZiAoIShvYnNlcnZlciBpbnN0YW5jZW9mIEZhYnJpY0NsaWVudEFkYXB0ZXIpKVxuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgIFwiT25seSBGYWJyaWNDbGllbnRBZGFwdGVyIGNhbiBiZSBvYnNlcnZlZCBieSBkaXNwYXRjaFwiXG4gICAgICApO1xuICAgIHN1cGVyLm9ic2VydmUob2JzZXJ2ZXIgYXMgRmFicmljQ2xpZW50QWRhcHRlcik7XG4gICAgcmV0dXJuICgpID0+IHRoaXMudW5PYnNlcnZlKG9ic2VydmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBvYnNlcnZlcnMgYWJvdXQgYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYSBjaGFuZ2UgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgY2hhbmdlIG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7YW55fSBwYXlsb2FkIC0gVGhlIGV2ZW50IHBheWxvYWRcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKFxuICAgIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+IHwgc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IEFkYXB0ZXIubG9nQ3R4PENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PihcbiAgICAgIHRoaXMudXBkYXRlT2JzZXJ2ZXJzLFxuICAgICAgZXZlbnQsXG4gICAgICBmYWxzZSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYE5vIGFkYXB0ZXIgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoOyBza2lwcGluZyBvYnNlcnZlciB1cGRhdGUgZm9yICR7dHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiID8gbW9kZWwgOiBNb2RlbC50YWJsZU5hbWUobW9kZWwpfToke2V2ZW50fWBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIucmVmcmVzaChtb2RlbCwgZXZlbnQsIGlkLCAuLi5jdHhBcmdzKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggZGlzcGF0Y2g6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBpbmNvbWluZyBjaGFpbmNvZGUgZXZlbnRzXG4gICAqIEBzdW1tYXJ5IExpc3RlbnMgZm9yIGV2ZW50cyBmcm9tIHRoZSBjaGFpbmNvZGUgYW5kIGRpc3BhdGNoZXMgdGhlbSB0byByZWdpc3RlcmVkIG9ic2VydmVyc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVudCBoYW5kbGluZyBzdG9wc1xuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNEaXNwYXRjaFxuICAgKiAgIHBhcnRpY2lwYW50IEV2ZW50U3RhY2tcbiAgICogICBwYXJ0aWNpcGFudCBFdmVudFBhcnNlclxuICAgKiAgIHBhcnRpY2lwYW50IE9ic2VydmVyc1xuICAgKlxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IGhhbmRsZUV2ZW50cygpXG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5FdmVudFN0YWNrOiBmb3IgYXdhaXQgKGNvbnN0IGV2dCBvZiBsaXN0ZW5pbmdTdGFjaylcbiAgICogICBFdmVudFN0YWNrLS0+PkZhYnJpY0Rpc3BhdGNoOiBDaGFpbmNvZGVFdmVudFxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RXZlbnRQYXJzZXI6IHBhcnNlRXZlbnROYW1lKGV2dC5ldmVudE5hbWUpXG4gICAqICAgRXZlbnRQYXJzZXItLT4+RmFicmljRGlzcGF0Y2g6IHsgdGFibGUsIGV2ZW50LCBvd25lciB9XG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogQ2hlY2sgaWYgZXZlbnQgaXMgZm9yIHRoaXMgTVNQXG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogcGFyc2VQYXlsb2FkKGV2dC5wYXlsb2FkKVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+T2JzZXJ2ZXJzOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIGV2ZW50LCBwYXlsb2FkLmlkKVxuICAgKiAgIE9ic2VydmVycy0tPj5GYWJyaWNEaXNwYXRjaDogQ2FsbGJhY2tzIGV4ZWN1dGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlRXZlbnRzKFxuICAgIGN0eEFyZz86IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5saXN0ZW5pbmdTdGFjaylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgRXZlbnQgc3RhY2sgbm90IGluaXRpYWxpemVkLiBFbnN1cmUgdGhhdCBcInN0YXJ0TGlzdGVuaW5nXCIgaXMgY2FsbGVkIGJlZm9yZSBhdHRlbXB0aW5nIHRoaXMgb3BlcmF0aW9uLmBcbiAgICAgICk7XG5cbiAgICBpZiAoIXRoaXMuYWRhcHRlciB8fCAhdGhpcy5hZGFwdGVyLmNvbmZpZylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIGZvdW5kLiBzaG91bGQgYmUgaW1wb3NzaWJsZWApO1xuXG4gICAgY29uc3QgY3R4ID1cbiAgICAgIGN0eEFyZyB8fFxuICAgICAgKGF3YWl0IHRoaXMuYWRhcHRlci5jb250ZXh0KFxuICAgICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICAgIHtcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiB0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgICh0aGlzLm1vZGVscyAmJiB0aGlzLm1vZGVsc1swXSkgfHwgKE1vZGVsIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3IpXG4gICAgICApKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5oYW5kbGVFdmVudHMpO1xuXG4gICAgbG9nLmluZm8oXG4gICAgICBgTGlzdGVuaW5nIGZvciBpbmNvbWluZyBldmVudHMgb24gY2hhaW5jb2RlIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWV9XCIgb24gY2hhbm5lbCBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFubmVsfVwiLi4uYFxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBldnQgb2YgdGhpcy5saXN0ZW5pbmdTdGFjaykge1xuICAgICAgICBjb25zdCB7IHRhYmxlLCBldmVudCwgb3duZXIgfSA9IHBhcnNlRXZlbnROYW1lKGV2dC5ldmVudE5hbWUpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5hZGFwdGVyLmNvbmZpZz8ubXNwRXZlbnRPbmx5ICYmXG4gICAgICAgICAgb3duZXIgJiZcbiAgICAgICAgICBvd25lciAhPT0gdGhpcy5hZGFwdGVyLmNvbmZpZz8ubXNwSWRcbiAgICAgICAgKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiB7IGlkOiBzdHJpbmc7IHJlc3VsdD86IGFueSB9ID0gdGhpcy5wYXJzZVBheWxvYWQoXG4gICAgICAgICAgZXZ0LnBheWxvYWRcbiAgICAgICAgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0YXJnZXRNb2RlbCA9IHRhYmxlXG4gICAgICAgICAgICA/IE1vZGVsLmdldCh0YWJsZSlcbiAgICAgICAgICAgIDogTW9kZWwuZ2V0KHRoaXMubW9kZWxzWzBdLm5hbWUpO1xuICAgICAgICAgIGNvbnN0IG1vZGVsUmVmID0gdGFyZ2V0TW9kZWwgPz8gKHRhYmxlIHx8IHRoaXMubW9kZWxzWzBdPy5uYW1lKTtcbiAgICAgICAgICBjb25zdCBvYnNlcnZlckFyZ3MgPSBwYXlsb2FkLnJlc3VsdCA/IFtwYXlsb2FkLnJlc3VsdCwgY3R4XSA6IFtjdHhdO1xuICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlT2JzZXJ2ZXJzKFxuICAgICAgICAgICAgbW9kZWxSZWYgYXMgQ29uc3RydWN0b3IgfCBzdHJpbmcsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIHBheWxvYWQuaWQgYXMgc3RyaW5nLFxuICAgICAgICAgICAgLi4uKG9ic2VydmVyQXJncyBhcyBDb250ZXh0dWFsQXJnczxhbnk+KVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHVwZGF0ZSBvYnNlcnZhYmxlcyBmb3IgdGFibGUgJHt0YWJsZX0gZXZlbnQgJHtldmVudH0gaWQ6ICR7cGF5bG9hZC5pZH06ICR7ZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgbG9nLmVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHJlYWQgZXZlbnQgZm9yIGNoYWluY29kZSBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lfVwiIG9uIGNoYW5uZWwgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhbm5lbH1cIjogJHtlfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLmNsb3NlKGN0eCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgZXZlbnQgbGlzdGVuZXJcbiAgICogQHN1bW1hcnkgU2V0cyB1cCBldmVudCBkaXNwYXRjaGluZyBmb3IgdGhlIG9ic2VydmVkIGFkYXB0ZXIuIFdoZW5cbiAgICogYHN5bnRoZXRpY0V2ZW50c2AgaXMgdHJ1ZSAodGhlIGRlZmF1bHQpIG5vIGdhdGV3YXkgY29ubmVjdGlvbiBpcyBvcGVuZWQ7XG4gICAqIGluc3RlYWQgZXZlcnkgQ1JVRCBvcGVyYXRpb24gaXMgd3JhcHBlZCB3aXRoIGEgUHJveHkgdGhhdCBmaXJlc1xuICAgKiBgdXBkYXRlT2JzZXJ2ZXJzYCBmb3IgKiphbGwqKiBtb2RlbHMuIFdoZW4gYHN5bnRoZXRpY0V2ZW50c2AgaXMgZmFsc2UgdGhlXG4gICAqIGV4aXN0aW5nIGdhdGV3YXktYmFzZWQgY2hhaW5jb2RlLWV2ZW50IHN1YnNjcmlwdGlvbiBpcyBlc3RhYmxpc2hlZCBhbmQgdGhlXG4gICAqIGxvY2FsIFByb3h5IGZhbGxiYWNrIGlzIGxpbWl0ZWQgdG8gZnVsbHktc2VncmVnYXRlZCAodHJhbnNpZW50KSBtb2RlbHMgb25seS5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGVcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5hZGFwdGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGFkYXB0ZXIgb3IgY29uZmlnIG9ic2VydmVkIGZvciBkaXNwYXRjaGApO1xuXG4gICAgY29uc3Qgc3ludGhldGljRXZlbnRzID0gdGhpcy5hZGFwdGVyLmNvbmZpZy5zeW50aGV0aWNFdmVudHMgIT09IGZhbHNlO1xuXG4gICAgaWYgKCFzeW50aGV0aWNFdmVudHMpIHtcbiAgICAgIC8vIEdhdGV3YXktYmFzZWQgY2hhaW5jb2RlLWV2ZW50IHN1YnNjcmlwdGlvbiAobm9uLXN5bnRoZXRpYyBwYXRoKVxuICAgICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jb250ZXh0KFxuICAgICAgICBcImRpc3BhdGNoXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiB0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIE1vZGVsIGFzIGFueVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgICBjb25zdCBnYXRld2F5ID0gYXdhaXQgRmFicmljQ2xpZW50QWRhcHRlci5nZXRHYXRld2F5KFxuICAgICAgICBjdHgsXG4gICAgICAgIHRoaXMuYWRhcHRlci5jb25maWcgYXMgUGVlckNvbmZpZyxcbiAgICAgICAgdGhpcy5jbGllbnRcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXR3b3JrID0gZ2F0ZXdheS5nZXROZXR3b3JrKHRoaXMuYWRhcHRlci5jb25maWcuY2hhbm5lbCk7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlcilcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGFkYXB0ZXIgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoYCk7XG4gICAgICB0aGlzLmxpc3RlbmluZ1N0YWNrID0gYXdhaXQgbmV0d29yay5nZXRDaGFpbmNvZGVFdmVudHMoXG4gICAgICAgIHRoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZVxuICAgICAgKTtcbiAgICAgIHRoaXMuaGFuZGxlRXZlbnRzKGN0eCk7XG4gICAgfVxuXG4gICAgLy8gUHJveHkgQ1JVRCBtZXRob2RzLlxuICAgIC8vIOKAoiBzeW50aGV0aWNFdmVudHMgPSB0cnVlICDihpIgbm90aWZ5IGZvciBBTEwgbW9kZWxzIChyZXBsYWNlcyBnYXRld2F5IGV2ZW50cyBlbnRpcmVseSlcbiAgICAvLyDigKIgc3ludGhldGljRXZlbnRzID0gZmFsc2Ug4oaSIG5vdGlmeSBvbmx5IGZvciBmdWxseS1zZWdyZWdhdGVkICh0cmFuc2llbnQpIG1vZGVsc1xuICAgIC8vICAgKHRoZSBnYXRld2F5IHN1YnNjcmlwdGlvbiBoYW5kbGVzIHB1YmxpYyBtb2RlbHMpXG4gICAgKFxuICAgICAgW1xuICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMLFxuICAgICAgXSBhcyAoa2V5b2YgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+KVtdXG4gICAgKS5mb3JFYWNoKCh0b1dyYXApID0+IHtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTm8gYWRhcHRlciBwcm92aWRlZCBmb3IgdGhlIGZhbGxiYWNrIG9mIGZ1bGx5IHNlZ3JlZ2F0ZWQgbW9kZWxzYFxuICAgICAgICApO1xuICAgICAgaWYgKCF0aGlzLmFkYXB0ZXJbdG9XcmFwXSlcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE1ldGhvZCAke3RvV3JhcH0gbm90IGZvdW5kIGluICR7dGhpcy5hZGFwdGVyLmFsaWFzfSBhZGFwdGVyIHRvIGJpbmQgT2JzZXJ2YWJsZXMgRGlzcGF0Y2hgXG4gICAgICAgICk7XG5cbiAgICAgIGxldCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLmFkYXB0ZXIsIHRvV3JhcCk7XG4gICAgICBsZXQgcHJvdG86IGFueSA9IHRoaXMuYWRhcHRlcjtcbiAgICAgIHdoaWxlICghZGVzY3JpcHRvciAmJiBwcm90byAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gICAgICAgIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCB0b1dyYXApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRlc2NyaXB0b3IgfHwgIWRlc2NyaXB0b3Iud3JpdGFibGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1ldGhvZCAke3RvV3JhcH0gdG8gYmluZCBPYnNlcnZhYmxlcyBEaXNwYXRjaGBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gYnVsa1RvU2luZ2xlKG1ldGhvZDogc3RyaW5nKSB7XG4gICAgICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLkNSRUFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuVVBEQVRFO1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5ERUxFVEU7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBiZWNhdXNlIHRoZXJlIGFyZSByZWFkIG9ubHkgcHJvcGVydGllc1xuICAgICAgdGhpcy5hZGFwdGVyW3RvV3JhcF0gPSBuZXcgUHJveHkodGhpcy5hZGFwdGVyW3RvV3JhcF0sIHtcbiAgICAgICAgYXBwbHk6IGFzeW5jIChcbiAgICAgICAgICB0YXJnZXQ6IGFueSxcbiAgICAgICAgICB0aGlzQXJnOiBGYWJyaWNDbGllbnRBZGFwdGVyLFxuICAgICAgICAgIGFyZ0FycmF5OiBhbnlbXVxuICAgICAgICApID0+IHtcbiAgICAgICAgICAvLyBSdW4gdGhlIG9yaWdpbmFsIG1ldGhvZCB1bmNoYW5nZWQgc28gdHJhbnNpZW50IGRhdGEgaXMgcHJlc2VydmVkXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGFyZ2V0LmFwcGx5KHRoaXNBcmcsIGFyZ0FycmF5KTtcblxuICAgICAgICAgIGNvbnN0IGNsYXp6OiBDb25zdHJ1Y3Rvcjxhbnk+ID0gYXJnQXJyYXlbMF07XG4gICAgICAgICAgLy8gV2hlbiBzeW50aGV0aWNFdmVudHMgaXMgZmFsc2UsIHB1YmxpYyBtb2RlbHMgZW1pdCBhIGNoYWluY29kZSBldmVudFxuICAgICAgICAgIC8vIG9uIHRoZSBjb250cmFjdCBzaWRlOyBza2lwIHRoZSBsb2NhbCBmYWxsYmFjayB0byBhdm9pZFxuICAgICAgICAgIC8vIGRvdWJsZS1ub3RpZmljYXRpb24uIFdoZW4gc3ludGhldGljRXZlbnRzIGlzIHRydWUgd2UgaGFuZGxlIGFsbCBtb2RlbHMuXG4gICAgICAgICAgaWYgKCFzeW50aGV0aWNFdmVudHMgJiYgIU1vZGVsLmlzVHJhbnNpZW50KGNsYXp6KSkgcmV0dXJuIHJlc3VsdDtcblxuICAgICAgICAgIC8vIENvbnRleHQgaXMgYWx3YXlzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYXJnQXJyYXlcbiAgICAgICAgICBjb25zdCB7IGxvZywgY3R4QXJncywgY3R4IH0gPSB0aGlzQXJnW1wibG9nQ3R4XCJdKFxuICAgICAgICAgICAgYXJnQXJyYXkuc2xpY2UoYXJnQXJyYXkubGVuZ3RoIC0gMSksXG4gICAgICAgICAgICB0YXJnZXRcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGlkcyA9IGFyZ0FycmF5WzFdO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdEFyZ3M6IGFueVtdID0gW2NsYXp6LCBidWxrVG9TaW5nbGUodG9XcmFwKSwgaWRzXTtcblxuICAgICAgICAgIGlmIChjdHguZ2V0T3JVbmRlZmluZWQoXCJvYnNlcnZlRnVsbFJlc3VsdFwiKSkge1xuICAgICAgICAgICAgcmVzdWx0QXJncy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKFxuICAgICAgICAgICAgLi4uKHJlc3VsdEFyZ3MgYXMgUGFyYW1ldGVyczx0eXBlb2YgdGhpcy51cGRhdGVPYnNlcnZlcnM+KSxcbiAgICAgICAgICAgIC4uLmN0eEFyZ3NcbiAgICAgICAgICApLmNhdGNoKChlOiB1bmtub3duKSA9PlxuICAgICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGRpc3BhdGNoIG9ic2VydmVyIHJlZnJlc2ggZm9yICR7dG9XcmFwfSBvbiAke2NsYXp6Lm5hbWUgfHwgY2xhenp9IGZvciAke2lkc306ICR7ZX1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuaWYgKEZhYnJpY0NsaWVudEFkYXB0ZXIpXG4gIEZhYnJpY0NsaWVudEFkYXB0ZXJbXCJfYmFzZURpc3BhdGNoXCJdID0gRmFicmljQ2xpZW50RGlzcGF0Y2g7XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSBcIiMjUEFDS0FHRSMjXCI7XG5cbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShQQUNLQUdFX05BTUUsIFZFUlNJT04pO1xuIl0sIm5hbWVzIjpbImVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZSIsImZpbGVQYXRoIiwiZnMiLCJyZXF1aXJlIiwicGF0aCIsImRpcm5hbWUiLCJleGlzdHNTeW5jIiwibWtkaXJTeW5jIiwiZ2VuZXJhdGVNb2RlbEluZGV4ZXMiLCJtIiwiZ2VuZXJhdGVJbmRleGVzIiwiZ2VuZXJhdGVNb2RlbERlc2lnbkRvY3MiLCJhY2N1bSIsInZpZXdzIiwiZ2VuZXJhdGVWaWV3cyIsInN0b3JhZ2UiLCJmb3JFYWNoIiwiZG9jIiwiX2lkIiwicmVhZE1vZGVsRmlsZSIsImZpbGUiLCJleHBvcnRzIiwiam9pbiIsInByb2Nlc3MiLCJjd2QiLCJwYXJlbnRQYXRoIiwibmFtZSIsInZhbHVlcyIsIk9iamVjdCIsImZpbHRlciIsImUiLCJNb2RlbCIsImFzeW5jIiwicmVhZE1vZGVsRm9sZGVycyIsImZvbGRlcnMiLCJyZXN1bHQiLCJmb2xkZXIiLCJmaWxlcyIsInJlYWRkaXJTeW5jIiwid2l0aEZpbGVUeXBlcyIsInJlY3Vyc2l2ZSIsImYiLCJpc0ZpbGUiLCJlbmRzV2l0aCIsInB1c2giLCJ3cml0ZUluZGV4ZXMiLCJpbmRleGVzIiwicCIsImNvbGxlY3Rpb24iLCJpbmRleCIsInJlc29sdmUiLCJ3cml0ZUZpbGVTeW5jIiwiSlNPTiIsInN0cmluZ2lmeSIsInVuZGVmaW5lZCIsIndyaXRlRGVzaWduRG9jcyIsImRlc2lnbkRvY3MiLCJsZW5ndGgiLCJkb2NJZCIsInJlcGxhY2UiLCJwYXlsb2FkIiwiX3JldiIsImNvbGxlY3Rpb25Gb3IiLCJjb2xsZWN0aW9uTmFtZSIsInBvbGljeSIsInJlcXVpcmVkUGVlckNvdW50IiwibWF4UGVlckNvdW50IiwiYmxvY2tUb0xpdmUiLCJtZW1iZXJPbmx5UmVhZCIsIm1lbWJlck9ubHlXcml0ZSIsInByaXZhdGVDb2xsZWN0aW9uRm9yIiwibXNwSWQiLCJjIiwiZW5kb3JzZW1lbnRQb2xpY3kiLCJzaWduYXR1cmVQb2xpY3kiLCJzaGFyZWRDb2xsZWN0aW9uRm9yIiwibXNwSWRzIiwibWFwIiwiZXh0cmFjdENvbGxlY3Rpb25zIiwib3ZlcnJpZGVzIiwibWlycm9yIiwicHJpdmF0ZUNvbHMiLCJzaGFyZWRDb2xzIiwiY29sbGVjdGlvbnNGb3IiLCJyZXNvbHZlQ29sbGVjdGlvbiIsImFyZyIsIkludGVybmFsRXJyb3IiLCJwcml2YXRlRGVmYXVsdHMiLCJhc3NpZ24iLCJzaGFyZWREZWZhdWx0cyIsIm1pcnJvck1ldGEiLCJtaXJyb3JlZEF0IiwicHJpdmF0ZXMiLCJmbGF0IiwicmVzb2x2ZWQiLCJyZXNvbHZlciIsInNvbWUiLCJpbmNsdWRlcyIsInNoYXJlZCIsIndyaXRlQ29sbGVjdGlvbnMiLCJjb2xzIiwiZmlsZU5hbWUiLCJ3cml0ZUNvbGxlY3Rpb25EZXNpZ25Eb2NzIiwiZG9jcyIsIkZhYnJpY0NsaWVudFBhZ2luYXRvciIsIlBhZ2luYXRvciIsImNvbnN0cnVjdG9yIiwiYWRhcHRlciIsInF1ZXJ5Iiwic2l6ZSIsImNsYXp6Iiwic3VwZXIiLCJwcmVwYXJlIiwicmF3U3RhdGVtZW50IiwiVW5zdXBwb3J0ZWRFcnJvciIsInBhZ2UiLCJhcmdzIiwiaXNTZXJpYWxpemVkUGFnZSIsIm9iaiIsIkFycmF5IiwiaXNBcnJheSIsImRhdGEiLCJGYWJyaWNDbGllbnRSZXBvc2l0b3J5IiwiUmVwb3NpdG9yeSIsImZvcmNlIiwidGhpcyIsIl9vdmVycmlkZXMiLCJpZ25vcmVWYWxpZGF0aW9uIiwiaWdub3JlSGFuZGxlcnMiLCJhbGxvd1Jhd1N0YXRlbWVudHMiLCJmb3JjZVByZXBhcmVTaW1wbGVRdWVyaWVzIiwiZm9yY2VQcmVwYXJlQ29tcGxleFF1ZXJpZXMiLCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZSIsInJlYnVpbGRXaXRoVHJhbnNpZW50Iiwib3ZlcnJpZGUiLCJmbGFncyIsImZvciIsIk9ic2VydmVySGFuZGxlciIsInBhZ2luYXRlQnkiLCJrZXkiLCJvcmRlciIsInJlZiIsIm9mZnNldCIsImxpbWl0IiwibG9nIiwiY3R4QXJncyIsImxvZ0N0eCIsIlByZXBhcmVkU3RhdGVtZW50S2V5cyIsIlBBR0VfQlkiLCJ2ZXJib3NlIiwidGFibGVOYW1lIiwiY2xhc3MiLCJzdGF0ZW1lbnQiLCJib29rbWFyayIsImxpc3RCeSIsIkxJU1RfQlkiLCJmaW5kQnkiLCJ2YWx1ZSIsIkZJTkRfQlkiLCJmaW5kT25lQnkiLCJGSU5EX09ORV9CWSIsImZpbmQiLCJPcmRlckRpcmVjdGlvbiIsIkFTQyIsIkZJTkQiLCJkaXJlY3Rpb24iLCJQQUdFIiwiY3R4IiwiUGVyc2lzdGVuY2VLZXlzIiwiU1RBVEVNRU5UIiwiY2FsbEFyZ3MiLCJzbGljZSIsInBhcnNlIiwiZGVjb2RlIiwiZXZhbHVhdGVUcmFuc2FjdGlvbiIsImh5ZHJhdGVkIiwiciIsIkNvdWNoREJLZXlzIiwiVEFCTEUiLCJkIiwiYXBwbHlBZnRlclJlYWQiLCJnZXRPclVuZGVmaW5lZCIsImVuZm9yY2VEQkRlY29yYXRvcnMiLCJPcGVyYXRpb25LZXlzIiwiUkVBRCIsIkFGVEVSIiwiUHJvbWlzZSIsImFsbCIsImVudHJ5IiwiY291bnRPZiIsIkNPVU5UX09GIiwic3RtdEFyZ3MiLCJtYXhPZiIsIk1BWF9PRiIsIm1pbk9mIiwiTUlOX09GIiwiYXZnT2YiLCJBVkdfT0YiLCJzdW1PZiIsIlNVTV9PRiIsImRpc3RpbmN0T2YiLCJESVNUSU5DVF9PRiIsImdyb3VwT2YiLCJHUk9VUF9PRiIsImhlYWx0aGNoZWNrIiwiY3JlYXRlIiwibW9kZWwiLCJkZWJ1ZyIsImVuc3VyZUxlZ2FjeU1pcnJvckZsYWciLCJwcmVwYXJlZCIsInJlY29yZCIsImlkIiwidHJhbnNpZW50IiwicmV2ZXJ0IiwidXBkYXRlIiwiY3JlYXRlQWxsUHJlZml4IiwibW9kZWxzIiwiQ1JFQVRFIiwiZ2V0IiwiaWdub3JlVmFsaWRhdGUiLCJPTiIsImlnbm9yZWRQcm9wcyIsImVycm9ycyIsImhhc0Vycm9ycyIsImVycm9yTWVzc2FnZXMiLCJyZWR1Y2VFcnJvcnNUb1ByaW50IiwiVmFsaWRhdGlvbkVycm9yIiwiY3JlYXRlQWxsIiwiaWRzIiwicGF5bG9hZHMiLCJ0cmFuc2llbnRzIiwiY3JlYXRlZCIsImkiLCJyZWFkQWxsIiwia2V5cyIsInJlY29yZHMiLCJ1cGRhdGVBbGwiLCJ1cGRhdGVkIiwidSIsImFjY3VtdWxhdGUiLCJsZWdhY3kiLCJFUkMyMFRva2VuIiwiQmFzZU1vZGVsIiwiX19kZWNvcmF0ZSIsInBrIiwidHlwZSIsIlN0cmluZyIsInByb3RvdHlwZSIsImNvbHVtbiIsInJlcXVpcmVkIiwidGFibGUiLCJFUkMyMFdhbGxldCIsIkFsbG93YW5jZSIsIkNsaWVudFNlcmlhbGl6ZXIiLCJKU09OU2VyaWFsaXplciIsInByZVNlcmlhbGl6ZSIsIm1vZGVsTmFtZSIsInRvU2VyaWFsaXplIiwibWV0YWRhdGEiLCJNZXRhZGF0YSIsIlNlcmlhbGl6YXRpb25FcnJvciIsIk1vZGVsS2V5cyIsIkFOQ0hPUiIsImRlc2VyaWFsaXplIiwic3RyIiwiZGVzZXJpYWxpemF0aW9uIiwiY2xhc3NOYW1lIiwiRXJyb3IiLCJidWlsZCIsInNlcmlhbGl6ZSIsIkZhYnJpY0VSQzIwQ2xpZW50UmVwb3NpdG9yeSIsInNlcmlhbGl6ZXIiLCJkZWNvZGVyIiwiVGV4dERlY29kZXIiLCJ1cGRhdGVPYnNlcnZlcnMiLCJldmVudCIsIm9ic2VydmVySGFuZGxlciIsImNvdW50IiwicGFyc2VkSWQiLCJTZXF1ZW5jZSIsInBhcnNlVmFsdWUiLCJzZXF1ZW5jZUZvciIsInRva2VuTmFtZSIsInN5bWJvbCIsImRlY2ltYWxzIiwiTnVtYmVyIiwidG90YWxTdXBwbHkiLCJ0b3RhbCIsImJhbGFuY2VPZiIsIm93bmVyIiwiYmFsYW5jZSIsInRyYW5zZmVyIiwidG8iLCJ0cmFuc2ZlcnJlZCIsInN1Ym1pdFRyYW5zYWN0aW9uIiwidG9TdHJpbmciLCJ0cmFuc2ZlckZyb20iLCJmcm9tIiwiY29udGV4dEFyZ3MiLCJDb250ZXh0IiwiYXBwcm92ZSIsInNwZW5kZXIiLCJhcHByb3ZlZCIsImFsbG93YW5jZSIsImluaXRpYWxpemUiLCJ0b2tlbiIsImluaXRpbGlhemVkIiwiY2hlY2tJbml0aWFsaXplZCIsIm1pbnQiLCJhbW91bnQiLCJidXJuIiwiYnVybkZyb20iLCJhY2NvdW50IiwiY2xpZW50QWNjb3VudEJhbGFuY2UiLCJzZXJpYWxpemVkQWNjb3VudEJhbGFuY2UiLCJjbGllbnRBY2NvdW50SUQiLCJleHRyYWN0SWRzIiwiY29tcG9zZWQiLCJwa1Byb3BzIiwiZXh0cmFjdElkIiwiY29tcG9zZUF0dHJpYnV0ZVZhbHVlIiwiSWRlbnRpdHlDcmVkZW50aWFscyIsImRlc2NyaXB0aW9uIiwiRmFicmljTW9kZWxLZXlzIiwiSWRlbnRpdHlUeXBlIiwiRmFicmljRmxhdm91ciIsIklkZW50aXR5IiwiWDUwOSIsIm9uZVRvT25lIiwiQ2FzY2FkZSIsIkNBU0NBREUiLCJkZWxldGUiLCJDb3JlVXRpbHMiLCJsb2dnZXIiLCJNaW5pTG9nZ2VyIiwiY29udGVudE9mTG9hZEZpbGUiLCJjb250ZW50T3JQYXRoIiwiZmlsZVJlYWRlciIsIlVpbnQ4QXJyYXkiLCJtYXRjaCIsInJlYWRGaWxlIiwicHJvbWlzZXMiLCJub3JtYWxpemVJbXBvcnQiLCJpbXBvcnQiLCJnZXRDQVVzZXIiLCJ1c2VyTmFtZSIsInByaXZhdGVLZXkiLCJjZXJ0aWZpY2F0ZSIsIm9wdGlvbnMiLCJzdHJpbmdGb3JtYXQiLCJ1c2VyIiwiVXNlciIsImNvbmZpZyIsImhzbSIsInNvZnR3YXJlIiwibGliIiwibGlicmFyeSIsInNsb3QiLCJsYWJlbCIsInRva2VuTGFiZWwiLCJwaW4iLCJjcnlwdG9TdWl0ZSIsImdldENyeXB0b1N1aXRlIiwic2V0Q3J5cHRvU3VpdGUiLCJlbnJvbGxtZW50S2V5IiwiZ2V0SFNNRW5yb2xsbWVudEtleSIsImdldFNvZnR3YXJlRW5yb2xsbWVudEtleSIsInNldEVucm9sbG1lbnQiLCJuZXdDcnlwdG9TdWl0ZSIsImNyZWF0ZUtleUZyb21SYXciLCJza2kiLCJrZXlJZEhleCIsInRyaW0iLCJCdWZmZXIiLCJnZXRDZXJ0aWZpY2F0ZVNLSSIsImdldEtleSIsImlzUHJpdmF0ZSIsIng1MDkiLCJYNTA5Q2VydGlmaWNhdGUiLCJqd2siLCJwdWJsaWNLZXkiLCJleHBvcnQiLCJmb3JtYXQiLCJwcmVmaXgiLCJ4IiwieSIsImNyeXB0byIsImNyZWF0ZUhhc2giLCJjb25jYXQiLCJkaWdlc3QiLCJnZXRJZGVudGl0eSIsImNlcnREaXJlY3RvcnlQYXRoIiwiaWRlbnRpdHlGaWxlUmVhZGVyIiwiY2VydFBhdGgiLCJnZXRGaXJzdERpckZpbGVOYW1lIiwiY3JlZGVudGlhbHMiLCJkaXJQYXRoIiwicmVhZGRpciIsImdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50IiwiZ2V0RmlsZUNvbnRlbnQiLCJnZXRTaWduZXIiLCJrZXlEaXJlY3RvcnlQYXRoIiwic2lnbmVyRmlsZVJlYWRlciIsImtleVBhdGgiLCJwcml2YXRlS2V5UGVtIiwiZXh0cmFjdFByaXZhdGVLZXkiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJrIiwic2lnbmVycyIsIm5ld1ByaXZhdGVLZXlTaWduZXIiLCJwZW0iLCJsaWJOYW1lIiwic3VidGxlIiwiZ2xvYmFsVGhpcyIsIndpbmRvdyIsIkNyeXB0byIsIndlYmNyeXB0byIsInN0cjJhYiIsImJ1ZiIsIkFycmF5QnVmZmVyIiwiYnVmVmlldyIsInN0ckxlbiIsImNoYXJDb2RlQXQiLCJyZXBsYWNlQWxsIiwiZGVjb2RlZCIsImJpbmFyeURlciIsImltcG9ydEtleSIsIm5hbWVkQ3VydmUiLCJnZXRBa2lBbmRTZXJpYWxGcm9tQ2VydCIsImNlcnQiLCJ4NTA5Q2VydGlmaWNhdGUiLCJYNTA5Q2VydCIsImFraUV4dCIsImV4dGVuc2lvbnMiLCJha2kiLCJ0b1VwcGVyQ2FzZSIsInN0YXJ0c1dpdGgiLCJzZXJpYWwiLCJzZXJpYWxOdW1iZXIiLCJjcnlwdG9Qcm92aWRlciIsInNldCIsIkJBU0VfQUxQSEFCRVQiLCJDUllQVE8iLCJCYXNlRW5jb2RlciIsImFscGhhYmV0IiwiYmFzZU1hcCIsImoiLCJjaGFyQXQiLCJ4YyIsImJhc2UiLCJsZWFkZXIiLCJmYWN0b3IiLCJNYXRoIiwiaUZhY3RvciIsImVuY29kZSIsInNvdXJjZSIsImlzVmlldyIsImJ1ZmZlciIsImJ5dGVPZmZzZXQiLCJieXRlTGVuZ3RoIiwiemVyb2VzIiwicGJlZ2luIiwicGVuZCIsImI1OCIsImNhcnJ5IiwiaXQxIiwiaXQyIiwicmVwZWF0IiwiZGVjb2RlVW5zYWZlIiwicHN6IiwiYjI1NiIsIml0MyIsIml0NCIsInZjaCIsIkNyeXB0b1V0aWxzIiwiYjU4ZW5jb2RlciIsIkJBU0U1OCIsImZhYnJpY0lkRnJvbUNlcnRpZmljYXRlIiwic3ViamVjdCIsImlzc3VlciIsInN0cmluZ1RvQXJyYXlCdWZmZXIiLCJleHRyYWN0S2V5IiwidXNhZ2VzIiwiUmVnRXhwIiwiZXh0cmFjdFB1YmxpY0tleSIsInNpZ24iLCJidWZmIiwiaGFzaCIsImIiLCJwYWRTdGFydCIsInZlcmlmeSIsInNpZ25hdHVyZSIsImVuY3J5cHQiLCJnZXRTdWJ0bGVDcnlwdG8iLCJpc0Jyb3dzZXIiLCJkZWNyeXB0IiwiZ2V0TWFzdGVyIiwidGV4dEVuY29kZXIiLCJUZXh0RW5jb2RlciIsImdlbkdlbmVzaXMiLCJyYW5kb21VVUlEIiwiaW1wb3J0ZWRLZXkiLCJLRVlfQUxHT1JZVEhNIiwiaXYiLCJnZXREZXJpdmF0aW9uS2V5Iiwic2FsdCIsInNhbHRCdWZmZXIiLCJzYWx0SGFzaGVkIiwicGFyYW1zIiwiSEFTSCIsIml0ZXJhdGlvbnMiLCJJVEVSQVRJT05TIiwiZGVyaXZhdGlvbiIsImRlcml2ZUJpdHMiLCJLRVlMRU5HVEgiLCJpdmxlbiIsImtleWxlbiIsImRlcml2ZWRLZXkiLCJpbXBvcnRlZEVuY3J5cHRpb25LZXkiLCJBTEdPUllUSE0iLCJlbmNyeXB0UGluIiwidGV4dCIsImtleU9iamVjdCIsInRleHRCdWZmZXIiLCJlbmNyeXB0ZWRUZXh0IiwiZGVjcnlwdFBpbiIsInRleHREZWNvZGVyIiwiZGVjcnlwdGVkVGV4dCIsIk92ZXJmbG93RXJyb3IiLCJtc2ciLCJCYWxhbmNlRXJyb3IiLCJBbGxvd2FuY2VFcnJvciIsIlJlZ2lzdHJhdGlvbkVycm9yIiwiQXV0aG9yaXphdGlvbkVycm9yIiwiTWlzc2luZ0NvbnRleHRFcnJvciIsIlVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzIiwiQmFzZUVycm9yIiwiTm90SW5pdGlhbGl6ZWRFcnJvciIsIk1pc3NpbmdQS0NTUzExTGliIiwiRW5kb3JzZW1lbnRFcnJvciIsIm1lc3NhZ2UiLCJNdmNjUmVhZENvbmZsaWN0RXJyb3IiLCJQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IiLCJFbmRvcnNlbWVudFBvbGljeUVycm9yIiwiVHJhbnNhY3Rpb25MaW1pdHNFcnJvciIsImNvZGUiLCJUcmFuc2FjdGlvblRpbWVvdXRFcnJvciIsIlRyYW5zYWN0aW9uQnVmZmVyU2l6ZUVycm9yIiwiSEZDQUlkZW50aXR5VHlwZSIsIkhGQ0FJZGVudGl0eUF0dHJpYnV0ZXMiLCJGYWJyaWNFbnJvbGxtZW50U2VydmljZSIsIkxvZ2dlZENsYXNzIiwiY2FDb25maWciLCJjYU5hbWUiLCJjYUNlcnQiLCJjYUtleSIsInVybCIsIkNBIiwiY2EiLCJ0bHMiLCJ0cnVzdGVkUm9vdHMiLCJyb290IiwiRmFicmljQ0FTZXJ2aWNlcyIsIkNsaWVudCIsImNsaWVudCIsIkNlcnRpZmljYXRlIiwiY2VydGlmaWNhdGVTZXJ2aWNlIiwibmV3Q2VydGlmaWNhdGVTZXJ2aWNlIiwiQWZmaWxpYXRpb25zIiwiYWZmaWxpYXRpb25TZXJ2aWNlIiwibmV3QWZmaWxpYXRpb25TZXJ2aWNlIiwiSWRlbnRpdGllcyIsImlkZW50aXR5U2VydmljZSIsIm5ld0lkZW50aXR5U2VydmljZSIsImdldENlcnRpZmljYXRlcyIsInJlcXVlc3QiLCJkb01hcCIsInJlc3BvbnNlIiwiY2VydHMiLCJQRU0iLCJnZXRJZGVudGl0aWVzIiwiaWRlbnRpdGllc1NlcnZpY2UiLCJnZXRBbGwiLCJpZGVudGl0aWVzIiwicGFyc2VFcnJvciIsInJlZ2V4cCIsImV4ZWMiLCJDb25mbGljdEVycm9yIiwiZ2V0QWZmaWxpYXRpb25zIiwiYSIsInJlYWQiLCJlbnJvbGxtZW50SWQiLCJnZXRPbmUiLCJOb3RGb3VuZEVycm9yIiwic3VjY2VzcyIsInJlZ2lzdGVyIiwiaXNTdXBlclVzZXIiLCJhZmZpbGlhdGlvbiIsInVzZXJSb2xlIiwiYXR0cnMiLCJtYXhFbnJvbGxtZW50cyIsInJlZ2lzdHJhdGlvbiIsInBhc3N3b3JkIiwicHJvcHMiLCJlbnJvbGxtZW50SUQiLCJlbnJvbGxtZW50U2VjcmV0IiwiaW5mbyIsImlkZW50aXR5RnJvbUVucm9sbG1lbnQiLCJlbnJvbGxtZW50Iiwicm9vdENlcnRpZmljYXRlIiwiTG9nZ2luZyIsImNsaWVudElkIiwibm93IiwiRGF0ZSIsInRvQnl0ZXMiLCJjcmVhdGVkT24iLCJ1cGRhdGVkT24iLCJlbnJvbGwiLCJpZGVudGl0eSIsInJlZ2lzdGVyQW5kRW5yb2xsIiwicmV2b2tlIiwicmVhc29uIiwiUmVnaXN0cmF0aW9uUmVxdWVzdEJ1aWxkZXIiLCJlcnJzIiwicm9sZSIsInNldEFmZmlsaWF0aW9uIiwiYWRkQXR0ciIsImF0dHIiLCJzZXRBdHRycyIsInNldEVucm9sbG1lbnRJRCIsInNldEVucm9sbG1lbnRTZWNyZXQiLCJzZXRNYXhFbnJvbGxtZW50cyIsInNldFJvbGUiLCJtaW5sZW5ndGgiLCJtaW4iLCJFUkMyMEV2ZW50cyIsIkZhYnJpY0Jhc2VNb2RlbCIsImNyZWF0ZWRBdCIsInVwZGF0ZWRBdCIsInZlcnNpb24iLCJ1c2VzIiwiRmFicmljSWRlbnRpZmllZEJhc2VNb2RlbCIsImNyZWF0ZWRCeSIsInVwZGF0ZWRCeSIsImlzU2hhcmVkIiwic2VncmVnYXRlIiwiaXNUcmFuc2llbnQiLCJkZWNvcmF0ZWRQcm9wZXJ0aWVzIiwiZ2V0QXR0cmlidXRlcyIsInRyYW5zaWVudFByb3BzIiwiREJLZXlzIiwiVFJBTlNJRU5UIiwicHJpdmF0ZVByb3BlcnRpZXMiLCJQUklWQVRFIiwic2hhcmVkUHJvcGVydGllcyIsIlNIQVJFRCIsInB1YmxpYyIsInRyYW5zaWVudEtleXMiLCJwcml2YXRlS2V5cyIsInNoYXJlZEtleXMiLCJpc1B1YmxpYyIsImJpbmQiLCJtaXJyb3JlZCIsIkZBQlJJQyIsIk1JUlJPUiIsIm93bmVyT2YiLCJtZXRhIiwiT1dORURfQlkiLCJzaGFyZWRLZXkiLCJjb25zdHIiLCJwcml2YXRlTWV0YSIsInNoYXJlZE1ldGEiLCJjb2xsZWN0aW9ucyIsImV4dHJhY3RNc3BJZCIsImdldE1TUElEIiwiT3duZXIiLCJ0YXJnZXQiLCJwcm9wZXJ0eUtleSIsImRlc2NyaXB0b3IiLCJvcmlnaW5hbE1ldGhvZCIsImFjb3VudElkIiwiY2xpZW50SWRlbnRpdHkiLCJnZXRJRCIsInNlbGVjdCIsInRva2VucyIsImV4ZWN1dGUiLCJhcHBseSIsIm93bmVkQnlPbkNyZWF0ZSIsImNvbnRleHQiLCJzdHViIiwiY3JlYXRvciIsImdldENyZWF0b3IiLCJtc3BpZCIsInNldE93bmVkQnlLZXlWYWx1ZSIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwib3duZWRCeSIsImF0dHJpYnV0ZSIsImdlbmVyYXRlZCIsInJlYWRvbmx5Iiwib25DcmVhdGUiLCJwcm9wTWV0YWRhdGEiLCJEZWNvcmF0aW9uIiwiZGVmaW5lIiwiZGVjb3JhdG9yIiwidHJhbnNhY3Rpb25JZE9uQ3JlYXRlIiwiZ2V0VHhJRCIsInRyYW5zYWN0aW9uSWQiLCJvblVwZGF0ZSIsIlRSQU5TQUNUSU9OX0lEIiwiZXZhbE1pcnJvck1ldGFkYXRhIiwiY3JlYXRlTWlycm9ySGFuZGxlciIsImZhYnJpY0N0eCIsInNvdXJjZU1vZGVsIiwicHV0IiwicmVwbyIsIm1pcnJvckNvbGxlY3Rpb24iLCJ1cGRhdGVNaXJyb3JIYW5kbGVyIiwiYXBwbHlVcGRhdGVWYWxpZGF0aW9uIiwibWVyZ2VGb3JVcGRhdGUiLCJkZWxldGVNaXJyb3JIYW5kbGVyIiwicGtQcm9wIiwic2VncmVnYXRlZCIsIm1pcnJvcldyaXRlR3VhcmQiLCJtc3AiLCJjb25kaXRpb24iLCJyZWFkTWlycm9ySGFuZGxlciIsIm1hdGNoZXMiLCJyZWFkRnJvbSIsIm1zcElkT3JDb25kaXRpb24iLCJpc0NvbmRpdGlvbk9ubHkiLCJCb29sZWFuIiwiY29uZCIsIm9uUmVhZCIsInByaW9yaXR5Iiwib25EZWxldGUiLCJNb2RlbENvbGxlY3Rpb24iLCJvcmdOYW1lIiwidG9QYXNjYWxDYXNlIiwiTmFtZXNwYWNlQ29sbGVjdGlvbiIsIm5hbWVzcGFjZSIsIkltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb24iLCJTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSIsImFwcGx5U2VncmVnYXRpb25GbGFncyIsImlzRnVsbHlTZWdyZWdhdGVkIiwiaGFzUHVibGljUHJvcGVydGllcyIsIm1hcmtGdWxseVNlZ3JlZ2F0ZWQiLCJhcHBseU1pcnJvckZsYWdzIiwiYXR0cmlidXRlcyIsInRyYW5zaWVudE1ldGEiLCJleHRyYWN0U2VncmVnYXRlZENvbGxlY3Rpb25zIiwiZGF0YUFycmF5IiwiY29sbGVjdGlvblJlc29sdmVyIiwia2V5QXJyYXkiLCJwa0tleSIsInBrU2VxTmFtZSIsInNlcXVlbmNlTmFtZSIsImlkVmFsdWUiLCJjYW5CdWlsZFBlckluc3RhbmNlIiwic2V0U2VxdWVuY2VTZWdyZWdhdGlvbiIsInByb3BTZXFOYW1lIiwic2VncmVnYXRlZERhdGFPbkNyZWF0ZSIsIl9rIiwia2V5U3RyaW5ncyIsIndyaXRlVG8iLCJzZWdyZWdhdGVkRGF0YU9uUmVhZCIsInNlZ3JlZ2F0ZWREYXRhT25VcGRhdGUiLCJvbGRNb2RlbCIsInNlZ3JlZ2F0ZWREYXRhT25EZWxldGUiLCJpbm5lclNlZ3JlZ2F0ZWQiLCJzZWdyZWdhdGVkRGVjIiwiU2V0IiwiYWRkIiwiY29uc3RyTWV0YSIsImNvbnN0ckNvbGxlY3Rpb25zIiwidXBkYXRlZFRyYW5zaWVudE1ldGEiLCJkZWNzIiwicHJvcGVydGllcyIsImdyb3VwTmFtZSIsImV4dHJhY3RHcm91cE5hbWUiLCJkYXRhR3JvdXBOYW1lIiwiZWFybHlFeHRyYWN0aW9uTWV0YSIsImVhcmx5RXh0cmFjdGlvbkdyb3VwU29ydCIsImdyb3VwIiwicHJvcCIsIm9uIiwiREJPcGVyYXRpb25zIiwiQUxMIiwicHJpdmF0ZURhdGEiLCJzaGFyZWREYXRhIiwic29ydEtleXNPbmx5UmVjdXJzaXZlIiwic29ydCIsInJlZHVjZSIsImFjYyIsIkRldGVybWluaXN0aWNTZXJpYWxpemVyIiwiZXJyb3IiLCJzZWxmIiwibyIsImNhbGwiLCJyZWxhdGlvbnMiLCJnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZSIsInBhcnNlRXZlbnROYW1lIiwicGFydHMiLCJzcGxpdCIsInN1YiIsInNhZmVQYXJzZUludCIsInN0cmluZyIsImRpZ2l0UmVnZXgiLCJ0ZXN0IiwicGFyc2VkaW50IiwicGFyc2VJbnQiLCJpc05hTiIsIlNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyIiwicHV0QW5jaG9yIiwicHJlU2VyaWFsaXphdGlvbiIsIkZhYnJpY0lkZW50aXR5U2VydmljZSIsIkNsaWVudEJhc2VkU2VydmljZSIsInJvb3RDbGllbnQiLCJfdXNlciIsImNlcnRpZmljYXRlcyIsImFmZmlsaWF0aW9ucyIsImdldFVzZXIiLCJjZmciLCJJTklUSUFMSVpBVElPTiIsImdldE5hbWUiLCJ1cGRhdGVJZGVudGl0eSIsImlkZW50aXR5UmVxdWVzdCIsImNhVXNlcklkZW50aXR5IiwicmVlbnJvbGxVc2VyIiwiY3JlYXRlVXNlciIsImdldE1zcGlkIiwiZW5yb2xsbWVudEF0dHJzIiwib3B0aW9uYWwiLCJyZWVucm9sbCIsInJlbmV3ZWRJZGVudGl0eSIsInJldm9rZU9wdGlvbnMiLCJyZXZva2VSZXF1ZXN0IiwiQ0FfUk9MRSIsIkRlZmF1bHRGYWJyaWNDbGllbnRGbGFncyIsImV2YWx1YXRlVGltZW91dCIsImVuZG9yc2VUaW1lb3V0Iiwic3VibWl0VGltZW91dCIsImNvbW1pdFRpbWVvdXQiLCJhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3MiLCJhbGxvd0dhdGV3YXlPdmVycmlkZSIsImVuY3J5cHRUcmFuc2llbnQiLCJzeW50aGV0aWNFdmVudHMiLCJlc2NhcGVSZWdFeHAiLCJuZXh0TGV4aWNvZ3JhcGhpY1N0cmluZyIsImNoYXJzIiwiY29kZVBvaW50QXQiLCJmcm9tQ29kZVBvaW50IiwicHJlZml4UmFuZ2UiLCJzdGFydCIsImVuZCIsIkZhYnJpY0NsaWVudFN0YXRlbWVudCIsIlN0YXRlbWVudCIsInNxdWFzaCIsInNxdWFzaGVkIiwibWV0aG9kIiwiZXhlY3V0ZVByZXBhcmVkIiwiYXJneiIsImZvck1vZGVsIiwiZnJvbVNlbGVjdG9yIiwiYWxpYXMiLCJRVUVSWSIsImlzU2ltcGxlUXVlcnkiLCJRdWVyeUNsYXVzZSIsIndoZXJlQ29uZGl0aW9uIiwicGFyc2VkIiwicHJlcGFyZUNvbmRpdGlvbiIsInNlbGVjdFNlbGVjdG9yIiwiU0VMRUNUIiwiQU5EIiwidG9Mb3dlckNhc2UiLCJvcmRlckJ5U2VsZWN0b3JzIiwiT1JERVJfQlkiLCJ0b0NhbWVsQ2FzZSIsInByb2Nlc3NSZWNvcmQiLCJwa0F0dHIiLCJJRCIsImtleUFyZ3MiLCJTRVBBUkFUT1IiLCJyYXciLCJyYXdJbnB1dCIsImFnZ3JlZ2F0b3IiLCJhZ2dyZWdhdGVJbmZvIiwiYWdncmVnYXRlIiwiZXhlY3V0ZUFnZ3JlZ2F0ZSIsInJlc3VsdHMiLCJwcm9jZXNzZWQiLCJhcHBseUFmdGVySGFuZGxlcnNUb1Jlc3VsdCIsImFnZ3JlZ2F0ZVF1ZXJ5IiwiYnVpbGRBZ2dyZWdhdGVRdWVyeSIsInNlbGVjdG9ycyIsInNlbGVjdG9yIiwiZmllbGRzIiwicGFyc2VDb25kaXRpb24iLCJDb25kaXRpb24iLCJhbmQiLCJlcSIsInNlbGVjdG9yS2V5cyIsIkNvdWNoREJHcm91cE9wZXJhdG9yIiwiaW5kZXhPZiIsInZhbCIsIk9SIiwicyIsImVudHJpZXMiLCJ3YXJuIiwic2VsZWN0b3JLZXkiLCJyZWMiLCJDb3VjaERCT3BlcmF0b3IiLCJCSUdHRVIiLCJsaW1pdFNlbGVjdG9yIiwiQ291Y2hEQlF1ZXJ5TGltaXQiLCJvZmZzZXRTZWxlY3RvciIsInNraXAiLCJtZXJnZSIsIm9wIiwib2JqMSIsIm9iajIiLCJhdHRyMSIsIm9wZXJhdG9yIiwiY29tcGFyaXNvbiIsIk9wZXJhdG9yIiwiU1RBUlRTX1dJVEgiLCJRdWVyeUVycm9yIiwicmFuZ2UiLCJCSUdHRVJfRVEiLCJTTUFMTEVSIiwiRU5EU19XSVRIIiwiUkVHRVhQIiwiQkVUV0VFTiIsIm1heCIsIm9wQmV0d2VlbiIsInRyYW5zbGF0ZU9wZXJhdG9ycyIsIlNNQUxMRVJfRVEiLCJHcm91cE9wZXJhdG9yIiwiTk9UIiwib3AxIiwib3AyIiwiYXZnU2VsZWN0b3IiLCJzdW1JbmZvIiwiY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvciIsImNvdW50SW5mbyIsImNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5Iiwia2luZCIsInN1bURlc2NyaXB0b3IiLCJjb3VudERlc2NyaXB0b3IiLCJjb3VudERpc3RpbmN0U2VsZWN0b3IiLCJjb3VudERpc3RpbmN0IiwiYWdncmVnYXRvclVzZWQiLCJjb3VudFNlbGVjdG9yIiwibWluU2VsZWN0b3IiLCJtYXhTZWxlY3RvciIsInN1bVNlbGVjdG9yIiwiZGlzdGluY3RTZWxlY3RvciIsImFnZ3JlZ2F0b3JDaGVja3MiLCJtZXRhcyIsImZpbmRWaWV3TWV0YWRhdGEiLCJ2aWV3TmFtZSIsImdlbmVyYXRlVmlld05hbWUiLCJkZG9jIiwiZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lIiwicmV0dXJuRG9jcyIsInZpZXciLCJnZXRGYWJyaWNBZGFwdGVyIiwiaXNWaWV3QWdncmVnYXRlIiwiaGFuZGxlQXZlcmFnZSIsImZhYnJpY0FkYXB0ZXIiLCJ2aWV3SW5mbyIsInByb2Nlc3NWaWV3UmVzcG9uc2UiLCJzdW1EZXNjIiwiY291bnREZXNjIiwic3VtUmVzcG9uc2UiLCJjb3VudFJlc3BvbnNlIiwic3VtIiwicm93cyIsInJvdyIsIkZhYnJpY0NsaWVudEFkYXB0ZXIiLCJBZGFwdGVyIiwib3BlcmF0aW9uIiwibWVyZ2VkRmxhZ3MiLCJzaWxseSIsInBvcCIsInRvT3ZlcnJpZGVzIiwibmV3Q3R4IiwicGFyZW50Q29udGV4dCIsImNoaWxkQ29udGV4dHMiLCJjdXJyZW50T3AiLCJjdXJyZW50TW9kZWwiLCJyZXBvc2l0b3J5IiwiY3JlYXRlUHJlZml4IiwidXBkYXRlQWxsUHJlZml4Iiwic2hpZnQiLCJoYXNUcmFuc2llbnQiLCJuZWVkc0Z1bGxQYXlsb2FkIiwic2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uIiwidHJhbnNpZW50UGF5bG9hZCIsIkJ1bGtDcnVkT3BlcmF0aW9uS2V5cyIsIkNSRUFURV9BTEwiLCJnZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zIiwicmVzIiwic2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUiLCJSRUFEX0FMTCIsIlVQREFURV9BTEwiLCJkZWxldGVBbGwiLCJzaG91bGRIeWRyYXRlIiwiREVMRVRFX0FMTCIsIk1FVEFEQVRBIiwibWlycm9yTXNwIiwibXNwcyIsIm1lcmdlZCIsImVuZG9yc2luZ09yZ3MiLCJlbmRvcnNpbmdPcmdhbml6YXRpb25zIiwic2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQiLCJ2IiwiY2hpbGRSZWJ1aWxkIiwiZ2V0RnJvbUNoaWxkcmVuIiwicmVzb2x2ZWRPcCIsInJlc29sdmVPcGVyYXRpb24iLCJoYXNJZCIsImRpcmVjdCIsImRlc2VyaWFsaXplZCIsInVwZGF0ZVByZWZpeCIsIlVQREFURSIsIkRFTEVURSIsImRvY3NPbmx5IiwidHJhbnNhY3Rpb25SZXN1bHQiLCJwYXJzZVJlY29yZCIsImlzTW9kZWwiLCJlbCIsImdldENsaWVudCIsIl9jbGllbnQiLCJHYXRld2F5IiwiZ2V0R2F0ZXdheSIsImdldENvbnRyYWN0TmFtZSIsIkNvbnRyYWN0IiwiY29udHJhY3ROYW1lIiwiZ2V0Q29udHJhY3QiLCJ0cmFuc2FjdGlvbiIsImFwaSIsInN1Ym1pdCIsInRyYW5zaWVudERhdGEiLCJnYXRld2F5IiwiY29udHJhY3QiLCJldmFsdWF0ZSIsInByb3Bvc2FsT3B0aW9ucyIsImFyZ3VtZW50cyIsImNsb3NlIiwic2hvdWxkVXNlTGVnYWN5R2F0ZXdheSIsInByZXBhcmVMZWdhY3lBcmdzIiwiYnVpbGRMZWdhY3lUcmFuc2llbnQiLCJyZXNvbHZlTGVnYWN5TXNwQ291bnQiLCJjb25maWd1cmVkIiwibGVnYWN5TXNwQ291bnQiLCJpc0Zpbml0ZSIsImZsb29yIiwicGlja0xlZ2FjeUNhbmRpZGF0ZXMiLCJjYW5kaWRhdGVzIiwiYXZhaWxhYmxlIiwicGlja2VkIiwiaWR4IiwicmFuZG9tIiwic2VsZWN0aW9uIiwic3BsaWNlIiwiYnVpbGRMZWdhY3lQZWVyQ29uZmlncyIsInBlZXJzIiwicGVlckVuZHBvaW50IiwicGVlckhvc3RBbGlhcyIsInRsc0NlcnQiLCJlbmRvcnNlcnMiLCJvcmciLCJleHRyYXMiLCJtc3BNYXAiLCJsZWdhY3lDb3VudCIsInNlbGVjdGlvbnMiLCJjaG9pY2UiLCJlbmRwb2ludCIsInN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyIsImZjbiIsInRyYW5zaWVudE1hcCIsInBlZXJDb25maWdzIiwibm9ybWFsaXplTGVnYWN5UGVlcnMiLCJpZGVudGl0eU1hdGVyaWFsIiwicmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwiLCJ3YWxsZXQiLCJXYWxsZXRzIiwibmV3SW5NZW1vcnlXYWxsZXQiLCJpZGVudGl0eUxhYmVsIiwiY29ubmVjdGlvblByb2ZpbGUiLCJidWlsZExlZ2FjeUNvbm5lY3Rpb25Qcm9maWxlIiwiTGVnYWN5R2F0ZXdheSIsImNvbm5lY3QiLCJkaXNjb3ZlcnkiLCJlbmFibGVkIiwiYXNMb2NhbGhvc3QiLCJzaG91bGRUcmVhdFBlZXJzQXNMb2NhbGhvc3QiLCJ0bHNJbmZvIiwibmV0d29yayIsImdldE5ldHdvcmsiLCJjaGFubmVsIiwiY2hhaW5jb2RlTmFtZSIsImNyZWF0ZVRyYW5zYWN0aW9uIiwic2V0VHJhbnNpZW50IiwicGVlciIsImdldENoYW5uZWwiLCJnZXRFbmRvcnNlciIsImVuZG9yc2VyIiwic2V0RW5kb3JzaW5nUGVlcnMiLCJkaXNjb25uZWN0IiwiZGVkdXBlZCIsIk1hcCIsImFkZFBlZXIiLCJoYXMiLCJyZWFkUGVtSW5wdXQiLCJjZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aCIsImtleUNlcnRPckRpcmVjdG9yeVBhdGgiLCJwZWVyRW50cmllcyIsImNoYW5uZWxQZWVycyIsIm9yZ3MiLCJ0bHNQZW0iLCJob3N0bmFtZSIsImV4dHJhY3RIb3N0IiwiZW5zdXJlR3JwY1VybCIsInRsc0NBQ2VydHMiLCJncnBjT3B0aW9ucyIsImhvc3RuYW1lT3ZlcnJpZGUiLCJlbmRvcnNpbmdQZWVyIiwiY2hhaW5jb2RlUXVlcnkiLCJsZWRnZXJRdWVyeSIsImV2ZW50U291cmNlIiwib3JnYW5pemF0aW9uIiwib3JnYW5pemF0aW9ucyIsIm9yZGVyZXJzIiwiY2hhbm5lbHMiLCJldmVyeSIsImlzTG9jYWxFbmRwb2ludCIsImhvc3QiLCJzYW5pdGl6ZWQiLCJpc0J1ZmZlciIsInRyaW1tZWQiLCJzdGF0cyIsInN0YXQiLCJjYXRjaCIsImlzRGlyZWN0b3J5IiwicmVhZEZzRmlsZSIsImVyciIsImxlZ2FjeUFyZ3MiLCJzaHV0ZG93biIsImNoYW5uZWxOYW1lIiwiZ2V0Q29ubmVjdGlvbiIsInBhdGhPckNlcnQiLCJyZWFkRmlsZVN5bmMiLCJ0bHNDcmVkZW50aWFscyIsImdycGMiLCJjcmVhdGVTc2wiLCJzaXplTGltaXQiLCJzaWduZXIiLCJldmFsdWF0ZU9wdGlvbnMiLCJkZWFkbGluZSIsImVuZG9yc2VPcHRpb25zIiwic3VibWl0T3B0aW9ucyIsImNvbW1pdFN0YXR1c09wdGlvbnMiLCJQcm94eSIsInRoaXNBcmciLCJhcmdBcnJheSIsIlJlZmxlY3QiLCJEaXNwYXRjaCIsIkdhdGV3YXlFcnJvciIsImRldGFpbHMiLCJFbmRvcnNlRXJyb3IiLCJCYWRSZXF1ZXN0RXJyb3IiLCJQYWdpbmdFcnJvciIsIk1pZ3JhdGlvbkVycm9yIiwiT2JzZXJ2ZXJFcnJvciIsIkZvcmJpZGRlbkVycm9yIiwiQ29ubmVjdGlvbkVycm9yIiwiZmluYWwiLCJEIiwiX2EiLCJkZWNvcmF0aW9uIiwic2V0Q3VycmVudCIsIkZhYnJpY0NsaWVudERpc3BhdGNoIiwibG9nZ2VkQXJncyIsIlNIVVRET1dOIiwibGlzdGVuaW5nU3RhY2siLCJwYXJzZVBheWxvYWQiLCJqc29uQnl0ZXMiLCJqc29uIiwib2JzZXJ2ZSIsIm9ic2VydmVyIiwidW5PYnNlcnZlIiwicmVmcmVzaCIsImhhbmRsZUV2ZW50cyIsImN0eEFyZyIsImNvcnJlbGF0aW9uSWQiLCJldnQiLCJldmVudE5hbWUiLCJtc3BFdmVudE9ubHkiLCJ0YXJnZXRNb2RlbCIsIm1vZGVsUmVmIiwib2JzZXJ2ZXJBcmdzIiwiZ2V0Q2hhaW5jb2RlRXZlbnRzIiwidG9XcmFwIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwicHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsImJ1bGtUb1NpbmdsZSIsInJlc3VsdEFyZ3MiLCJWRVJTSU9OIiwiUEFDS0FHRV9OQU1FIiwicmVnaXN0ZXJMaWJyYXJ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXQSxTQUFTQSx5QkFBeUJDO0lBRWhDLE1BQU1DLEtBQUtDLFFBQVE7SUFFbkIsTUFBTUMsT0FBT0QsUUFBUTtJQUNyQixNQUFNRSxVQUFrQkQsS0FBS0MsUUFBUUo7SUFDckMsSUFBSUMsR0FBR0ksV0FBV0QsVUFBVTtRQUMxQixPQUFPO0FBQ1Q7SUFDQUwseUJBQXlCSztJQUN6QkgsR0FBR0ssVUFBVUY7QUFDZjs7QUFFTSxTQUFVRyxxQkFDZEM7SUFFQSxPQUFPQyxnQkFBZ0IsRUFBQ0Q7QUFDMUI7O0FBRU0sU0FBVUUsd0JBQ2RGLEdBQ0FHO0lBRUEsTUFBTUMsUUFBUUMsY0FBYyxFQUFDTDtJQUM3QixNQUFNTSxVQUE0Q0gsU0FBUyxDQUFBO0lBQzNEQyxNQUFNRyxRQUFTQztRQUNiRixRQUFRRSxJQUFJQyxPQUFPRDs7SUFFckIsT0FBT0o7QUFDVDs7QUFFTSxTQUFVTSxjQUFjQztJQUU1QixNQUFNaEIsT0FBT0QsUUFBUTtJQUVyQixNQUFNa0IsWUFBVWxCLFFBQVFDLEtBQUtrQixLQUFLQyxRQUFRQyxPQUFPSixL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
3894
+ //# 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+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHN0dWIgfSA9IGNvbnRleHQgYXMgYW55O1xuXG4gIGNvbnN0IGFsbG93R2VuZXJhdGlvbk92ZXJyaWRlID1cbiAgICBjb250ZXh0LmdldE9yVW5kZWZpbmVkKFwiYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGVcIikgfHwgZmFsc2U7XG5cbiAgY29uc3QgY3JlYXRvciA9IGF3YWl0IHN0dWIuZ2V0Q3JlYXRvcigpO1xuICBsZXQgb3duZXIgPSBjcmVhdG9yLm1zcGlkO1xuICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgIGBFeHBlY3RlZCBtc3BpZCB0byBiZSAke21vZGVsW2tleV19IHwgJHtvd25lcn0uIFxcbiBVc2luZyBhbGxvd0dlbmVyYXRpb25PdmVycmlkZTogJHthbGxvd0dlbmVyYXRpb25PdmVycmlkZX1gXG4gICk7XG5cbiAgaWYgKGFsbG93R2VuZXJhdGlvbk92ZXJyaWRlKSBvd25lciA9IG1vZGVsW2tleV0gPyBtb2RlbFtrZXldIDogb3duZXI7XG5cbiAgY29uc3Qgc2V0T3duZWRCeUtleVZhbHVlID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgdGFyZ2V0OiBNLFxuICAgIHByb3BlcnR5S2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludFxuICApIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICB9KTtcbiAgfTtcblxuICBzZXRPd25lZEJ5S2V5VmFsdWUobW9kZWwsIGtleSBhcyBzdHJpbmcsIG93bmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG93bmVkQnkoKSB7XG4gIGZ1bmN0aW9uIG93bmVkQnkoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmo6IGFueSwgYXR0cmlidXRlPzogYW55KSB7XG4gICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgIHJlcXVpcmVkKCksXG4gICAgICAgIGdlbmVyYXRlZCgpLFxuICAgICAgICByZWFkb25seSgpLFxuICAgICAgICBvbkNyZWF0ZShvd25lZEJ5T25DcmVhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoXG4gICAgICAgICAgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsIEZhYnJpY01vZGVsS2V5cy5PV05FRF9CWSksXG4gICAgICAgICAgYXR0cmlidXRlXG4gICAgICAgIClcbiAgICAgICkob2JqLCBhdHRyaWJ1dGUpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLk9XTkVEX0JZKVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBvd25lZEJ5LFxuICAgICAgYXJnczogW10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYW5zYWN0aW9uSWRPbkNyZWF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBSIGV4dGVuZHMgUmVwbzxNPixcbiAgVixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHRPZjxSPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc3R1YiB9ID0gY29udGV4dCBhcyBhbnk7XG4gIG1vZGVsW2tleV0gPSBzdHViLmdldFR4SUQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zYWN0aW9uSWQoKSB7XG4gIGZ1bmN0aW9uIHRyYW5zYWN0aW9uSWQoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmo6IGFueSwgYXR0cmlidXRlPzogYW55KSB7XG4gICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgIHJlcXVpcmVkKCksXG4gICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgIG9uQ3JlYXRlKHRyYW5zYWN0aW9uSWRPbkNyZWF0ZSksXG4gICAgICAgIG9uVXBkYXRlKHRyYW5zYWN0aW9uSWRPbkNyZWF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YShcbiAgICAgICAgICBNZXRhZGF0YS5rZXkoXG4gICAgICAgICAgICBGYWJyaWNNb2RlbEtleXMuRkFCUklDLFxuICAgICAgICAgICAgYXR0cmlidXRlLFxuICAgICAgICAgICAgRmFicmljTW9kZWxLZXlzLlRSQU5TQUNUSU9OX0lEXG4gICAgICAgICAgKSxcbiAgICAgICAgICBhdHRyaWJ1dGVcbiAgICAgICAgKVxuICAgICAgKShvYmosIGF0dHJpYnV0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuVFJBTlNBQ1RJT05fSUQpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHRyYW5zYWN0aW9uSWQsXG4gICAgICBhcmdzOiBbXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgdHlwZSBNaXJyb3JDb25kaXRpb24gPSAobXNwOiBzdHJpbmcpID0+IGJvb2xlYW47XG5cbmV4cG9ydCB0eXBlIE1pcnJvck1ldGFkYXRhID0ge1xuICBjb25kaXRpb24/OiBNaXJyb3JDb25kaXRpb247XG4gIHJlc29sdmVyOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmc7XG4gIG1zcElkOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXZhbE1pcnJvck1ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNLFxuICByZXNvbHZlcjogdW5kZWZpbmVkIHwgc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyLFxuICBjdHg6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz5cbikge1xuICBsZXQgY29sbGVjdGlvbjogQ29sbGVjdGlvblJlc29sdmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkID0gcmVzb2x2ZXI7XG4gIGlmICh0eXBlb2YgY29sbGVjdGlvbiAhPT0gXCJzdHJpbmdcIikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvd25lciA9XG4gICAgICAgIE1vZGVsLm93bmVyT2YobW9kZWwpIHx8IGN0eC5nZXQoXCJzdHViXCIpLmdldENyZWF0b3IoKS50b1N0cmluZygpO1xuICAgICAgaWYgKHJlc29sdmVyICYmIHR5cGVvZiByZXNvbHZlciA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBjb2xsZWN0aW9uID0gYXdhaXQgcmVzb2x2ZXIobW9kZWwsIG93bmVyLCBjdHgpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gcmVzb2x2ZSBjb2xsZWN0aW9uIG1pcnJvciBuYW1lOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb2xsZWN0aW9uIHx8IHR5cGVvZiBjb2xsZWN0aW9uICE9PSBcInN0cmluZ1wiKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE5vIGNvbGxlY3Rpb24gZm91bmQgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuICByZXR1cm4gY29sbGVjdGlvbjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU1pcnJvckhhbmRsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29sbGVjdGlvbiA9IGF3YWl0IGV2YWxNaXJyb3JNZXRhZGF0YShtb2RlbCwgZGF0YS5yZXNvbHZlciwgY29udGV4dCk7XG4gIGNvbnN0IGZhYnJpY0N0eCA9IGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0O1xuICBjb25zdCBzb3VyY2VNb2RlbCA9IG1vZGVsO1xuICAvLyBQdXQgbWlycm9yIGZsYWdzIGRpcmVjdGx5IG9uIGNvbnRleHQgc28gYWRhcHRlci5wcmVwYXJlKCkgYW5kIGFkYXB0ZXIuY3JlYXRlKCkgY2FuIHNlZSB0aGVtXG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBtaXJyb3JDb2xsZWN0aW9uOiBjb2xsZWN0aW9uLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgIH0gYXMgYW55KVxuICAgICk7XG4gICAgY29uc3QgbWlycm9yID0gYXdhaXQgcmVwby5jcmVhdGUoc291cmNlTW9kZWwsIGNvbnRleHQpO1xuICAgIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgICBgTWlycm9yIGZvciAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gY3JlYXRlZCB3aXRoICR7TW9kZWwucGsobW9kZWwpIGFzIHN0cmluZ306ICR7bWlycm9yW01vZGVsLnBrKG1vZGVsKV19YFxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gQ2xlYW4gdXAgbWlycm9yIGZsYWdzIGZyb20gY29udGV4dFxuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZU1pcnJvckhhbmRsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29sbGVjdGlvbiA9IGF3YWl0IGV2YWxNaXJyb3JNZXRhZGF0YShtb2RlbCwgZGF0YS5yZXNvbHZlciwgY29udGV4dCk7XG4gIGNvbnN0IGZhYnJpY0N0eCA9IGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0O1xuICBjb25zdCBzb3VyY2VNb2RlbCA9IG1vZGVsO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG8gPSB0aGlzLm92ZXJyaWRlKFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgKHRoaXMgYXMgYW55KS5fb3ZlcnJpZGVzLCB7XG4gICAgICAgIG1pcnJvcjogdHJ1ZSxcbiAgICAgICAgbWlycm9yQ29sbGVjdGlvbjogY29sbGVjdGlvbixcbiAgICAgICAgaWdub3JlVmFsaWRhdGlvbjogdHJ1ZSxcbiAgICAgICAgaWdub3JlSGFuZGxlcnM6IHRydWUsXG4gICAgICAgIGFwcGx5VXBkYXRlVmFsaWRhdGlvbjogZmFsc2UsXG4gICAgICAgIG1lcmdlRm9yVXBkYXRlOiBmYWxzZSxcbiAgICAgIH0gYXMgYW55KVxuICAgICk7XG4gICAgYXdhaXQgcmVwby51cGRhdGUoc291cmNlTW9kZWwsIGNvbnRleHQpO1xuICAgIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgICBgTWlycm9yIGZvciAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gdXBkYXRlZDogJHsobW9kZWwgYXMgYW55KVtNb2RlbC5wayhtb2RlbCldfWBcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU1pcnJvckhhbmRsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29sbGVjdGlvbiA9IGF3YWl0IGV2YWxNaXJyb3JNZXRhZGF0YShtb2RlbCwgZGF0YS5yZXNvbHZlciwgY29udGV4dCk7XG4gIGNvbnN0IGZhYnJpY0N0eCA9IGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0O1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICBmYWJyaWNDdHgucHV0KFwic2VncmVnYXRlZFwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIHRyeSB7XG4gICAgY29uc3QgcGtQcm9wID0gTW9kZWwucGsobW9kZWwpIGFzIGtleW9mIE07XG4gICAgY29uc3QgaWQgPSBtb2RlbFtwa1Byb3BdO1xuICAgIGNvbnN0IHJlcG8gPSB0aGlzLm92ZXJyaWRlKFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgKHRoaXMgYXMgYW55KS5fb3ZlcnJpZGVzLCB7XG4gICAgICAgIHNlZ3JlZ2F0ZWQ6IGNvbGxlY3Rpb24sXG4gICAgICAgIG1pcnJvcjogdHJ1ZSxcbiAgICAgICAgaWdub3JlVmFsaWRhdGlvbjogdHJ1ZSxcbiAgICAgICAgaWdub3JlSGFuZGxlcnM6IHRydWUsXG4gICAgICB9IGFzIGFueSlcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCByZXBvLmRlbGV0ZShpZCBhcyBhbnksIGNvbnRleHQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWF5IGFscmVhZHkgYmUgZGVsZXRlZCBieSBhZGFwdGVyLmRlbGV0ZVNlZ3JlZ2F0ZWRDb2xsZWN0aW9uc1xuICAgIH1cbiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgICAgYE1pcnJvciBmb3IgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGRlbGV0ZWQ6ICR7U3RyaW5nKGlkKX1gXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJzZWdyZWdhdGVkXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtaXJyb3JXcml0ZUd1YXJkPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBrZXk6IGtleW9mIE0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBtc3AgPSBleHRyYWN0TXNwSWQoXG4gICAgY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSBhcyBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuICApO1xuICBpZiAoIW1zcCkgcmV0dXJuO1xuICBpZiAobXNwID09PSBkYXRhLm1zcElkIHx8IChkYXRhLmNvbmRpdGlvbiAmJiBkYXRhLmNvbmRpdGlvbihtc3ApKSkge1xuICAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgICBgT3JnYW5pemF0aW9uICR7bXNwfSBpcyBub3QgYXV0aG9yaXplZCB0byBtb2RpZnkgbWlycm9yZWQgZGF0YWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBtc3AgPSBleHRyYWN0TXNwSWQoXG4gICAgY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSBhcyBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuICApO1xuXG4gIGlmICghbXNwKSByZXR1cm47XG5cbiAgY29uc3QgY29sbGVjdGlvbiA9IGF3YWl0IGV2YWxNaXJyb3JNZXRhZGF0YShtb2RlbCwgZGF0YS5yZXNvbHZlciwgY29udGV4dCk7XG4gIGNvbnN0IGZhYnJpY0N0eCA9IGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0O1xuICBjb25zdCBtYXRjaGVzID0gbXNwID09PSBkYXRhLm1zcElkIHx8IChkYXRhLmNvbmRpdGlvbiAmJiBkYXRhLmNvbmRpdGlvbihtc3ApKTtcblxuICBpZiAobWF0Y2hlcykge1xuICAgIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgICBgTWlycm9yIHJlYWQ6IE1TUCAke21zcH0gbWF0Y2hlcywgcm91dGluZyByZWFkcyB0byBtaXJyb3IgY29sbGVjdGlvbiAke2NvbGxlY3Rpb259YFxuICAgICk7XG4gICAgLy8gUm91dGUgcmVhZHMgZXhjbHVzaXZlbHkgdGhyb3VnaCB0aGUgbWlycm9yIGNvbGxlY3Rpb25cbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gICAgZmFicmljQ3R4LnB1dChcImZ1bGx5U2VncmVnYXRlZFwiLCB0cnVlKTtcbiAgICBmYWJyaWNDdHgucmVhZEZyb20oY29sbGVjdGlvbik7XG4gIH1cbiAgLy8gV2hlbiBNU1AgZG9lcyBOT1QgbWF0Y2gsIG5vcm1hbCByZWFkIGZsb3cg4oCUIGFsbCBkYXRhIGlzIGluIHB1YmxpYyBzdGF0ZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWlycm9yKFxuICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcsXG4gIG1zcElkT3JDb25kaXRpb24/OiBzdHJpbmcgfCBNaXJyb3JDb25kaXRpb24sXG4gIGNvbmRpdGlvbj86IE1pcnJvckNvbmRpdGlvblxuKSB7XG4gIGNvbnN0IGlzQ29uZGl0aW9uT25seSA9XG4gICAgdHlwZW9mIG1zcElkT3JDb25kaXRpb24gIT09IFwic3RyaW5nXCIgJiYgQm9vbGVhbihtc3BJZE9yQ29uZGl0aW9uKTtcbiAgY29uc3QgbXNwSWQgPSBpc0NvbmRpdGlvbk9ubHlcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogKG1zcElkT3JDb25kaXRpb24gYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcbiAgY29uc3QgY29uZCA9IGlzQ29uZGl0aW9uT25seVxuICAgID8gKG1zcElkT3JDb25kaXRpb24gYXMgTWlycm9yQ29uZGl0aW9uKVxuICAgIDogY29uZGl0aW9uO1xuXG4gIGZ1bmN0aW9uIG1pcnJvcihcbiAgICByZXNvbHZlcjogQ29sbGVjdGlvblJlc29sdmVyIHwgc3RyaW5nLFxuICAgIG1zcElkOiBzdHJpbmcsXG4gICAgY29uZGl0aW9uPzogTWlycm9yQ29uZGl0aW9uXG4gICkge1xuICAgIGNvbnN0IG1ldGE6IE1pcnJvck1ldGFkYXRhID0ge1xuICAgICAgY29uZGl0aW9uOiBjb25kaXRpb24sXG4gICAgICBtc3BJZDogbXNwSWQsXG4gICAgICByZXNvbHZlcjogcmVzb2x2ZXIsXG4gICAgfTtcbiAgICByZXR1cm4gYXBwbHkoXG4gICAgICBtZXRhZGF0YShcbiAgICAgICAgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsIEZhYnJpY01vZGVsS2V5cy5NSVJST1IpLFxuICAgICAgICBtZXRhXG4gICAgICApLFxuICAgICAgLy8gUmVhZCBoYW5kbGVyIHJ1bnMgZWFybHkgKHByaW9yaXR5IDMwKSB0byBzZXQgdXAgY29udGV4dCBiZWZvcmUgYW55IHJlYWRzXG4gICAgICBvblJlYWQocmVhZE1pcnJvckhhbmRsZXIgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAzMCB9KSxcbiAgICAgIC8vIFdyaXRlIGd1YXJkcyDigJQgcmVqZWN0IG1hdGNoaW5nIE1TUHMgYmVmb3JlIGFueSBwcm9jZXNzaW5nXG4gICAgICBvbkNyZWF0ZShtaXJyb3JXcml0ZUd1YXJkIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMjAgfSksXG4gICAgICBvblVwZGF0ZShtaXJyb3JXcml0ZUd1YXJkIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMjAgfSksXG4gICAgICBvbkRlbGV0ZShtaXJyb3JXcml0ZUd1YXJkIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMjAgfSksXG4gICAgICAvLyBNaXJyb3Igc3luYyBoYW5kbGVycyDigJQgd3JpdGUgZnVsbCBtb2RlbCBhZnRlciBvdGhlciBoYW5kbGVycyAocHJpb3JpdHkgMTAwKVxuICAgICAgb25DcmVhdGUoY3JlYXRlTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDEwMCB9KSxcbiAgICAgIG9uVXBkYXRlKHVwZGF0ZU1pcnJvckhhbmRsZXIgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAxMDAgfSksXG4gICAgICBvbkRlbGV0ZShkZWxldGVNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMTAwIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuTUlSUk9SKVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBtaXJyb3IsXG4gICAgICBhcmdzOiBbY29sbGVjdGlvbiwgbXNwSWQsIGNvbmRdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25SZXNvbHZlciA9IDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuICBtc3A/OiBzdHJpbmcsXG4gIC4uLmFyZ3M6IGFueVtdXG4pID0+IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IE1vZGVsQ29sbGVjdGlvbjogQ29sbGVjdGlvblJlc29sdmVyID0gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIG1zcElkPzogc3RyaW5nXG4pID0+IHtcbiAgY29uc3Qgb3JnTmFtZSA9XG4gICAgbXNwSWQgfHwgKHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gTW9kZWwub3duZXJPZihtb2RlbCkgOiB1bmRlZmluZWQpO1xuICBjb25zdCBjb25zdHIgPSB0eXBlb2YgbW9kZWwgPT09IFwiZnVuY3Rpb25cIiA/IG1vZGVsIDogbW9kZWwuY29uc3RydWN0b3I7XG4gIGlmICghb3JnTmFtZSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBNb2RlbCAke2NvbnN0ci5uYW1lfSBpcyBub3Qgb3duZWQgYnkgYW55IG9yZ2FuaXphdGlvbi4gZGlkIHlvdSB1c2UgQG93bmVkQnkoKSAob3IgcHJvdmlkZSB0aGUgbmFtZSk/YFxuICAgICk7XG4gIHJldHVybiBgJHt0b1Bhc2NhbENhc2UoY29uc3RyLm5hbWUpfSR7b3JnTmFtZSA/IHRvUGFzY2FsQ2FzZShvcmdOYW1lKSA6IFwiXCJ9YDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBOYW1lc3BhY2VDb2xsZWN0aW9uKG5hbWVzcGFjZTogc3RyaW5nKTogQ29sbGVjdGlvblJlc29sdmVyIHtcbiAgcmV0dXJuIDxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sIG1zcElkPzogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgb3JnTmFtZSA9XG4gICAgICBtc3BJZCB8fCAodHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyBNb2RlbC5vd25lck9mKG1vZGVsKSA6IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgY29uc3RyID0gdHlwZW9mIG1vZGVsID09PSBcImZ1bmN0aW9uXCIgPyBtb2RlbCA6IG1vZGVsLmNvbnN0cnVjdG9yO1xuICAgIGlmICghb3JnTmFtZSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTW9kZWwgJHtjb25zdHIubmFtZX0gaXMgbm90IG93bmVkIGJ5IGFueSBvcmdhbml6YXRpb24uIGRpZCB5b3UgdXNlIEBvd25lZEJ5KCkgKG9yIHByb3ZpZGUgdGhlIG5hbWUpP2BcbiAgICAgICk7XG4gICAgcmV0dXJuIGAke25hbWVzcGFjZX0ke29yZ05hbWUgPyB0b1Bhc2NhbENhc2Uob3JnTmFtZSkgOiBcIlwifWA7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBJbXBsaWNpdFByaXZhdGVDb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgPSA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwSWQ/OiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBvcmdOYW1lID1cbiAgICBtc3BJZCB8fCAodHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyBNb2RlbC5vd25lck9mKG1vZGVsKSA6IHVuZGVmaW5lZCk7XG4gIGlmICghb3JnTmFtZSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBNb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9IGlzIG5vdCBvd25lZCBieSBhbnkgb3JnYW5pemF0aW9uLiBkaWQgeW91IHVzZSBAb3duZWRCeSgpIChvciBwcm92aWRlIHRoZSBuYW1lKT9gXG4gICAgKTtcbiAgcmV0dXJuIGBfXyR7dG9QYXNjYWxDYXNlKG9yZ05hbWUpfVByaXZhdGVDb2xsZWN0aW9uYDtcbn07XG5cbmV4cG9ydCB0eXBlIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgPSB7XG4gIGNvbGxlY3Rpb25zOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXI7XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcmlvcml0eSBmb3IgZWFybHkgY29sbGVjdGlvbiBleHRyYWN0aW9uIChiZWZvcmUgcGsgZ2VuZXJhdGlvbiBhdCBwcmlvcml0eSA2MClcbiAqIEBzdW1tYXJ5IFRoaXMgcHJpb3JpdHkgZW5zdXJlcyBjb2xsZWN0aW9ucyBhcmUgcmVnaXN0ZXJlZCBpbiBjb250ZXh0IGJlZm9yZSBhbnkgc2VxdWVuY2VcbiAqIG9wZXJhdGlvbnMgb2NjdXIsIGFsbG93aW5nIHNlcXVlbmNlcyB0byBiZSByZXBsaWNhdGVkIHRvIHByaXZhdGUvc2hhcmVkIGNvbGxlY3Rpb25zLlxuICovXG5leHBvcnQgY29uc3QgU0VHUkVHQVRFRF9DT0xMRUNUSU9OX0VYVFJBQ1RJT05fUFJJT1JJVFkgPSAzNTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U2VncmVnYXRpb25GbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogTSxcbiAgY29sbGVjdGlvbnM6IHN0cmluZ1tdLFxuICBjdHg6IGFueVxuKSB7XG4gIC8vIFJlZ2lzdGVyIGNvbGxlY3Rpb25zIGVhcmx5IHVzaW5nIHJlYWRGcm9tIC0gdGhpcyBhbGxvd3Mgc2VxdWVuY2UgY29kZVxuICAvLyB0byBrbm93IHdoaWNoIGNvbGxlY3Rpb25zIHRvIHJlcGxpY2F0ZSB0byBkdXJpbmcgcGsgZ2VuZXJhdGlvblxuICBpZiAoY29sbGVjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgIChjdHggYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9ucyk7XG4gIH1cblxuICAvLyBDaGVjayBpZiBtb2RlbCBpcyBmdWxseSBzZWdyZWdhdGVkIChhbGwgbm9uLXBrIHByb3BlcnRpZXMgYXJlIHByaXZhdGUvc2hhcmVkL3RyYW5zaWVudCkuXG4gIC8vIFVzZSBNb2RlbC5zZWdyZWdhdGUoKSB3aGljaCBpcyB0aGUgY2Fub25pY2FsIHdheSB0byBkZXRlcm1pbmUgd2hhdCdzIHRyYW5zaWVudCxcbiAgLy8gcmF0aGVyIHRoYW4gcmVhZGluZyBEQktleXMuVFJBTlNJRU5UIG1ldGFkYXRhIHdoaWNoIG1heSBub3QgYWNjdW11bGF0ZSBjb3JyZWN0bHlcbiAgLy8gd2hlbiBjbGFzcy1sZXZlbCBAcHJpdmF0ZURhdGEgYXBwbGllcyBkZWNvcmF0b3JzIGl0ZXJhdGl2ZWx5LlxuICBpZiAoIWN0eC5pc0Z1bGx5U2VncmVnYXRlZCAmJiBjb2xsZWN0aW9ucy5sZW5ndGgpIHtcbiAgICBpZiAoIWhhc1B1YmxpY1Byb3BlcnRpZXMoY2xhenouY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pKSB7XG4gICAgICBjdHgubWFya0Z1bGx5U2VncmVnYXRlZCgpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlNaXJyb3JGbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gIG1zcDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBjdHg6IEZhYnJpY0NvbnRyYWN0Q29udGV4dFxuKSB7XG4gIGlmICghbXNwKSByZXR1cm47XG4gIGNvbnN0IG1pcnJvck1ldGEgPSBNb2RlbC5taXJyb3JlZEF0KGNsYXp6KTtcbiAgaWYgKCFtaXJyb3JNZXRhKSByZXR1cm47XG4gIGNvbnN0IG1hdGNoZXMgPVxuICAgIG1zcCA9PT0gbWlycm9yTWV0YS5tc3BJZCB8fFxuICAgIChtaXJyb3JNZXRhLmNvbmRpdGlvbiAmJiBtaXJyb3JNZXRhLmNvbmRpdGlvbihtc3ApKTtcbiAgaWYgKCFtYXRjaGVzKSByZXR1cm47XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEoXG4gICAgbmV3IGNsYXp6KCksXG4gICAgbWlycm9yTWV0YS5yZXNvbHZlcixcbiAgICBjdHhcbiAgKTtcbiAgLy8gTWlycm9yIE1TUCBtYXRjaGVzIOKAlCByb3V0ZSByZWFkcyBleGNsdXNpdmVseSB0aHJvdWdoIHRoZSBtaXJyb3JcbiAgLy8gY29sbGVjdGlvbi4gQ2xlYXIgYW55IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjb2xsZWN0aW9ucyBzbyBxdWVyaWVzXG4gIC8vIGdvIE9OTFkgdG8gdGhlIG1pcnJvciwgbm90IHRvIHRoZSByZWd1bGFyIHByaXZhdGUvc2hhcmVkIG9uZXMuXG4gIGN0eC5wdXQoXCJzZWdyZWdhdGVSZWFkXCIsIHVuZGVmaW5lZCk7XG4gIGN0eC5wdXQoXCJzZWdyZWdhdGVSZWFkU3RhY2tcIiwgdW5kZWZpbmVkKTtcbiAgY3R4LnB1dChcImZ1bGx5U2VncmVnYXRlZFwiLCB0cnVlKTtcbiAgY3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGN0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgY3R4LnJlYWRGcm9tKGNvbGxlY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBoYXNQdWJsaWNQcm9wZXJ0aWVzPE0gZXh0ZW5kcyBNb2RlbD4oY2xheno6IENvbnN0cnVjdG9yPE0+KTogYm9vbGVhbiB7XG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSBNZXRhZGF0YS5nZXRBdHRyaWJ1dGVzKGNsYXp6KSB8fCBbXTtcbiAgY29uc3QgcGsgPSBNb2RlbC5wayhjbGF6eik7XG4gIGNvbnN0IHRyYW5zaWVudE1ldGEgPSBNZXRhZGF0YS5nZXQoY2xhenogYXMgYW55LCBEQktleXMuVFJBTlNJRU5UKSB8fCB7fTtcbiAgY29uc3QgcHJpdmF0ZU1ldGEgPVxuICAgIE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuUFJJVkFURSkpIHx8IHt9O1xuICBjb25zdCBzaGFyZWRNZXRhID1cbiAgICBNZXRhZGF0YS5nZXQoY2xhenogYXMgYW55LCBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLlNIQVJFRCkpIHx8IHt9O1xuXG4gIHJldHVybiBhdHRyaWJ1dGVzLnNvbWUoKGF0dHIpID0+IHtcbiAgICBpZiAoYXR0ciA9PT0gcGspIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYXR0ciBpbiB0cmFuc2llbnRNZXRhKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGF0dHIgaW4gcHJpdmF0ZU1ldGEpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYXR0ciBpbiBzaGFyZWRNZXRhKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFYXJseSBoYW5kbGVyIHRvIGV4dHJhY3QgYW5kIHJlZ2lzdGVyIGNvbGxlY3Rpb25zIGluIGNvbnRleHRcbiAqIEBzdW1tYXJ5IFJ1bnMgd2l0aCBwcmlvcml0eSA8IDQwIHRvIGV4dHJhY3QgY29sbGVjdGlvbiBuYW1lcyBiZWZvcmUgcGsgZ2VuZXJhdGlvbiAocHJpb3JpdHkgNjApLlxuICogVGhpcyBhbGxvd3MgRmFicmljQ29udHJhY3RTZXF1ZW5jZSB0byBrbm93IHdoaWNoIGNvbGxlY3Rpb25zIHRvIHJlcGxpY2F0ZSB0by5cbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSB0aGF0IGV4dGVuZHMgTW9kZWxcbiAqIEBwYXJhbSB7Q29udGV4dE9mPFJlcG9zaXRvcnk8TSwgYW55Pj59IGNvbnRleHQgLSBUaGUgZXhlY3V0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB7U2VncmVnYXRlZERhdGFNZXRhZGF0YSB8IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXX0gZGF0YSAtIFRoZSBzZWdyZWdhdGVkIGRhdGEgbWV0YWRhdGFcbiAqIEBwYXJhbSB7c3RyaW5nIHwgc3RyaW5nW119IGtleXMgLSBUaGUgcHJvcGVydHkga2V5KHMpIGJlaW5nIHNlZ3JlZ2F0ZWRcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHRyYWN0U2VncmVnYXRlZENvbGxlY3Rpb25zPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dE9mPHR5cGVvZiB0aGlzPixcbiAgZGF0YTogU2VncmVnYXRlZERhdGFNZXRhZGF0YSB8IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXSxcbiAga2V5czoga2V5b2YgTSB8IChrZXlvZiBNKVtdLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRhdGFBcnJheSA9IChcbiAgICBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXVxuICApIGFzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXTtcblxuICBjb25zdCBtc3AgPVxuICAgIE1vZGVsLm93bmVyT2YobW9kZWwpIHx8XG4gICAgZXh0cmFjdE1zcElkKFxuICAgICAgY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSBhcyBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuICAgICk7XG4gIGlmICghbXNwKSB7XG4gICAgLy8gQ2FuJ3QgZXh0cmFjdCBjb2xsZWN0aW9ucyB3aXRob3V0IE1TUCwgd2lsbCBiZSBjYXVnaHQgYnkgbGF0ZXIgaGFuZGxlcnNcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjb2xsZWN0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBtZXRhZGF0YSBvZiBkYXRhQXJyYXkpIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uUmVzb2x2ZXIgPSBtZXRhZGF0YS5jb2xsZWN0aW9ucztcbiAgICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICAgIHR5cGVvZiBjb2xsZWN0aW9uUmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG4gICAgaWYgKGNvbGxlY3Rpb24gJiYgIWNvbGxlY3Rpb25zLmluY2x1ZGVzKGNvbGxlY3Rpb24pKSB7XG4gICAgICBjb2xsZWN0aW9ucy5wdXNoKGNvbGxlY3Rpb24pO1xuICAgIH1cbiAgfVxuICBhcHBseVNlZ3JlZ2F0aW9uRmxhZ3MobW9kZWwsIGNvbGxlY3Rpb25zLCBjb250ZXh0KTtcblxuICAvLyBTdG9yZSBzZWdyZWdhdGlvbiBtZXRhZGF0YSBwZXItc2VxdWVuY2Ugc28gRmFicmljQ29udHJhY3RTZXF1ZW5jZSBjYW4gZGVjaWRlXG4gIC8vIHdoZXJlIHRvIHN0b3JlL3JlcGxpY2F0ZSBzZXF1ZW5jZSByZWNvcmRzIChwdWJsaWMgdnMgcHJpdmF0ZS9zaGFyZWQpLlxuICAvL1xuICAvLyAtIGBAcGsoKWAgc2VxdWVuY2VzIHVzZSB0aGUgc2hhcmVkIG5hbWUgYCR7dGFibGV9X3BrYCAobm8gaWQgY29tcG9uZW50KS5cbiAgLy8gLSBgQHNlcXVlbmNlKClgIC8gcGVyc2lzdGVudCBgQHZlcnNpb24odHJ1ZSlgIHNlcXVlbmNlcyBhcmUgcGVyLW1vZGVsLWluc3RhbmNlOlxuICAvLyAgIGAke3RhYmxlfV8ke2lkfV8ke3Byb3BlcnR5fWAuXG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdKSBhcyAoa2V5b2YgTSlbXTtcbiAgY29uc3QgcGtLZXkgPSBNb2RlbC5wayhtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIGFzIGtleW9mIE07XG4gIGNvbnN0IHBrU2VxTmFtZSA9IE1vZGVsLnNlcXVlbmNlTmFtZShtb2RlbCwgXCJwa1wiKTtcblxuICBjb25zdCBpZFZhbHVlID0gKG1vZGVsIGFzIGFueSlbcGtLZXkgYXMgYW55XTtcbiAgY29uc3QgY2FuQnVpbGRQZXJJbnN0YW5jZSA9XG4gICAgdHlwZW9mIGlkVmFsdWUgIT09IFwidW5kZWZpbmVkXCIgJiYgaWRWYWx1ZSAhPT0gbnVsbDtcblxuICAvLyBBbHdheXMgdW5pb24gY29sbGVjdGlvbnMgZm9yIHRoZSBwayBzZXF1ZW5jZSB3aGVuIHRoZSBtb2RlbCB1c2VzIHNlZ3JlZ2F0ZWQgZGF0YS5cbiAgKGNvbnRleHQgYXMgYW55KS5zZXRTZXF1ZW5jZVNlZ3JlZ2F0aW9uKFxuICAgIHBrU2VxTmFtZSxcbiAgICAoY29udGV4dCBhcyBhbnkpLmlzRnVsbHlTZWdyZWdhdGVkLFxuICAgIGNvbGxlY3Rpb25zXG4gICk7XG5cbiAgLy8gRm9yIHBlci1wcm9wZXJ0eSBzZXF1ZW5jZXMsIG9ubHkgcmVnaXN0ZXIgd2hlbiB3ZSBjYW4gY29tcHV0ZSBhbiBpZC1zY29wZWQgbmFtZS5cbiAgLy8gVGhpcyBrZWVwcyBzZXF1ZW5jZXMgY29uc3RyYWluZWQgdG8gdGhlIGNvbGxlY3Rpb25zIHRoZSBhdHRyaWJ1dGUgZXhpc3RzIGluLlxuICBpZiAoY2FuQnVpbGRQZXJJbnN0YW5jZSkge1xuICAgIGZvciAoY29uc3QgayBvZiBrZXlBcnJheSkge1xuICAgICAgY29uc3QgcHJvcFNlcU5hbWUgPSBNb2RlbC5zZXF1ZW5jZU5hbWUobW9kZWwsIFN0cmluZyhpZFZhbHVlKSwgU3RyaW5nKGspKTtcbiAgICAgIChjb250ZXh0IGFzIGFueSkuc2V0U2VxdWVuY2VTZWdyZWdhdGlvbihcbiAgICAgICAgcHJvcFNlcU5hbWUsXG4gICAgICAgIChjb250ZXh0IGFzIGFueSkuaXNGdWxseVNlZ3JlZ2F0ZWQsXG4gICAgICAgIGNvbGxlY3Rpb25zXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VncmVnYXRlZERhdGFPbkNyZWF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIGNvbnRleHQ6IENvbnRleHRPZjx0eXBlb2YgdGhpcz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleXM6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgLy8gVmFsaWRhdGUgYWxsIGtleXMgcmVzb2x2ZSB0byB0aGUgc2FtZSBjb2xsZWN0aW9uXG4gIGtleUFycmF5LmZvckVhY2goKF9rLCBpKSA9PiB7XG4gICAgY29uc3QgYyA9XG4gICAgICB0eXBlb2YgZGF0YUFycmF5W2ldLmNvbGxlY3Rpb25zID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gZGF0YUFycmF5W2ldLmNvbGxlY3Rpb25zXG4gICAgICAgIDogZGF0YUFycmF5W2ldLmNvbGxlY3Rpb25zKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuICAgIGlmIChjICE9PSBjb2xsZWN0aW9uKVxuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgIGBTZWdyZWdhdGVkIGRhdGEgY29sbGVjdGlvbiBtaXNtYXRjaDogJHtjfSB2cyAke2NvbGxlY3Rpb259YFxuICAgICAgKTtcbiAgfSk7XG5cbiAgY29uc3Qga2V5U3RyaW5ncyA9IGtleUFycmF5Lm1hcCgoa2V5KSA9PiBTdHJpbmcoa2V5KSk7XG4gIC8vIFN0b3JlIHRoZSBzZWdyZWdhdGVkIG1vZGVsIOKAlCBwcmVwYXJlKCkgd2lsbCBmaWx0ZXIgdG8gY29sbGVjdGlvbi1zcGVjaWZpYyBmaWVsZHNcbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS53cml0ZVRvKGNvbGxlY3Rpb24sIGtleVN0cmluZ3MpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VncmVnYXRlZERhdGFPblJlYWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0ZsYWdzPixcbiAgZGF0YTogU2VncmVnYXRlZERhdGFNZXRhZGF0YSB8IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXSxcbiAga2V5czoga2V5b2YgTSB8IChrZXlvZiBNKVtdLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRhdGFBcnJheSA9IChcbiAgICBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXVxuICApIGFzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXTtcbiAgY29uc3Qga2V5QXJyYXkgPSAoQXJyYXkuaXNBcnJheShrZXlzKSA/IGtleXMgOiBba2V5c10pIGFzIChrZXlvZiBNKVtdO1xuICBpZiAoa2V5QXJyYXkubGVuZ3RoICE9PSBkYXRhQXJyYXkubGVuZ3RoKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBrZXlzIGFuZCBtZXRhZGF0YSBsZW5ndGggbWlzbWF0Y2hgXG4gICAgKTtcblxuICBjb25zdCBtc3AgPSBNb2RlbC5vd25lck9mKG1vZGVsKSB8fCBleHRyYWN0TXNwSWQoY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSk7XG4gIGlmICghbXNwKVxuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgVGhlcmUncyBubyBhc3NpZ25lZCBvcmdhbml6YXRpb24gZm9yIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgKTtcblxuICBjb25zdCBjb2xsZWN0aW9uUmVzb2x2ZXIgPSBkYXRhQXJyYXlbMF0uY29sbGVjdGlvbnM7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPVxuICAgIHR5cGVvZiBjb2xsZWN0aW9uUmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICA6IGF3YWl0IGNvbGxlY3Rpb25SZXNvbHZlcihtb2RlbCwgbXNwLCBjb250ZXh0KTtcblxuICAoY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLnJlYWRGcm9tKGNvbGxlY3Rpb24pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VncmVnYXRlZERhdGFPblVwZGF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIGNvbnRleHQ6IENvbnRleHRPZjx0eXBlb2YgdGhpcz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleToga2V5b2YgTSB8IChrZXlvZiBNKVtdLFxuICBtb2RlbDogTSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBvbGRNb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRhdGFBcnJheSA9IChcbiAgICBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXVxuICApIGFzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXTtcbiAgY29uc3Qga2V5QXJyYXkgPSAoQXJyYXkuaXNBcnJheShrZXkpID8ga2V5IDogW2tleV0pIGFzIChrZXlvZiBNKVtdO1xuICBpZiAoa2V5QXJyYXkubGVuZ3RoICE9PSBkYXRhQXJyYXkubGVuZ3RoKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBrZXlzIGFuZCBtZXRhZGF0YSBsZW5ndGggbWlzbWF0Y2hgXG4gICAgKTtcblxuICBjb25zdCBtc3AgPVxuICAgIE1vZGVsLm93bmVyT2YobW9kZWwpIHx8XG4gICAgZXh0cmFjdE1zcElkKFxuICAgICAgY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSBhcyBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuICAgICk7XG4gIGlmICghbXNwKVxuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgVGhlcmUncyBubyBhc3NpZ25lZCBvcmdhbml6YXRpb24gZm9yIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgKTtcblxuICBjb25zdCBjb2xsZWN0aW9uUmVzb2x2ZXIgPSBkYXRhQXJyYXlbMF0uY29sbGVjdGlvbnM7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPVxuICAgIHR5cGVvZiBjb2xsZWN0aW9uUmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICA6IGNvbGxlY3Rpb25SZXNvbHZlcihtb2RlbCwgbXNwLCBjb250ZXh0KTtcblxuICBrZXlBcnJheS5mb3JFYWNoKChrLCBpKSA9PiB7XG4gICAgY29uc3QgYyA9XG4gICAgICB0eXBlb2YgZGF0YUFycmF5W2ldLmNvbGxlY3Rpb25zID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gZGF0YUFycmF5W2ldLmNvbGxlY3Rpb25zXG4gICAgICAgIDogZGF0YUFycmF5W2ldLmNvbGxlY3Rpb25zKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuICAgIGlmIChjICE9PSBjb2xsZWN0aW9uKVxuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgIGBTZWdyZWdhdGVkIGRhdGEgY29sbGVjdGlvbiBtaXNtYXRjaDogJHtjfSB2cyAke2NvbGxlY3Rpb259YFxuICAgICAgKTtcbiAgfSk7XG5cbiAgY29uc3Qga2V5U3RyaW5ncyA9IChrZXlBcnJheSBhcyAoa2V5b2YgTSlbXSkubWFwKChrZXkpID0+IFN0cmluZyhrZXkpKTtcbiAgLy8gU3RvcmUgdGhlIG9yaWdpbmFsIG1vZGVsIOKAlCBwcmVwYXJlKCkgd2lsbCBmaWx0ZXIgdG8gY29sbGVjdGlvbi1zcGVjaWZpYyBmaWVsZHNcbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS53cml0ZVRvKGNvbGxlY3Rpb24sIGtleVN0cmluZ3MpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VncmVnYXRlZERhdGFPbkRlbGV0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBWIGV4dGVuZHMgU2VncmVnYXRlZERhdGFNZXRhZGF0YSxcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHRPZjxSPixcbiAgZGF0YTogViB8IFZbXSxcbiAga2V5OiAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV0pIGFzIFZbXTtcbiAgY29uc3Qga2V5QXJyYXkgPSAoQXJyYXkuaXNBcnJheShrZXkpID8ga2V5IDogW2tleV0pIGFzIChrZXlvZiBNKVtdO1xuICBpZiAoa2V5QXJyYXkubGVuZ3RoICE9PSBkYXRhQXJyYXkubGVuZ3RoKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBrZXlzIGFuZCBtZXRhZGF0YSBsZW5ndGggbWlzbWF0Y2hgXG4gICAgKTtcblxuICBjb25zdCBtc3AgPVxuICAgIE1vZGVsLm93bmVyT2YobW9kZWwpIHx8XG4gICAgZXh0cmFjdE1zcElkKFxuICAgICAgY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSBhcyBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuICAgICk7XG4gIGlmICghbXNwKVxuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgVGhlcmUncyBubyBhc3NpZ25lZCBvcmdhbml6YXRpb24gZm9yIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgKTtcblxuICBjb25zdCBjb2xsZWN0aW9uUmVzb2x2ZXIgPSBkYXRhQXJyYXlbMF0uY29sbGVjdGlvbnM7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPVxuICAgIHR5cGVvZiBjb2xsZWN0aW9uUmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICA6IGNvbGxlY3Rpb25SZXNvbHZlcihtb2RlbCwgbXNwLCBjb250ZXh0KTtcblxuICAoY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLnJlYWRGcm9tKGNvbGxlY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBzZWdyZWdhdGVkKFxuICBjb2xsZWN0aW9uOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIsXG4gIHR5cGU6IEZhYnJpY01vZGVsS2V5cy5QUklWQVRFIHwgRmFicmljTW9kZWxLZXlzLlNIQVJFRCxcbiAgZmlsdGVyPzogKHByb3BOYW1lOiBzdHJpbmcpID0+IGJvb2xlYW5cbikge1xuICByZXR1cm4gZnVuY3Rpb24gaW5uZXJTZWdyZWdhdGVkKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREZWModGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5PzogYW55KSB7XG4gICAgICBjb25zdCBrZXkgPSBNZXRhZGF0YS5rZXkodHlwZSwgcHJvcGVydHlLZXkpO1xuICAgICAgY29uc3QgY29uc3RyOiBDb25zdHJ1Y3RvciA9IHRhcmdldC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjtcblxuICAgICAgY29uc3QgbWV0YSA9IE1ldGFkYXRhLmdldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIGtleSkgfHwge307XG4gICAgICBjb25zdCBjb2xsZWN0aW9ucyA9IG5ldyBTZXQobWV0YS5jb2xsZWN0aW9ucyB8fCBbXSk7XG4gICAgICBjb2xsZWN0aW9ucy5hZGQoY29sbGVjdGlvbik7XG4gICAgICBtZXRhLmNvbGxlY3Rpb25zID0gWy4uLmNvbGxlY3Rpb25zXTtcbiAgICAgIE1ldGFkYXRhLnNldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIGtleSwgbWV0YSk7XG5cbiAgICAgIGNvbnN0IGNvbnN0ck1ldGEgPSBNZXRhZGF0YS5nZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCB0eXBlKSB8fCB7fTtcbiAgICAgIGNvbnN0IGNvbnN0ckNvbGxlY3Rpb25zID0gbmV3IFNldChjb25zdHJNZXRhLmNvbGxlY3Rpb25zIHx8IFtdKTtcbiAgICAgIGNvbnN0ckNvbGxlY3Rpb25zLmFkZChjb2xsZWN0aW9uKTtcbiAgICAgIGNvbnN0ck1ldGEuY29sbGVjdGlvbnMgPSBbLi4uY29uc3RyQ29sbGVjdGlvbnNdO1xuICAgICAgTWV0YWRhdGEuc2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgdHlwZSwgY29uc3RyTWV0YSk7XG5cbiAgICAgIGNvbnN0IHRyYW5zaWVudE1ldGEgPVxuICAgICAgICBNZXRhZGF0YS5nZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBEQktleXMuVFJBTlNJRU5UKSB8fCB7fTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRUcmFuc2llbnRNZXRhID0ge1xuICAgICAgICAuLi50cmFuc2llbnRNZXRhLFxuICAgICAgICBbcHJvcGVydHlLZXkgYXMgYW55XToge30sXG4gICAgICB9O1xuICAgICAgTWV0YWRhdGEuc2V0KFxuICAgICAgICBjb25zdHIgYXMgQ29uc3RydWN0b3IsXG4gICAgICAgIERCS2V5cy5UUkFOU0lFTlQsXG4gICAgICAgIHVwZGF0ZWRUcmFuc2llbnRNZXRhXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY3M6IGFueVtdID0gW107XG4gICAgaWYgKCFwcm9wZXJ0eUtleSkge1xuICAgICAgLy8gZGVjb3JhdGVkIGF0IHRoZSBjbGFzcyBsZXZlbFxuICAgICAgY29uc3QgcHJvcGVydGllcyA9IE1ldGFkYXRhLmdldEF0dHJpYnV0ZXModGFyZ2V0IGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIHByb3BlcnRpZXM/LmZvckVhY2goKHApID0+IHtcbiAgICAgICAgaWYgKCFmaWx0ZXIgfHwgZmlsdGVyKHApKSB7XG4gICAgICAgICAgc2VncmVnYXRlZChjb2xsZWN0aW9uLCB0eXBlKSgodGFyZ2V0IGFzIGFueSkucHJvdG90eXBlLCBwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBncm91cE5hbWUgPVxuICAgICAgICB0eXBlb2YgY29sbGVjdGlvbiA9PT0gXCJzdHJpbmdcIiA/IGNvbGxlY3Rpb24gOiBjb2xsZWN0aW9uLnRvU3RyaW5nKCk7XG4gICAgICAvLyBVc2UgZGlmZmVyZW50IGdyb3VwIG5hbWVzIGZvciBleHRyYWN0aW9uIHZzIGRhdGEgaGFuZGxlcnMgdG8gcHJldmVudCBtZXJnaW5nXG4gICAgICBjb25zdCBleHRyYWN0R3JvdXBOYW1lID0gYCR7Z3JvdXBOYW1lfTpleHRyYWN0YDtcbiAgICAgIGNvbnN0IGRhdGFHcm91cE5hbWUgPSBgJHtncm91cE5hbWV9OmRhdGFgO1xuICAgICAgY29uc3QgZWFybHlFeHRyYWN0aW9uTWV0YSA9IHsgY29sbGVjdGlvbnM6IGNvbGxlY3Rpb24gfTtcbiAgICAgIGNvbnN0IGVhcmx5RXh0cmFjdGlvbkdyb3VwU29ydCA9IHtcbiAgICAgICAgcHJpb3JpdHk6IFNFR1JFR0FURURfQ09MTEVDVElPTl9FWFRSQUNUSU9OX1BSSU9SSVRZLFxuICAgICAgICBncm91cDogZXh0cmFjdEdyb3VwTmFtZSxcbiAgICAgIH07XG4gICAgICBkZWNzLnB1c2goXG4gICAgICAgIHByb3AoKSxcbiAgICAgICAgdHJhbnNpZW50KCksXG4gICAgICAgIHNlZ3JlZ2F0ZWREZWMsXG4gICAgICAgIC8vIEVhcmx5IGV4dHJhY3Rpb24gaGFuZGxlcnMgLSBydW4gQkVGT1JFIHBrIGdlbmVyYXRpb24gKHByaW9yaXR5IDYwKVxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgY29sbGVjdGlvbnMgYXJlIHJlZ2lzdGVyZWQgaW4gY29udGV4dCBmb3Igc2VxdWVuY2UgcmVwbGljYXRpb25cbiAgICAgICAgLy8gV2UgcmVnaXN0ZXIgZm9yIGVhY2ggb3BlcmF0aW9uIGV4cGxpY2l0bHkgdG8gZW5zdXJlIHByb3BlciBoYW5kbGVyIGxvb2t1cFxuICAgICAgICBvbihcbiAgICAgICAgICBEQk9wZXJhdGlvbnMuQUxMLFxuICAgICAgICAgIGV4dHJhY3RTZWdyZWdhdGVkQ29sbGVjdGlvbnMgYXMgYW55LFxuICAgICAgICAgIGVhcmx5RXh0cmFjdGlvbk1ldGEsXG4gICAgICAgICAgZWFybHlFeHRyYWN0aW9uR3JvdXBTb3J0XG4gICAgICAgICksXG4gICAgICAgIC8vIE1haW4gaGFuZGxlcnMgZm9yIHNlZ3JlZ2F0ZWQgZGF0YSBvcGVyYXRpb25zIChwcmlvcml0eSA5NSlcbiAgICAgICAgb25DcmVhdGUoXG4gICAgICAgICAgc2VncmVnYXRlZERhdGFPbkNyZWF0ZSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvblJlYWQoXG4gICAgICAgICAgc2VncmVnYXRlZERhdGFPblJlYWQgYXMgYW55LFxuICAgICAgICAgIHsgY29sbGVjdGlvbnM6IGNvbGxlY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmlvcml0eTogOTUsXG4gICAgICAgICAgICBncm91cDogZGF0YUdyb3VwTmFtZSxcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICAgIG9uVXBkYXRlKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25VcGRhdGUgYXMgYW55LFxuICAgICAgICAgIHsgY29sbGVjdGlvbnM6IGNvbGxlY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmlvcml0eTogOTUsXG4gICAgICAgICAgICBncm91cDogZGF0YUdyb3VwTmFtZSxcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICAgIG9uRGVsZXRlKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25EZWxldGUgYXMgYW55LFxuICAgICAgICAgIHsgY29sbGVjdGlvbnM6IGNvbGxlY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmlvcml0eTogOTUsXG4gICAgICAgICAgICBncm91cDogZGF0YUdyb3VwTmFtZSxcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBhcHBseSguLi5kZWNzKSh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVEYXRhKFxuICBjb2xsZWN0aW9uOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIgPSBJbXBsaWNpdFByaXZhdGVDb2xsZWN0aW9uXG4pIHtcbiAgZnVuY3Rpb24gcHJpdmF0ZURhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gICAgcmV0dXJuIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgRmFicmljTW9kZWxLZXlzLlBSSVZBVEUpO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBwcml2YXRlRGF0YSxcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkRGF0YShjb2xsZWN0aW9uOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpIHtcbiAgZnVuY3Rpb24gc2hhcmVkRGF0YShjb2xsZWN0aW9uOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpIHtcbiAgICByZXR1cm4gc2VncmVnYXRlZChjb2xsZWN0aW9uLCBGYWJyaWNNb2RlbEtleXMuU0hBUkVEKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuU0hBUkVEKVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBzaGFyZWREYXRhLFxuICAgICAgYXJnczogW2NvbGxlY3Rpb25dLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzICovXG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIEpTT05TZXJpYWxpemVyLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlY3Vyc2l2ZWx5IHNvcnRzIG9iamVjdCBrZXlzIHdpdGhvdXQgcmVvcmRlcmluZyBhcnJheXNcbiAqIEBwYXJhbSB7YW55fSBvYmogLSBUaGUgdmFsdWUgdG8gcHJvY2Vzc1xuICogQHJldHVybiB7YW55fSBBIGNvcHkgd2l0aCBzb3J0ZWQgb2JqZWN0IGtleXMgYnV0IHByZXNlcnZlZCBhcnJheSBvcmRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXNPbmx5UmVjdXJzaXZlKG9iajogYW55KTogYW55IHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKSByZXR1cm4gb2JqO1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcChzb3J0S2V5c09ubHlSZWN1cnNpdmUpO1xuICBpZiAob2JqLmNvbnN0cnVjdG9yICE9PSBPYmplY3QpIHJldHVybiBvYmo7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopXG4gICAgLnNvcnQoKVxuICAgIC5yZWR1Y2UoKGFjYzogUmVjb3JkPHN0cmluZywgYW55Piwga2V5KSA9PiB7XG4gICAgICBhY2Nba2V5XSA9IHNvcnRLZXlzT25seVJlY3Vyc2l2ZShvYmpba2V5XSk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5pc3RpYyBKU09OIHNlcmlhbGl6ZXIgZm9yIEZhYnJpYyBtb2RlbHNcbiAqIEBzdW1tYXJ5IEVuc3VyZXMgc3RhYmxlLCBkZXRlcm1pbmlzdGljIEpTT04gb3V0cHV0IGJ5IHNvcnRpbmcgb2JqZWN0IGtleXMgcmVjdXJzaXZlbHkgYmVmb3JlIHN0cmluZ2lmaWNhdGlvbiwgd2hpY2ggaXMgaW1wb3J0YW50IGZvciBGYWJyaWMgZW5kb3JzZW1lbnQgYW5kIGhhc2hpbmcuIEV4dGVuZHMgSlNPTlNlcmlhbGl6ZXIgdG8gcGx1ZyBpbnRvIGV4aXN0aW5nIERlY2FmIG1vZGVsIHNlcmlhbGl6YXRpb24gZmxvdy5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIERlY2FmIE1vZGVsIHN1YnR5cGUgc2VyaWFsaXplZCBieSB0aGlzIGluc3RhbmNlXG4gKiBAcGFyYW0ge3ZvaWR9IFtjb25zdHJ1Y3Rvcl0gTm8gcHVibGljIGNvbnN0cnVjdG9yIGFyZ3VtZW50c1xuICogQGNsYXNzIERldGVybWluaXN0aWNTZXJpYWxpemVyXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc2VyaWFsaXplciA9IG5ldyBEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxNeU1vZGVsPigpO1xuICogY29uc3QganNvbiA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKG1vZGVsKTtcbiAqIGNvbnN0IHJlYnVpbHQgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGpzb24pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgRFMgYXMgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXJcbiAqICAgQ2FsbGVyLT4+RFM6IHNlcmlhbGl6ZShtb2RlbClcbiAqICAgRFMtPj5EUzogcHJlU2VyaWFsaXplKG1vZGVsKVxuICogICBEUy0+PkRTOiBzb3J0LWtleXMtcmVjdXJzaXZlXG4gKiAgIERTLT4+RFM6IGpzb24tc3RyaW5naWZ5LWRldGVybWluaXN0aWNcbiAqICAgRFMtLT4+Q2FsbGVyOiBzdHJpbmdcbiAqICAgQ2FsbGVyLT4+RFM6IGRlc2VyaWFsaXplKHN0cmluZylcbiAqICAgRFMtLT4+Q2FsbGVyOiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbj4gZXh0ZW5kcyBKU09OU2VyaWFsaXplcjxNPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHByZVNlcmlhbGl6ZShtb2RlbDogTSkge1xuICAgIC8vIFRPRE86IG5lc3RlZCBwcmVzZXJpYWxpemF0aW9uIChzbyBpbmNyZWFzZSBwZXJmb3JtYW5jZSB3aGVuIGRlc2VyaWFsaXppbmcpXG4gICAgLy8gVE9ETzogVmVyaWZ5IHdoeSB0aGVyZSBpcyBubyBtZXRhZGF0YVxuICAgIGNvbnN0IHRvU2VyaWFsaXplOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwpO1xuICAgIGxldCBtZXRhZGF0YTtcbiAgICB0cnkge1xuICAgICAgbWV0YWRhdGEgPSBNZXRhZGF0YS5tb2RlbE5hbWUobW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3IpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBtZXRhZGF0YSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdG9TZXJpYWxpemVbTW9kZWxLZXlzLkFOQ0hPUl0gPSBtZXRhZGF0YSB8fCBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lO1xuXG4gICAgY29uc3QgcHJlU2VyaWFsaXplID0gZnVuY3Rpb24gcHJlU2VyaWFsaXplKFxuICAgICAgdGhpczogRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8YW55PixcbiAgICAgIG9iajogYW55XG4gICAgKTogYW55IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICBpZiAodHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG9iajtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoubWFwKChvKSA9PiBwcmVTZXJpYWxpemUuY2FsbChzZWxmLCBvKSk7XG4gICAgICByZXR1cm4gdGhpcy5wcmVTZXJpYWxpemUuY2FsbCh0aGlzLCBvYmopO1xuICAgIH0uYmluZCh0aGlzKTtcblxuICAgIE1vZGVsLnJlbGF0aW9ucyhtb2RlbCkuZm9yRWFjaCgocikgPT4ge1xuICAgICAgdG9TZXJpYWxpemVbcl0gPSBwcmVTZXJpYWxpemUodG9TZXJpYWxpemVbcl0pO1xuICAgIH0pO1xuICAgIHJldHVybiB0b1NlcmlhbGl6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWJ1aWxkcyBhIG1vZGVsIGZyb20gYSBzZXJpYWxpemF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIGl0IGZhaWxzIHRvIHBhcnNlIHRoZSBzdHJpbmcsIG9yIHRvIGJ1aWxkIHRoZSBtb2RlbFxuICAgKi9cbiAgb3ZlcnJpZGUgZGVzZXJpYWxpemUoc3RyOiBzdHJpbmcpOiBNIHtcbiAgICBjb25zdCBkZXNlcmlhbGl6YXRpb24gPSBKU09OLnBhcnNlKHN0cik7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gZGVzZXJpYWxpemF0aW9uW01vZGVsS2V5cy5BTkNIT1JdO1xuICAgIGlmICghY2xhc3NOYW1lKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgY2xhc3MgcmVmZXJlbmNlIGluIHNlcmlhbGl6ZWQgbW9kZWxcIik7XG4gICAgY29uc3QgbW9kZWw6IE0gPSBNb2RlbC5idWlsZChkZXNlcmlhbGl6YXRpb24sIGNsYXNzTmFtZSkgYXMgdW5rbm93biBhcyBNO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2VyaWFsaXplIGEgbW9kZWwgaW50byBhIGRldGVybWluaXN0aWMgSlNPTiBzdHJpbmdcbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIG1vZGVsIHdpdGggcHJlU2VyaWFsaXplLCBzb3J0cyBrZXlzIHJlY3Vyc2l2ZWx5LCBhbmQgc3RyaW5naWZpZXMgZGV0ZXJtaW5pc3RpY2FsbHkgZm9yIHN0YWJsZSBvcmRlcmluZ1xuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHNlcmlhbGl6ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IERldGVybWluaXN0aWMgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWxcbiAgICovXG4gIG92ZXJyaWRlIHNlcmlhbGl6ZShtb2RlbDogTSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RyaW5naWZ5ID0gcmVxdWlyZShcImpzb24tc3RyaW5naWZ5LWRldGVybWluaXN0aWNcIik7XG4gICAgcmV0dXJuIHN0cmluZ2lmeShzb3J0S2V5c09ubHlSZWN1cnNpdmUodGhpcy5wcmVTZXJpYWxpemUobW9kZWwpKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cywgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBGYWJyaWMgZXZlbnQgbmFtZSBmcm9tIGNvbXBvbmVudHNcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzdGFuZGFyZGl6ZWQgZXZlbnQgbmFtZSBieSBqb2luaW5nIHRhYmxlLCBldmVudCwgYW5kIG9wdGlvbmFsIG93bmVyIHdpdGggdW5kZXJzY29yZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSB0YWJsZS9jb2xsZWN0aW9uIG5hbWVcbiAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZ30gZXZlbnQgLSBUaGUgZXZlbnQgdHlwZVxuICogQHBhcmFtIHtzdHJpbmd9IFtvd25lcl0gLSBPcHRpb25hbCBvd25lciBpZGVudGlmaWVyXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgZXZlbnQgbmFtZSBpbiBmb3JtYXQgXCJ0YWJsZV9ldmVudFwiIG9yIFwidGFibGVfZXZlbnRfb3duZXJcIlxuICogQGZ1bmN0aW9uIGdlbmVyYXRlRmFicmljRXZlbnROYW1lXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZShcbiAgdGFibGU6IHN0cmluZyxcbiAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gIG93bmVyPzogc3RyaW5nXG4pIHtcbiAgY29uc3QgcGFyYW1zID0gW3RhYmxlLCBldmVudF07XG4gIGlmIChvd25lcikgcGFyYW1zLnB1c2gob3duZXIpO1xuICByZXR1cm4gcGFyYW1zLmpvaW4oXCJfXCIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBGYWJyaWMgZXZlbnQgbmFtZSBpbnRvIGl0cyBjb21wb25lbnRzXG4gKiBAc3VtbWFyeSBTcGxpdHMgYW4gZXZlbnQgbmFtZSBieSB1bmRlcnNjb3JlcyBhbmQgZXh0cmFjdHMgdGFibGUsIGV2ZW50LCBhbmQgb3B0aW9uYWwgb3duZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGV2ZW50IG5hbWUgdG8gcGFyc2VcbiAqIEByZXR1cm4ge3t0YWJsZTogc3RyaW5nLCBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZywgb3duZXI6IHN0cmluZ319IFRoZSBwYXJzZWQgY29tcG9uZW50cyBhcyBhIHN0cnVjdHVyZWQgb2JqZWN0XG4gKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgZXZlbnQgbmFtZSBmb3JtYXQgaXMgaW52YWxpZFxuICogQGZ1bmN0aW9uIHBhcnNlRXZlbnROYW1lXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBQYXJzZXIgYXMgcGFyc2VFdmVudE5hbWVcbiAqICAgQ2FsbGVyLT4+UGFyc2VyOiBwYXJzZUV2ZW50TmFtZShuYW1lKVxuICogICBQYXJzZXItPj5QYXJzZXI6IHNwbGl0IG5hbWUgYnkgXCJfXCJcbiAqICAgYWx0IHBhcnRzIGxlbmd0aCBpbnZhbGlkXG4gKiAgICAgUGFyc2VyLS0+PkNhbGxlcjogdGhyb3cgSW50ZXJuYWxFcnJvclxuICogICBlbHNlXG4gKiAgICAgUGFyc2VyLS0+PkNhbGxlcjogeyB0YWJsZSwgZXZlbnQsIG93bmVyPyB9XG4gKiAgIGVuZFxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFdmVudE5hbWUobmFtZTogc3RyaW5nKToge1xuICB0YWJsZT86IHN0cmluZztcbiAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmc7XG4gIG93bmVyPzogc3RyaW5nO1xufSB7XG4gIGNvbnN0IHBhcnRzID0gbmFtZS5zcGxpdChcIl9cIik7XG4gIGlmIChwYXJ0cy5sZW5ndGggPCAyIHx8IHBhcnRzLmxlbmd0aCA+IDMpXG4gICAgcmV0dXJuIHsgdGFibGU6IHVuZGVmaW5lZCwgZXZlbnQ6IG5hbWUsIG93bmVyOiB1bmRlZmluZWQgfTtcbiAgcmV0dXJuIHtcbiAgICB0YWJsZTogcGFydHNbMF0sXG4gICAgZXZlbnQ6IHBhcnRzWzFdLFxuICAgIG93bmVyOiBwYXJ0c1syXSxcbiAgfSBhcyB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZztcbiAgICBvd25lcj86IHN0cmluZztcbiAgfTtcbn1cbiIsImltcG9ydCB7IHN0cmluZ0Zvcm1hdCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE92ZXJmbG93RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBPdmVyZmxvdy1zYWZlIGFkZGl0aW9uIG9wZXJhdGlvblxuICogQHN1bW1hcnkgQWRkcyB0d28gbnVtYmVycyBhbmQgdmVyaWZpZXMgbm8gb3ZlcmZsb3cgYnkgcmV2ZXJzZS1jaGVja2luZyB0aGUgb3BlcmFuZHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBhIC0gRmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtudW1iZXJ9IGIgLSBTZWNvbmQgb3BlcmFuZFxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgc3VtIG9mIGEgYW5kIGJcbiAqIEBmdW5jdGlvbiBhZGRcbiAqIEB0aHJvd3Mge092ZXJmbG93RXJyb3J9IG9uIGFkZGl0aW9uIG92ZXJmbG93XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGQoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBjID0gYSArIGI7XG4gIGlmIChhICE9PSBjIC0gYiB8fCBiICE9PSBjIC0gYSkge1xuICAgIHRocm93IG5ldyBPdmVyZmxvd0Vycm9yKGBBZGRpdGlvbiBvdmVyZmxvdzogJHthfSArICR7Yn1gKTtcbiAgfVxuICByZXR1cm4gYztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gT3ZlcmZsb3ctc2FmZSBzdWJ0cmFjdGlvbiBvcGVyYXRpb25cbiAqIEBzdW1tYXJ5IFN1YnRyYWN0cyBiIGZyb20gYSBhbmQgdmFsaWRhdGVzIG5vIG92ZXJmbG93IGJ5IHJldmVyc2UtY2hlY2tpbmcgdGhlIG9wZXJhbmRzXG4gKiBAcGFyYW0ge251bWJlcn0gYSAtIE1pbnVlbmRcbiAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gU3VidHJhaGVuZFxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgZGlmZmVyZW5jZSBhIC0gYlxuICogQGZ1bmN0aW9uIHN1YlxuICogQHRocm93cyB7T3ZlcmZsb3dFcnJvcn0gb24gc3VidGFjdGlvbiBvdmVyZmxvd1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3ViKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgYyA9IGEgLSBiO1xuICBpZiAoYSAhPT0gYyArIGIgfHwgYiAhPT0gYSAtIGMpIHtcbiAgICB0aHJvdyBuZXcgT3ZlcmZsb3dFcnJvcihgU3VidHJhY3Rpb24gb3ZlcmZsb3c6ICR7YX0gLSAke2J9YCk7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgU2FmZSBJbnRlZ2VyIFBhcnNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICpcbiAqIEBmdW5jdGlvbiBzYWZlUGFyc2VJbnRcbiAqXG4gKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IGlmIHBhcnNlSW50IHJldHVybnMgTmFOXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2FmZVBhcnNlSW50KHN0cmluZzogc3RyaW5nKTogbnVtYmVyIHtcbiAgLy8gUmVndWxhciBleHByZXNzaW9uIHRvIGNoZWNrIGlmIHN0cmluZyBvbmx5IGhhdmUgZGlnaXRzXG4gIGNvbnN0IGRpZ2l0UmVnZXggPSAvXlxcZCskLztcbiAgaWYgKCFkaWdpdFJlZ2V4LnRlc3Qoc3RyaW5nKSkge1xuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBzdHJpbmdGb3JtYXQoXCJGYWlsZWQgdG8gcGFyc2U6IHswfVwiLCBcInN0cmluZyBjb250YWlucyBkaWdpdHNcIilcbiAgICApO1xuICB9XG4gIGNvbnN0IHBhcnNlZGludCA9IHBhcnNlSW50KHN0cmluZyk7XG4gIGlmIChpc05hTihwYXJzZWRpbnQpKSB7XG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIHN0cmluZ0Zvcm1hdChcIkZhaWxlZCB0byBwYXJzZTogezB9XCIsIFwic3RyaW5nIGlzIG5vdCBhIHBhcnNhYmxlIGludGVnZXJcIilcbiAgICApO1xuICB9XG4gIHJldHVybiBwYXJzZWRpbnQ7XG59XG4iLCJpbXBvcnQge1xuICBKU09OU2VyaWFsaXplcixcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBzb3J0S2V5c09ubHlSZWN1cnNpdmUgfSBmcm9tIFwiLi9EZXRlcm1pbmlzdGljU2VyaWFsaXplclwiO1xuXG5leHBvcnQgY2xhc3MgU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbj4gZXh0ZW5kcyBKU09OU2VyaWFsaXplcjxNPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nLCB0YWJsZU5hbWU/OiBzdHJpbmcpOiBNIHtcbiAgICBjb25zdCBkZXNlcmlhbGl6YXRpb24gPSBKU09OLnBhcnNlKHN0cik7XG4gICAgLy8gY29uc3QgY2xhc3NOYW1lID0gdGFibGVOYW1lO1xuICAgIC8vIGlmICghY2xhc3NOYW1lKVxuICAgIC8vICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgY2xhc3MgcmVmZXJlbmNlIGluIHNlcmlhbGl6ZWQgbW9kZWxcIik7XG5cbiAgICAvLyAvLyB0aGlzIHdpbGwgcmV0dXJuIHVuZGVmaW5lZCB2YWx1ZXNcbiAgICAvLyBjb25zdCBtb2RlbDogTSA9IE1vZGVsLmJ1aWxkKGRlc2VyaWFsaXphdGlvbiwgY2xhc3NOYW1lKSBhcyB1bmtub3duIGFzIE07XG5cbiAgICAvLyAvLyBQb3B1bGF0ZSBNb2RlbFxuICAgIC8vIGNvbnN0IHByb2Nlc3NlZERlc2VhbGl6YXRpb24gPSBPYmplY3Qua2V5cyhtb2RlbCkucmVkdWNlKFxuICAgIC8vICAgKGFjY3VtOiBNLCBrZXkpID0+IHtcbiAgICAvLyAgICAgKGFjY3VtIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tleV0gPVxuICAgIC8vICAgICAgIGRlc2VyaWFsaXphdGlvbltSZXBvc2l0b3J5LmNvbHVtbihhY2N1bSwga2V5KV07XG4gICAgLy8gICAgIHJldHVybiBhY2N1bTtcbiAgICAvLyAgIH0sXG4gICAgLy8gICBtb2RlbFxuICAgIC8vICk7XG5cbiAgICAvLyBjb25zdCByZXN1bHQgPSBNb2RlbC5idWlsZChcbiAgICAvLyAgIHByb2Nlc3NlZERlc2VhbGl6YXRpb24sXG4gICAgLy8gICBjbGFzc05hbWVcbiAgICAvLyApIGFzIHVua25vd24gYXMgTTtcblxuICAgIC8vIHJldHVybiByZXN1bHQ7XG4gICAgcmV0dXJuIGRlc2VyaWFsaXphdGlvbjtcbiAgfVxuXG4gIG92ZXJyaWRlIHNlcmlhbGl6ZShtb2RlbDogTSwgcHV0QW5jaG9yID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBzdHJpbmdpZnkgPSByZXF1aXJlKFwianNvbi1zdHJpbmdpZnktZGV0ZXJtaW5pc3RpY1wiKTtcbiAgICBjb25zdCBwcmVTZXJpYWxpemF0aW9uID0gdGhpcy5wcmVTZXJpYWxpemUobW9kZWwsIHB1dEFuY2hvcik7XG4gICAgcmV0dXJuIHN0cmluZ2lmeShzb3J0S2V5c09ubHlSZWN1cnNpdmUocHJlU2VyaWFsaXphdGlvbikpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHByZVNlcmlhbGl6ZShtb2RlbDogTSwgcHV0QW5jaG9yOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIC8vIFRPRE86IG5lc3RlZCBwcmVzZXJpYWxpemF0aW9uIChzbyBpbmNyZWFzZSBwZXJmb3JtYW5jZSB3aGVuIGRlc2VyaWFsaXppbmcpXG4gICAgLy8gVE9ETzogVmVyaWZ5IHdoeSB0aGVyZSBpcyBubyBtZXRhZGF0YVxuICAgIGNvbnN0IHRvU2VyaWFsaXplOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwpO1xuICAgIGxldCBtZXRhZGF0YTtcbiAgICB0cnkge1xuICAgICAgbWV0YWRhdGEgPSBNZXRhZGF0YS5tb2RlbE5hbWUobW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3IpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBtZXRhZGF0YSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHB1dEFuY2hvcilcbiAgICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGEgfHwgbW9kZWwuY29uc3RydWN0b3IubmFtZTtcblxuICAgIGZ1bmN0aW9uIHByZVNlcmlhbGl6ZShcbiAgICAgIHRoaXM6IFNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyPGFueT4sXG4gICAgICBvYmo6IGFueVxuICAgICk6IGFueSB7XG4gICAgICBpZiAodHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG9iajtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoubWFwKHByZVNlcmlhbGl6ZSk7XG4gICAgICByZXR1cm4gdGhpcy5wcmVTZXJpYWxpemUob2JqKTtcbiAgICB9XG4gICAgTW9kZWwucmVsYXRpb25zKG1vZGVsKS5mb3JFYWNoKChyKSA9PiB7XG4gICAgICB0b1NlcmlhbGl6ZVtyXSA9IHByZVNlcmlhbGl6ZS5jYWxsKHRoaXMsIHRvU2VyaWFsaXplW3JdKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG9TZXJpYWxpemU7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgQ2xpZW50QmFzZWRTZXJ2aWNlLFxuICBDb250ZXh0LFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgRmFicmljQ0FTZXJ2aWNlcywge1xuICBBZmZpbGlhdGlvblNlcnZpY2UsXG4gIElBdHRyaWJ1dGVSZXF1ZXN0LFxuICBJZGVudGl0eVNlcnZpY2UsXG4gIElFbnJvbGxSZXNwb25zZSxcbiAgSUlkZW50aXR5UmVxdWVzdCxcbiAgSVJlZ2lzdGVyUmVxdWVzdCxcbiAgSVJldm9rZVJlcXVlc3QsXG4gIElTZXJ2aWNlUmVzcG9uc2UsXG4gIFRMU09wdGlvbnMsXG59IGZyb20gXCJmYWJyaWMtY2EtY2xpZW50XCI7XG5pbXBvcnQgeyBDQUNvbmZpZywgQ3JlZGVudGlhbHMgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQge1xuICBDb25mbGljdEVycm9yLFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvcmVVdGlscywgZ2V0QWtpQW5kU2VyaWFsRnJvbUNlcnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7XG4gIENlcnRpZmljYXRlUmVzcG9uc2UsXG4gIEZhYnJpY0lkZW50aXR5LFxuICBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICBJZGVudGl0eVJlc3BvbnNlLFxufSBmcm9tIFwiLi4vLi4vc2hhcmVkL2ZhYnJpYy10eXBlc1wiO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gXCJmYWJyaWMtY29tbW9uXCI7XG5pbXBvcnQgeyBSZWdpc3RyYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBDQV9ST0xFIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBJS2V5VmFsdWVBdHRyaWJ1dGUgfSBmcm9tIFwiLi9GYWJyaWNFbnJvbGxtZW50U2VydmljZVwiO1xuaW1wb3J0IHsgSWRlbnRpdHkgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2luZGV4XCI7XG5pbXBvcnQgeyBDcnlwdG9VdGlscyB9IGZyb20gXCIuLi9jcnlwdG9cIjtcblxuZXhwb3J0IGNsYXNzIEZhYnJpY0lkZW50aXR5U2VydmljZSBleHRlbmRzIENsaWVudEJhc2VkU2VydmljZTxcbiAgRmFicmljQ0FTZXJ2aWNlcyxcbiAgQ0FDb25maWdcbj4ge1xuICBwcm90ZWN0ZWQgX3VzZXIhOiBVc2VyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHJvb3RDbGllbnQoKTogeyBuZXdDZXJ0aWZpY2F0ZVNlcnZpY2U6IGFueSB9IHtcbiAgICByZXR1cm4gKHRoaXMuY2xpZW50IGFzIGFueSlbXCJfRmFicmljQ2FTZXJ2aWNlc1wiXSBhcyBhbnk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHVzZXIoKTogVXNlciB7XG4gICAgaWYgKCF0aGlzLl91c2VyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiRmFicmljIGlkZW50aXR5IHNlcnZpY2Ugbm90IHByb3Blcmx5IHNldHVwOiBtaXNzaW5nIHVzZXJcIlxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5fdXNlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgY2VydGlmaWNhdGVzKCkge1xuICAgIHJldHVybiB0aGlzLnJvb3RDbGllbnQubmV3Q2VydGlmaWNhdGVTZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGFmZmlsaWF0aW9ucygpOiBBZmZpbGlhdGlvblNlcnZpY2Uge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5uZXdBZmZpbGlhdGlvblNlcnZpY2UoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaWRlbnRpdGllcygpOiBJZGVudGl0eVNlcnZpY2Uge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5uZXdJZGVudGl0eVNlcnZpY2UoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZXRVc2VyKGNmZzogQ0FDb25maWcsIGN0eDogQ29udGV4dCkge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuZ2V0VXNlcik7XG4gICAgY29uc3QgeyBjYU5hbWUsIGNhQ2VydCwgY2FLZXksIHVybCwgaHNtIH0gPSBjZmc7XG5cbiAgICBsb2cuaW5mbyhgQ3JlYXRpbmcgQ0EgdXNlciBmb3IgJHtjYU5hbWV9IGF0ICR7dXJsfWApO1xuICAgIGxvZy52ZXJib3NlKGBSZXRyaWV2aW5nIENBIGNlcnRpZmljYXRlIGZyb20gJHtjYUNlcnR9YCk7XG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoY2FDZXJ0KTtcbiAgICBsZXQga2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFoc20pIHtcbiAgICAgIGlmICghY2FLZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE1pc3NpbmcgY2FLZXkgY29uZmlndXJhdGlvbiBmb3IgQ0EgJHtjYU5hbWV9LiBQcm92aWRlIGEga2V5IGRpcmVjdG9yeSBvciBjb25maWd1cmUgSFNNIHN1cHBvcnQuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIENBIGtleSBmcm9tICR7Y2FLZXl9YCk7XG4gICAgICBrZXkgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoY2FLZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBVc2luZyBIU00gY29uZmlndXJhdGlvbiBmb3IgQ0EgJHtjYU5hbWV9IHdpdGggbGlicmFyeSAke2hzbS5saWJyYXJ5fWBcbiAgICAgICk7XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgTG9hZGluZyBBZG1pbiB1c2VyIGZvciBjYSAke2NhTmFtZX1gKTtcbiAgICB0aGlzLl91c2VyID0gYXdhaXQgQ29yZVV0aWxzLmdldENBVXNlcihcImFkbWluXCIsIGtleSwgY2VydGlmaWNhdGUsIGNhTmFtZSwge1xuICAgICAgaHNtLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLl91c2VyO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgaW5pdGlhbGl6ZShcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHsgY29uZmlnOiBDQUNvbmZpZzsgY2xpZW50OiBGYWJyaWNDQVNlcnZpY2VzIH0+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQZXJzaXN0ZW5jZUtleXMuSU5JVElBTElaQVRJT04sIHRydWUpXG4gICAgKS5mb3IodGhpcy5pbml0aWFsaXplKTtcbiAgICBjb25zdCBbY29uZmlnXSA9IGFyZ3M7XG4gICAgaWYgKCFjb25maWcpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTWlzc2luZyBGYWJyaWMgQ0EgY29uZmlndXJhdGlvblwiKTtcblxuICAgIGNvbnN0IHsgdXJsLCB0bHMsIGNhTmFtZSB9ID0gY29uZmlnO1xuICAgIGxvZy5pbmZvKGBJbml0aWFsaXppbmcgQ0EgQ2xpZW50IGZvciBDQSAke2NvbmZpZy5jYU5hbWV9IGF0ICR7Y29uZmlnLnVybH1gKTtcbiAgICBjb25zdCB7IHRydXN0ZWRSb290cywgdmVyaWZ5IH0gPSB0bHMgYXMgVExTT3B0aW9ucztcblxuICAgIGNvbnN0IHJvb3QgPSAodHJ1c3RlZFJvb3RzIGFzIHN0cmluZ1tdKVswXSBhcyBzdHJpbmc7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIENBIGNlcnRpZmljYXRlIGZyb20gJHtyb290fS4gY3dkOiAke3Byb2Nlc3MuY3dkKCl9YCk7XG5cbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGF3YWl0IENvcmVVdGlscy5nZXRGaWxlQ29udGVudChyb290KTtcblxuICAgIGxvZy5kZWJ1ZyhgQ0EgQ2VydGlmaWNhdGU6ICR7Y2VydGlmaWNhdGUudG9TdHJpbmcoKX1gKTtcblxuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBGYWJyaWNDQVNlcnZpY2VzKFxuICAgICAgdXJsLFxuICAgICAge1xuICAgICAgICB0cnVzdGVkUm9vdHM6IEJ1ZmZlci5mcm9tKGNlcnRpZmljYXRlKSxcbiAgICAgICAgdmVyaWZ5LFxuICAgICAgfSBhcyBUTFNPcHRpb25zLFxuICAgICAgY2FOYW1lXG4gICAgKTtcblxuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmdldFVzZXIoY29uZmlnLCBjdHgpO1xuICAgIGxvZy5kZWJ1ZyhgQ0EgdXNlciBsb2FkZWQ6ICR7dXNlci5nZXROYW1lKCl9YCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbmZpZyxcbiAgICAgIGNsaWVudCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzKC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+KTogUHJvbWlzZTxzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlcyhcbiAgICByZXF1ZXN0OiBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8c3RyaW5nW10+O1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXM8TUFQIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgZG9NYXA6IE1BUCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPE1BUCBleHRlbmRzIGZhbHNlID8gQ2VydGlmaWNhdGVSZXNwb25zZSA6IHN0cmluZ1tdPjtcbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzPE1BUCBleHRlbmRzIGJvb2xlYW4+KFxuICAgIHJlcXVlc3Q6IEdldENlcnRpZmljYXRlc1JlcXVlc3QsXG4gICAgZG9NYXA6IE1BUCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPE1BUCBleHRlbmRzIGZhbHNlID8gQ2VydGlmaWNhdGVSZXNwb25zZSA6IHN0cmluZ1tdPjtcbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzPE1BUCBleHRlbmRzIGJvb2xlYW4+KFxuICAgIHJlcXVlc3Q/OiBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0IHwgTUFQLFxuICAgIGRvTWFwOiBNQVAgPSB0cnVlIGFzIE1BUCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPE1BUCBleHRlbmRzIGZhbHNlID8gQ2VydGlmaWNhdGVSZXNwb25zZSA6IHN0cmluZ1tdPiB7XG4gICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBDb250ZXh0KSB7XG4gICAgICBhcmdzID0gW3JlcXVlc3RdO1xuICAgICAgZG9NYXAgPSB0cnVlIGFzIE1BUDtcbiAgICAgIHJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmVxdWVzdCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGRvTWFwID0gcmVxdWVzdDtcbiAgICAgIHJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZG9NYXAgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBhcmdzID0gW2RvTWFwIGFzIE1heWJlQ29udGV4dHVhbEFyZzxhbnk+LCAuLi5hcmdzXTtcbiAgICAgIGRvTWFwID0gdHJ1ZSBhcyBNQVA7XG4gICAgfVxuXG4gICAgY29uc3QgeyBsb2cgfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBPcGVyYXRpb25LZXlzLlJFQUQsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLmdldENlcnRpZmljYXRlc1xuICAgICk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYFJldHJpZXZpbmcgY2VydGlmaWNhdGVzJHtyZXF1ZXN0ID8gYCBmb3IgJHtyZXF1ZXN0LmlkfWAgOiBcIlwifSBmb3IgQ0EgJHt0aGlzLmNvbmZpZy5jYU5hbWV9YFxuICAgICk7XG4gICAgY29uc3QgcmVzcG9uc2U6IENlcnRpZmljYXRlUmVzcG9uc2UgPSAoXG4gICAgICBhd2FpdCB0aGlzLmNlcnRpZmljYXRlcy5nZXRDZXJ0aWZpY2F0ZXMocmVxdWVzdCB8fCB7fSwgdGhpcy51c2VyKVxuICAgICkucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmNlcnRzLmxlbmd0aH0gY2VydGlmaWNhdGVzYCk7XG4gICAgbG9nLmRlYnVnKHJlc3BvbnNlLmNlcnRzKTtcbiAgICByZXR1cm4gKFxuICAgICAgZG9NYXAgPyByZXNwb25zZS5jZXJ0cy5tYXAoKGMpID0+IGMuUEVNKSA6IHJlc3BvbnNlXG4gICAgKSBhcyBNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXTtcbiAgfVxuXG4gIGFzeW5jIGdldElkZW50aXRpZXMoY3R4OiBDb250ZXh0KTogUHJvbWlzZTxGYWJyaWNJZGVudGl0eVtdPiB7XG4gICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IodGhpcy5nZXRJZGVudGl0aWVzKTtcbiAgICBsb2cudmVyYm9zZShgUmV0cmlldmluZyBJZGVudGl0aWVzIHVuZGVyIENBICR7dGhpcy5jb25maWcuY2FOYW1lfWApO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBJZGVudGl0eVJlc3BvbnNlID0gKGF3YWl0IHRoaXMuaWRlbnRpdGllcy5nZXRBbGwodGhpcy51c2VyKSlcbiAgICAgIC5yZXN1bHQ7XG4gICAgbG9nLnZlcmJvc2UoYEZvdW5kICR7cmVzcG9uc2UuaWRlbnRpdGllcy5sZW5ndGh9IElkZW50aXRpZXNgKTtcbiAgICBsb2cuZGVidWcocmVzcG9uc2UuaWRlbnRpdGllcyk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmlkZW50aXRpZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlIGFmZmlsaWF0aW9ucyBmcm9tIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgUXVlcmllcyB0aGUgQ0EgZm9yIHRoZSBsaXN0IG9mIGFmZmlsaWF0aW9ucyBhdmFpbGFibGUgdW5kZXIgdGhlIGNvbmZpZ3VyZWQgQ0EuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGFmZmlsaWF0aW9ucyByZXN1bHQgcGF5bG9hZC5cbiAgICovXG4gIGFzeW5jIGdldEFmZmlsaWF0aW9ucyhjdHg6IENvbnRleHQpIHtcbiAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyLmZvcih0aGlzLmdldEFmZmlsaWF0aW9ucyk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgQWZmaWxpYXRpb25zIHVuZGVyIENBICR7dGhpcy5jb25maWcuY2FOYW1lfWApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IHRoaXMuYWZmaWxpYXRpb25zLmdldEFsbCh0aGlzLnVzZXIpKS5yZXN1bHQ7XG4gICAgbG9nLnZlcmJvc2UoYEZvdW5kICR7cmVzcG9uc2UuYS5sZW5ndGh9IEFmZmlsaWF0aW9uc2ApO1xuICAgIGxvZy5kZWJ1ZyhKU09OLnN0cmluZ2lmeShyZXNwb25zZSkpO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUVycm9yKGU6IEVycm9yKSB7XG4gICAgY29uc3QgcmVnZXhwID0gLy4qY29kZTpcXHMoXFxkKykuKj9tZXNzYWdlOlxcc1tcIiddKC4rKVtcIiddL2dzO1xuICAgIGNvbnN0IG1hdGNoID0gcmVnZXhwLmV4ZWMoZS5tZXNzYWdlKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gbmV3IFJlZ2lzdHJhdGlvbkVycm9yKGUpO1xuICAgIGNvbnN0IFssIGNvZGUsIG1lc3NhZ2VdID0gbWF0Y2g7XG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICBjYXNlIFwiNzRcIjpcbiAgICAgIGNhc2UgXCI3MVwiOlxuICAgICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IobWVzc2FnZSk7XG4gICAgICBjYXNlIFwiMjBcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBBdXRob3JpemF0aW9uRXJyb3IobWVzc2FnZSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbmV3IFJlZ2lzdHJhdGlvbkVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZCBpZGVudGl0eSBkZXRhaWxzIGZyb20gdGhlIENBIGJ5IGVucm9sbG1lbnQgSUQuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhbmQgdmFsaWRhdGVzIGEgc2luZ2xlIGlkZW50aXR5LCB0aHJvd2luZyBOb3RGb3VuZEVycm9yIHdoZW4gbWlzc2luZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVucm9sbG1lbnRJZCAtIEVucm9sbG1lbnQgSUQgdG8gbG9va3VwLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEZhYnJpY0lkZW50aXR5Pn0gVGhlIGlkZW50aXR5IGRldGFpbHMgc3RvcmVkIGluIHRoZSBDQS5cbiAgICovXG4gIGFzeW5jIHJlYWQoXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxGYWJyaWNJZGVudGl0eT4ge1xuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgT3BlcmF0aW9uS2V5cy5SRUFELCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5yZWFkXG4gICAgKTtcbiAgICBsb2cudmVyYm9zZShgUmV0cmlldmluZyBpZGVudGl0eSB3aXRoIGVucm9sbG1lbnQgSUQgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgbGV0IHJlc3VsdDogSVNlcnZpY2VSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5pZGVudGl0aWVzLmdldE9uZShlbnJvbGxtZW50SWQsIHRoaXMudXNlcik7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkbid0IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXN1bHQuc3VjY2VzcylcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGRuJ3QgZmluZCBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke3Jlc3VsdC5lcnJvcnMuam9pbihcIlxcblwiKX1gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQgYXMgRmFicmljSWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGEgbmV3IGlkZW50aXR5IHdpdGggdGhlIENBLlxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgcmVnaXN0cmF0aW9uIHJlcXVlc3QgZm9yIGEgbmV3IGVucm9sbG1lbnQgSUQsIHJldHVybmluZyB0aGUgZW5yb2xsbWVudCBzZWNyZXQgdXBvbiBzdWNjZXNzLlxuICAgKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBtb2RlbCAtIENyZWRlbnRpYWxzIGNvbnRhaW5pbmcgdXNlck5hbWUgYW5kIHBhc3N3b3JkIGZvciB0aGUgbmV3IGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N1cGVyVXNlcj1mYWxzZV0gLSBXaGV0aGVyIHRvIHJlZ2lzdGVyIHRoZSBpZGVudGl0eSBhcyBhIHN1cGVyIHVzZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWZmaWxpYXRpb249XCJcIl0gLSBBZmZpbGlhdGlvbiBzdHJpbmcgKGUuZy4sIG9yZzEuZGVwYXJ0bWVudDEpLlxuICAgKiBAcGFyYW0ge0NBX1JPTEUgfCBzdHJpbmd9IFt1c2VyUm9sZV0gLSBSb2xlIHRvIGFzc2lnbiB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7SUtleVZhbHVlQXR0cmlidXRlfSBbYXR0cnNdIC0gT3B0aW9uYWwgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW21heEVucm9sbG1lbnRzXSAtIE1heGltdW0gbnVtYmVyIG9mIGVucm9sbG1lbnRzIGFsbG93ZWQgZm9yIHRoZSBpZGVudGl0eS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSBUaGUgZW5yb2xsbWVudCBzZWNyZXQgZm9yIHRoZSByZWdpc3RlcmVkIGlkZW50aXR5LlxuICAgKi9cbiAgYXN5bmMgcmVnaXN0ZXIoXG4gICAgbW9kZWw6IENyZWRlbnRpYWxzLFxuICAgIGlzU3VwZXJVc2VyOiBib29sZWFuID0gZmFsc2UsXG4gICAgYWZmaWxpYXRpb246IHN0cmluZyA9IFwiXCIsXG4gICAgdXNlclJvbGU/OiBDQV9ST0xFIHwgc3RyaW5nLFxuICAgIGF0dHJzPzogSUtleVZhbHVlQXR0cmlidXRlLFxuICAgIG1heEVucm9sbG1lbnRzPzogbnVtYmVyLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInJlZ2lzdGVyXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLnJlZ2lzdGVyXG4gICAgKTtcblxuICAgIGxldCByZWdpc3RyYXRpb246IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyB1c2VyTmFtZSwgcGFzc3dvcmQgfSA9IG1vZGVsO1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIGVucm9sbG1lbnRJRDogdXNlck5hbWUgYXMgc3RyaW5nLFxuICAgICAgICBlbnJvbGxtZW50U2VjcmV0OiBwYXNzd29yZCxcbiAgICAgICAgYWZmaWxpYXRpb246IGFmZmlsaWF0aW9uLFxuICAgICAgICB1c2VyUm9sZTogdXNlclJvbGUsXG4gICAgICAgIGF0dHJzOiBhdHRycyxcbiAgICAgICAgbWF4RW5yb2xsbWVudHM6IG1heEVucm9sbG1lbnRzLFxuICAgICAgfSBhcyBJUmVnaXN0ZXJSZXF1ZXN0O1xuICAgICAgcmVnaXN0cmF0aW9uID0gYXdhaXQgdGhpcy5jbGllbnQucmVnaXN0ZXIocHJvcHMsIHRoaXMudXNlcik7XG4gICAgICBsb2cuaW5mbyhcbiAgICAgICAgYFJlZ2lzdHJhdGlvbiBmb3IgJHt1c2VyTmFtZX0gY3JlYXRlZCB3aXRoIHVzZXIgdHlwZSAke3VzZXJSb2xlID8/IFwiVW5kZWZpbmVkIFJvbGVcIn0gJHtpc1N1cGVyVXNlciA/IFwiYXMgc3VwZXIgdXNlclwiIDogXCJcIn1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVnaXN0cmF0aW9uO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBpZGVudGl0eUZyb21FbnJvbGxtZW50KFxuICAgIGVucm9sbG1lbnQ6IElFbnJvbGxSZXNwb25zZSxcbiAgICBtc3BJZDogc3RyaW5nLFxuICAgIGN0eDogQ29udGV4dFxuICApOiBJZGVudGl0eSB7XG4gICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IodGhpcy5pZGVudGl0eUZyb21FbnJvbGxtZW50KTtcbiAgICBjb25zdCB7IGNlcnRpZmljYXRlLCBrZXksIHJvb3RDZXJ0aWZpY2F0ZSB9ID0gZW5yb2xsbWVudDtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBHZW5lcmF0aW5nIElkZW50aXR5IGZyb20gY2VydGlmaWNhdGUgJHtjZXJ0aWZpY2F0ZX0gaW4gbXNwICR7bXNwSWR9YFxuICAgICk7XG4gICAgY29uc3QgY2xpZW50SWQgPSBDcnlwdG9VdGlscy5mYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3QgaWQgPSBDcnlwdG9VdGlscy5lbmNvZGUoY2xpZW50SWQpO1xuICAgIGxvZy5kZWJ1ZyhgSWRlbnRpdHkgJHtjbGllbnRJZH0gYW5kIGVuY29kZWRJZCAke2lkfWApO1xuICAgIHJldHVybiBuZXcgSWRlbnRpdHkoe1xuICAgICAgaWQ6IGlkLFxuICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBjZXJ0aWZpY2F0ZTogY2VydGlmaWNhdGUsXG4gICAgICAgIHByaXZhdGVLZXk6IGtleS50b0J5dGVzKCksXG4gICAgICAgIHJvb3RDZXJ0aWZpY2F0ZTogcm9vdENlcnRpZmljYXRlLFxuICAgICAgfSxcbiAgICAgIG1zcElkOiBtc3BJZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRW5yb2xsIGFuIGlkZW50aXR5IHdpdGggdGhlIENBIHVzaW5nIGEgcmVnaXN0cmF0aW9uIHNlY3JldC5cbiAgICogQHN1bW1hcnkgRXhjaGFuZ2VzIHRoZSBlbnJvbGxtZW50IElEIGFuZCBzZWNyZXQgZm9yIGNlcnRpZmljYXRlcywgcmV0dXJuaW5nIGEgY29uc3RydWN0ZWQgSWRlbnRpdHkgbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGVucm9sbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbiAtIEVucm9sbG1lbnQgc2VjcmV0IHJldHVybmVkIGF0IHJlZ2lzdHJhdGlvbiB0aW1lLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPElkZW50aXR5Pn0gVGhlIGVucm9sbGVkIGlkZW50aXR5IG9iamVjdCB3aXRoIGNyZWRlbnRpYWxzLlxuICAgKi9cbiAgYXN5bmMgZW5yb2xsKFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIHJlZ2lzdHJhdGlvbjogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8SWRlbnRpdHk+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJlbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMuZW5yb2xsXG4gICAgKTtcbiAgICBsZXQgaWRlbnRpdHk6IElkZW50aXR5O1xuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoYEVucm9sbGluZyAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIGNvbnN0IGVucm9sbG1lbnQ6IElFbnJvbGxSZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmVucm9sbCh7XG4gICAgICAgIGVucm9sbG1lbnRJRDogZW5yb2xsbWVudElkLFxuICAgICAgICBlbnJvbGxtZW50U2VjcmV0OiByZWdpc3RyYXRpb24sXG4gICAgICB9KTtcbiAgICAgIGlkZW50aXR5ID0gRmFicmljSWRlbnRpdHlTZXJ2aWNlLmlkZW50aXR5RnJvbUVucm9sbG1lbnQoXG4gICAgICAgIGVucm9sbG1lbnQsXG4gICAgICAgIHRoaXMuY29uZmlnLmNhTmFtZSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBTdWNjZXNzZnVsbHkgZW5yb2xsZWQgJHtlbnJvbGxtZW50SWR9IHVuZGVyICR7dGhpcy5jb25maWcuY2FOYW1lfSBhcyAke2lkZW50aXR5LmlkfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiBpZGVudGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgYW5kIGVucm9sbCBhIG5ldyBpZGVudGl0eSBpbiBvbmUgc3RlcC5cbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIGEgbmV3IGVucm9sbG1lbnQgSUQgd2l0aCB0aGUgQ0EgYW5kIGltbWVkaWF0ZWx5IGV4Y2hhbmdlcyB0aGUgc2VjcmV0IHRvIGVucm9sbCwgcmV0dXJuaW5nIHRoZSBjcmVhdGVkIElkZW50aXR5LlxuICAgKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBtb2RlbCAtIENyZWRlbnRpYWxzIGZvciB0aGUgbmV3IGlkZW50aXR5IGNvbnRhaW5pbmcgdXNlck5hbWUgYW5kIHBhc3N3b3JkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N1cGVyVXNlcj1mYWxzZV0gLSBXaGV0aGVyIHRvIHJlZ2lzdGVyIHRoZSBpZGVudGl0eSBhcyBhIHN1cGVyIHVzZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWZmaWxpYXRpb249XCJcIl0gLSBBZmZpbGlhdGlvbiBzdHJpbmcgKGUuZy4sIG9yZzEuZGVwYXJ0bWVudDEpLlxuICAgKiBAcGFyYW0ge0NBX1JPTEUgfCBzdHJpbmd9IFt1c2VyUm9sZV0gLSBSb2xlIHRvIGFzc2lnbiB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7SUtleVZhbHVlQXR0cmlidXRlfSBbYXR0cnNdIC0gT3B0aW9uYWwgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW21heEVucm9sbG1lbnRzXSAtIE1heGltdW0gbnVtYmVyIG9mIGVucm9sbG1lbnRzIGFsbG93ZWQgZm9yIHRoZSBpZGVudGl0eS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBlbnJvbGxlZCBpZGVudGl0eS5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyQW5kRW5yb2xsKFxuICAgIG1vZGVsOiBDcmVkZW50aWFscyxcbiAgICBpc1N1cGVyVXNlcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiLFxuICAgIHVzZXJSb2xlPzogQ0FfUk9MRSB8IHN0cmluZyxcbiAgICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZSxcbiAgICBtYXhFbnJvbGxtZW50cz86IG51bWJlcixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInJlZ2lzdGVyLWVucm9sbFwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5yZWdpc3RlckFuZEVucm9sbFxuICAgICk7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gYXdhaXQgdGhpcy5yZWdpc3RlcihcbiAgICAgIG1vZGVsLFxuICAgICAgaXNTdXBlclVzZXIsXG4gICAgICBhZmZpbGlhdGlvbixcbiAgICAgIHVzZXJSb2xlLFxuICAgICAgYXR0cnMsXG4gICAgICBtYXhFbnJvbGxtZW50cyxcbiAgICAgIGN0eFxuICAgICk7XG4gICAgY29uc3QgeyB1c2VyTmFtZSB9ID0gbW9kZWw7XG4gICAgcmV0dXJuIHRoaXMuZW5yb2xsKHVzZXJOYW1lIGFzIHN0cmluZywgcmVnaXN0cmF0aW9uLCBjdHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZS1lbnJvbGwgYW4gZXhpc3RpbmcgaWRlbnRpdHkgdXNpbmcgaXRzIGN1cnJlbnQgZW5yb2xsbWVudC5cbiAgICogQHN1bW1hcnkgUmVuZXdzIHRoZSBlbnJvbGxtZW50IGNlcnRpZmljYXRlIGJ5IGNhbGxpbmcgdGhlIENBIHJlZW5yb2xsLlxuICAgKiBAcGFyYW0ge1VzZXJ9IGN1cnJlbnRVc2VyIC0gQWxyZWFkeSBlbnJvbGxlZCB1c2VyLCBtdXN0IGhhdmUgYSBzaWduaW5nIGlkZW50aXR5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPElkZW50aXR5Pn0gVGhlIHJlbmV3ZWQgaWRlbnRpdHkgb2JqZWN0IHdpdGggbmV3IGNyZWRlbnRpYWxzLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlSWRlbnRpdHkoXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgaWRlbnRpdHk6IHsgY2VydGlmaWNhdGU6IHN0cmluZzsgcHJpdmF0ZUtleTogc3RyaW5nIH0sXG4gICAgaWRlbnRpdHlSZXF1ZXN0OiBJSWRlbnRpdHlSZXF1ZXN0LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8SWRlbnRpdHk+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWVucm9sbFwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy51cGRhdGVJZGVudGl0eVxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgbG9nLmluZm8oYFJlbmV3aW5nIGlkZW50aXR5IGZvciAke2Vucm9sbG1lbnRJZH1gKTtcblxuICAgICAgLy8gVXBkYXRlIGF0dHJpYnV0ZXMgaW4gdGhlIENBIHJlZ2lzdHJ5IChhZG1pbiBvcGVyYXRpb24pLiBUaGlzIGNoYW5nZXMgdGhlIFwic291cmNlIG9mIHRydXRoXCIuXG4gICAgICBjb25zdCBpZGVudGl0eVNlcnZpY2UgPSB0aGlzLmNsaWVudC5uZXdJZGVudGl0eVNlcnZpY2UoKTtcblxuICAgICAgY29uc3QgY2FVc2VySWRlbnRpdHkgPSAoYXdhaXQgaWRlbnRpdHlTZXJ2aWNlLmdldE9uZShcbiAgICAgICAgZW5yb2xsbWVudElkLFxuICAgICAgICB0aGlzLnVzZXJcbiAgICAgICkpIGFzIHsgcmVzdWx0OiB7IGF0dHJzPzogSUtleVZhbHVlQXR0cmlidXRlW10gfSB9O1xuXG4gICAgICBhd2FpdCBpZGVudGl0eVNlcnZpY2UudXBkYXRlKGVucm9sbG1lbnRJZCwgaWRlbnRpdHlSZXF1ZXN0LCB0aGlzLnVzZXIpOyAvLyBhcyBJU2VydmljZVJlc3BvbnNlICYgeyByZXN1bHQ6IElJZGVudGl0eVJlcXVlc3QgfTtcblxuICAgICAgLy8gUmVlbnJvbGwgYXMgdGhlIHVzZXIuIFJlcXVlc3QgbXVzdCBiZSBzaWduZWQgdXNpbmcgdGhlIGV4aXN0aW5nIGNlcnRpZmljYXRlLlxuICAgICAgY29uc3QgcmVlbnJvbGxVc2VyID0gVXNlci5jcmVhdGVVc2VyKFxuICAgICAgICBlbnJvbGxtZW50SWQsXG4gICAgICAgIFwiXCIsIC8vIGVucm9sbG1lbnRTZWNyZXQgbm90IHJlcXVpcmVkIGZvciByZWVucm9sbFxuICAgICAgICB0aGlzLnVzZXIuZ2V0TXNwaWQoKSxcbiAgICAgICAgaWRlbnRpdHkuY2VydGlmaWNhdGUsXG4gICAgICAgIGlkZW50aXR5LnByaXZhdGVLZXlcbiAgICAgICk7XG4gICAgICByZWVucm9sbFVzZXIuc2V0Q3J5cHRvU3VpdGUodGhpcy51c2VyLmdldENyeXB0b1N1aXRlKCkpO1xuXG4gICAgICBjb25zdCBlbnJvbGxtZW50QXR0cnM6IElBdHRyaWJ1dGVSZXF1ZXN0W10gPSAoXG4gICAgICAgIGNhVXNlcklkZW50aXR5LnJlc3VsdC5hdHRycyB8fCBbXVxuICAgICAgKS5tYXAoKHsgbmFtZSB9KSA9PiAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBvcHRpb25hbDogZmFsc2UsXG4gICAgICB9KSk7XG5cbiAgICAgIGNvbnN0IGVucm9sbG1lbnQgPSBhd2FpdCB0aGlzLmNsaWVudC5yZWVucm9sbChcbiAgICAgICAgcmVlbnJvbGxVc2VyLFxuICAgICAgICBlbnJvbGxtZW50QXR0cnNcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJlbmV3ZWRJZGVudGl0eSA9IEZhYnJpY0lkZW50aXR5U2VydmljZS5pZGVudGl0eUZyb21FbnJvbGxtZW50KFxuICAgICAgICBlbnJvbGxtZW50LFxuICAgICAgICB0aGlzLmNvbmZpZy5jYU5hbWUsXG4gICAgICAgIGN0eFxuICAgICAgKTtcblxuICAgICAgLy8gUmV2b2tlIHRoZSBwcmV2aW91cyBjZXJ0aWZpY2F0ZSBvbmx5LCBzbyB0aGUgb2xkIGNlcnQgYmVjb21lcyBpbnZhbGlkLlxuICAgICAgbG9nLmRlYnVnKGBSZXZva2luZyBwcmV2aW91cyBjZXJ0aWZpY2F0ZXMgZm9yICR7ZW5yb2xsbWVudElkfWApO1xuICAgICAgY29uc3QgeyBha2ksIHNlcmlhbCB9ID0gZ2V0QWtpQW5kU2VyaWFsRnJvbUNlcnQoaWRlbnRpdHkuY2VydGlmaWNhdGUpO1xuICAgICAgYXdhaXQgdGhpcy5yZXZva2UoZW5yb2xsbWVudElkLCB7IGFraSwgc2VyaWFsIH0sIGFyZ3MpO1xuXG4gICAgICBsb2cuZGVidWcoYFJlbmV3IGlkZW50aXR5IHN1Y2Nlc3NmdWwgZm9yICR7ZW5yb2xsbWVudElkfWApO1xuICAgICAgcmV0dXJuIHJlbmV3ZWRJZGVudGl0eTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV2b2tlcyB0aGUgZW5yb2xsbWVudCBvZiBhbiBpZGVudGl0eSB3aXRoIHRoZSBzcGVjaWZpZWQgZW5yb2xsbWVudCBJRC5cbiAgICpcbiAgICogQHBhcmFtIGVucm9sbG1lbnRJZCAtIFRoZSBlbnJvbGxtZW50IElEIG9mIHRoZSBpZGVudGl0eSB0byBiZSByZXZva2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVzdWx0IG9mIHRoZSByZXZvY2F0aW9uIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHRocm93cyB7Tm90Rm91bmRFcnJvcn0gSWYgdGhlIGVucm9sbG1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIElEIGRvZXMgbm90IGV4aXN0LlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGVyZSBpcyBhbiBlcnJvciBkdXJpbmcgdGhlIHJldm9jYXRpb24gcHJvY2Vzcy5cbiAgICovXG4gIGFzeW5jIHJldm9rZShcbiAgICBlbnJvbGxtZW50SWQ6IHN0cmluZyxcbiAgICByZXZva2VPcHRpb25zOiBPbWl0PElSZXZva2VSZXF1ZXN0LCBcImVucm9sbG1lbnRJRFwiPixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElTZXJ2aWNlUmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IGxvZyB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwicmV2b2tlXCIsIHRydWUpKS5mb3IodGhpcy5yZXZva2UpO1xuICAgIGxvZy52ZXJib3NlKGBSZXZva2luZyBpZGVudGl0eSB3aXRoIGVucm9sbG1lbnQgSUQgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBhd2FpdCB0aGlzLnJlYWQoZW5yb2xsbWVudElkKTtcbiAgICBpZiAoIWlkZW50aXR5KVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgZmluZCBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9YFxuICAgICAgKTtcbiAgICBsZXQgcmVzdWx0OiBJU2VydmljZVJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWFzb24gPVxuICAgICAgICBCb29sZWFuKHJldm9rZU9wdGlvbnMuc2VyaWFsKSB8fCBCb29sZWFuKHJldm9rZU9wdGlvbnMuYWtpKVxuICAgICAgICAgID8gXCJSZXZva2UgVXNlciBDZXJ0aWZpY2F0ZVwiXG4gICAgICAgICAgOiBcIlVzZXIgRGVsZXRpb25cIjtcblxuICAgICAgY29uc3QgcmV2b2tlUmVxdWVzdDogSVJldm9rZVJlcXVlc3QgPSB7XG4gICAgICAgIHJlYXNvbixcbiAgICAgICAgLi4ucmV2b2tlT3B0aW9ucyxcbiAgICAgICAgZW5yb2xsbWVudElEOiBpZGVudGl0eS5pZCxcbiAgICAgIH07XG5cbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuY2xpZW50LnJldm9rZShyZXZva2VSZXF1ZXN0LCB0aGlzLnVzZXIpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IHJldm9rZSBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke2V9YFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFyZXN1bHQuc3VjY2VzcylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IHJldm9rZSBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke3Jlc3VsdC5lcnJvcnMuam9pbihcIlxcblwiKX1gXG4gICAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIENlcnRpZmljYXRlIEF1dGhvcml0eSByb2xlIHR5cGVzIHVzZWQgZHVyaW5nIGVucm9sbG1lbnQgYW5kIHJlZ2lzdHJhdGlvbi5cbiAqIEBzdW1tYXJ5IEVudW1lcmF0ZXMgdGhlIHN0YW5kYXJkIEh5cGVybGVkZ2VyIEZhYnJpYyBDQSByb2xlcyB0aGF0IGNhbiBiZSBhc3NpZ25lZCB0byBpZGVudGl0aWVzIHdoZW4gcmVnaXN0ZXJpbmcgd2l0aCB0aGUgQ0Egc2VydmljZS5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGVudW0gQ0FfUk9MRSB7XG4gIC8qKiBBZG1pbmlzdHJhdG9yIHJvbGUgd2l0aCBlbGV2YXRlZCBwcml2aWxlZ2VzIGZvciBtYW5hZ2luZyBpZGVudGl0aWVzIGFuZCBhZmZpbGlhdGlvbnMgKi9cbiAgQURNSU4gPSBcImFkbWluXCIsXG4gIC8qKiBTdGFuZGFyZCB1c2VyIHJvbGUgZm9yIGFwcGxpY2F0aW9uIGNsaWVudHMgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgbmV0d29yayAqL1xuICBVU0VSID0gXCJ1c2VyXCIsXG4gIC8qKiBDbGllbnQgcm9sZSB0eXBpY2FsbHkgdXNlZCBmb3IgU0RLLWJhc2VkIGludGVyYWN0aW9ucyBhbmQgc2VydmljZSBhY2NvdW50cyAqL1xuICBDTElFTlQgPSBcImNsaWVudFwiLFxufVxuIiwiaW1wb3J0IHsgRmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzOiBGYWJyaWNDbGllbnRGbGFncyA9IE9iamVjdC5hc3NpZ24oe1xuICBldmFsdWF0ZVRpbWVvdXQ6IDUsXG4gIGVuZG9yc2VUaW1lb3V0OiAxNSxcbiAgc3VibWl0VGltZW91dDogNSxcbiAgY29tbWl0VGltZW91dDogNjAsXG4gIGxlZ2FjeTogZmFsc2UsXG4gIGFsbG93TWFudWFsRW5kb3JzaW5nT3JnczogZmFsc2UsXG4gIGFsbG93R2F0ZXdheU92ZXJyaWRlOiBmYWxzZSxcbiAgcmVidWlsZFdpdGhUcmFuc2llbnQ6IHRydWUsXG4gIGVuY3J5cHRUcmFuc2llbnQ6IGZhbHNlLFxuICBzeW50aGV0aWNFdmVudHM6IHRydWUsXG59KSBhcyBhbnk7XG4iLCJpbXBvcnQgeyBpc0Jyb3dzZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgSWRlbnRpdHksIFNpZ25lciwgc2lnbmVycyB9IGZyb20gXCJAaHlwZXJsZWRnZXIvZmFicmljLWdhdGV3YXlcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUltcG9ydCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5jb25zdCBsb2cgPSBuZXcgTWluaUxvZ2dlcihcImZhYnJpYy1mc1wiKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTG9hZHMgY29udGVudCBmcm9tIGEgZmlsZSBvciByZXR1cm5zIHRoZSBjb250ZW50IGlmIGFscmVhZHkgbG9hZGVkXG4gKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIHRoZSBpbnB1dCBpcyBhbHJlYWR5IGNvbnRlbnQgb3IgYSBwYXRoIHRvIGEgZmlsZSwgYW5kIGxvYWRzIHRoZSBmaWxlIGlmIG5lZWRlZFxuICogQHBhcmFtIHtzdHJpbmcgfCBVaW50OEFycmF5fSBjb250ZW50T3JQYXRoIC0gVGhlIGNvbnRlbnQgb3IgcGF0aCB0byBsb2FkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaWxlUmVhZGVyIC0gRnVuY3Rpb24gdG8gcmVhZCB0aGUgZmlsZSBpZiBjb250ZW50T3JQYXRoIGlzIGEgcGF0aFxuICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmcgfCBVaW50OEFycmF5IHwgQnVmZmVyPn0gVGhlIGNvbnRlbnRcbiAqIEBmdW5jdGlvbiBjb250ZW50T2ZMb2FkRmlsZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29udGVudE9mTG9hZEZpbGUoXG4gIGNvbnRlbnRPclBhdGg6IHN0cmluZyB8IFVpbnQ4QXJyYXksXG4gIGZpbGVSZWFkZXI6IChwYXRoOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nIHwgVWludDhBcnJheSB8IEJ1ZmZlcj5cbikge1xuICBpZiAoY29udGVudE9yUGF0aCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHJldHVybiBjb250ZW50T3JQYXRoO1xuICBpZiAoXG4gICAgY29udGVudE9yUGF0aC5tYXRjaChcbiAgICAgIC8tLS0tLUJFR0lOIChDRVJUSUZJQ0FURXxLRVl8UFJJVkFURSBLRVkpLS0tLS0uKz8tLS0tLUVORCBcXDEtLS0tLSQvZ21zXG4gICAgKVxuICApXG4gICAgcmV0dXJuIGNvbnRlbnRPclBhdGg7XG4gIHJldHVybiBhd2FpdCBmaWxlUmVhZGVyKGNvbnRlbnRPclBhdGgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIGZpbGUgZnJvbSB0aGUgZmlsZSBzeXN0ZW1cbiAqIEBzdW1tYXJ5IExvYWRzIGEgZmlsZSB1c2luZyB0aGUgTm9kZS5qcyBmaWxlIHN5c3RlbSBtb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nIHwgQnVmZmVyfSBjb250ZW50T3JQYXRoIC0gVGhlIGNvbnRlbnQgb3IgcGF0aCB0byBsb2FkXG4gKiBAcmV0dXJuIHtQcm9taXNlPEJ1ZmZlcj59IFRoZSBmaWxlIGNvbnRlbnQgYXMgYSBCdWZmZXJcbiAqIEBmdW5jdGlvbiByZWFkRmlsZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEZpbGUoY29udGVudE9yUGF0aDogc3RyaW5nIHwgQnVmZmVyKSB7XG4gIGlmICh0eXBlb2YgY29udGVudE9yUGF0aCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGNvbnRlbnRPclBhdGg7XG5cbiAgY29uc3QgZmlsZVJlYWRlciA9IGFzeW5jIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgIHJldHVybiBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShwYXRoKTtcbiAgfTtcblxuICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIENlcnRpZmljYXRlIEF1dGhvcml0eSB1c2VyXG4gKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIHVzZXIgd2l0aCB0aGUgZ2l2ZW4gY3JlZGVudGlhbHMgZm9yIGludGVyYWN0aW5nIHdpdGggYSBGYWJyaWMgQ0FcbiAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyTmFtZSAtIFRoZSB1c2VyIG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcml2YXRlS2V5IC0gVGhlIHByaXZhdGUga2V5IGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gY2VydGlmaWNhdGUgLSBUaGUgY2VydGlmaWNhdGUgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc3BJZCAtIFRoZSBNZW1iZXJzaGlwIFNlcnZpY2UgUHJvdmlkZXIgSURcbiAqIEByZXR1cm4ge1Byb21pc2U8VXNlcj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIHVzZXJcbiAqIEBmdW5jdGlvbiBnZXRDQVVzZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENBVXNlcihcbiAgdXNlck5hbWU6IHN0cmluZyxcbiAgcHJpdmF0ZUtleTogc3RyaW5nLFxuICBjZXJ0aWZpY2F0ZTogc3RyaW5nLFxuICBtc3BJZDogc3RyaW5nXG4pOiBQcm9taXNlPFVzZXI+IHtcbiAgbG9nLmRlYnVnKFxuICAgIGBDcmVhdGluZyBhIENBICR7bXNwSWR9IHVzZXIgJHt1c2VyTmFtZX0gd2l0aCBjZXJ0aWZpY2F0ZSAke2NlcnRpZmljYXRlfWBcbiAgKTtcbiAgY29uc3QgdXNlciA9IG5ldyBVc2VyKHVzZXJOYW1lKTtcbiAgY29uc3QgY3J5cHRvU3VpdGUgPSBVc2VyLm5ld0NyeXB0b1N1aXRlKCk7XG4gIHVzZXIuc2V0Q3J5cHRvU3VpdGUoY3J5cHRvU3VpdGUpO1xuICBjb25zdCBpbXBvcnRlZEtleSA9IGNyeXB0b1N1aXRlLmNyZWF0ZUtleUZyb21SYXcocHJpdmF0ZUtleSk7XG4gIGF3YWl0IHVzZXIuc2V0RW5yb2xsbWVudChpbXBvcnRlZEtleSwgY2VydGlmaWNhdGUsIG1zcElkKTtcbiAgcmV0dXJuIHVzZXI7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgYW4gaWRlbnRpdHkgZnJvbSBhIGNlcnRpZmljYXRlIGRpcmVjdG9yeVxuICogQHN1bW1hcnkgTG9hZHMgYSBjZXJ0aWZpY2F0ZSBmcm9tIGEgZGlyZWN0b3J5IGFuZCBjcmVhdGVzIGFuIElkZW50aXR5IG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gVGhlIE1lbWJlcnNoaXAgU2VydmljZSBQcm92aWRlciBJRFxuICogQHBhcmFtIHtzdHJpbmd9IGNlcnREaXJlY3RvcnlQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGNlcnRpZmljYXRlXG4gKiBAcmV0dXJuIHtQcm9taXNlPElkZW50aXR5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGlkZW50aXR5XG4gKiBAZnVuY3Rpb24gZ2V0SWRlbnRpdHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldElkZW50aXR5KFxuICBtc3BJZDogc3RyaW5nLFxuICBjZXJ0RGlyZWN0b3J5UGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPElkZW50aXR5PiB7XG4gIGNvbnN0IGlkZW50aXR5RmlsZVJlYWRlciA9IGFzeW5jIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgIGNvbnN0IGNlcnRQYXRoID0gYXdhaXQgZ2V0Rmlyc3REaXJGaWxlTmFtZShwYXRoKTtcbiAgICBjb25zdCBjcmVkZW50aWFscyA9IGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGNlcnRQYXRoKTtcbiAgICByZXR1cm4gY3JlZGVudGlhbHM7XG4gIH07XG5cbiAgY29uc3QgY3JlZGVudGlhbHM6IFVpbnQ4QXJyYXkgPSAoYXdhaXQgY29udGVudE9mTG9hZEZpbGUoXG4gICAgY2VydERpcmVjdG9yeVBhdGgsXG4gICAgaWRlbnRpdHlGaWxlUmVhZGVyXG4gICkpIGFzIFVpbnQ4QXJyYXk7XG5cbiAgcmV0dXJuIHsgbXNwSWQsIGNyZWRlbnRpYWxzIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgZmlyc3QgZmlsZSBpbiBhIGRpcmVjdG9yeVxuICogQHN1bW1hcnkgUmVhZHMgYSBkaXJlY3RvcnkgYW5kIHJldHVybnMgdGhlIHBhdGggdG8gdGhlIGZpcnN0IGZpbGUgZm91bmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXJQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBmdWxsIHBhdGggb2YgdGhlIGZpcnN0IGZpbGVcbiAqIEBmdW5jdGlvbiBnZXRGaXJzdERpckZpbGVOYW1lXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGaXJzdERpckZpbGVOYW1lKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcInBhdGhcIikpO1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gIHJldHVybiBqb2luKGRpclBhdGgsIGZpbGVzWzBdKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY29udGVudCBvZiB0aGUgZmlyc3QgZmlsZSBpbiBhIGRpcmVjdG9yeVxuICogQHN1bW1hcnkgUmVhZHMgYSBkaXJlY3RvcnksIGZpbmRzIHRoZSBmaXJzdCBmaWxlLCBhbmQgcmV0dXJucyBpdHMgY29udGVudCBhcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IGRpclBhdGggLSBQYXRoIHRvIHRoZSBkaXJlY3RvcnlcbiAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGZpcnN0IGZpbGVcbiAqIEBmdW5jdGlvbiBnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudFxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoXG4gIGRpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgY29uc3QgeyBqb2luIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwicGF0aFwiKSk7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgcHJvbWlzZXMucmVhZGRpcihkaXJQYXRoKTtcbiAgcmV0dXJuIChhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShqb2luKGRpclBhdGgsIGZpbGVzWzBdKSkpLnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgYSBzaWduZXIgZnJvbSBhIGtleSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IExvYWRzIGEgcHJpdmF0ZSBrZXkgZnJvbSBhIGRpcmVjdG9yeSBhbmQgY3JlYXRlcyBhIFNpZ25lciBmb3IgRmFicmljIHRyYW5zYWN0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IGtleURpcmVjdG9yeVBhdGggLSBQYXRoIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgcHJpdmF0ZSBrZXlcbiAqIEByZXR1cm4ge1Byb21pc2U8U2lnbmVyPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHNpZ25lclxuICogQGZ1bmN0aW9uIGdldFNpZ25lclxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2lnbmVyKGtleURpcmVjdG9yeVBhdGg6IHN0cmluZyk6IFByb21pc2U8U2lnbmVyPiB7XG4gIGNvbnN0IHNpZ25lckZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCBrZXlQYXRoID0gYXdhaXQgZ2V0Rmlyc3REaXJGaWxlTmFtZShwYXRoKTtcbiAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoa2V5UGF0aCk7XG4gIH07XG5cbiAgY29uc3QgcHJpdmF0ZUtleVBlbSA9IChhd2FpdCBjb250ZW50T2ZMb2FkRmlsZShcbiAgICBrZXlEaXJlY3RvcnlQYXRoLFxuICAgIHNpZ25lckZpbGVSZWFkZXJcbiAgKSkgYXMgQnVmZmVyO1xuICAvLyBOb2RlIGJhc2VkIGltcGxlbWVudGF0aW9uXG4gIC8vIHByaXZhdGVLZXkgPSBjcmVhdGVQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICAvLyAtLVxuXG4gIC8vIHdlYiBiYXNlZCBpbXBsZW1lbnRhdGlvblxuICBjb25zdCBwcml2YXRlS2V5ID0gYXdhaXQgZXh0cmFjdFByaXZhdGVLZXkocHJpdmF0ZUtleVBlbSk7XG4gIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByaXZhdGVLZXkpO1xuICBjb25zdCBrID0gKHByaXZhdGVLZXkgYXMgYW55KVtrZXlzWzBdXTtcbiAgLy8gLS1cblxuICByZXR1cm4gc2lnbmVycy5uZXdQcml2YXRlS2V5U2lnbmVyKGsgYXMgYW55KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXh0cmFjdHMgYSBwcml2YXRlIGtleSBmcm9tIGEgUEVNIGJ1ZmZlclxuICogQHN1bW1hcnkgQ29udmVydHMgYSBQRU0tZW5jb2RlZCBwcml2YXRlIGtleSB0byBhIENyeXB0b0tleSBvYmplY3RcbiAqIEBwYXJhbSB7QnVmZmVyfSBwZW0gLSBUaGUgUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXlcbiAqIEByZXR1cm4ge1Byb21pc2U8Q3J5cHRvS2V5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIENyeXB0b0tleVxuICogQGZ1bmN0aW9uIGV4dHJhY3RQcml2YXRlS2V5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBFeHRyYWN0UHJpdmF0ZUtleVxuICogICBwYXJ0aWNpcGFudCBTdWJ0bGVDcnlwdG9cbiAqXG4gKiAgIENhbGxlci0+PkV4dHJhY3RQcml2YXRlS2V5OiBleHRyYWN0UHJpdmF0ZUtleShwZW0pXG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+RXh0cmFjdFByaXZhdGVLZXk6IEdldCBTdWJ0bGVDcnlwdG8gaW1wbGVtZW50YXRpb25cbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5FeHRyYWN0UHJpdmF0ZUtleTogUGFyc2UgUEVNIGZvcm1hdFxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PkV4dHJhY3RQcml2YXRlS2V5OiBDb252ZXJ0IHRvIGJpbmFyeSBERVJcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5TdWJ0bGVDcnlwdG86IGltcG9ydEtleShwa2NzOCwgYmluYXJ5RGVyLCBvcHRpb25zKVxuICogICBTdWJ0bGVDcnlwdG8tLT4+RXh0cmFjdFByaXZhdGVLZXk6IENyeXB0b0tleVxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0tPj5DYWxsZXI6IENyeXB0b0tleVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0cmFjdFByaXZhdGVLZXkocGVtOiBCdWZmZXIpIHtcbiAgY29uc3QgbGliTmFtZSA9IFwiY3J5cHRvXCI7XG4gIGxldCBzdWJ0bGU7XG4gIGlmIChpc0Jyb3dzZXIoKSkge1xuICAgIHN1YnRsZSA9IChnbG9iYWxUaGlzIGFzIGFueSkuY3J5cHRvLnN1YnRsZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBsaWIgPSAoYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChsaWJOYW1lKSkpIGFzIGFueTtcbiAgICBzdWJ0bGUgPSBsaWIuc3VidGxlIHx8IGxpYi53ZWJjcnlwdG8uc3VidGxlO1xuICB9XG5cbiAgaWYgKCFzdWJ0bGUpIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBsb2FkIFN1YnRsZUNyeXB0byBtb2R1bGVcIik7XG5cbiAgZnVuY3Rpb24gc3RyMmFiKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVmID0gbmV3IEFycmF5QnVmZmVyKHN0ci5sZW5ndGgpO1xuICAgIGNvbnN0IGJ1ZlZpZXcgPSBuZXcgVWludDhBcnJheShidWYpO1xuICAgIGZvciAobGV0IGkgPSAwLCBzdHJMZW4gPSBzdHIubGVuZ3RoOyBpIDwgc3RyTGVuOyBpKyspIHtcbiAgICAgIGJ1ZlZpZXdbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIGNvbnN0IHN0ciA9IHBlbVxuICAgIC50b1N0cmluZyhcInV0ZjhcIilcbiAgICAucmVwbGFjZShcIi0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLVwiLCBcIlwiKVxuICAgIC5yZXBsYWNlQWxsKFwiXFxuXCIsIFwiXCIpXG4gICAgLnJlcGxhY2UoXCItLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpO1xuICBjb25zdCBkZWNvZGVkID0gQnVmZmVyLmZyb20oc3RyLCBcImJhc2U2NFwiKS50b1N0cmluZyhcImJpbmFyeVwiKTtcbiAgY29uc3QgYmluYXJ5RGVyID0gc3RyMmFiKGRlY29kZWQpO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgc3VidGxlLmltcG9ydEtleShcbiAgICAgIFwicGtjczhcIixcbiAgICAgIGJpbmFyeURlcixcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJFQ0RTQVwiLFxuICAgICAgICBuYW1lZEN1cnZlOiBcIlAtMjU2XCIsXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICAgIFtcInNpZ25cIl1cbiAgICApO1xuXG4gICAgcmV0dXJuIGtleTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEFkYXB0ZXJGbGFncyxcbiAgQ29uZGl0aW9uLFxuICBDb250ZXh0LFxuICBHcm91cE9wZXJhdG9yLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIE9wZXJhdG9yLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBQcmVwYXJlZFN0YXRlbWVudCxcbiAgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLFxuICBRdWVyeUNsYXVzZSxcbiAgUXVlcnlFcnJvcixcbiAgUmVwb3NpdG9yeSxcbiAgU2VsZWN0U2VsZWN0b3IsXG4gIFNlcXVlbmNlLFxuICBTdGF0ZW1lbnQsXG4gIFN0YXRlbWVudEV4ZWN1dG9yLFxuICBWaWV3S2luZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRBZGFwdGVyXCI7XG5pbXBvcnQge1xuICBDb3VjaERCS2V5cyxcbiAgQ291Y2hEQk9wZXJhdG9yLFxuICBDb3VjaERCR3JvdXBPcGVyYXRvcixcbiAgQ291Y2hEQlF1ZXJ5TGltaXQsXG4gIE1hbmdvUXVlcnksXG4gIE1hbmdvT3BlcmF0b3IsXG4gIE1hbmdvU2VsZWN0b3IsXG4gIHRyYW5zbGF0ZU9wZXJhdG9ycyxcbiAgZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lLFxuICBnZW5lcmF0ZVZpZXdOYW1lLFxuICBmaW5kVmlld01ldGFkYXRhLFxuICBDb3VjaERCVmlld01ldGFkYXRhLFxuICBWaWV3UmVzcG9uc2UsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IHRvQ2FtZWxDYXNlIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBEQktleXMsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbnR5cGUgRmFicmljVmlld0Rlc2NyaXB0b3IgPSB7XG4gIGRkb2M6IHN0cmluZztcbiAgdmlldzogc3RyaW5nO1xuICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufTtcblxudHlwZSBGYWJyaWNBZ2dyZWdhdGVJbmZvID1cbiAgfCB7XG4gICAgICBraW5kOiBWaWV3S2luZDtcbiAgICAgIG1ldGE6IENvdWNoREJWaWV3TWV0YWRhdGE7XG4gICAgICBkZXNjcmlwdG9yOiBGYWJyaWNWaWV3RGVzY3JpcHRvcjtcbiAgICAgIGNvdW50RGlzdGluY3Q/OiBib29sZWFuO1xuICAgIH1cbiAgfCB7XG4gICAgICBraW5kOiBcImF2Z1wiO1xuICAgICAgYXR0cmlidXRlOiBzdHJpbmc7XG4gICAgICBzdW1EZXNjcmlwdG9yOiBGYWJyaWNWaWV3RGVzY3JpcHRvcjtcbiAgICAgIGNvdW50RGVzY3JpcHRvcjogRmFicmljVmlld0Rlc2NyaXB0b3I7XG4gICAgfTtcblxuY29uc3QgZXNjYXBlUmVnRXhwID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgdmFsdWUucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFwiXFxcXCQmXCIpO1xuXG5mdW5jdGlvbiBuZXh0TGV4aWNvZ3JhcGhpY1N0cmluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiXFx1MDAwMFwiO1xuICBjb25zdCBjaGFycyA9IEFycmF5LmZyb20odmFsdWUpO1xuICBmb3IgKGxldCBpID0gY2hhcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICBjb25zdCBjb2RlID0gY2hhcnNbaV0uY29kZVBvaW50QXQoMCk7XG4gICAgaWYgKGNvZGUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgaWYgKGNvZGUgPCAweDEwZmZmZikge1xuICAgICAgY2hhcnNbaV0gPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlICsgMSk7XG4gICAgICByZXR1cm4gY2hhcnMuc2xpY2UoMCwgaSArIDEpLmpvaW4oXCJcIik7XG4gICAgfVxuICB9XG4gIHJldHVybiBgJHt2YWx1ZX1cXHUwMDAwYDtcbn1cblxuZnVuY3Rpb24gcHJlZml4UmFuZ2UocHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBzdGFydDogcHJlZml4LFxuICAgIGVuZDogbmV4dExleGljb2dyYXBoaWNTdHJpbmcocHJlZml4KSxcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgU3RhdGVtZW50PFxuICBNLFxuICBGYWJyaWNDbGllbnRBZGFwdGVyLFxuICBSLFxuICBNYW5nb1F1ZXJ5XG4+IHtcbiAgY29uc3RydWN0b3IoYWRhcHRlcjogRmFicmljQ2xpZW50QWRhcHRlciwgb3ZlcnJpZGVzPzogUGFydGlhbDxBZGFwdGVyRmxhZ3M+KSB7XG4gICAgc3VwZXIoYWRhcHRlciwgb3ZlcnJpZGVzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzcXVhc2goXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcmVwYXJlZFN0YXRlbWVudDxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzcXVhc2hlZDogUHJlcGFyZWRTdGF0ZW1lbnQ8TT4gfCB1bmRlZmluZWQgPSBzdXBlci5zcXVhc2goXG4gICAgICBjdHggYXMgbmV2ZXJcbiAgICApO1xuICAgIGlmICghc3F1YXNoZWQpIHJldHVybiBzcXVhc2hlZDtcblxuICAgIGNvbnN0IHsgbWV0aG9kLCBwYXJhbXMsIGFyZ3MgfSA9IHNxdWFzaGVkO1xuICAgIGNvbnN0IHsgZGlyZWN0aW9uLCBsaW1pdCB9ID0gcGFyYW1zO1xuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0U6XG4gICAgICAgIGFyZ3MucHVzaChkaXJlY3Rpb24sIGxpbWl0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlk6XG4gICAgICAgIGFyZ3MucHVzaChkaXJlY3Rpb24pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlk6XG4gICAgICAgIGFyZ3MucHVzaChkaXJlY3Rpb24sIGxpbWl0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWTpcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgbWV0aG9kICR7bWV0aG9kfWApO1xuICAgIH1cblxuICAgIHJldHVybiBzcXVhc2hlZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBleGVjdXRlUHJlcGFyZWQoXG4gICAgLi4uYXJnejogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCByZXBvID0gUmVwb3NpdG9yeS5mb3JNb2RlbCh0aGlzLmZyb21TZWxlY3RvciwgdGhpcy5hZGFwdGVyLmFsaWFzKTtcbiAgICBjb25zdCB7IG1ldGhvZCwgYXJncyB9ID0gdGhpcy5wcmVwYXJlZCBhcyBQcmVwYXJlZFN0YXRlbWVudDxhbnk+O1xuICAgIHJldHVybiByZXBvLnN0YXRlbWVudChtZXRob2QsIC4uLmFyZ3MsIC4uLmFyZ3opO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcHJlcGFyZShcbiAgICBjdHg/OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcm9taXNlPFN0YXRlbWVudEV4ZWN1dG9yPE0sIFI+PiB7XG4gICAgY3R4ID1cbiAgICAgIGN0eCB8fFxuICAgICAgKGF3YWl0IHRoaXMuYWRhcHRlci5jb250ZXh0KFxuICAgICAgICBQZXJzaXN0ZW5jZUtleXMuUVVFUlksXG4gICAgICAgIHRoaXMub3ZlcnJpZGVzIHx8IHt9LFxuICAgICAgICB0aGlzLmZyb21TZWxlY3RvclxuICAgICAgKSk7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmlzU2ltcGxlUXVlcnkoKSAmJlxuICAgICAgKGN0eCBhcyBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPikuZ2V0KFwiZm9yY2VQcmVwYXJlU2ltcGxlUXVlcmllc1wiKVxuICAgICkge1xuICAgICAgY29uc3Qgc3F1YXNoZWQgPSB0aGlzLnNxdWFzaChjdHggYXMgQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4pO1xuICAgICAgaWYgKHNxdWFzaGVkKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZWQgPSBzcXVhc2hlZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXTtcbiAgICBjb25zdCBwYXJhbXM6IGFueSA9IHt9IGFzIGFueTtcblxuICAgIGNvbnN0IHByZXBhcmVkOiBQcmVwYXJlZFN0YXRlbWVudDxhbnk+ID0ge1xuICAgICAgY2xhc3M6IHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgYXJncyxcbiAgICAgIHBhcmFtcyxcbiAgICB9IGFzIGFueTtcblxuICAgIGNvbnN0IG1ldGhvZDogc3RyaW5nW10gPSBbUXVlcnlDbGF1c2UuRklORF9CWV07XG5cbiAgICBpZiAodGhpcy53aGVyZUNvbmRpdGlvbikge1xuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wcmVwYXJlQ29uZGl0aW9uKHRoaXMud2hlcmVDb25kaXRpb24sIGN0eCBhcyBuZXZlcik7XG4gICAgICBtZXRob2QucHVzaChwYXJzZWQubWV0aG9kKTtcbiAgICAgIGlmIChwYXJzZWQuYXJncyAmJiBwYXJzZWQuYXJncy5sZW5ndGgpXG4gICAgICAgIGFyZ3MucHVzaCguLi4ocGFyc2VkLmFyZ3MgYXMgKHN0cmluZyB8IG51bWJlcilbXSkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RTZWxlY3RvcilcbiAgICAgIG1ldGhvZC5wdXNoKFxuICAgICAgICBRdWVyeUNsYXVzZS5TRUxFQ1QsXG4gICAgICAgIHRoaXMuc2VsZWN0U2VsZWN0b3Iuam9pbihgICR7UXVlcnlDbGF1c2UuQU5ELnRvTG93ZXJDYXNlKCl9IGApXG4gICAgICApO1xuICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcnM/Lmxlbmd0aCkge1xuICAgICAgbWV0aG9kLnB1c2goUXVlcnlDbGF1c2UuT1JERVJfQlksIHRoaXMub3JkZXJCeVNlbGVjdG9yc1swXVswXSBhcyBzdHJpbmcpO1xuICAgICAgYXJncy5wdXNoKHRoaXMub3JkZXJCeVNlbGVjdG9yc1swXVsxXSBhcyBhbnkpO1xuICAgIH1cbiAgICBwcmVwYXJlZC5tZXRob2QgPSB0b0NhbWVsQ2FzZShtZXRob2Quam9pbihcIiBcIikpO1xuICAgIHByZXBhcmVkLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLnByZXBhcmVkID0gcHJlcGFyZWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhIHJlY29yZCBmcm9tIENvdWNoREIvRmFicmljXG4gICAqIEBzdW1tYXJ5IEV4dHJhY3RzIHRoZSBJRCBmcm9tIGEgQ291Y2hEQiBkb2N1bWVudCBhbmQgcmV2ZXJ0cyBpdCB0byBhIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJvY2Vzc1JlY29yZChcbiAgICByZWNvcmQ6IGFueSxcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IE0ge1xuICAgIGNvbnN0IHBrQXR0ciA9IE1vZGVsLnBrKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCB0eXBlID0gTWV0YWRhdGEuZ2V0KFxuICAgICAgdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICBNZXRhZGF0YS5rZXkoREJLZXlzLklELCBwa0F0dHIgYXMgc3RyaW5nKVxuICAgICk/LnR5cGU7XG5cbiAgICBpZiAocmVjb3JkW0NvdWNoREJLZXlzLklEXSkge1xuICAgICAgY29uc3QgWywgLi4ua2V5QXJnc10gPSByZWNvcmRbQ291Y2hEQktleXMuSURdLnNwbGl0KENvdWNoREJLZXlzLlNFUEFSQVRPUik7XG4gICAgICBjb25zdCBpZCA9IGtleUFyZ3Muam9pbihcIl9cIik7XG4gICAgICByZWNvcmRbcGtBdHRyXSA9IFNlcXVlbmNlLnBhcnNlVmFsdWUodHlwZSBhcyBhbnksIGlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIucHJvY2Vzc1JlY29yZChyZWNvcmQsIGN0eCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IE1hbmdvIHF1ZXJ5XG4gICAqIEBzdW1tYXJ5IFNlbmRzIGEgcmF3IE1hbmdvIHF1ZXJ5IHRvIEZhYnJpYyBhbmQgcHJvY2Vzc2VzIHRoZSByZXN1bHRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByYXc8Uj4ocmF3SW5wdXQ6IE1hbmdvUXVlcnksIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmF3KTtcbiAgICBjb25zdCBhZ2dyZWdhdG9yID0gKHJhd0lucHV0IGFzIGFueSk/LmFnZ3JlZ2F0ZUluZm87XG4gICAgaWYgKChyYXdJbnB1dCBhcyBhbnkpPy5hZ2dyZWdhdGUgJiYgYWdncmVnYXRvcikge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUFnZ3JlZ2F0ZTxSPihhZ2dyZWdhdG9yLCBjdHgpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRzOiBhbnlbXSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoXG4gICAgICByYXdJbnB1dCxcbiAgICAgIHRydWUsXG4gICAgICB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIGN0eFxuICAgICk7XG5cbiAgICBpZiAoIXRoaXMuc2VsZWN0U2VsZWN0b3IpIHtcbiAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IHJlc3VsdHMubWFwKChyKSA9PiB0aGlzLnByb2Nlc3NSZWNvcmQociwgY3R4KSk7XG4gICAgICBpZiAoIWN0eC5nZXRPclVuZGVmaW5lZChcImFmdGVyUXVlcnlIYW5kbGVyc1wiKSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzc2VkIGFzIHVua25vd24gYXMgUjtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5hcHBseUFmdGVySGFuZGxlcnNUb1Jlc3VsdChwcm9jZXNzZWQsIGN0eCkpIGFzIFI7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhIENvdWNoREIgTWFuZ28gcXVlcnkgZnJvbSB0aGUgc3RhdGVtZW50XG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIHRoZSBzdGF0ZW1lbnQncyBjb25kaXRpb25zLCBzZWxlY3RvcnMsIGFuZCBvcHRpb25zIGludG8gYSBDb3VjaERCIE1hbmdvIHF1ZXJ5XG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGQoKTogTWFuZ29RdWVyeSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuYnVpbGQpO1xuICAgIGNvbnN0IGFnZ3JlZ2F0ZVF1ZXJ5ID0gdGhpcy5idWlsZEFnZ3JlZ2F0ZVF1ZXJ5KCk7XG4gICAgaWYgKGFnZ3JlZ2F0ZVF1ZXJ5KSByZXR1cm4gYWdncmVnYXRlUXVlcnk7XG4gICAgY29uc3Qgc2VsZWN0b3JzOiBNYW5nb1NlbGVjdG9yID0ge307XG4gICAgc2VsZWN0b3JzW0NvdWNoREJLZXlzLlRBQkxFXSA9IHt9O1xuICAgIHNlbGVjdG9yc1tDb3VjaERCS2V5cy5UQUJMRV0gPSBNb2RlbC50YWJsZU5hbWUodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHF1ZXJ5OiBNYW5nb1F1ZXJ5ID0geyBzZWxlY3Rvcjogc2VsZWN0b3JzIH07XG4gICAgaWYgKHRoaXMuc2VsZWN0U2VsZWN0b3IpIHF1ZXJ5LmZpZWxkcyA9IHRoaXMuc2VsZWN0U2VsZWN0b3IgYXMgc3RyaW5nW107XG5cbiAgICBpZiAodGhpcy53aGVyZUNvbmRpdGlvbikge1xuICAgICAgY29uc3QgY29uZGl0aW9uOiBNYW5nb1NlbGVjdG9yID0gdGhpcy5wYXJzZUNvbmRpdGlvbihcbiAgICAgICAgQ29uZGl0aW9uLmFuZChcbiAgICAgICAgICB0aGlzLndoZXJlQ29uZGl0aW9uLFxuICAgICAgICAgIENvbmRpdGlvbi5hdHRyaWJ1dGU8TT4oQ291Y2hEQktleXMuVEFCTEUgYXMga2V5b2YgTSkuZXEoXG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvcltDb3VjaERCS2V5cy5UQUJMRV1cbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICkuc2VsZWN0b3I7XG4gICAgICBjb25zdCBzZWxlY3RvcktleXMgPSBPYmplY3Qua2V5cyhjb25kaXRpb24pIGFzIE1hbmdvT3BlcmF0b3JbXTtcbiAgICAgIGlmIChcbiAgICAgICAgc2VsZWN0b3JLZXlzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBPYmplY3QudmFsdWVzKENvdWNoREJHcm91cE9wZXJhdG9yKS5pbmRleE9mKHNlbGVjdG9yS2V5c1swXSkgIT09IC0xXG4gICAgICApXG4gICAgICAgIHN3aXRjaCAoc2VsZWN0b3JLZXlzWzBdKSB7XG4gICAgICAgICAgY2FzZSBDb3VjaERCR3JvdXBPcGVyYXRvci5BTkQ6XG4gICAgICAgICAgICBjb25kaXRpb25bQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSA9IFtcbiAgICAgICAgICAgICAgLi4uT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgICAgICAgICBjb25kaXRpb25bQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSBhcyBNYW5nb1NlbGVjdG9yXG4gICAgICAgICAgICAgICkucmVkdWNlKChhY2N1bTogTWFuZ29TZWxlY3RvcltdLCB2YWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJUb28gbWFueSBrZXlzIGluIHF1ZXJ5IHNlbGVjdG9yLiBzaG91bGQgYmUgb25lXCJcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgayA9IGtleXNbMF07XG4gICAgICAgICAgICAgICAgaWYgKGsgPT09IENvdWNoREJHcm91cE9wZXJhdG9yLkFORClcbiAgICAgICAgICAgICAgICAgIGFjY3VtLnB1c2goLi4uKHZhbFtrXSBhcyBhbnlbXSkpO1xuICAgICAgICAgICAgICAgIGVsc2UgYWNjdW0ucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgICAgICAgfSwgW10pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yID0gY29uZGl0aW9uO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBDb3VjaERCR3JvdXBPcGVyYXRvci5PUjoge1xuICAgICAgICAgICAgY29uc3QgczogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgICAgICAgc1tDb3VjaERCR3JvdXBPcGVyYXRvci5BTkRdID0gW1xuICAgICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgICAgIC4uLk9iamVjdC5lbnRyaWVzKHF1ZXJ5LnNlbGVjdG9yKS5tYXAoKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxhbnksIGFueT4gPSB7fTtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvciA9IHM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgc2hvdWxkIGJlIGltcG9zc2libGVcIik7XG4gICAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBPYmplY3QuZW50cmllcyhjb25kaXRpb24pLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAocXVlcnkuc2VsZWN0b3Jba2V5XSlcbiAgICAgICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgICAgICBgQSAke2tleX0gcXVlcnkgcGFyYW0gaXMgYWJvdXQgdG8gYmUgb3ZlcnJpZGRlbjogJHtxdWVyeS5zZWxlY3RvcltrZXldfSBieSAke3ZhbH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yW2tleV0gPSB2YWw7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcnM/Lmxlbmd0aCkge1xuICAgICAgcXVlcnkuc29ydCA9IHF1ZXJ5LnNvcnQgfHwgW107XG4gICAgICBxdWVyeS5zZWxlY3RvciA9IHF1ZXJ5LnNlbGVjdG9yIHx8ICh7fSBhcyBNYW5nb1NlbGVjdG9yKTtcbiAgICAgIGZvciAoY29uc3QgW3NlbGVjdG9yS2V5LCBkaXJlY3Rpb25dIG9mIHRoaXMub3JkZXJCeVNlbGVjdG9ycykge1xuICAgICAgICBjb25zdCBzZWxlY3RvciA9IHNlbGVjdG9yS2V5IGFzIHN0cmluZztcbiAgICAgICAgY29uc3QgcmVjOiBSZWNvcmQ8c3RyaW5nLCBPcmRlckRpcmVjdGlvbj4gPSB7fTtcbiAgICAgICAgcmVjW3NlbGVjdG9yXSA9IGRpcmVjdGlvbiBhcyBPcmRlckRpcmVjdGlvbjtcbiAgICAgICAgKHF1ZXJ5LnNvcnQgYXMgUmVjb3JkPHN0cmluZywgT3JkZXJEaXJlY3Rpb24+W10pLnB1c2gocmVjKTtcbiAgICAgICAgaWYgKCFxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0pIHtcbiAgICAgICAgICBxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgICAgIChxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0gYXMgTWFuZ29TZWxlY3RvcilbQ291Y2hEQk9wZXJhdG9yLkJJR0dFUl0gPVxuICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmxpbWl0U2VsZWN0b3IpIHtcbiAgICAgIHF1ZXJ5LmxpbWl0ID0gdGhpcy5saW1pdFNlbGVjdG9yO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cud2FybihcbiAgICAgICAgYE5vIGxpbWl0IHNlbGVjdG9yIGRlZmluZWQuIFVzaW5nIGRlZmF1bHQgY291Y2hkYiBsaW1pdCBvZiAke0NvdWNoREJRdWVyeUxpbWl0fWBcbiAgICAgICk7XG4gICAgICBxdWVyeS5saW1pdCA9IENvdWNoREJRdWVyeUxpbWl0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9mZnNldFNlbGVjdG9yKSBxdWVyeS5za2lwID0gdGhpcy5vZmZzZXRTZWxlY3RvcjtcblxuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgY29uZGl0aW9uIGludG8gYSBDb3VjaERCIE1hbmdvIHF1ZXJ5IHNlbGVjdG9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgQ29uZGl0aW9uIG9iamVjdCBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeSBzZWxlY3RvciBzdHJ1Y3R1cmVcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwYXJzZUNvbmRpdGlvbihjb25kaXRpb246IENvbmRpdGlvbjxNPik6IE1hbmdvUXVlcnkge1xuICAgIGZ1bmN0aW9uIG1lcmdlKFxuICAgICAgb3A6IE1hbmdvT3BlcmF0b3IsXG4gICAgICBvYmoxOiBNYW5nb1NlbGVjdG9yLFxuICAgICAgb2JqMjogTWFuZ29TZWxlY3RvclxuICAgICk6IE1hbmdvUXVlcnkge1xuICAgICAgY29uc3QgcmVzdWx0OiBNYW5nb1F1ZXJ5ID0geyBzZWxlY3Rvcjoge30gYXMgTWFuZ29TZWxlY3RvciB9O1xuICAgICAgcmVzdWx0LnNlbGVjdG9yW29wXSA9IFtvYmoxLCBvYmoyXTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgeyBhdHRyMSwgb3BlcmF0b3IsIGNvbXBhcmlzb24gfSA9IGNvbmRpdGlvbiBhcyB1bmtub3duIGFzIHtcbiAgICAgIGF0dHIxOiBzdHJpbmcgfCBDb25kaXRpb248TT47XG4gICAgICBvcGVyYXRvcjogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yO1xuICAgICAgY29tcGFyaXNvbjogYW55O1xuICAgIH07XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLlNUQVJUU19XSVRIKSB7XG4gICAgICBpZiAodHlwZW9mIGF0dHIxICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIlNUQVJUU19XSVRIIHJlcXVpcmVzIGFuIGF0dHJpYnV0ZSBuYW1lXCIpO1xuICAgICAgaWYgKHR5cGVvZiBjb21wYXJpc29uICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIlNUQVJUU19XSVRIIHJlcXVpcmVzIGEgc3RyaW5nIGNvbXBhcmlzb25cIik7XG4gICAgICBjb25zdCByYW5nZSA9IHByZWZpeFJhbmdlKGNvbXBhcmlzb24pO1xuICAgICAgY29uc3Qgc2VsZWN0b3I6IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgc2VsZWN0b3JbYXR0cjFdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChzZWxlY3RvclthdHRyMV0gYXMgTWFuZ29TZWxlY3RvcilbQ291Y2hEQk9wZXJhdG9yLkJJR0dFUl9FUV0gPSByYW5nZS5zdGFydDtcbiAgICAgIChzZWxlY3RvclthdHRyMV0gYXMgTWFuZ29TZWxlY3RvcilbQ291Y2hEQk9wZXJhdG9yLlNNQUxMRVJdID0gcmFuZ2UuZW5kO1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3IgfTtcbiAgICB9XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLkVORFNfV0lUSCkge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyMSAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJFTkRTX1dJVEggcmVxdWlyZXMgYW4gYXR0cmlidXRlIG5hbWVcIik7XG4gICAgICBpZiAodHlwZW9mIGNvbXBhcmlzb24gIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiRU5EU19XSVRIIHJlcXVpcmVzIGEgc3RyaW5nIGNvbXBhcmlzb25cIik7XG4gICAgICBjb25zdCBzZWxlY3RvcjogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBzZWxlY3RvclthdHRyMV0gPSB7XG4gICAgICAgIFtDb3VjaERCT3BlcmF0b3IuUkVHRVhQXTogYCR7ZXNjYXBlUmVnRXhwKGNvbXBhcmlzb24pfSRgLFxuICAgICAgfSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3IgfTtcbiAgICB9XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLkJFVFdFRU4pIHtcbiAgICAgIGNvbnN0IGF0dHIgPSBhdHRyMSBhcyBzdHJpbmc7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29tcGFyaXNvbikgfHwgY29tcGFyaXNvbi5sZW5ndGggIT09IDIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiQkVUV0VFTiBvcGVyYXRvciByZXF1aXJlcyBbbWluLCBtYXhdIGNvbXBhcmlzb25cIik7XG4gICAgICBjb25zdCBbbWluLCBtYXhdID0gY29tcGFyaXNvbjtcbiAgICAgIGNvbnN0IG9wQmV0d2VlbjogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBvcEJldHdlZW5bYXR0cl0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wQmV0d2VlblthdHRyXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLkJJR0dFUl9FUSlcbiAgICAgIF0gPSBtaW47XG4gICAgICAob3BCZXR3ZWVuW2F0dHJdIGFzIE1hbmdvU2VsZWN0b3IpW1xuICAgICAgICB0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuU01BTExFUl9FUSlcbiAgICAgIF0gPSBtYXg7XG4gICAgICByZXR1cm4geyBzZWxlY3Rvcjogb3BCZXR3ZWVuIH07XG4gICAgfVxuXG4gICAgbGV0IG9wOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICBpZiAoXG4gICAgICBbR3JvdXBPcGVyYXRvci5BTkQsIEdyb3VwT3BlcmF0b3IuT1IsIE9wZXJhdG9yLk5PVF0uaW5kZXhPZihcbiAgICAgICAgb3BlcmF0b3IgYXMgR3JvdXBPcGVyYXRvclxuICAgICAgKSA9PT0gLTFcbiAgICApIHtcbiAgICAgIG9wW2F0dHIxIGFzIHN0cmluZ10gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wW2F0dHIxIGFzIHN0cmluZ10gYXMgTWFuZ29TZWxlY3RvcilbdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKV0gPVxuICAgICAgICBjb21wYXJpc29uO1xuICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLk5PVCkge1xuICAgICAgb3AgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGF0dHIxIGFzIENvbmRpdGlvbjxNPikuc2VsZWN0b3IgYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIG9wW3RyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5OT1QpXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAob3BbdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLk5PVCldIGFzIE1hbmdvU2VsZWN0b3IpW1xuICAgICAgICAoYXR0cjEgYXMgdW5rbm93biBhcyB7IGF0dHIxOiBzdHJpbmcgfSkuYXR0cjFcbiAgICAgIF0gPSBjb21wYXJpc29uO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcDE6IGFueSA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uPE0+KS5zZWxlY3RvcjtcbiAgICAgIGNvbnN0IG9wMjogYW55ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihjb21wYXJpc29uIGFzIENvbmRpdGlvbjxNPikuc2VsZWN0b3I7XG4gICAgICBvcCA9IG1lcmdlKHRyYW5zbGF0ZU9wZXJhdG9ycyhvcGVyYXRvciksIG9wMSwgb3AyKS5zZWxlY3RvcjtcbiAgICB9XG5cbiAgICByZXR1cm4geyBzZWxlY3Rvcjogb3AgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGRzIGFuIGFnZ3JlZ2F0ZSBxdWVyeSBpZiBhZ2dyZWdhdGlvbiBpcyByZXF1ZXN0ZWRcbiAgICogQHN1bW1hcnkgQ2hlY2tzIGZvciBhZ2dyZWdhdGUgb3BlcmF0aW9ucyBhbmQgcmV0dXJucyBhIHNwZWNpYWwgTWFuZ29RdWVyeSBmb3IgdGhlbVxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEFnZ3JlZ2F0ZVF1ZXJ5KCk6IE1hbmdvUXVlcnkgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5mcm9tU2VsZWN0b3IpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuYXZnU2VsZWN0b3IpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IFN0cmluZyh0aGlzLmF2Z1NlbGVjdG9yKTtcbiAgICAgIGNvbnN0IHN1bUluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXCJzdW1cIiwgYXR0cmlidXRlKTtcbiAgICAgIGNvbnN0IGNvdW50SW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcImNvdW50XCIsIGF0dHJpYnV0ZSk7XG4gICAgICBpZiAoIXN1bUluZm8gfHwgIWNvdW50SW5mbylcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgICAgYEF2ZyBvcGVyYXRpb24gcmVxdWlyZXMgc3VtIGFuZCBjb3VudCB2aWV3cyBmb3IgYXR0cmlidXRlICR7YXR0cmlidXRlfWBcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KHtcbiAgICAgICAga2luZDogXCJhdmdcIixcbiAgICAgICAgYXR0cmlidXRlLFxuICAgICAgICBzdW1EZXNjcmlwdG9yOiBzdW1JbmZvLmRlc2NyaXB0b3IsXG4gICAgICAgIGNvdW50RGVzY3JpcHRvcjogY291bnRJbmZvLmRlc2NyaXB0b3IsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMuY291bnREaXN0aW5jdFNlbGVjdG9yICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPVxuICAgICAgICB0aGlzLmNvdW50RGlzdGluY3RTZWxlY3RvciA9PSBudWxsXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IFN0cmluZyh0aGlzLmNvdW50RGlzdGluY3RTZWxlY3Rvcik7XG4gICAgICBjb25zdCBpbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFwiZGlzdGluY3RcIiwgYXR0cmlidXRlKTtcbiAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgIGluZm8uY291bnREaXN0aW5jdCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KGluZm8pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFnZ3JlZ2F0b3JVc2VkID1cbiAgICAgIHR5cGVvZiB0aGlzLmNvdW50U2VsZWN0b3IgIT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIHR5cGVvZiB0aGlzLmNvdW50RGlzdGluY3RTZWxlY3RvciAhPT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgISF0aGlzLm1pblNlbGVjdG9yIHx8XG4gICAgICAhIXRoaXMubWF4U2VsZWN0b3IgfHxcbiAgICAgICEhdGhpcy5zdW1TZWxlY3RvciB8fFxuICAgICAgISF0aGlzLmRpc3RpbmN0U2VsZWN0b3I7XG5cbiAgICBjb25zdCBhZ2dyZWdhdG9yQ2hlY2tzOiBBcnJheTxbVmlld0tpbmQsIFNlbGVjdFNlbGVjdG9yPE0+IHwgdW5kZWZpbmVkXT4gPSBbXG4gICAgICBbXG4gICAgICAgIFwiY291bnRcIixcbiAgICAgICAgKHRoaXMuY291bnRTZWxlY3RvciA/PyB1bmRlZmluZWQpIGFzIFNlbGVjdFNlbGVjdG9yPE0+IHwgdW5kZWZpbmVkLFxuICAgICAgXSxcbiAgICAgIFtcIm1heFwiLCB0aGlzLm1heFNlbGVjdG9yXSxcbiAgICAgIFtcIm1pblwiLCB0aGlzLm1pblNlbGVjdG9yXSxcbiAgICAgIFtcInN1bVwiLCB0aGlzLnN1bVNlbGVjdG9yXSxcbiAgICAgIFtcImRpc3RpbmN0XCIsIHRoaXMuZGlzdGluY3RTZWxlY3Rvcl0sXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgW2tpbmQsIHNlbGVjdG9yXSBvZiBhZ2dyZWdhdG9yQ2hlY2tzKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBzZWxlY3RvciA/IFN0cmluZyhzZWxlY3RvcikgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBpbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKGtpbmQsIGF0dHJpYnV0ZSk7XG4gICAgICBpZiAoaW5mbykgcmV0dXJuIHRoaXMuY3JlYXRlQWdncmVnYXRlUXVlcnkoaW5mbyk7XG4gICAgfVxuXG4gICAgaWYgKGFnZ3JlZ2F0b3JVc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgYE5vIENvdWNoREIgdmlldyBtZXRhZGF0YSBmb3VuZCBmb3IgdGFibGUgJHtNb2RlbC50YWJsZU5hbWUoXG4gICAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICAgKX0gYWdncmVnYXRvcmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gYWdncmVnYXRlIGRlc2NyaXB0b3IgZm9yIGEgdmlldy1iYXNlZCBhZ2dyZWdhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFxuICAgIGtpbmQ6IFZpZXdLaW5kLFxuICAgIGF0dHJpYnV0ZT86IHN0cmluZ1xuICApOiBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT4gfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5mcm9tU2VsZWN0b3IpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWV0YXMgPSBmaW5kVmlld01ldGFkYXRhKHRoaXMuZnJvbVNlbGVjdG9yLCBraW5kLCBhdHRyaWJ1dGUpO1xuICAgIGlmICghbWV0YXMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1ldGEgPSBtZXRhc1swXTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHZpZXdOYW1lID0gZ2VuZXJhdGVWaWV3TmFtZSh0YWJsZU5hbWUsIG1ldGEuYXR0cmlidXRlLCBraW5kLCBtZXRhKTtcbiAgICBjb25zdCBkZG9jID0gbWV0YS5kZG9jIHx8IGdlbmVyYXRlRGVzaWduRG9jTmFtZSh0YWJsZU5hbWUsIHZpZXdOYW1lKTtcbiAgICBjb25zdCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgcmVkdWNlOiBtZXRhLnJlZHVjZSAhPT0gdW5kZWZpbmVkID8gdHJ1ZSA6ICFtZXRhLnJldHVybkRvY3MsXG4gICAgfTtcbiAgICBpZiAoa2luZCA9PT0gXCJkaXN0aW5jdFwiIHx8IGtpbmQgPT09IFwiZ3JvdXBCeVwiKSBvcHRpb25zLmdyb3VwID0gdHJ1ZTtcbiAgICByZXR1cm4ge1xuICAgICAga2luZCxcbiAgICAgIG1ldGEsXG4gICAgICBkZXNjcmlwdG9yOiB7XG4gICAgICAgIGRkb2MsXG4gICAgICAgIHZpZXc6IHZpZXdOYW1lLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIHRoZSBzcGVjaWFsIGFnZ3JlZ2F0ZSBNYW5nb1F1ZXJ5IG1hcmtlclxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBZ2dyZWdhdGVRdWVyeShcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvXG4gICk6IE1hbmdvUXVlcnkgJiB7IGFnZ3JlZ2F0ZTogdHJ1ZTsgYWdncmVnYXRlSW5mbzogRmFicmljQWdncmVnYXRlSW5mbyB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0b3I6IHt9LFxuICAgICAgYWdncmVnYXRlOiB0cnVlLFxuICAgICAgYWdncmVnYXRlSW5mbzogaW5mbyxcbiAgICB9IGFzIE1hbmdvUXVlcnkgJiB7IGFnZ3JlZ2F0ZTogdHJ1ZTsgYWdncmVnYXRlSW5mbzogRmFicmljQWdncmVnYXRlSW5mbyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBhZGFwdGVyIGNhc3QgdG8gRmFicmljQ2xpZW50QWRhcHRlciBmb3IgdmlldyBhY2Nlc3NcbiAgICovXG4gIHByaXZhdGUgZ2V0RmFicmljQWRhcHRlcigpOiBGYWJyaWNDbGllbnRBZGFwdGVyIHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyIGFzIEZhYnJpY0NsaWVudEFkYXB0ZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGFuIGFnZ3JlZ2F0ZSBxdWVyeSB2aWEgYWRhcHRlcidzIHZpZXcgbWV0aG9kXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVBZ2dyZWdhdGU8Uj4oXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mbyxcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IFByb21pc2U8Uj4ge1xuICAgIGlmICghdGhpcy5pc1ZpZXdBZ2dyZWdhdGUoaW5mbykpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUF2ZXJhZ2U8Uj4oaW5mbywgY3R4KTtcbiAgICB9XG4gICAgY29uc3QgZmFicmljQWRhcHRlciA9IHRoaXMuZ2V0RmFicmljQWRhcHRlcigpO1xuICAgIGNvbnN0IHZpZXdJbmZvID0gaW5mbyBhcyBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT47XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmYWJyaWNBZGFwdGVyLnZpZXc8Vmlld1Jlc3BvbnNlPihcbiAgICAgIHZpZXdJbmZvLmRlc2NyaXB0b3IuZGRvYyxcbiAgICAgIHZpZXdJbmZvLmRlc2NyaXB0b3IudmlldyxcbiAgICAgIHZpZXdJbmZvLmRlc2NyaXB0b3Iub3B0aW9ucyxcbiAgICAgIGN0eFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzc1ZpZXdSZXNwb25zZTxSPihpbmZvLCByZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgYXZlcmFnZSBjYWxjdWxhdGlvbiBmcm9tIHN1bSBhbmQgY291bnQgdmlld3NcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQXZlcmFnZTxSPihcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvLFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogUHJvbWlzZTxSPiB7XG4gICAgaWYgKGluZm8ua2luZCAhPT0gXCJhdmdcIilcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiQXZlcmFnZSBkZXNjcmlwdG9yIGlzIG5vdCB2YWxpZFwiKTtcbiAgICBjb25zdCBmYWJyaWNBZGFwdGVyID0gdGhpcy5nZXRGYWJyaWNBZGFwdGVyKCk7XG4gICAgY29uc3QgW3N1bURlc2MsIGNvdW50RGVzY10gPSBbaW5mby5zdW1EZXNjcmlwdG9yLCBpbmZvLmNvdW50RGVzY3JpcHRvcl07XG4gICAgY29uc3QgW3N1bVJlc3BvbnNlLCBjb3VudFJlc3BvbnNlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZhYnJpY0FkYXB0ZXIudmlldzxWaWV3UmVzcG9uc2U+KFxuICAgICAgICBzdW1EZXNjLmRkb2MsXG4gICAgICAgIHN1bURlc2MudmlldyxcbiAgICAgICAgc3VtRGVzYy5vcHRpb25zLFxuICAgICAgICBjdHhcbiAgICAgICksXG4gICAgICBmYWJyaWNBZGFwdGVyLnZpZXc8Vmlld1Jlc3BvbnNlPihcbiAgICAgICAgY291bnREZXNjLmRkb2MsXG4gICAgICAgIGNvdW50RGVzYy52aWV3LFxuICAgICAgICBjb3VudERlc2Mub3B0aW9ucyxcbiAgICAgICAgY3R4XG4gICAgICApLFxuICAgIF0pO1xuICAgIGNvbnN0IHN1bSA9IHN1bVJlc3BvbnNlLnJvd3M/LlswXT8udmFsdWUgPz8gMDtcbiAgICBjb25zdCBjb3VudCA9IGNvdW50UmVzcG9uc2Uucm93cz8uWzBdPy52YWx1ZSA/PyAwO1xuICAgIGlmICghY291bnQpIHJldHVybiAwIGFzIHVua25vd24gYXMgUjtcbiAgICByZXR1cm4gKHN1bSAvIGNvdW50KSBhcyB1bmtub3duIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyB0aGUgdmlldyByZXNwb25zZSBiYXNlZCBvbiBhZ2dyZWdhdGUga2luZFxuICAgKi9cbiAgcHJpdmF0ZSBwcm9jZXNzVmlld1Jlc3BvbnNlPFI+KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8sXG4gICAgcmVzcG9uc2U6IFZpZXdSZXNwb25zZVxuICApOiBSIHtcbiAgICBpZiAoaW5mby5raW5kID09PSBcImF2Z1wiKVxuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgIFwiQXZlcmFnZSByZXN1bHRzIHNob3VsZCBiZSBoYW5kbGVkIGJlZm9yZSBwcm9jZXNzaW5nIHJvd3NcIlxuICAgICAgKTtcbiAgICBjb25zdCByb3dzID0gcmVzcG9uc2Uucm93cyB8fCBbXTtcbiAgICBjb25zdCB2aWV3SW5mbyA9IGluZm8gYXMgRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+O1xuICAgIGNvbnN0IG1ldGEgPSB2aWV3SW5mby5tZXRhO1xuICAgIGlmICh2aWV3SW5mby5jb3VudERpc3RpbmN0KSB7XG4gICAgICByZXR1cm4gKHJvd3MubGVuZ3RoIHx8IDApIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgaWYgKHZpZXdJbmZvLmtpbmQgPT09IFwiZGlzdGluY3RcIiB8fCB2aWV3SW5mby5raW5kID09PSBcImdyb3VwQnlcIikge1xuICAgICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IHJvdy5rZXkgPz8gcm93LnZhbHVlKSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmIChtZXRhLnJldHVybkRvY3MpIHtcbiAgICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiByb3cudmFsdWUgPz8gcm93LmRvYyA/PyByb3cpIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgaWYgKCFyb3dzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuICh2aWV3SW5mby5raW5kID09PSBcImNvdW50XCIgPyAwIDogbnVsbCkgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICByZXR1cm4gKHJvd3NbMF0udmFsdWUgPz8gcm93c1swXS5rZXkgPz8gbnVsbCkgYXMgdW5rbm93biBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGluZm8gaXMgYSB2aWV3LWJhc2VkIGFnZ3JlZ2F0ZVxuICAgKi9cbiAgcHJpdmF0ZSBpc1ZpZXdBZ2dyZWdhdGUoXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mb1xuICApOiBpbmZvIGlzIEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PiB7XG4gICAgcmV0dXJuIGluZm8ua2luZCAhPT0gXCJhdmdcIjtcbiAgfVxufVxuIiwiaW1wb3J0IFwiLi4vc2hhcmVkL292ZXJyaWRlc1wiO1xuaW1wb3J0IHtcbiAgQ291Y2hEQktleXMsXG4gIHR5cGUgTWFuZ29RdWVyeSxcbiAgdHlwZSBWaWV3UmVzcG9uc2UsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7IENsaWVudCB9IGZyb20gXCJAZ3JwYy9ncnBjLWpzXCI7XG5pbXBvcnQgKiBhcyBncnBjIGZyb20gXCJAZ3JwYy9ncnBjLWpzXCI7XG5pbXBvcnQge1xuICBNb2RlbCxcbiAgdHlwZSBNb2RlbENvbnN0cnVjdG9yLFxuICB0eXBlIFNlcmlhbGl6ZXIsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGRlYnVnLCBmaW5hbCwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBQZWVyQ29uZmlnLFxuICB0eXBlIFNlZ3JlZ2F0ZWRNb2RlbCxcbiAgdHlwZSBNc3BEZXRhaWxzLFxufSBmcm9tIFwiLi4vc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQge1xuICBjb25uZWN0LFxuICB0eXBlIENvbm5lY3RPcHRpb25zLFxuICBHYXRld2F5LFxuICBOZXR3b3JrLFxuICBQcm9wb3NhbE9wdGlvbnMsXG4gIENvbnRyYWN0IGFzIENvbnRyYWt0LFxuICB0eXBlIFNpZ25lcixcbiAgR2F0ZXdheUVycm9yLFxuICBFbmRvcnNlRXJyb3IsXG59IGZyb20gXCJAaHlwZXJsZWRnZXIvZmFicmljLWdhdGV3YXlcIjtcbmltcG9ydCB7IEdhdGV3YXkgYXMgTGVnYWN5R2F0ZXdheSwgV2FsbGV0cyB9IGZyb20gXCJmYWJyaWMtbmV0d29ya1wiO1xuaW1wb3J0IHR5cGUgeyBFbmRvcnNlciB9IGZyb20gXCJmYWJyaWMtY29tbW9uXCI7XG5pbXBvcnQge1xuICBnZXRJZGVudGl0eSxcbiAgZ2V0U2lnbmVyLFxuICBnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudCxcbiAgcmVhZEZpbGUgYXMgcmVhZEZzRmlsZSxcbn0gZnJvbSBcIi4vZmFicmljLWZzXCI7XG5pbXBvcnQge1xuICBCYXNlRXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG4gIFNlcmlhbGl6YXRpb25FcnJvcixcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBOb3RGb3VuZEVycm9yLFxuICBDb25mbGljdEVycm9yLFxuICBCYWRSZXF1ZXN0RXJyb3IsXG4gIHR5cGUgUHJpbWFyeUtleVR5cGUsXG4gIFZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDb250ZXh0LFxuICBBZGFwdGVyLFxuICB0eXBlIEFkYXB0ZXJGbGFncyxcbiAgQXV0aG9yaXphdGlvbkVycm9yLFxuICBDb25uZWN0aW9uRXJyb3IsXG4gIEZvcmJpZGRlbkVycm9yLFxuICBNaWdyYXRpb25FcnJvcixcbiAgT2JzZXJ2ZXJFcnJvcixcbiAgUGFnaW5nRXJyb3IsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUXVlcnlFcnJvcixcbiAgUmVwb3NpdG9yeSxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbiAgU3RhdGVtZW50LFxuICB0eXBlIFByZXBhcmVkU3RhdGVtZW50LFxuICBQYWdpbmF0b3IsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgQ29udGV4dHVhbEFyZ3MsXG4gIHR5cGUgUHJlcGFyZWRNb2RlbCxcbiAgQWxsT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGF2b3VyIH0gZnJvbSBcIi4uL3NoYXJlZC9jb25zdGFudHNcIjtcbmltcG9ydCB7IENsaWVudFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vc2hhcmVkL0NsaWVudFNlcmlhbGl6ZXJcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudERpc3BhdGNoIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50RGlzcGF0Y2hcIjtcbi8vIGltcG9ydCB7IEhTTVNpZ25lckZhY3RvcnlDdXN0b20gfSBmcm9tIFwiLi9mYWJyaWMtaHNtXCI7XG5pbXBvcnQgeyB0eXBlIENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRTdGF0ZW1lbnQgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRTdGF0ZW1lbnRcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudFBhZ2luYXRvciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudFBhZ2luYXRvclwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50UmVwb3NpdG9yeSB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudFJlcG9zaXRvcnlcIjtcbmltcG9ydCB7XG4gIEVuZG9yc2VtZW50RXJyb3IsXG4gIEVuZG9yc2VtZW50UG9saWN5RXJyb3IsXG4gIE12Y2NSZWFkQ29uZmxpY3RFcnJvcixcbiAgUGhhbnRvbVJlYWRDb25mbGljdEVycm9yLFxuICBUcmFuc2FjdGlvblRpbWVvdXRFcnJvcixcbn0gZnJvbSBcIi4uL3NoYXJlZC9lcnJvcnNcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlZmF1bHRGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgQ3J5cHRvVXRpbHMgfSBmcm9tIFwiLi9jcnlwdG9cIjtcbmltcG9ydCB7IGV4dHJhY3RJZHMgfSBmcm9tIFwiLi9pZHMvaWQtZXh0cmFjdGlvblwiO1xuaW1wb3J0IHsgSWRlbnRpdHkgfSBmcm9tIFwiLi4vc2hhcmVkL2luZGV4XCI7XG5cbnR5cGUgTGVnYWN5UGVlclRhcmdldCA9IHtcbiAgbXNwSWQ6IHN0cmluZztcbiAgcGVlckVuZHBvaW50OiBzdHJpbmc7XG4gIHBlZXJIb3N0QWxpYXM/OiBzdHJpbmc7XG4gIHRsc0NlcnQ/OiBzdHJpbmcgfCBCdWZmZXI7XG59O1xuXG50eXBlIExlZ2FjeVBlZXJXaXRoTmFtZSA9IExlZ2FjeVBlZXJUYXJnZXQgJiB7IG5hbWU6IHN0cmluZyB9O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBZGFwdGVyIGZvciBpbnRlcmFjdGluZyB3aXRoIEh5cGVybGVkZ2VyIEZhYnJpYyBuZXR3b3Jrc1xuICogQHN1bW1hcnkgVGhlIEZhYnJpY0FkYXB0ZXIgZXh0ZW5kcyBDb3VjaERCQWRhcHRlciB0byBwcm92aWRlIGEgc2VhbWxlc3MgaW50ZXJmYWNlIGZvciBpbnRlcmFjdGluZyB3aXRoIEh5cGVybGVkZ2VyIEZhYnJpYyBuZXR3b3Jrcy5cbiAqIEl0IGhhbmRsZXMgY29ubmVjdGlvbiBtYW5hZ2VtZW50LCB0cmFuc2FjdGlvbiBzdWJtaXNzaW9uLCBhbmQgQ1JVRCBvcGVyYXRpb25zIGFnYWluc3QgRmFicmljIGNoYWluY29kZS5cbiAqIEB0ZW1wbGF0ZSBQZWVyQ29uZmlnIC0gQ29uZmlndXJhdGlvbiB0eXBlIGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAqIEB0ZW1wbGF0ZSBGYWJyaWNGbGFncyAtIEZsYWdzIHNwZWNpZmljIHRvIEZhYnJpYyBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgQ29udGV4dDxGYWJyaWNGbGFncz4gLSBDb250ZXh0IHR5cGUgY29udGFpbmluZyBGYWJyaWMtc3BlY2lmaWMgZmxhZ3NcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAqIEBwYXJhbSBhbGlhcyAtIE9wdGlvbmFsIGFsaWFzIGZvciB0aGUgYWRhcHRlciBpbnN0YW5jZVxuICogQGNsYXNzIEZhYnJpY0NsaWVudEFkYXB0ZXJcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgRmFicmljQWRhcHRlciBpbnN0YW5jZVxuICogY29uc3QgY29uZmlnOiBQZWVyQ29uZmlnID0ge1xuICogICBtc3BJZDogJ09yZzFNU1AnLFxuICogICBwZWVyRW5kcG9pbnQ6ICdsb2NhbGhvc3Q6NzA1MScsXG4gKiAgIGNoYW5uZWxOYW1lOiAnbXljaGFubmVsJyxcbiAqICAgY2hhaW5jb2RlTmFtZTogJ215Y2MnLFxuICogICBjb250cmFjdE5hbWU6ICdteWNvbnRyYWN0JyxcbiAqICAgdGxzQ2VydFBhdGg6ICcvcGF0aC90by90bHMvY2VydCcsXG4gKiAgIGNlcnREaXJlY3RvcnlQYXRoOiAnL3BhdGgvdG8vY2VydC9kaXInLFxuICogICBrZXlEaXJlY3RvcnlQYXRoOiAnL3BhdGgvdG8va2V5L2RpcidcbiAqIH07XG4gKlxuICogY29uc3QgYWRhcHRlciA9IG5ldyBGYWJyaWNBZGFwdGVyKGNvbmZpZywgJ29yZzEtYWRhcHRlcicpO1xuICpcbiAqIC8vIFVzZSB0aGUgYWRhcHRlciB0byBpbnRlcmFjdCB3aXRoIHRoZSBGYWJyaWMgbmV0d29ya1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgYWRhcHRlci5yZWFkKCd1c2VycycsICd1c2VyMScsIG15U2VyaWFsaXplcik7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICogICBwYXJ0aWNpcGFudCBOZXR3b3JrXG4gKiAgIHBhcnRpY2lwYW50IENvbnRyYWN0XG4gKiAgIHBhcnRpY2lwYW50IENoYWluY29kZVxuICpcbiAqICAgQ2xpZW50LT4+RmFicmljQWRhcHRlcjogY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsLCB0cmFuc2llbnQsIHNlcmlhbGl6ZXIpXG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBzdWJtaXRUcmFuc2FjdGlvbihPcGVyYXRpb25LZXlzLkNSRUFURSwgW3NlcmlhbGl6ZWRNb2RlbF0sIHRyYW5zaWVudClcbiAqICAgRmFicmljQWRhcHRlci0+PkdhdGV3YXk6IGNvbm5lY3QoKVxuICogICBHYXRld2F5LT4+TmV0d29yazogZ2V0TmV0d29yayhjaGFubmVsTmFtZSlcbiAqICAgTmV0d29yay0+PkNvbnRyYWN0OiBnZXRDb250cmFjdChjaGFpbmNvZGVOYW1lLCBjb250cmFjdE5hbWUpXG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5Db250cmFjdDogc3VibWl0KGFwaSwgcHJvcG9zYWxPcHRpb25zKVxuICogICBDb250cmFjdC0+PkNoYWluY29kZTogaW52b2tlXG4gKiAgIENoYWluY29kZS0tPj5Db250cmFjdDogcmVzcG9uc2VcbiAqICAgQ29udHJhY3QtLT4+RmFicmljQWRhcHRlcjogcmVzdWx0XG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBkZWNvZGUocmVzdWx0KVxuICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkZWNvZGVkUmVzdWx0KVxuICogICBGYWJyaWNBZGFwdGVyLS0+PkNsaWVudDogZGVzZXJpYWxpemVkUmVzdWx0XG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnRBZGFwdGVyIGV4dGVuZHMgQWRhcHRlcjxcbiAgUGVlckNvbmZpZyxcbiAgQ2xpZW50LFxuICBNYW5nb1F1ZXJ5LFxuICBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhdGljIHRleHQgZGVjb2RlciBmb3IgY29udmVydGluZyBVaW50OEFycmF5IHRvIHN0cmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc2VyaWFsaXplciA9IG5ldyBDbGllbnRTZXJpYWxpemVyKCk7XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBsb2cgPSBMb2dnaW5nLmZvcihGYWJyaWNDbGllbnRBZGFwdGVyKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VyaWFsaXplcjogU2VyaWFsaXplcjxhbnk+ID1cbiAgICBGYWJyaWNDbGllbnRBZGFwdGVyLnNlcmlhbGl6ZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IEZhYnJpY0FkYXB0ZXIgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgYWRhcHRlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhIEh5cGVybGVkZ2VyIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyIGluc3RhbmNlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IFBlZXJDb25maWcsIGFsaWFzPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0RmFicmljQ2xpZW50RmxhZ3MsIGNvbmZpZyksXG4gICAgICBGYWJyaWNGbGF2b3VyLFxuICAgICAgYWxpYXNcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3ZlcnJpZGVzPzogUGFydGlhbDxBZGFwdGVyRmxhZ3M+XG4gICk6IFN0YXRlbWVudDxNLCBGYWJyaWNDbGllbnRBZGFwdGVyLCBhbnksIE1hbmdvUXVlcnk+IHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY0NsaWVudFN0YXRlbWVudCh0aGlzLCBvdmVycmlkZXMpO1xuICB9XG5cbiAgUGFnaW5hdG9yPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgcXVlcnk6IFByZXBhcmVkU3RhdGVtZW50PGFueT4gfCBNYW5nb1F1ZXJ5LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKTogUGFnaW5hdG9yPE0sIGFueSwgTWFuZ29RdWVyeT4ge1xuICAgIHJldHVybiBuZXcgRmFicmljQ2xpZW50UGFnaW5hdG9yKHRoaXMsIHF1ZXJ5LCBzaXplLCBjbGF6eik7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+IHwgQ29uc3RydWN0b3I8TT5bXSB8IHVuZGVmaW5lZCxcbiAgICBmbGFnczogUGFydGlhbDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGYWJyaWNDbGllbnRGbGFncz4ge1xuICAgIGNvbnN0IG1lcmdlZEZsYWdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jb25maWcsIGZsYWdzKTtcbiAgICBjb25zdCBmID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIGF3YWl0IHN1cGVyLmZsYWdzKG9wZXJhdGlvbiwgbW9kZWwsIG1lcmdlZEZsYWdzLCAuLi5hcmdzKVxuICAgICk7XG4gICAgcmV0dXJuIGY7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjb250ZXh0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiAoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgQWxsT3BlcmF0aW9uS2V5cyxcbiAgICBvdmVycmlkZXM6IFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiB8IENvbnN0cnVjdG9yPE0+W10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHQ8YW55Pj5cbiAgKTogUHJvbWlzZTxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNvbnRleHQpO1xuICAgIGxvZy5zaWxseShcbiAgICAgIGBjcmVhdGluZyBuZXcgY29udGV4dCBmb3IgJHtvcGVyYXRpb259IG9wZXJhdGlvbiBvbiAke21vZGVsID8gKEFycmF5LmlzQXJyYXkobW9kZWwpID8gbW9kZWwubWFwKChtKSA9PiBNb2RlbC50YWJsZU5hbWUobSkpIDogTW9kZWwudGFibGVOYW1lKG1vZGVsKSkgOiBcIm5vXCJ9IHRhYmxlICR7b3ZlcnJpZGVzICYmIE9iamVjdC5rZXlzKG92ZXJyaWRlcykgPyBPYmplY3Qua2V5cyhvdmVycmlkZXMpLmxlbmd0aCA6IFwibm9cIn0gd2l0aCBmbGFnIG92ZXJyaWRlc2BcbiAgICApO1xuICAgIGxldCBjdHggPSBhcmdzLnBvcCgpO1xuICAgIGlmICh0eXBlb2YgY3R4ICE9PSBcInVuZGVmaW5lZFwiICYmICEoY3R4IGluc3RhbmNlb2YgQ29udGV4dCkpIHtcbiAgICAgIGFyZ3MucHVzaChjdHgpO1xuICAgICAgY3R4ID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIG92ZXJyaWRlcyA9IGN0eFxuICAgICAgPyBPYmplY3QuYXNzaWduKHt9LCBjdHgudG9PdmVycmlkZXMoKSwgb3ZlcnJpZGVzKVxuICAgICAgOiBvdmVycmlkZXM7XG4gICAgY29uc3QgZmxhZ3MgPSBhd2FpdCB0aGlzLmZsYWdzKFxuICAgICAgdHlwZW9mIG9wZXJhdGlvbiA9PT0gXCJzdHJpbmdcIiA/IG9wZXJhdGlvbiA6IG9wZXJhdGlvbi5uYW1lLFxuICAgICAgbW9kZWwsXG4gICAgICBvdmVycmlkZXMgYXMgUGFydGlhbDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgICAuLi5bLi4uYXJncywgY3R4XS5maWx0ZXIoQm9vbGVhbilcbiAgICApO1xuXG4gICAgaWYgKGN0eCkge1xuICAgICAgaWYgKCEoY3R4IGluc3RhbmNlb2YgdGhpcy5Db250ZXh0KSkge1xuICAgICAgICBjb25zdCBuZXdDdHggPSBuZXcgdGhpcy5Db250ZXh0KCkuYWNjdW11bGF0ZSh7XG4gICAgICAgICAgLi4uY3R4W1wiY2FjaGVcIl0sXG4gICAgICAgICAgLi4uZmxhZ3MsXG4gICAgICAgICAgcGFyZW50Q29udGV4dDogY3R4LFxuICAgICAgICB9KSBhcyBhbnk7XG4gICAgICAgIGN0eC5hY2N1bXVsYXRlKHtcbiAgICAgICAgICBjaGlsZENvbnRleHRzOiBbXG4gICAgICAgICAgICAuLi4oY3R4LmdldE9yVW5kZWZpbmVkKFwiY2hpbGRDb250ZXh0c1wiKSB8fCBbXSksXG4gICAgICAgICAgICBuZXdDdHgsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXdDdHg7XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50T3AgPSBjdHguZ2V0T3JVbmRlZmluZWQoXCJvcGVyYXRpb25cIik7XG4gICAgICBjb25zdCBjdXJyZW50TW9kZWwgPSBjdHguZ2V0T3JVbmRlZmluZWQoXCJhZmZlY3RlZFRhYmxlc1wiKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWN1cnJlbnRPcCB8fFxuICAgICAgICBjdXJyZW50T3AgIT09IG9wZXJhdGlvbiB8fFxuICAgICAgICAobW9kZWwgJiYgbW9kZWwgIT09IGN1cnJlbnRNb2RlbClcbiAgICAgICkge1xuICAgICAgICBjb25zdCBuZXdDdHggPSBuZXcgdGhpcy5Db250ZXh0KCkuYWNjdW11bGF0ZSh7XG4gICAgICAgICAgLi4uY3R4W1wiY2FjaGVcIl0sXG4gICAgICAgICAgLi4uZmxhZ3MsXG4gICAgICAgICAgcGFyZW50Q29udGV4dDogY3R4LFxuICAgICAgICB9KSBhcyBhbnk7XG5cbiAgICAgICAgY3R4LmFjY3VtdWxhdGUoe1xuICAgICAgICAgIGNoaWxkQ29udGV4dHM6IFtcbiAgICAgICAgICAgIC4uLihjdHguZ2V0T3JVbmRlZmluZWQoXCJjaGlsZENvbnRleHRzXCIpIHx8IFtdKSxcbiAgICAgICAgICAgIG5ld0N0eCxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ld0N0eDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdHguYWNjdW11bGF0ZShmbGFncykgYXMgYW55O1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgdGhpcy5Db250ZXh0KCkuYWNjdW11bGF0ZSh7XG4gICAgICAuLi5mbGFncyxcbiAgICB9KSBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlY29kZXMgYSBVaW50OEFycmF5IHRvIGEgc3RyaW5nXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGJpbmFyeSBkYXRhIHJlY2VpdmVkIGZyb20gRmFicmljIHRvIGEgc3RyaW5nIHVzaW5nIFVURi04IGVuY29kaW5nXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YSAtIFRoZSBiaW5hcnkgZGF0YSB0byBkZWNvZGVcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGVjb2RlZCBzdHJpbmdcbiAgICovXG4gIGRlY29kZShkYXRhOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5kZWNvZGVyLmRlY29kZShkYXRhKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlcG9zaXRvcnk8XG4gICAgUiBleHRlbmRzIFJlcG9zaXRvcnk8XG4gICAgICBhbnksXG4gICAgICBBZGFwdGVyPFBlZXJDb25maWcsIENsaWVudCwgTWFuZ29RdWVyeSwgQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICAgPixcbiAgPigpOiBDb25zdHJ1Y3RvcjxSPiB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxSPjtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogW0NvbnN0cnVjdG9yPE0+LCBQcmltYXJ5S2V5VHlwZSwgUmVjb3JkPHN0cmluZywgYW55PiwgLi4uYW55W10sIENvbnRleHRdIHtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuY3JlYXRlUHJlZml4KTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsKTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZCwgcmVjb3JkLCAuLi5jdHhBcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgbXVsdGlwbGUgcmVjb3JkcyBmb3IgY3JlYXRpb25cbiAgICogQHN1bW1hcnkgQWRkcyBuZWNlc3NhcnkgQ291Y2hEQiBmaWVsZHMgdG8gbXVsdGlwbGUgcmVjb3JkcyBiZWZvcmUgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBpZHMgLSBUaGUgSURzIG9mIHRoZSByZWNvcmRzXG4gICAqIEBwYXJhbSBtb2RlbHMgLSBUaGUgbW9kZWxzIHRvIHByZXBhcmVcbiAgICogQHJldHVybiBBIHR1cGxlIGNvbnRhaW5pbmcgdGhlIHRhYmxlTmFtZSwgaWRzLCBhbmQgcHJlcGFyZWQgcmVjb3Jkc1xuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBpZHMgYW5kIG1vZGVscyBhcnJheXMgaGF2ZSBkaWZmZXJlbnQgbGVuZ3Roc1xuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUFsbFByZWZpeDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGVBbGxQcmVmaXgpO1xuICAgIGNvbnN0IHJlY29yZHMgPSBpZHMubWFwKChpZCwgY291bnQpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbHNbY291bnRdKTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIFtjbGF6eiwgaWRzLCByZWNvcmRzLCAuLi5jdHhBcmdzXTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVBbGxQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlQWxsUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmRzID0gaWRzLm1hcCgoKSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH0pO1xuICAgIHJldHVybiBbY2xhenosIGlkcywgcmVjb3JkcywgLi4uY3R4QXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gY3JlYXRlIG11bHRpcGxlIHJlY29yZHMgaW4gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0gaWRzIC0gQXJyYXkgb2YgcmVjb3JkIGlkZW50aWZpZXJzXG4gICAqIEBwYXJhbSB7QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj59IG1vZGVscyAtIEFycmF5IG9mIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNyZWF0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICAvL0hFUkUhXG4gICAgY29uc3QgY3R4QXJncyA9IFsuLi4oYXJncyBhcyB1bmtub3duIGFzIGFueVtdKV07XG4gICAgY29uc3QgdHJhbnNpZW50ID0gY3R4QXJncy5zaGlmdCgpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoXG4gICAgICBjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PixcbiAgICAgIHRoaXMuY3JlYXRlQWxsXG4gICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgbG9nLmluZm8oYGFkZGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHRyYW5zaWVudFBheWxvYWQgPSBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHt9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLFxuICAgICAgW1xuICAgICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBtb2RlbHMubWFwKChtKSA9PiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG0sIGNsYXp6Lm5hbWUpKVxuICAgICAgICApLFxuICAgICAgXSxcbiAgICAgIHRyYW5zaWVudFBheWxvYWQgYXMgYW55LFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcblxuICAgIGxldCByZXM6IFJlY29yZDxzdHJpbmcsIGFueT5bXTtcbiAgICB0cnkge1xuICAgICAgcmVzID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgY3R4LFxuICAgICAgICBuZWVkc0Z1bGxQYXlsb2FkLFxuICAgICAgICByZXNbMF1bTW9kZWwucGsoY2xhenopIGFzIHN0cmluZ10gfHwgaWRzWzBdXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQWxsKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICAgICAgTW9kZWwubWVyZ2UoT2JqZWN0LmFzc2lnbih7fSwgbSBhcyBhbnksIHRyYW5zaWVudFtpXSB8fCB7fSksIHJlc1tpXSlcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkc1xuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgbXVsdGlwbGUgcmVjb3JkcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gcmVhZCBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0gaWRzIC0gQXJyYXkgb2YgcmVjb3JkIGlkZW50aWZpZXJzIHRvIHJlYWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3Jkc1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkQWxsKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy5pbmZvKGByZWFkaW5nICR7aWRzLmxlbmd0aH0gZW50cmllcyB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cudmVyYm9zZShgcGtzOiAke2lkc31gKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuUkVBRF9BTEwsXG4gICAgICBbSlNPTi5zdHJpbmdpZnkoaWRzKV0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzdWx0KSkubWFwKChyOiBhbnkpID0+IEpTT04ucGFyc2UocikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHVwZGF0ZSBtdWx0aXBsZSByZWNvcmRzIGluIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVyc1xuICAgKiBAcGFyYW0ge0FycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+fSBtb2RlbHMgLSBBcnJheSBvZiB1cGRhdGVkIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHVwZGF0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCBjdHhBcmdzID0gWy4uLihhcmdzIGFzIHVua25vd24gYXMgYW55W10pXTtcbiAgICBjb25zdCB0cmFuc2llbnQgPSBjdHhBcmdzLnNoaWZ0KCkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChcbiAgICAgIGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+LFxuICAgICAgdGhpcy51cGRhdGVBbGxcbiAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgbG9nLmluZm8oYHVwZGF0aW5nICR7aWRzLmxlbmd0aH0gZW50cmllcyB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cudmVyYm9zZShgcGtzOiAke2lkc31gKTtcbiAgICBjb25zdCBoYXNUcmFuc2llbnQgPSB0cmFuc2llbnQgJiYgT2JqZWN0LmtleXModHJhbnNpZW50KS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgaGFzVHJhbnNpZW50IHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgY29uc3QgdHJhbnNpZW50UGF5bG9hZCA9IGhhc1RyYW5zaWVudCA/IHsgW3RhYmxlTmFtZV06IHRyYW5zaWVudCB9IDoge307XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsXG4gICAgICBbXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIG1vZGVscy5tYXAoKG0pID0+IHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUobSwgY2xhenoubmFtZSkpXG4gICAgICAgICksXG4gICAgICBdLFxuICAgICAgdHJhbnNpZW50UGF5bG9hZCBhcyBhbnksXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuXG4gICAgbGV0IHJlczogYW55O1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlc3VsdCkpLm1hcCgocjogYW55KSA9PiBKU09OLnBhcnNlKHIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKGNsYXp6LCBjdHgsIG5lZWRzRnVsbFBheWxvYWQsIGlkc1swXSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWRBbGwoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBleHRyYWN0SWRzKFxuICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgIG1vZGVscy5tYXAoKG0sIGkpID0+XG4gICAgICAgICAgICBNb2RlbC5tZXJnZShPYmplY3QuYXNzaWduKHt9LCBtIGFzIGFueSwgdHJhbnNpZW50W2ldIHx8IHt9KSwgcmVzW2ldKVxuICAgICAgICAgICksXG4gICAgICAgICAgaWRzXG4gICAgICAgICksXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byBkZWxldGUgbXVsdGlwbGUgcmVjb3JkcyBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD59IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVycyB0byBkZWxldGVcbiAgICogQHBhcmFtIHtTZXJpYWxpemVyPGFueT59IHNlcmlhbGl6ZXIgLSBTZXJpYWxpemVyIGZvciB0aGUgbW9kZWwgZGF0YVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGRlbGV0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4LCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmRlbGV0ZUFsbCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgTW9kZWwuaXNUcmFuc2llbnQoY2xhenopIHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIGNvbnN0IHNob3VsZEh5ZHJhdGUgPSB0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKFxuICAgICAgY2xhenosXG4gICAgICBjdHgsXG4gICAgICBuZWVkc0Z1bGxQYXlsb2FkLFxuICAgICAgaWRzWzBdXG4gICAgKTtcbiAgICBpZiAoc2hvdWxkSHlkcmF0ZSkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZWFkQWxsKGNsYXp6LCBpZHMsIC4uLmN0eEFyZ3MpO1xuICAgIH1cblxuICAgIGxvZy5pbmZvKGBkZWxldGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMLFxuICAgICAgW0pTT04uc3RyaW5naWZ5KGlkcyldLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHNob3VsZEh5ZHJhdGVcbiAgICAgICAgPyByZXN1bHRcbiAgICAgICAgOiBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlcykpLm1hcCgocjogYW55KSA9PiBKU09OLnBhcnNlKHIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgcGVyc2lzdGVuY2VcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBtb2RlbCBpbnN0YW5jZSBpbnRvIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBkYXRhYmFzZSBzdG9yYWdlLFxuICAgKiBoYW5kbGluZyBjb2x1bW4gbWFwcGluZyBhbmQgc2VwYXJhdGluZyB0cmFuc2llbnQgcHJvcGVydGllc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gcHJlcGFyZVxuICAgKiBAcGFyYW0gcGsgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAcmV0dXJuIFRoZSBwcmVwYXJlZCBkYXRhXG4gICAqL1xuICBvdmVycmlkZSBwcmVwYXJlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFNlZ3JlZ2F0ZWRNb2RlbDxNPiAmIFByZXBhcmVkTW9kZWwge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucHJlcGFyZSk7XG4gICAgY29uc3Qgc3BsaXQgPSBNb2RlbC5zZWdyZWdhdGUobW9kZWwpO1xuICAgIGlmICgobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdKSB7XG4gICAgICBsb2cuc2lsbHkoXG4gICAgICAgIGBQYXNzaW5nIGFsb25nIHBlcnNpc3RlbmNlIG1ldGFkYXRhIGZvciAkeyhtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV19YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGxpdC5tb2RlbCwgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBLCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBtaXJyb3JNZXRhID0gTW9kZWwubWlycm9yZWRBdChtb2RlbCk7XG4gICAgaWYgKG1pcnJvck1ldGEpIHtcbiAgICAgIGNvbnN0IG1pcnJvck1zcCA9IG1pcnJvck1ldGEubXNwSWQ7XG4gICAgICBpZiAoIW1pcnJvck1zcCkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIG1pcnJvciBNU1AgY291bGQgYmUgZm91bmRgKTtcbiAgICAgIGxldCBtc3BzID0gdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCkgfHwgW107XG4gICAgICBtc3BzID0gQXJyYXkuaXNBcnJheShtc3BzKSA/IG1zcHMgOiBbbXNwc107XG4gICAgICBjb25zdCBtZXJnZWQgPSBbLi4ubmV3IFNldChbLi4ubXNwcywgbWlycm9yTXNwXSldO1xuICAgICAgY3R4LmFjY3VtdWxhdGUoe1xuICAgICAgICBlbmRvcnNpbmdPcmdzOiBtZXJnZWQsXG4gICAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnM6IG1lcmdlZCxcbiAgICAgICAgbGVnYWN5OiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlY29yZDogc3BsaXQubW9kZWwsXG4gICAgICBtb2RlbDogc3BsaXQubW9kZWwsXG4gICAgICBpZDogbW9kZWxbTW9kZWwucGsobW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pXSBhcyBzdHJpbmcsXG4gICAgICB0cmFuc2llbnQ6IHNwbGl0LnRyYW5zaWVudCxcbiAgICAgIHByaXZhdGVzOiBzcGxpdC5wcml2YXRlcyxcbiAgICAgIHNoYXJlZDogc3BsaXQuc2hhcmVkLFxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSByZXZlcnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBNIHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJldmVydCk7XG4gICAgaWYgKFxuICAgICAgdHJhbnNpZW50ICYmXG4gICAgICB0aGlzLnNob3VsZFJlYnVpbGRXaXRoVHJhbnNpZW50KFxuICAgICAgICBjdHgsXG4gICAgICAgIGN0eC5nZXRPclVuZGVmaW5lZChcIm9wZXJhdGlvblwiKSBhcyBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgcmUtYWRkaW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzOiAke09iamVjdC5rZXlzKHRyYW5zaWVudCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZW50cmllcyh0cmFuc2llbnQgYXMgUmVjb3JkPHN0cmluZywgYW55PilcbiAgICAgICAgLmZpbHRlcigoWywgdl0pID0+IHR5cGVvZiB2ICE9PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgaW4gb2JqICYmIChvYmogYXMgYW55KVtrZXldICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBsb2cud2FybihcbiAgICAgICAgICAgICAgYG92ZXJ3cml0aW5nIGV4aXN0aW5nICR7a2V5fS4gaWYgdGhpcyBpcyBub3QgYSBkZWZhdWx0IHZhbHVlLCB0aGlzIG1heSBwb3NlIGEgcHJvYmxlbWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgKG9iaiBhcyBNKVtrZXkgYXMga2V5b2YgTV0gPSB2YWw7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8TT4pKG9iaik7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRSZWJ1aWxkV2l0aFRyYW5zaWVudChcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIG9wZXJhdGlvbj86IHN0cmluZ1xuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWN0eCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChjdHguZ2V0T3JVbmRlZmluZWQoXCJyZWJ1aWxkV2l0aFRyYW5zaWVudFwiKSkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgY2hpbGRSZWJ1aWxkID1cbiAgICAgIHR5cGVvZiAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuKFwicmVidWlsZFdpdGhUcmFuc2llbnRcIilcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKGNoaWxkUmVidWlsZCkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgcmVzb2x2ZWRPcCA9IHRoaXMucmVzb2x2ZU9wZXJhdGlvbihjdHgsIG9wZXJhdGlvbik7XG4gICAgaWYgKCFyZXNvbHZlZE9wKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qgb3AgPSByZXNvbHZlZE9wLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gKFxuICAgICAgb3AuaW5jbHVkZXMoXCJyZWFkXCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcImZpbmRcIikgfHxcbiAgICAgIG9wLmluY2x1ZGVzKFwicXVlcnlcIikgfHxcbiAgICAgIG9wLmluY2x1ZGVzKFwic3RhdGVtZW50XCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcInBhZ2VcIilcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlT3BlcmF0aW9uKFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgb3BlcmF0aW9uPzogc3RyaW5nXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKG9wZXJhdGlvbikgcmV0dXJuIG9wZXJhdGlvbjtcbiAgICBpZiAodHlwZW9mIChjdHggYXMgYW55KS5nZXRGcm9tQ2hpbGRyZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIChjdHggYXMgYW55KS5nZXRGcm9tQ2hpbGRyZW4oXCJvcGVyYXRpb25cIik7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFJlZnJlc2hBZnRlcldyaXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgaGFzVHJhbnNpZW50OiBib29sZWFuLFxuICAgIGlkPzogUHJpbWFyeUtleVR5cGVcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFoYXNUcmFuc2llbnQpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBwayA9IE1vZGVsLnBrKGNsYXp6KTtcbiAgICBjb25zdCBjb21wb3NlZCA9IE1vZGVsLmNvbXBvc2VkKGNsYXp6LCBwayk7XG4gICAgY29uc3QgZ2VuZXJhdGVkID0gTW9kZWwuZ2VuZXJhdGVkKGNsYXp6LCBwayk7XG4gICAgY29uc3QgaGFzSWQgPSBpZCAhPT0gdW5kZWZpbmVkICYmIGlkICE9PSBudWxsO1xuICAgIGlmICghaGFzSWQgJiYgY29tcG9zZWQpIHJldHVybiB0cnVlO1xuICAgIGlmICghaGFzSWQgJiYgZ2VuZXJhdGVkKSB7XG4gICAgICBjdHgubG9nZ2VyLndhcm4oXG4gICAgICAgIGBDYW5ub3QgcmVmcmVzaCByZWNvcmQgd2l0aCBwcml2YXRlIGdlbmVyYXRlZCBwcmltYXJ5IGtleWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBoYXNJZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkaXJlY3QgPVxuICAgICAgY3R4LmdldE9yVW5kZWZpbmVkKFwiZW5kb3JzaW5nT3Jnc1wiKSB8fFxuICAgICAgKGN0eC5nZXRPclVuZGVmaW5lZChcImVuZG9yc2luZ09yZ3NcIikgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpO1xuICAgIGlmIChkaXJlY3QgJiYgZGlyZWN0Lmxlbmd0aCkgcmV0dXJuIGRpcmVjdDtcbiAgICByZXR1cm4gKFxuICAgICAgKGN0eC5nZXRGcm9tQ2hpbGRyZW4oXCJlbmRvcnNpbmdPcmdzXCIpIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB8fFxuICAgICAgKGN0eC5nZXRGcm9tQ2hpbGRyZW4oXCJlbmRvcnNpbmdPcmdzXCIpIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmNvbmZpZy5hbGxvd0dhdGV3YXlPdmVycmlkZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGNyZWF0ZSBhIHJlY29yZCBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgcmVjb3JkIGRhdGFcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0cmFuc2llbnQgLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIHJlY29yZFxuICAgKi9cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICB0cmFuc2llbnQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgY3R4QXJncyA9IFsuLi4oYXJncyBhcyB1bmtub3duIGFzIGFueVtdKV07XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoXG4gICAgICBjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PixcbiAgICAgIHRoaXMuY3JlYXRlXG4gICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy52ZXJib3NlKGBhZGRpbmcgZW50cnkgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCBoYXNUcmFuc2llbnQgPSB0cmFuc2llbnQgJiYgT2JqZWN0LmtleXModHJhbnNpZW50KS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgaGFzVHJhbnNpZW50IHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgY29uc3QgdHJhbnNpZW50UGF5bG9hZCA9IGhhc1RyYW5zaWVudCA/IHsgW3RhYmxlTmFtZV06IHRyYW5zaWVudCB9IDoge307XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgW3RoaXMuc2VyaWFsaXplci5zZXJpYWxpemUobW9kZWwsIGNsYXp6Lm5hbWUpXSxcbiAgICAgIHRyYW5zaWVudFBheWxvYWQgYXMgYW55LFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICBjb25zdCBkZXNlcmlhbGl6ZWQgPSB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gICAgaWYgKHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoY2xhenosIGN0eCwgbmVlZHNGdWxsUGF5bG9hZCwgaWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBNb2RlbC5tZXJnZShcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oe30sIG1vZGVsLCB0cmFuc2llbnQgfHwge30pLFxuICAgICAgICAgICAgZGVzZXJpYWxpemVkLFxuICAgICAgICAgICAgY2xhenpcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkXG4gICAgICAgICksXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplZDtcbiAgfVxuXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIGFzeW5jIGhlYWx0aGNoZWNrPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmhlYWx0aGNoZWNrKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgbG9nLnZlcmJvc2UoYHJlYWRpbmcgZW50cnkgZnJvbSAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcImhlYWx0aGNoZWNrXCIsXG4gICAgICBbXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlc3VsdCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gdG8gcmVhZCBhIHJlY29yZCBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJldHJpZXZlZCByZWNvcmRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIGFzeW5jIHJlYWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJlYWQpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBsb2cudmVyYm9zZShgcmVhZGluZyBlbnRyeSBmcm9tICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGs6ICR7aWR9YCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgW2lkLnRvU3RyaW5nKCldLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZSh0aGlzLmRlY29kZShyZXN1bHQpKTtcbiAgfVxuXG4gIHVwZGF0ZVByZWZpeDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGVQcmVmaXgpO1xuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgLy8gcmVjb3JkW0NvdWNoREJLZXlzLklEXSA9IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKTtcbiAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWwpO1xuICAgIHJldHVybiBbY2xhenosIGlkLCByZWNvcmQsIC4uLmN0eEFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGEgc2luZ2xlIHJlY29yZFxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gdXBkYXRlIGEgcmVjb3JkIGluIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSB1cGRhdGVkIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdXBkYXRlZCByZWNvcmRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIGFzeW5jIHVwZGF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgdHJhbnNpZW50OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4sXG4gICAgICB0aGlzLnVwZGF0ZVxuICAgICk7XG4gICAgbG9nLmluZm8oYENMSUVOVCBVUERBVEUgY2xhc3MgOiAke3R5cGVvZiBjbGF6en1gKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy52ZXJib3NlKGB1cGRhdGluZyBlbnRyeSB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrOiAke2lkfWApO1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudCA9IHRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyh0cmFuc2llbnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBoYXNUcmFuc2llbnQgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBjb25zdCB0cmFuc2llbnRQYXlsb2FkID0gaGFzVHJhbnNpZW50ID8geyBbdGFibGVOYW1lXTogdHJhbnNpZW50IH0gOiB7fTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICBbdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShtb2RlbCwgY2xhenoubmFtZSB8fCBjbGF6eildLCAvLyBUT0RPIHNob3VsZCBiZSByZWNldmluZyBjbGFzcyBidXQgaXMgcmVjZWl2aW5nIHN0cmluZ1xuICAgICAgdHJhbnNpZW50UGF5bG9hZCBhcyBhbnksXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIGNvbnN0IGRlc2VyaWFsaXplZCA9IHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZSh0aGlzLmRlY29kZShyZXN1bHQpKTtcbiAgICBpZiAodGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShjbGF6eiwgY3R4LCBuZWVkc0Z1bGxQYXlsb2FkLCBpZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWQoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBleHRyYWN0SWRzKFxuICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgIE1vZGVsLm1lcmdlKFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwsIHRyYW5zaWVudCB8fCB7fSksXG4gICAgICAgICAgICBkZXNlcmlhbGl6ZWQsXG4gICAgICAgICAgICBjbGF6elxuICAgICAgICAgICksXG4gICAgICAgICAgaWRcbiAgICAgICAgKSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZGVzZXJpYWxpemVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgc2luZ2xlIHJlY29yZFxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gZGVsZXRlIGEgcmVjb3JkIGZyb20gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllciB0byBkZWxldGVcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGRlbGV0ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBvdmVycmlkZSBhc3luYyBkZWxldGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmRlbGV0ZSk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIE1vZGVsLmlzVHJhbnNpZW50KGNsYXp6KSB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICBjb25zdCBzaG91bGRIeWRyYXRlID0gdGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShcbiAgICAgIGNsYXp6LFxuICAgICAgY3R4LFxuICAgICAgbmVlZHNGdWxsUGF5bG9hZCxcbiAgICAgIGlkXG4gICAgKTtcbiAgICBpZiAoc2hvdWxkSHlkcmF0ZSkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZWFkKGNsYXp6LCBpZCwgY3R4KTtcbiAgICB9XG5cbiAgICBsb2cudmVyYm9zZShgZGVsZXRpbmcgZW50cnkgZnJvbSAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrOiAke2lkfWApO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIFtpZC50b1N0cmluZygpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgcmV0dXJuIHNob3VsZEh5ZHJhdGVcbiAgICAgID8gcmVzdWx0XG4gICAgICA6IHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZSh0aGlzLmRlY29kZShyZXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgcXVlcnkgYWdhaW5zdCB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAc3VtbWFyeSBFdmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiB0byBwZXJmb3JtIGEgcXVlcnkgdXNpbmcgTWFuZ28gUXVlcnkgc3ludGF4XG4gICAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJldHVybiB0eXBlXG4gICAqIEBwYXJhbSB7TWFuZ29RdWVyeX0gcmF3SW5wdXQgLSBUaGUgTWFuZ28gUXVlcnkgdG8gZXhlY3V0ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHByb2Nlc3MgLSBXaGV0aGVyIHRvIHByb2Nlc3MgdGhlIHJlc3VsdFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFY+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcXVlcnkgcmVzdWx0XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICAgKiAgIHBhcnRpY2lwYW50IENoYWluY29kZVxuICAgKlxuICAgKiAgIENsaWVudC0+PkZhYnJpY0FkYXB0ZXI6IHJhdyhyYXdJbnB1dCwgcHJvY2VzcylcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogSlNPTi5zdHJpbmdpZnkocmF3SW5wdXQpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IGV2YWx1YXRlVHJhbnNhY3Rpb24oXCJxdWVyeVwiLCBbaW5wdXRdKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5Db250cmFjdDogZXZhbHVhdGUoXCJxdWVyeVwiLCBwcm9wb3NhbE9wdGlvbnMpXG4gICAqICAgQ29udHJhY3QtPj5DaGFpbmNvZGU6IGludm9rZVxuICAgKiAgIENoYWluY29kZS0tPj5Db250cmFjdDogcmVzcG9uc2VcbiAgICogICBDb250cmFjdC0tPj5GYWJyaWNBZGFwdGVyOiByZXN1bHRcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogSlNPTi5wYXJzZShkZWNvZGUocmVzdWx0KSlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogUHJvY2VzcyByZXN1bHQgYmFzZWQgb24gdHlwZVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItLT4+Q2xpZW50OiBwcm9jZXNzZWQgcmVzdWx0XG4gICAqL1xuICBAZGVidWcoKVxuICBhc3luYyByYXc8ViwgRCBleHRlbmRzIGJvb2xlYW4+KFxuICAgIHJhd0lucHV0OiBNYW5nb1F1ZXJ5LFxuICAgIGRvY3NPbmx5OiBEID0gdHJ1ZSBhcyBELFxuICAgIGNsYXp6OiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8Vj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmF3KTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBjbGF6ei5uYW1lO1xuICAgIGxvZy5pbmZvKGBQZXJmb3JtaW5nIHJhdyBzdGF0ZW1lbnQgb24gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUoY2xhenopfWApO1xuICAgIGxldCB0cmFuc2FjdGlvblJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICB0cmFuc2FjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgY3R4LFxuICAgICAgICBcInJhd1wiLFxuICAgICAgICBbSlNPTi5zdHJpbmdpZnkocmF3SW5wdXQpLCBkb2NzT25seV0sXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB0YWJsZU5hbWVcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0OiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGUodHJhbnNhY3Rpb25SZXN1bHQpKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoYEZhaWxlZCB0byBwcm9jZXNzIHJlc3VsdDogJHtlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlUmVjb3JkID0gKHJlY29yZDogUmVjb3JkPGFueSwgYW55PikgPT4ge1xuICAgICAgaWYgKE1vZGVsLmlzTW9kZWwocmVjb3JkKSkgcmV0dXJuIE1vZGVsLmJ1aWxkKHJlY29yZCk7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH07XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHJldHVybiByZXN1bHQgYXMgVjtcbiAgICAgIGNvbnN0IGVsID0gcmVzdWx0WzBdO1xuICAgICAgaWYgKE1vZGVsLmlzTW9kZWwoZWwpKVxuICAgICAgICAvLyBpZiB0aGUgZmlyc3Qgb25lIGlzIGEgbW9kZWwsIGFsbCBhcmUgbW9kZWxzXG4gICAgICAgIHJldHVybiByZXN1bHQubWFwKChlbCkgPT4gTW9kZWwuYnVpbGQoZWwpKSBhcyBWO1xuICAgICAgcmV0dXJuIHJlc3VsdCBhcyBWO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJzZVJlY29yZChyZXN1bHQgYXMgYW55KSBhcyBWO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIENvdWNoREIgdmlldyBxdWVyeSBhZ2FpbnN0IHRoZSBGYWJyaWMgY2hhaW5jb2RlXG4gICAqIEBzdW1tYXJ5IEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIHRvIHF1ZXJ5IGEgZGVzaWduIGRvY3VtZW50IHZpZXdcbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgdmlldyByZXNwb25zZSB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZG9jIC0gRGVzaWduIGRvY3VtZW50IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZpZXdOYW1lIC0gVmlldyBuYW1lXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb3B0aW9ucyAtIFZpZXcgcXVlcnkgb3B0aW9uc1xuICAgKiBAcGFyYW0gey4uLkNvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+Pn0gYXJncyAtIE9wdGlvbmFsIGNvbnRleHR1YWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Vmlld1Jlc3BvbnNlPFI+Pn0gVGhlIHZpZXcgcmVzcG9uc2VcbiAgICovXG4gIEBkZWJ1ZygpXG4gIGFzeW5jIHZpZXc8Uj4oXG4gICAgZGRvYzogc3RyaW5nLFxuICAgIHZpZXdOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxWaWV3UmVzcG9uc2U8Uj4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnZpZXcpO1xuICAgIGxvZy5pbmZvKGBRdWVyeWluZyB2aWV3ICR7ZGRvY30vJHt2aWV3TmFtZX1gKTtcbiAgICBsZXQgdHJhbnNhY3Rpb25SZXN1bHQ6IGFueTtcbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgIGN0eCxcbiAgICAgICAgXCJ2aWV3XCIsXG4gICAgICAgIFtkZG9jLCB2aWV3TmFtZSwgSlNPTi5zdHJpbmdpZnkob3B0aW9ucyldLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDogVmlld1Jlc3BvbnNlPFI+O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHRyYW5zYWN0aW9uUmVzdWx0KSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyB2aWV3IHJlc3VsdDogJHtlfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIG9yIGNyZWF0ZXMgYSBnUlBDIGNsaWVudCBmb3IgdGhlIEZhYnJpYyBwZWVyXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBjYWNoZWQgY2xpZW50IG9yIGNyZWF0ZXMgYSBuZXcgb25lIGlmIG5vbmUgZXhpc3RzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q2xpZW50Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGdSUEMgY2xpZW50XG4gICAqL1xuICBvdmVycmlkZSBnZXRDbGllbnQoKTogQ2xpZW50IHtcbiAgICBpZiAoIXRoaXMuX2NsaWVudClcbiAgICAgIHRoaXMuX2NsaWVudCA9IEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0Q2xpZW50KHRoaXMuY29uZmlnKTtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgR2F0ZXdheSBpbnN0YW5jZSBmb3IgdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgR2F0ZXdheSBpbnN0YW5jZSB1c2luZyB0aGUgY3VycmVudCBjbGllbnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxHYXRld2F5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBHYXRld2F5KGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4pOiBQcm9taXNlPEdhdGV3YXk+IHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5nZXRHYXRld2F5KGN0eCwgdGhpcy5jb25maWcsIHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29udHJhY3ROYW1lKGNsYXNzTmFtZT86IHN0cmluZykge1xuICAgIGlmICghY2xhc3NOYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBgJHtjbGFzc05hbWV9Q29udHJhY3RgO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgQ29udHJhY3QgaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgY2hhaW5jb2RlXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgQ29udHJhY3QgaW5zdGFuY2UgdXNpbmcgdGhlIGN1cnJlbnQgR2F0ZXdheVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPENvbnRyYWt0Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIENvbnRyYWN0IGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgQ29udHJhY3QoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBjb250cmFjdE5hbWU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxDb250cmFrdD4ge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLmdldENvbnRyYWN0KFxuICAgICAgYXdhaXQgdGhpcy5HYXRld2F5KGN0eCksXG4gICAgICB0aGlzLmNvbmZpZyxcbiAgICAgIGNvbnRyYWN0TmFtZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgdHJhbnNhY3Rpb24gb24gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgb3IgZXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gb24gdGhlIEZhYnJpYyBjaGFpbmNvZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwaSAtIFRoZSBjaGFpbmNvZGUgZnVuY3Rpb24gdG8gY2FsbFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN1Ym1pdCAtIFdoZXRoZXIgdG8gc3VibWl0ICh0cnVlKSBvciBldmFsdWF0ZSAoZmFsc2UpIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge2FueVtdfSBbYXJnc10gLSBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY2hhaW5jb2RlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW3RyYW5zaWVudERhdGFdIC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtlbmRvcnNpbmdPcmdhbml6YXRpb25zXSAtIE9yZ2FuaXphdGlvbnMgdGhhdCBtdXN0IGVuZG9yc2UgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8VWludDhBcnJheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB0cmFuc2FjdGlvbiByZXN1bHRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAgICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICAgKiAgIHBhcnRpY2lwYW50IENoYWluY29kZVxuICAgKlxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KClcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IGdldENvbnRyYWN0KClcbiAgICogICBhbHQgc3VibWl0IHRyYW5zYWN0aW9uXG4gICAqICAgICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IHN1Ym1pdChhcGksIHByb3Bvc2FsT3B0aW9ucylcbiAgICogICBlbHNlIGV2YWx1YXRlIHRyYW5zYWN0aW9uXG4gICAqICAgICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IGV2YWx1YXRlKGFwaSwgcHJvcG9zYWxPcHRpb25zKVxuICAgKiAgIGVuZFxuICAgKiAgIENvbnRyYWN0LT4+Q2hhaW5jb2RlOiBpbnZva2VcbiAgICogICBDaGFpbmNvZGUtLT4+Q29udHJhY3Q6IHJlc3BvbnNlXG4gICAqICAgQ29udHJhY3QtLT4+RmFicmljQWRhcHRlcjogcmVzdWx0XG4gICAqICAgRmFicmljQWRhcHRlci0+PkdhdGV3YXk6IGNsb3NlKClcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyB0cmFuc2FjdGlvbihcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGFwaTogc3RyaW5nLFxuICAgIHN1Ym1pdCA9IHRydWUsXG4gICAgYXJncz86IGFueVtdLFxuICAgIHRyYW5zaWVudERhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSxcbiAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zPzogc3RyaW5nW10sXG4gICAgY2xhc3NOYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnRyYW5zYWN0aW9uKTtcbiAgICBjb25zdCBnYXRld2F5ID0gYXdhaXQgdGhpcy5HYXRld2F5KGN0eCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRyYWN0ID0gYXdhaXQgdGhpcy5Db250cmFjdChcbiAgICAgICAgY3R4LFxuICAgICAgICB0aGlzLmdldENvbnRyYWN0TmFtZShjbGFzc05hbWUpXG4gICAgICApO1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGAke3N1Ym1pdCA/IFwiU3VibWl0XCIgOiBcIkV2YWx1YXRlXCJ9dGluZyB0cmFuc2FjdGlvbiAke3RoaXMuZ2V0Q29udHJhY3ROYW1lKGNsYXNzTmFtZSkgfHwgdGhpcy5jb25maWcuY29udHJhY3ROYW1lfS4ke2FwaX1gXG4gICAgICApO1xuICAgICAgbG9nLmRlYnVnKGBhcmdzOiAke2FyZ3M/Lm1hcCgoYSkgPT4gYS50b1N0cmluZygpKS5qb2luKFwiXFxuXCIpIHx8IFwibm9uZVwifWApO1xuICAgICAgY29uc3QgbWV0aG9kID0gc3VibWl0ID8gY29udHJhY3Quc3VibWl0IDogY29udHJhY3QuZXZhbHVhdGU7XG5cbiAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnMgPSBlbmRvcnNpbmdPcmdhbml6YXRpb25zPy5sZW5ndGhcbiAgICAgICAgPyBlbmRvcnNpbmdPcmdhbml6YXRpb25zXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcHJvcG9zYWxPcHRpb25zOiBQcm9wb3NhbE9wdGlvbnMgPSB7XG4gICAgICAgIGFyZ3VtZW50czogYXJncyB8fCBbXSxcbiAgICAgICAgdHJhbnNpZW50RGF0YTogT2JqZWN0LmVudHJpZXModHJhbnNpZW50RGF0YSkucmVkdWNlKFxuICAgICAgICAgIChhY2MsIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICAgIGFjY1trZXldID0gSlNPTi5zdHJpbmdpZnkodmFsKTtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7fSBhcyB0eXBlb2YgdHJhbnNpZW50RGF0YVxuICAgICAgICApLFxuICAgICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zOiBjdHguZ2V0T3JVbmRlZmluZWQoXCJhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3NcIilcbiAgICAgICAgICA/IGVuZG9yc2luZ09yZ2FuaXphdGlvbnMgfHwgdW5kZWZpbmVkXG4gICAgICAgICAgOiB1bmRlZmluZWQsIC8vIG1zcElkIGxpc3RcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhd2FpdCBtZXRob2QuY2FsbChjb250cmFjdCwgYXBpLCBwcm9wb3NhbE9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgQ2xvc2luZyAke3RoaXMuY29uZmlnLm1zcElkfSBnYXRld2F5IGNvbm5lY3Rpb25gKTtcbiAgICAgIGdhdGV3YXkuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFVzZUxlZ2FjeUdhdGV3YXkoY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWN0eC5nZXRPclVuZGVmaW5lZChcImxlZ2FjeVwiKSAmJiAhIXRoaXMuY29uZmlnLmFsbG93R2F0ZXdheU92ZXJyaWRlO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlTGVnYWN5QXJncyhhcmdzPzogYW55W10pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIChhcmdzIHx8IFtdKS5tYXAoKGFyZykgPT5cbiAgICAgIHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIgPyBhcmcgOiBKU09OLnN0cmluZ2lmeShhcmcpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRMZWdhY3lUcmFuc2llbnQoXG4gICAgdHJhbnNpZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgKTogUmVjb3JkPHN0cmluZywgQnVmZmVyPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0cmFuc2llbnREYXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh0cmFuc2llbnREYXRhKTtcbiAgICBpZiAoIWVudHJpZXMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1hcDogUmVjb3JkPHN0cmluZywgQnVmZmVyPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgIG1hcFtrZXldID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUxlZ2FjeU1zcENvdW50KCk6IG51bWJlciB7XG4gICAgY29uc3QgY29uZmlndXJlZCA9IHRoaXMuY29uZmlnLmxlZ2FjeU1zcENvdW50ID8/IDE7XG4gICAgY29uc3QgcGFyc2VkID0gTnVtYmVyKGNvbmZpZ3VyZWQpO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgfHwgcGFyc2VkIDwgMSkgcmV0dXJuIDE7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IocGFyc2VkKTtcbiAgfVxuXG4gIHByaXZhdGUgcGlja0xlZ2FjeUNhbmRpZGF0ZXMoXG4gICAgY2FuZGlkYXRlczogTXNwRGV0YWlsc1tdLFxuICAgIGxpbWl0OiBudW1iZXJcbiAgKTogTXNwRGV0YWlsc1tdIHtcbiAgICBpZiAoIWNhbmRpZGF0ZXMubGVuZ3RoIHx8IGxpbWl0IDw9IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBbLi4uY2FuZGlkYXRlc107XG4gICAgY29uc3QgdGFyZ2V0ID0gTWF0aC5taW4obGltaXQsIGF2YWlsYWJsZS5sZW5ndGgpO1xuICAgIGNvbnN0IHBpY2tlZDogTXNwRGV0YWlsc1tdID0gW107XG4gICAgd2hpbGUgKHBpY2tlZC5sZW5ndGggPCB0YXJnZXQgJiYgYXZhaWxhYmxlLmxlbmd0aCkge1xuICAgICAgY29uc3QgaWR4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXZhaWxhYmxlLmxlbmd0aCk7XG4gICAgICBjb25zdCBbc2VsZWN0aW9uXSA9IGF2YWlsYWJsZS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgcGlja2VkLnB1c2goc2VsZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBpY2tlZDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRMZWdhY3lQZWVyQ29uZmlncyhcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IExlZ2FjeVBlZXJUYXJnZXRbXSB7XG4gICAgY29uc3QgcGVlcnM6IExlZ2FjeVBlZXJUYXJnZXRbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgbXNwSWQ6IHRoaXMuY29uZmlnLm1zcElkLFxuICAgICAgICBwZWVyRW5kcG9pbnQ6IHRoaXMuY29uZmlnLnBlZXJFbmRwb2ludCxcbiAgICAgICAgcGVlckhvc3RBbGlhczogdGhpcy5jb25maWcucGVlckhvc3RBbGlhcyxcbiAgICAgICAgdGxzQ2VydDogdGhpcy5jb25maWcudGxzQ2VydCxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGxldCBlbmRvcnNpbmdPcmdzID0gdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCkgfHwgW107XG4gICAgZW5kb3JzaW5nT3JncyA9IEFycmF5LmlzQXJyYXkoZW5kb3JzaW5nT3JncylcbiAgICAgID8gZW5kb3JzaW5nT3Jnc1xuICAgICAgOiBbZW5kb3JzaW5nT3Jnc107XG4gICAgY29uc3QgZW5kb3JzZXJzID1cbiAgICAgIGVuZG9yc2luZ09yZ3MuZmlsdGVyKChvcmcpOiBvcmcgaXMgc3RyaW5nID0+IEJvb2xlYW4ob3JnKSkgfHwgW107XG4gICAgY29uc3QgZXh0cmFzID0gZW5kb3JzZXJzLmZpbHRlcigob3JnKSA9PiBvcmcgIT09IHRoaXMuY29uZmlnLm1zcElkKTtcbiAgICBpZiAoIWV4dHJhcy5sZW5ndGgpIHJldHVybiBwZWVycztcblxuICAgIGNvbnN0IG1hcCA9IHRoaXMuY29uZmlnLm1zcE1hcDtcbiAgICBjb25zdCBsZWdhY3lDb3VudCA9IHRoaXMucmVzb2x2ZUxlZ2FjeU1zcENvdW50KCk7XG4gICAgZm9yIChjb25zdCBtc3Agb2YgZXh0cmFzKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVzID0gbWFwPy5bbXNwXTtcbiAgICAgIGlmICghY2FuZGlkYXRlcz8ubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgIGBObyBwZWVyIG1hcHBpbmcgYXZhaWxhYmxlIGZvciBNU1AgJHttc3B9LiBQcm92aWRlIGl0IHZpYSBjb25maWcubXNwTWFwYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMucGlja0xlZ2FjeUNhbmRpZGF0ZXMoY2FuZGlkYXRlcywgbGVnYWN5Q291bnQpO1xuICAgICAgaWYgKCFzZWxlY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICBgTm8gdmFsaWQgcGVlciBtYXBwaW5nIGF2YWlsYWJsZSBmb3IgTVNQICR7bXNwfS4gUHJvdmlkZSBpdCB2aWEgY29uZmlnLm1zcE1hcGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgY2hvaWNlIG9mIHNlbGVjdGlvbnMpIHtcbiAgICAgICAgaWYgKCFjaG9pY2UuZW5kcG9pbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICAgIGBJbnZhbGlkIHBlZXIgbWFwcGluZyBmb3IgTVNQICR7bXNwfTogbWlzc2luZyBlbmRwb2ludGBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHBlZXJzLnB1c2goe1xuICAgICAgICAgIG1zcElkOiBtc3AsXG4gICAgICAgICAgcGVlckVuZHBvaW50OiBjaG9pY2UuZW5kcG9pbnQsXG4gICAgICAgICAgcGVlckhvc3RBbGlhczogY2hvaWNlLmFsaWFzLFxuICAgICAgICAgIHRsc0NlcnQ6IGNob2ljZS50bHNDZXJ0IHx8IHRoaXMuY29uZmlnLnRsc0NlcnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwZWVycztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3VibWl0TGVnYWN5V2l0aEV4cGxpY2l0RW5kb3JzZXJzKFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgZmNuOiBzdHJpbmcsXG4gICAgYXJnczogc3RyaW5nW10sXG4gICAgdHJhbnNpZW50TWFwOiBSZWNvcmQ8c3RyaW5nLCBCdWZmZXI+IHwgdW5kZWZpbmVkLFxuICAgIHBlZXJDb25maWdzOiBMZWdhY3lQZWVyVGFyZ2V0W10sXG4gICAgY2xhc3NOYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2Vycyk7XG4gICAgY29uc3QgcGVlcnMgPSB0aGlzLm5vcm1hbGl6ZUxlZ2FjeVBlZXJzKHBlZXJDb25maWdzKTtcbiAgICBjb25zdCBpZGVudGl0eU1hdGVyaWFsID0gYXdhaXQgdGhpcy5yZXNvbHZlTGVnYWN5SWRlbnRpdHlNYXRlcmlhbCgpO1xuICAgIGNvbnN0IHdhbGxldCA9IGF3YWl0IFdhbGxldHMubmV3SW5NZW1vcnlXYWxsZXQoKTtcbiAgICBjb25zdCBpZGVudGl0eUxhYmVsID0gYCR7dGhpcy5jb25maWcubXNwSWR9LWxlZ2FjeWA7XG4gICAgYXdhaXQgd2FsbGV0LnB1dChpZGVudGl0eUxhYmVsLCB7XG4gICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICBjZXJ0aWZpY2F0ZTogaWRlbnRpdHlNYXRlcmlhbC5jZXJ0aWZpY2F0ZSxcbiAgICAgICAgcHJpdmF0ZUtleTogaWRlbnRpdHlNYXRlcmlhbC5wcml2YXRlS2V5LFxuICAgICAgfSxcbiAgICAgIG1zcElkOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgIHR5cGU6IFwiWC41MDlcIixcbiAgICB9IGFzIElkZW50aXR5KTtcblxuICAgIGNvbnN0IGNvbm5lY3Rpb25Qcm9maWxlID0gYXdhaXQgdGhpcy5idWlsZExlZ2FjeUNvbm5lY3Rpb25Qcm9maWxlKHBlZXJzKTtcbiAgICBjb25zdCBnYXRld2F5ID0gbmV3IExlZ2FjeUdhdGV3YXkoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBnYXRld2F5LmNvbm5lY3QoY29ubmVjdGlvblByb2ZpbGUsIHtcbiAgICAgICAgaWRlbnRpdHk6IGlkZW50aXR5TGFiZWwsXG4gICAgICAgIHdhbGxldCxcbiAgICAgICAgZGlzY292ZXJ5OiB7XG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBhc0xvY2FsaG9zdDogdGhpcy5zaG91bGRUcmVhdFBlZXJzQXNMb2NhbGhvc3QocGVlcnMpLFxuICAgICAgICB9LFxuICAgICAgICB0bHNJbmZvOiB7XG4gICAgICAgICAgY2VydGlmaWNhdGU6IGlkZW50aXR5TWF0ZXJpYWwuY2VydGlmaWNhdGUsXG4gICAgICAgICAga2V5OiBpZGVudGl0eU1hdGVyaWFsLnByaXZhdGVLZXksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbmV0d29yayA9IGF3YWl0IGdhdGV3YXkuZ2V0TmV0d29yayh0aGlzLmNvbmZpZy5jaGFubmVsKTtcbiAgICAgIGNvbnN0IGNvbnRyYWN0ID0gbmV0d29yay5nZXRDb250cmFjdChcbiAgICAgICAgdGhpcy5jb25maWcuY2hhaW5jb2RlTmFtZSxcbiAgICAgICAgdGhpcy5nZXRDb250cmFjdE5hbWUoY2xhc3NOYW1lKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gY29udHJhY3QuY3JlYXRlVHJhbnNhY3Rpb24oZmNuKTtcblxuICAgICAgaWYgKHRyYW5zaWVudE1hcCkge1xuICAgICAgICB0cmFuc2FjdGlvbi5zZXRUcmFuc2llbnQodHJhbnNpZW50TWFwKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZW5kb3JzZXJzID0gcGVlcnNcbiAgICAgICAgLm1hcCgocGVlcikgPT4gbmV0d29yay5nZXRDaGFubmVsKCkuZ2V0RW5kb3JzZXIocGVlci5uYW1lKSlcbiAgICAgICAgLmZpbHRlcigoZW5kb3JzZXIpOiBlbmRvcnNlciBpcyBFbmRvcnNlciA9PiBCb29sZWFuKGVuZG9yc2VyKSk7XG4gICAgICBpZiAoZW5kb3JzZXJzLmxlbmd0aCkge1xuICAgICAgICB0cmFuc2FjdGlvbi5zZXRFbmRvcnNpbmdQZWVycyhlbmRvcnNlcnMpO1xuICAgICAgfVxuXG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYExlZ2FjeSBzdWJtaXR0aW5nICR7dGhpcy5nZXRDb250cmFjdE5hbWUoY2xhc3NOYW1lKSB8fCB0aGlzLmNvbmZpZy5jb250cmFjdE5hbWV9LiR7ZmNufSB2aWEgcGVlcnMgJHtwZWVycy5tYXAoKHApID0+IHAucGVlckVuZHBvaW50KS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNhY3Rpb24uc3VibWl0KC4uLmFyZ3MpO1xuICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShyZXN1bHQpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBnYXRld2F5LmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUxlZ2FjeVBlZXJzKFxuICAgIHBlZXJzOiBMZWdhY3lQZWVyVGFyZ2V0W11cbiAgKTogTGVnYWN5UGVlcldpdGhOYW1lW10ge1xuICAgIGNvbnN0IGRlZHVwZWQgPSBuZXcgTWFwPHN0cmluZywgTGVnYWN5UGVlcldpdGhOYW1lPigpO1xuICAgIGNvbnN0IGFkZFBlZXIgPSAocGVlcjogTGVnYWN5UGVlclRhcmdldCkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gYCR7cGVlci5wZWVyRW5kcG9pbnR9fCR7cGVlci5wZWVySG9zdEFsaWFzIHx8IFwiXCJ9YDtcbiAgICAgIGlmIChkZWR1cGVkLmhhcyhrZXkpKSByZXR1cm47XG4gICAgICBjb25zdCBuYW1lID0gYHBlZXItJHtwZWVyLm1zcElkfS0ke2RlZHVwZWQuc2l6ZX1gO1xuICAgICAgZGVkdXBlZC5zZXQoa2V5LCB7XG4gICAgICAgIC4uLnBlZXIsXG4gICAgICAgIG5hbWUsXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcGVlcnMuZm9yRWFjaChhZGRQZWVyKTtcbiAgICBhZGRQZWVyKHtcbiAgICAgIG1zcElkOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgIHBlZXJFbmRwb2ludDogdGhpcy5jb25maWcucGVlckVuZHBvaW50LFxuICAgICAgcGVlckhvc3RBbGlhczogdGhpcy5jb25maWcucGVlckhvc3RBbGlhcyxcbiAgICB9KTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKGRlZHVwZWQudmFsdWVzKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlTGVnYWN5SWRlbnRpdHlNYXRlcmlhbCgpOiBQcm9taXNlPHtcbiAgICBjZXJ0aWZpY2F0ZTogc3RyaW5nO1xuICAgIHByaXZhdGVLZXk6IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgdGhpcy5yZWFkUGVtSW5wdXQoXG4gICAgICB0aGlzLmNvbmZpZy5jZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aFxuICAgICk7XG4gICAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IHRoaXMucmVhZFBlbUlucHV0KFxuICAgICAgdGhpcy5jb25maWcua2V5Q2VydE9yRGlyZWN0b3J5UGF0aFxuICAgICk7XG4gICAgcmV0dXJuIHsgY2VydGlmaWNhdGUsIHByaXZhdGVLZXkgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRMZWdhY3lDb25uZWN0aW9uUHJvZmlsZShwZWVyczogTGVnYWN5UGVlcldpdGhOYW1lW10pIHtcbiAgICBjb25zdCBwZWVyRW50cmllczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGNvbnN0IGNoYW5uZWxQZWVyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGNvbnN0IG9yZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHBlZXIgb2YgcGVlcnMpIHtcbiAgICAgIGNvbnN0IHRsc1BlbSA9IGF3YWl0IHRoaXMucmVhZFBlbUlucHV0KFxuICAgICAgICBwZWVyLnRsc0NlcnQgfHwgdGhpcy5jb25maWcudGxzQ2VydFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGhvc3RuYW1lID1cbiAgICAgICAgcGVlci5wZWVySG9zdEFsaWFzIHx8IHRoaXMuZXh0cmFjdEhvc3QocGVlci5wZWVyRW5kcG9pbnQpO1xuICAgICAgcGVlckVudHJpZXNbcGVlci5uYW1lXSA9IHtcbiAgICAgICAgdXJsOiB0aGlzLmVuc3VyZUdycGNVcmwocGVlci5wZWVyRW5kcG9pbnQpLFxuICAgICAgICB0bHNDQUNlcnRzOiB7IHBlbTogdGxzUGVtIH0sXG4gICAgICAgIGdycGNPcHRpb25zOiB7XG4gICAgICAgICAgXCJzc2wtdGFyZ2V0LW5hbWUtb3ZlcnJpZGVcIjogaG9zdG5hbWUsXG4gICAgICAgICAgaG9zdG5hbWVPdmVycmlkZTogaG9zdG5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY2hhbm5lbFBlZXJzW3BlZXIubmFtZV0gPSB7XG4gICAgICAgIGVuZG9yc2luZ1BlZXI6IHRydWUsXG4gICAgICAgIGNoYWluY29kZVF1ZXJ5OiB0cnVlLFxuICAgICAgICBsZWRnZXJRdWVyeTogdHJ1ZSxcbiAgICAgICAgZXZlbnRTb3VyY2U6IHRydWUsXG4gICAgICB9O1xuICAgICAgb3Jnc1twZWVyLm1zcElkXSA9IG9yZ3NbcGVlci5tc3BJZF0gfHwge1xuICAgICAgICBtc3BpZDogcGVlci5tc3BJZCxcbiAgICAgICAgcGVlcnM6IFtdLFxuICAgICAgfTtcbiAgICAgIG9yZ3NbcGVlci5tc3BJZF0ucGVlcnMucHVzaChwZWVyLm5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBcImxlZ2FjeS1tYW51YWxcIixcbiAgICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAgICAgIGNsaWVudDoge1xuICAgICAgICBvcmdhbml6YXRpb246IHRoaXMuY29uZmlnLm1zcElkLFxuICAgICAgfSxcbiAgICAgIG9yZ2FuaXphdGlvbnM6IG9yZ3MsXG4gICAgICBwZWVyczogcGVlckVudHJpZXMsXG4gICAgICBvcmRlcmVyczoge30sXG4gICAgICBjaGFubmVsczoge1xuICAgICAgICBbdGhpcy5jb25maWcuY2hhbm5lbF06IHtcbiAgICAgICAgICBwZWVyczogY2hhbm5lbFBlZXJzLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRUcmVhdFBlZXJzQXNMb2NhbGhvc3QocGVlcnM6IExlZ2FjeVBlZXJXaXRoTmFtZVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBlZXJzLmV2ZXJ5KChwZWVyKSA9PiB0aGlzLmlzTG9jYWxFbmRwb2ludChwZWVyLnBlZXJFbmRwb2ludCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0xvY2FsRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLmV4dHJhY3RIb3N0KGVuZHBvaW50KS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBob3N0ID09PSBcImxvY2FsaG9zdFwiIHx8IGhvc3QgPT09IFwiMTI3LjAuMC4xXCI7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RIb3N0KGVuZHBvaW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNhbml0aXplZCA9IGVuZHBvaW50LnJlcGxhY2UoL15ncnBjcz86XFwvXFwvLywgXCJcIik7XG4gICAgcmV0dXJuIHNhbml0aXplZC5zcGxpdChcIjpcIilbMF07XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUdycGNVcmwoZW5kcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKC9eZ3JwY3M/OlxcL1xcLy9pLnRlc3QoZW5kcG9pbnQpKSByZXR1cm4gZW5kcG9pbnQ7XG4gICAgcmV0dXJuIGBncnBjczovLyR7ZW5kcG9pbnR9YDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZFBlbUlucHV0KHNvdXJjZT86IHN0cmluZyB8IEJ1ZmZlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFzb3VyY2UpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTWlzc2luZyBjZXJ0aWZpY2F0ZSBvciBrZXkgbWF0ZXJpYWxcIik7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzb3VyY2UpKSByZXR1cm4gc291cmNlLnRvU3RyaW5nKFwidXRmOFwiKTtcbiAgICBjb25zdCB0cmltbWVkID0gc291cmNlLnRyaW0oKTtcbiAgICBpZiAoLy0tLS0tQkVHSU4gW0EtWiBdKy0tLS0tLy50ZXN0KHRyaW1tZWQpKSByZXR1cm4gdHJpbW1lZDtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQoc291cmNlKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIGlmIChzdGF0cz8uaXNEaXJlY3RvcnkoKSkge1xuICAgICAgcmV0dXJuIGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KHNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiAoYXdhaXQgcmVhZEZzRmlsZShzb3VyY2UpKS50b1N0cmluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYW4gZXJyb3IgaW50byBhIEJhc2VFcnJvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhbnkgZXJyb3IgaW50byBhIHN0YW5kYXJkaXplZCBCYXNlRXJyb3JcbiAgICogQHBhcmFtIHtFcnJvciB8IHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIHBhcnNlZCBlcnJvclxuICAgKi9cbiAgb3ZlcnJpZGUgcGFyc2VFcnJvcjxFIGV4dGVuZHMgQmFzZUVycm9yPihlcnI6IEVycm9yIHwgc3RyaW5nKTogRSB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIucGFyc2VFcnJvcjxFPihlcnIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIGEgdHJhbnNhY3Rpb24gdGhhdCBtb2RpZmllcyB0aGUgbGVkZ2VyIHN0YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcGkgLSBUaGUgY2hhaW5jb2RlIGZ1bmN0aW9uIHRvIGNhbGxcbiAgICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdIC0gQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNoYWluY29kZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFt0cmFuc2llbnREYXRhXSAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbZW5kb3JzaW5nT3JnYW5pemF0aW9uc10gLSBPcmdhbml6YXRpb25zIHRoYXQgbXVzdCBlbmRvcnNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFVpbnQ4QXJyYXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdHJhbnNhY3Rpb24gcmVzdWx0XG4gICAqL1xuICBhc3luYyBzdWJtaXRUcmFuc2FjdGlvbihcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGFwaTogc3RyaW5nLFxuICAgIGFyZ3M/OiBhbnlbXSxcbiAgICB0cmFuc2llbnREYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zPzogQXJyYXk8c3RyaW5nPixcbiAgICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgaWYgKHRoaXMuc2hvdWxkVXNlTGVnYWN5R2F0ZXdheShjdHgpKSB7XG4gICAgICBjb25zdCBsZWdhY3lBcmdzID0gdGhpcy5wcmVwYXJlTGVnYWN5QXJncyhhcmdzKTtcbiAgICAgIGNvbnN0IHRyYW5zaWVudE1hcCA9IHRoaXMuYnVpbGRMZWdhY3lUcmFuc2llbnQodHJhbnNpZW50RGF0YSk7XG4gICAgICBjb25zdCBwZWVyQ29uZmlncyA9IHRoaXMuYnVpbGRMZWdhY3lQZWVyQ29uZmlncyhjdHgpO1xuICAgICAgcmV0dXJuIHRoaXMuc3VibWl0TGVnYWN5V2l0aEV4cGxpY2l0RW5kb3JzZXJzKFxuICAgICAgICBjdHgsXG4gICAgICAgIGFwaSxcbiAgICAgICAgbGVnYWN5QXJncyxcbiAgICAgICAgdHJhbnNpZW50TWFwLFxuICAgICAgICBwZWVyQ29uZmlncyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIGFwaSxcbiAgICAgIHRydWUsXG4gICAgICBhcmdzLFxuICAgICAgdHJhbnNpZW50RGF0YSxcbiAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnMsXG4gICAgICBjbGFzc05hbWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiBvbiB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMgYSB0cmFuc2FjdGlvbiB0aGF0IGRvZXMgbm90IG1vZGlmeSB0aGUgbGVkZ2VyIHN0YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcGkgLSBUaGUgY2hhaW5jb2RlIGZ1bmN0aW9uIHRvIGNhbGxcbiAgICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdIC0gQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNoYWluY29kZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFt0cmFuc2llbnREYXRhXSAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbZW5kb3JzaW5nT3JnYW5pemF0aW9uc10gLSBPcmdhbml6YXRpb25zIHRoYXQgbXVzdCBlbmRvcnNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFVpbnQ4QXJyYXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdHJhbnNhY3Rpb24gcmVzdWx0XG4gICAqL1xuICBhc3luYyBldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgYXBpOiBzdHJpbmcsXG4gICAgYXJncz86IGFueVtdLFxuICAgIHRyYW5zaWVudERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnM/OiBBcnJheTxzdHJpbmc+LFxuICAgIGNsYXNzTmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIGFwaSxcbiAgICAgIGZhbHNlLFxuICAgICAgYXJncyxcbiAgICAgIHRyYW5zaWVudERhdGEsXG4gICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zLFxuICAgICAgY2xhc3NOYW1lXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2h1dHMgZG93biB0aGUgY29ubmVjdGlvbiB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ2xvc2VzIHRoZSBhY3RpdmUgZGlzcGF0Y2ggKHdoaWNoIGluIHR1cm4gY2xvc2VzIGFueSBnYXRld2F5XG4gICAqIGV2ZW50IHN1YnNjcmlwdGlvbikgdmlhIHRoZSBiYXNlIGNsYXNzLCB0aGVuIGNsb3NlcyB0aGUgZ1JQQyBjbGllbnQuXG4gICAqIFdvcmtzIGNvcnJlY3RseSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYHN5bnRoZXRpY0V2ZW50c2AgaXMgZW5hYmxlZC5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHNodXRkb3duKC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBCYXNlIGNsYXNzIGhhbmRsZXMgZGlzcGF0Y2guY2xvc2UoKSBpbnRlcm5hbGx5LlxuICAgIGF3YWl0IHN1cGVyLnNodXRkb3duKC4uLmFyZ3MpO1xuICAgIGlmICh0aGlzLmNsaWVudCkge1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShgQ2xvc2luZyAke3RoaXMuY29uZmlnLm1zcElkfSBnYXRld2F5IGNsaWVudGApO1xuICAgICAgdGhpcy5jbGllbnQuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBDb250cmFjdCBpbnN0YW5jZSBmcm9tIGEgR2F0ZXdheVxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBjaGFpbmNvZGUgY29udHJhY3QgZnJvbSB0aGUgc3BlY2lmaWVkIG5ldHdvcmtcbiAgICogQHBhcmFtIHtHYXRld2F5fSBnYXRld2F5IC0gVGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm4ge0NvbnRyYWt0fSBUaGUgQ29udHJhY3QgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBnZXRDb250cmFjdChcbiAgICBnYXRld2F5OiBHYXRld2F5LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICBjb250cmFjdE5hbWU/OiBzdHJpbmdcbiAgKTogQ29udHJha3Qge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldENvbnRyYWN0KTtcbiAgICBjb25zdCBuZXR3b3JrID0gdGhpcy5nZXROZXR3b3JrKGdhdGV3YXksIGNvbmZpZy5jaGFubmVsKTtcbiAgICBsZXQgY29udHJhY3Q6IENvbnRyYWt0O1xuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBSZXRyaWV2aW5nIGNoYWluY29kZSAke2NvbmZpZy5jaGFpbmNvZGVOYW1lfSBjb250cmFjdCAke2NvbnRyYWN0TmFtZSB8fCBjb25maWcuY29udHJhY3ROYW1lfSBmcm9tIG5ldHdvcmsgJHtjb25maWcuY2hhbm5lbH1gXG4gICAgICApO1xuICAgICAgY29udHJhY3ROYW1lID0gY29udHJhY3ROYW1lID8gY29udHJhY3ROYW1lIDogY29uZmlnLmNvbnRyYWN0TmFtZTtcbiAgICAgIGNvbnRyYWN0ID0gbmV0d29yay5nZXRDb250cmFjdChjb25maWcuY2hhaW5jb2RlTmFtZSwgY29udHJhY3ROYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyYWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgTmV0d29yayBpbnN0YW5jZSBmcm9tIGEgR2F0ZXdheVxuICAgKiBAc3VtbWFyeSBDb25uZWN0cyB0byBhIHNwZWNpZmljIGNoYW5uZWwgb24gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBwYXJhbSB7R2F0ZXdheX0gZ2F0ZXdheSAtIFRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjaGFubmVsIHRvIGNvbm5lY3QgdG9cbiAgICogQHJldHVybiB7TmV0d29ya30gVGhlIE5ldHdvcmsgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBnZXROZXR3b3JrKGdhdGV3YXk6IEdhdGV3YXksIGNoYW5uZWxOYW1lOiBzdHJpbmcpOiBOZXR3b3JrIHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0aGlzLmdldE5ldHdvcmspO1xuICAgIGxldCBuZXR3b3JrOiBOZXR3b3JrO1xuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoYENvbm5lY3RpbmcgdG8gY2hhbm5lbCAke2NoYW5uZWxOYW1lfWApO1xuICAgICAgbmV0d29yayA9IGdhdGV3YXkuZ2V0TmV0d29yayhjaGFubmVsTmFtZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldHdvcms7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBHYXRld2F5IGluc3RhbmNlIGZvciBjb25uZWN0aW5nIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgR2F0ZXdheSB1c2luZyB0aGUgcHJvdmlkZWQgY29uZmlndXJhdGlvbiBhbmQgY2xpZW50XG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0ge0NsaWVudH0gW2NsaWVudF0gLSBPcHRpb25hbCBnUlBDIGNsaWVudCwgd2lsbCBiZSBjcmVhdGVkIGlmIG5vdCBwcm92aWRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEdhdGV3YXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldEdhdGV3YXkoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgY2xpZW50PzogQ2xpZW50XG4gICkge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5nZXRDb25uZWN0aW9uKFxuICAgICAgY2xpZW50IHx8IChhd2FpdCB0aGlzLmdldENsaWVudChjb25maWcpKSxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGN0eFxuICAgICkpIGFzIEdhdGV3YXk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBnUlBDIGNsaWVudCBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgY2xpZW50IHdpdGggVExTIGNyZWRlbnRpYWxzIGZvciBzZWN1cmUgY29tbXVuaWNhdGlvblxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybiB7Q2xpZW50fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZ1JQQyBjbGllbnRcbiAgICovXG4gIHN0YXRpYyBnZXRDbGllbnQoY29uZmlnOiBQZWVyQ29uZmlnKTogQ2xpZW50IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRDbGllbnQpO1xuICAgIGxvZy5kZWJ1ZyhgZ2VuZXJhdGluZyBUTFMgY3JlZGVudGlhbHMgZm9yIG1zcCAke2NvbmZpZy5tc3BJZH1gKTtcbiAgICBsZXQgcGF0aE9yQ2VydDogc3RyaW5nIHwgQnVmZmVyID0gY29uZmlnLnRsc0NlcnQgYXMgc3RyaW5nIHwgQnVmZmVyO1xuXG4gICAgaWYgKHR5cGVvZiBwYXRoT3JDZXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHBhdGhPckNlcnQubWF0Y2goXG4gICAgICAgICAgLy0tLS0tQkVHSU4gKENFUlRJRklDQVRFfEtFWXxQUklWQVRFIEtFWSktLS0tLS4rPy0tLS0tRU5EIFxcMS0tLS0tJC9nbXNcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHBhdGhPckNlcnQgPSBCdWZmZXIuZnJvbShwYXRoT3JDZXJ0LCBcInV0ZjhcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhdGhPckNlcnQgPSBCdWZmZXIuZnJvbShmcy5yZWFkRmlsZVN5bmMocGF0aE9yQ2VydCwgXCJ1dGY4XCIpKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byByZWFkIHRoZSB0bHMgY2VydGlmaWNhdGUgZnJvbSAke3BhdGhPckNlcnR9OiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0bHNDcmVkZW50aWFscyA9IGdycGMuY3JlZGVudGlhbHMuY3JlYXRlU3NsKHBhdGhPckNlcnQpO1xuICAgIGxvZy5kZWJ1ZyhgZ2VuZXJhdGluZyBHYXRld2F5IENsaWVudCBmb3IgdXJsICR7Y29uZmlnLnBlZXJFbmRwb2ludH1gKTtcbiAgICByZXR1cm4gbmV3IENsaWVudChjb25maWcucGVlckVuZHBvaW50LCB0bHNDcmVkZW50aWFscywge1xuICAgICAgXCJncnBjLm1heF9yZWNlaXZlX21lc3NhZ2VfbGVuZ3RoXCI6IChjb25maWcuc2l6ZUxpbWl0IHx8IDE1KSAqIDEwMjQgKiAxMDI0LFxuICAgICAgXCJncnBjLm1heF9zZW5kX21lc3NhZ2VfbGVuZ3RoXCI6IChjb25maWcuc2l6ZUxpbWl0IHx8IDE1KSAqIDEwMjQgKiAxMDI0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFc3RhYmxpc2hlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBHYXRld2F5IGNvbm5lY3Rpb24gd2l0aCBpZGVudGl0eSBhbmQgc2lnbmVyXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgLSBUaGUgZ1JQQyBjbGllbnRcbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8R2F0ZXdheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjb25uZWN0ZWQgR2F0ZXdheVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgSWRlbnRpdHlcbiAgICogICBwYXJ0aWNpcGFudCBTaWduZXJcbiAgICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gICAqXG4gICAqICAgQ2FsbGVyLT4+RmFicmljQWRhcHRlcjogZ2V0Q29ubmVjdGlvbihjbGllbnQsIGNvbmZpZylcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+SWRlbnRpdHk6IGdldElkZW50aXR5KG1zcElkLCBjZXJ0RGlyZWN0b3J5UGF0aClcbiAgICogICBJZGVudGl0eS0tPj5GYWJyaWNBZGFwdGVyOiBpZGVudGl0eVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5TaWduZXI6IGdldFNpZ25lcihrZXlEaXJlY3RvcnlQYXRoKVxuICAgKiAgIFNpZ25lci0tPj5GYWJyaWNBZGFwdGVyOiBzaWduZXJcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogQ3JlYXRlIENvbm5lY3RPcHRpb25zXG4gICAqICAgRmFicmljQWRhcHRlci0+PkdhdGV3YXk6IGNvbm5lY3Qob3B0aW9ucylcbiAgICogICBHYXRld2F5LS0+PkZhYnJpY0FkYXB0ZXI6IGdhdGV3YXlcbiAgICogICBGYWJyaWNBZGFwdGVyLS0+PkNhbGxlcjogZ2F0ZXdheVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldENvbm5lY3Rpb24oXG4gICAgY2xpZW50OiBDbGllbnQsXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKSB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5nZXRDb25uZWN0aW9uKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgUmV0cmlldmluZyBQZWVyIElkZW50aXR5IGZvciAke2NvbmZpZy5tc3BJZH0gdW5kZXIgJHtjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGh9YFxuICAgICk7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBnZXRJZGVudGl0eShcbiAgICAgIGNvbmZpZy5tc3BJZCxcbiAgICAgIGNvbmZpZy5jZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aCBhcyBhbnlcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBwcmVwYXJpbmcgdHJhbnNhY3Rpb24gc2lnbmVyIGZvciAke0NyeXB0b1V0aWxzLmZhYnJpY0lkRnJvbUNlcnRpZmljYXRlKGlkZW50aXR5LmNyZWRlbnRpYWxzLnRvU3RyaW5nKCkpfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gZXh0cmFjdCBGYWJyaWMgSUQgZnJvbSBjZXJ0aWZpY2F0ZWAsIGUgYXMgRXJyb3IpO1xuICAgIH1cblxuICAgIGxldCBzaWduZXI6IFNpZ25lcjtcbiAgICBjb25zdCBjbG9zZSA9ICgpID0+IHt9O1xuICAgIGlmICghY29uZmlnLmhzbSkge1xuICAgICAgc2lnbmVyID0gYXdhaXQgZ2V0U2lnbmVyKGNvbmZpZy5rZXlDZXJ0T3JEaXJlY3RvcnlQYXRoIGFzIGFueSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnN0IGhzbSA9IG5ldyBIU01TaWduZXJGYWN0b3J5Q3VzdG9tKGNvbmZpZy5oc20ubGlicmFyeSk7XG4gICAgICAvLyBjb25zdCBpZGVudGlmaWVyID0gaHNtLmdldFNLSUZyb21DZXJ0aWZpY2F0ZVBhdGgoXG4gICAgICAvLyAgIGNvbmZpZy5jZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aCBhcyBhbnlcbiAgICAgIC8vICk7XG4gICAgICAvLyBjb25zdCBwa2NzMTFTaWduZXIgPSBoc20ubmV3U2lnbmVyKHtcbiAgICAgIC8vICAgbGFiZWw6IGNvbmZpZy5oc20udG9rZW5MYWJlbCBhcyBzdHJpbmcsXG4gICAgICAvLyAgIHBpbjogU3RyaW5nKGNvbmZpZy5oc20ucGluKSBhcyBzdHJpbmcsXG4gICAgICAvLyAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICAvLyAgIC8vIHVzZXJUeXBlOiAxIC8qQ0tVX1VTRVIgKi8sXG4gICAgICAvLyB9KTtcbiAgICAgIC8vIHNpZ25lciA9IHBrY3MxMVNpZ25lci5zaWduZXI7XG4gICAgICAvLyBjbG9zZSA9IHBrY3MxMVNpZ25lci5jbG9zZTtcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFwiSFNNIE5PVCBJTVBMRU1FTlRFRFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgY2xpZW50LFxuICAgICAgaWRlbnRpdHk6IGlkZW50aXR5LFxuICAgICAgc2lnbmVyOiBzaWduZXIsXG4gICAgICAvLyBEZWZhdWx0IHRpbWVvdXRzIGZvciBkaWZmZXJlbnQgZ1JQQyBjYWxsc1xuICAgICAgZXZhbHVhdGVPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJldmFsdWF0ZVRpbWVvdXRcIikgfTsgLy8gZGVmYXVsdHMgdG8gNSBzZWNvbmRzXG4gICAgICB9LFxuICAgICAgZW5kb3JzZU9wdGlvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZGVhZGxpbmU6IERhdGUubm93KCkgKyAxMDAwICogY3R4LmdldChcImVuZG9yc2VUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDE1IHNlY29uZHNcbiAgICAgIH0sXG4gICAgICBzdWJtaXRPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJzdWJtaXRUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDUgc2Vjb25kc1xuICAgICAgfSxcbiAgICAgIGNvbW1pdFN0YXR1c09wdGlvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZGVhZGxpbmU6IERhdGUubm93KCkgKyAxMDAwICogY3R4LmdldChcImNvbW1pdFRpbWVvdXRcIikgfTsgLy8gZGVmYXVsdHMgdG8gMSBtaW51dGVcbiAgICAgIH0sXG4gICAgfSBhcyBDb25uZWN0T3B0aW9ucztcblxuICAgIGxvZy5kZWJ1ZyhgQ29ubmVjdGluZyB0byAke2NvbmZpZy5tc3BJZH1gKTtcbiAgICBjb25zdCBnYXRld2F5ID0gY29ubmVjdChvcHRpb25zKTtcblxuICAgIC8vIFRPRE86IHJlcGxhY2U/XG4gICAgaWYgKGNvbmZpZy5oc20pIHtcbiAgICAgIGdhdGV3YXkuY2xvc2UgPSBuZXcgUHJveHkoZ2F0ZXdheS5jbG9zZSwge1xuICAgICAgICBhcHBseSh0YXJnZXQ6ICgpID0+IHZvaWQsIHRoaXNBcmc6IGFueSwgYXJnQXJyYXk6IGFueVtdKTogYW55IHtcbiAgICAgICAgICBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJnQXJyYXkpO1xuICAgICAgICAgIGNsb3NlKCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2F0ZXdheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBEaXNwYXRjaCBpbnN0YW5jZSBmb3IgdGhlIEZhYnJpYyBjbGllbnQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGEgbmV3IEZhYnJpY0NsaWVudERpc3BhdGNoIGluc3RhbmNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgRmFicmljIG5ldHdvcmsuXG4gICAqIEByZXR1cm5zIHtEaXNwYXRjaH0gQSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2UgY29uZmlndXJlZCBmb3IgdGhlIEZhYnJpYyBjbGllbnQuXG4gICAqIEByZW1hcmtzIFRoZSBEaXNwYXRjaCBpbnN0YW5jZSBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSBsb2dpYyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgRmFicmljIG5ldHdvcmssIHN1Y2ggYXMgc3VibWl0dGluZyB0cmFuc2FjdGlvbnMgb3IgcXVlcnlpbmcgZGF0YS5cbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgZmFicmljRGlzcGF0Y2ggPSBmYWJyaWNDbGllbnRBZGFwdGVyLkRpc3BhdGNoKCk7XG4gICAqIGZhYnJpY0Rpc3BhdGNoLnN1Ym1pdFRyYW5zYWN0aW9uKCdjcmVhdGVQcm9kdWN0JywgeyBuYW1lOiAnUHJvZHVjdCBBJywgcHJpY2U6IDEwMCB9KTtcbiAgICovXG4gIG92ZXJyaWRlIERpc3BhdGNoKCk6IEZhYnJpY0NsaWVudERpc3BhdGNoIHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY0NsaWVudEFkYXB0ZXJbXCJfYmFzZURpc3BhdGNoXCJdKHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuIGVycm9yIGludG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYW55IGVycm9yIGludG8gYSBzdGFuZGFyZGl6ZWQgQmFzZUVycm9yIHVzaW5nIHRoZSBwYXJlbnQgY2xhc3MgaW1wbGVtZW50YXRpb25cbiAgICogQHBhcmFtIHtFcnJvciB8IHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIHBhcnNlZCBlcnJvclxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBwYXJzZUVycm9yPEUgZXh0ZW5kcyBCYXNlRXJyb3I+KFxuICAgIGVycjogRXJyb3IgfCBzdHJpbmcgfCBHYXRld2F5RXJyb3JcbiAgKTogRSB7XG4gICAgLy8gaWYgKFxuICAgIC8vICAgTUlTU0lOR19QUklWQVRFX0RBVEFfUkVHRVgudGVzdChcbiAgICAvLyAgICAgdHlwZW9mIGVyciA9PT0gXCJzdHJpbmdcIiA/IGVyciA6IGVyci5tZXNzYWdlXG4gICAgLy8gICApXG4gICAgLy8gKVxuICAgIC8vICAgcmV0dXJuIG5ldyBVbmF1dGhvcml6ZWRQcml2YXRlRGF0YUFjY2VzcyhlcnIpIGFzIEU7XG5cbiAgICBsZXQgbXNnID0gdHlwZW9mIGVyciA9PT0gXCJzdHJpbmdcIiA/IGVyciA6IGVyci5tZXNzYWdlO1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBHYXRld2F5RXJyb3IgJiYgZXJyLmRldGFpbHMubGVuZ3RoICYmIGVyci5jb2RlID09PSAxMCkge1xuICAgICAgbXNnID0gYCR7ZXJyLmRldGFpbHNbMF0ubWVzc2FnZX1gO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGVyciBpbnN0YW5jZW9mIEVuZG9yc2VFcnJvciAmJlxuICAgICAgZXJyLmRldGFpbHMubGVuZ3RoICYmXG4gICAgICBlcnIuY29kZSA9PT0gMTAgJiZcbiAgICAgIGVyci5kZXRhaWxzWzBdLm1lc3NhZ2U/LmluY2x1ZGVzKFVuc3VwcG9ydGVkRXJyb3IubmFtZSlcbiAgICApIHtcbiAgICAgIG1zZyA9IGAke2Vyci5kZXRhaWxzWzBdLm1lc3NhZ2V9YDtcbiAgICB9XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFwiTVZDQ19SRUFEX0NPTkZMSUNUXCIpKVxuICAgICAgcmV0dXJuIG5ldyBNdmNjUmVhZENvbmZsaWN0RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIkRFQURMSU5FX0VYQ0VFREVEXCIpKVxuICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvblRpbWVvdXRFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFwiRU5ET1JTRU1FTlRfUE9MSUNZX0ZBSUxVUkVcIikpXG4gICAgICByZXR1cm4gbmV3IEVuZG9yc2VtZW50UG9saWN5RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIlBIQU5UT01fUkVBRF9DT05GTElDVFwiKSlcbiAgICAgIHJldHVybiBuZXcgUGhhbnRvbVJlYWRDb25mbGljdEVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiAoZXJyIGFzIGFueSkuY29kZSkge1xuICAgICAgc3dpdGNoICgoZXJyIGFzIGFueSkuY29kZSkge1xuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgcmV0dXJuIG5ldyBFbmRvcnNlbWVudEVycm9yKGVycikgYXMgRTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFZhbGlkYXRpb25FcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgVmFsaWRhdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE5vdEZvdW5kRXJyb3IubmFtZSkpIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhDb25mbGljdEVycm9yLm5hbWUpKSByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQmFkUmVxdWVzdEVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBCYWRSZXF1ZXN0RXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoUXVlcnlFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBRdWVyeUVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFBhZ2luZ0Vycm9yLm5hbWUpKSByZXR1cm4gbmV3IFBhZ2luZ0Vycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFVuc3VwcG9ydGVkRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFVuc3VwcG9ydGVkRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoTWlncmF0aW9uRXJyb3IubmFtZSkpIHJldHVybiBuZXcgTWlncmF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoT2JzZXJ2ZXJFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBPYnNlcnZlckVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEF1dGhvcml6YXRpb25FcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEZvcmJpZGRlbkVycm9yLm5hbWUpKSByZXR1cm4gbmV3IEZvcmJpZGRlbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKENvbm5lY3Rpb25FcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFNlcmlhbGl6YXRpb25FcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKSBhcyBFO1xuICB9XG59XG5cbkZhYnJpY0NsaWVudEFkYXB0ZXIuZGVjb3JhdGlvbigpO1xuQWRhcHRlci5zZXRDdXJyZW50KEZhYnJpY0ZsYXZvdXIpO1xuIiwiaW1wb3J0IHtcbiAgQWRhcHRlcixcbiAgQ29udGV4dHVhbEFyZ3MsXG4gIERpc3BhdGNoLFxuICBFdmVudElkcyxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbiAgQ29udGV4dCxcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBQZXJzaXN0ZW5jZUtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUGVlckNvbmZpZyB9IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7IENsaWVudCB9IGZyb20gXCJAZ3JwYy9ncnBjLWpzXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENoYWluY29kZUV2ZW50LFxuICBDbG9zZWFibGVBc3luY0l0ZXJhYmxlLFxufSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBwYXJzZUV2ZW50TmFtZSB9IGZyb20gXCIuLi9zaGFyZWQvZXZlbnRzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV2ZW50IGRpc3BhdGNoZXIgZm9yIEh5cGVybGVkZ2VyIEZhYnJpYyBjaGFpbmNvZGUgZXZlbnRzXG4gKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBhbmQgcHJvY2Vzc2VzIGV2ZW50cyBlbWl0dGVkIGJ5IEZhYnJpYyBjaGFpbmNvZGUsIGRpc3BhdGNoaW5nIHRoZW0gdG8gcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAqIEB0ZW1wbGF0ZSBQZWVyQ29uZmlnIC0gQ29uZmlndXJhdGlvbiB0eXBlIGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAqIEBwYXJhbSBjbGllbnQgLSBnUlBDIGNsaWVudCBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAqIEBjbGFzcyBGYWJyaWNDbGllbnREaXNwYXRjaFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBGYWJyaWNEaXNwYXRjaCBpbnN0YW5jZVxuICogY29uc3QgY2xpZW50ID0gYXdhaXQgRmFicmljQWRhcHRlci5nZXRDbGllbnQocGVlckNvbmZpZyk7XG4gKiBjb25zdCBkaXNwYXRjaCA9IG5ldyBGYWJyaWNEaXNwYXRjaChjbGllbnQpO1xuICpcbiAqIC8vIENvbmZpZ3VyZSB0aGUgZGlzcGF0Y2ggd2l0aCBwZWVyIGNvbmZpZ3VyYXRpb25cbiAqIGRpc3BhdGNoLmNvbmZpZ3VyZShwZWVyQ29uZmlnKTtcbiAqXG4gKiAvLyBSZWdpc3RlciBhbiBvYnNlcnZlciBmb3IgYSBzcGVjaWZpYyB0YWJsZSBhbmQgZXZlbnRcbiAqIGRpc3BhdGNoLm9ic2VydmUoJ3VzZXJzJywgJ2NyZWF0ZScsIChpZCkgPT4ge1xuICogICBjb25zb2xlLmxvZyhgVXNlciBjcmVhdGVkOiAke2lkfWApO1xuICogfSk7XG4gKlxuICogLy8gU3RhcnQgbGlzdGVuaW5nIGZvciBldmVudHNcbiAqIGF3YWl0IGRpc3BhdGNoLnN0YXJ0KCk7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEZhYnJpY0Rpc3BhdGNoXG4gKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAqICAgcGFydGljaXBhbnQgTmV0d29ya1xuICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAqXG4gKiAgIENsaWVudC0+PkZhYnJpY0Rpc3BhdGNoOiBuZXcgRmFicmljRGlzcGF0Y2goY2xpZW50KVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogY29uZmlndXJlKHBlZXJDb25maWcpXG4gKiAgIENsaWVudC0+PkZhYnJpY0Rpc3BhdGNoOiBvYnNlcnZlKHRhYmxlLCBldmVudCwgY2FsbGJhY2spXG4gKiAgIENsaWVudC0+PkZhYnJpY0Rpc3BhdGNoOiBzdGFydCgpXG4gKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IGluaXRpYWxpemUoKVxuICogICBGYWJyaWNEaXNwYXRjaC0+PkdhdGV3YXk6IGdldEdhdGV3YXkoY29uZmlnLCBjbGllbnQpXG4gKiAgIEdhdGV3YXktPj5OZXR3b3JrOiBnZXROZXR3b3JrKGNoYW5uZWwpXG4gKiAgIE5ldHdvcmstPj5OZXR3b3JrOiBnZXRDaGFpbmNvZGVFdmVudHMoY2hhaW5jb2RlTmFtZSlcbiAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogaGFuZGxlRXZlbnRzKClcbiAqICAgbG9vcCBGb3IgZWFjaCBldmVudFxuICogICAgIENoYWluY29kZS0tPj5GYWJyaWNEaXNwYXRjaDogQ2hhaW5jb2RlRXZlbnRcbiAqICAgICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBwYXJzZUV2ZW50TmFtZShldmVudE5hbWUpXG4gKiAgICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogcGFyc2VQYXlsb2FkKHBheWxvYWQpXG4gKiAgICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQpXG4gKiAgICAgRmFicmljRGlzcGF0Y2gtLT4+Q2xpZW50OiBjYWxsYmFjayhpZClcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnREaXNwYXRjaCBleHRlbmRzIERpc3BhdGNoPEZhYnJpY0NsaWVudEFkYXB0ZXI+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBsaXN0ZW5pbmcgc3RhY2sgZm9yIGNoYWluY29kZSBldmVudHNcbiAgICovXG4gIHByaXZhdGUgbGlzdGVuaW5nU3RhY2s/OiBDbG9zZWFibGVBc3luY0l0ZXJhYmxlPENoYWluY29kZUV2ZW50PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRleHQgZGVjb2RlciBmb3IgY29udmVydGluZyBldmVudCBwYXlsb2FkcyBmcm9tIGJ5dGVzIHRvIHN0cmluZ3NcbiAgICovXG4gIHByaXZhdGUgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IEZhYnJpY0Rpc3BhdGNoIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgZGlzcGF0Y2hlciBmb3IgRmFicmljIGNoYWluY29kZSBldmVudHNcbiAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCAtIGdSUEMgY2xpZW50IGZvciBjb25uZWN0aW5nIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNsaWVudDogQ2xpZW50KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2xvc2VzIHRoZSBldmVudCBsaXN0ZW5pbmcgY29ubmVjdGlvblxuICAgKiBAc3VtbWFyeSBTdG9wcyBsaXN0ZW5pbmcgZm9yIGNoYWluY29kZSBldmVudHMgYW5kIHJlbGVhc2VzIHJlc291cmNlc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNsb3NlKFxuICAgIC4uLmN0eEFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJnczogbG9nZ2VkQXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoY3R4QXJncywgUGVyc2lzdGVuY2VLZXlzLlNIVVRET1dOLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuY2xvc2UpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzdXBlci5jbG9zZSguLi5sb2dnZWRBcmdzKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBjbG9zZSBGYWJyaWMgcHJveGllcyBldmVudCBsaXN0ZW5lcmAsIGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICBpZiAodGhpcy5saXN0ZW5pbmdTdGFjaykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5saXN0ZW5pbmdTdGFjay5jbG9zZSgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBjbG9zZSBGYWJyaWMgZXZlbnQgbGlzdGVuZXJgLCBlIGFzIEVycm9yKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMubGlzdGVuaW5nU3RhY2sgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgZXZlbnQgcGF5bG9hZCBmcm9tIGJpbmFyeSBmb3JtYXRcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBVaW50OEFycmF5IGNvbnRhaW5pbmcgSlNPTiB0byBhbiBvYmplY3Qgd2l0aCBhbiBpZCBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGpzb25CeXRlcyAtIFRoZSBiaW5hcnkgcGF5bG9hZCBmcm9tIHRoZSBjaGFpbmNvZGUgZXZlbnRcbiAgICogQHJldHVybiB7eyBpZDogc3RyaW5nIH19IFRoZSBwYXJzZWQgcGF5bG9hZCBjb250YWluaW5nIHRoZSByZWNvcmQgSURcbiAgICovXG4gIHByaXZhdGUgcGFyc2VQYXlsb2FkKGpzb25CeXRlczogVWludDhBcnJheSk6IHsgaWQ6IHN0cmluZzsgcmVzdWx0PzogYW55IH0ge1xuICAgIGNvbnN0IGpzb24gPSB0aGlzLmRlY29kZXIuZGVjb2RlKGpzb25CeXRlcyk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoanNvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXJ0cyBvYnNlcnZpbmcgYW4gYWRhcHRlclxuICAgKiBAc3VtbWFyeSBDb25uZWN0cyB0aGlzIGRpc3BhdGNoIHRvIGFuIGFkYXB0ZXIgdG8gbW9uaXRvciBpdHMgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0ge0FkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pn0gb2JzZXJ2ZXIgLSBUaGUgYWRhcHRlciB0byBvYnNlcnZlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBvdmVycmlkZSBvYnNlcnZlKG9ic2VydmVyOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4pOiAoKSA9PiB2b2lkIHtcbiAgICBpZiAoIShvYnNlcnZlciBpbnN0YW5jZW9mIEZhYnJpY0NsaWVudEFkYXB0ZXIpKVxuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgIFwiT25seSBGYWJyaWNDbGllbnRBZGFwdGVyIGNhbiBiZSBvYnNlcnZlZCBieSBkaXNwYXRjaFwiXG4gICAgICApO1xuICAgIHN1cGVyLm9ic2VydmUob2JzZXJ2ZXIgYXMgRmFicmljQ2xpZW50QWRhcHRlcik7XG4gICAgcmV0dXJuICgpID0+IHRoaXMudW5PYnNlcnZlKG9ic2VydmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBvYnNlcnZlcnMgYWJvdXQgYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYSBjaGFuZ2UgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgY2hhbmdlIG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7YW55fSBwYXlsb2FkIC0gVGhlIGV2ZW50IHBheWxvYWRcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKFxuICAgIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+IHwgc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IEFkYXB0ZXIubG9nQ3R4PENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PihcbiAgICAgIHRoaXMudXBkYXRlT2JzZXJ2ZXJzLFxuICAgICAgZXZlbnQsXG4gICAgICBmYWxzZSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYE5vIGFkYXB0ZXIgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoOyBza2lwcGluZyBvYnNlcnZlciB1cGRhdGUgZm9yICR7dHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiID8gbW9kZWwgOiBNb2RlbC50YWJsZU5hbWUobW9kZWwpfToke2V2ZW50fWBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIucmVmcmVzaChtb2RlbCwgZXZlbnQsIGlkLCAuLi5jdHhBcmdzKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggZGlzcGF0Y2g6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBpbmNvbWluZyBjaGFpbmNvZGUgZXZlbnRzXG4gICAqIEBzdW1tYXJ5IExpc3RlbnMgZm9yIGV2ZW50cyBmcm9tIHRoZSBjaGFpbmNvZGUgYW5kIGRpc3BhdGNoZXMgdGhlbSB0byByZWdpc3RlcmVkIG9ic2VydmVyc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVudCBoYW5kbGluZyBzdG9wc1xuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNEaXNwYXRjaFxuICAgKiAgIHBhcnRpY2lwYW50IEV2ZW50U3RhY2tcbiAgICogICBwYXJ0aWNpcGFudCBFdmVudFBhcnNlclxuICAgKiAgIHBhcnRpY2lwYW50IE9ic2VydmVyc1xuICAgKlxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IGhhbmRsZUV2ZW50cygpXG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5FdmVudFN0YWNrOiBmb3IgYXdhaXQgKGNvbnN0IGV2dCBvZiBsaXN0ZW5pbmdTdGFjaylcbiAgICogICBFdmVudFN0YWNrLS0+PkZhYnJpY0Rpc3BhdGNoOiBDaGFpbmNvZGVFdmVudFxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RXZlbnRQYXJzZXI6IHBhcnNlRXZlbnROYW1lKGV2dC5ldmVudE5hbWUpXG4gICAqICAgRXZlbnRQYXJzZXItLT4+RmFicmljRGlzcGF0Y2g6IHsgdGFibGUsIGV2ZW50LCBvd25lciB9XG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogQ2hlY2sgaWYgZXZlbnQgaXMgZm9yIHRoaXMgTVNQXG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogcGFyc2VQYXlsb2FkKGV2dC5wYXlsb2FkKVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+T2JzZXJ2ZXJzOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIGV2ZW50LCBwYXlsb2FkLmlkKVxuICAgKiAgIE9ic2VydmVycy0tPj5GYWJyaWNEaXNwYXRjaDogQ2FsbGJhY2tzIGV4ZWN1dGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlRXZlbnRzKFxuICAgIGN0eEFyZz86IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5saXN0ZW5pbmdTdGFjaylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgRXZlbnQgc3RhY2sgbm90IGluaXRpYWxpemVkLiBFbnN1cmUgdGhhdCBcInN0YXJ0TGlzdGVuaW5nXCIgaXMgY2FsbGVkIGJlZm9yZSBhdHRlbXB0aW5nIHRoaXMgb3BlcmF0aW9uLmBcbiAgICAgICk7XG5cbiAgICBpZiAoIXRoaXMuYWRhcHRlciB8fCAhdGhpcy5hZGFwdGVyLmNvbmZpZylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIGZvdW5kLiBzaG91bGQgYmUgaW1wb3NzaWJsZWApO1xuXG4gICAgY29uc3QgY3R4ID1cbiAgICAgIGN0eEFyZyB8fFxuICAgICAgKGF3YWl0IHRoaXMuYWRhcHRlci5jb250ZXh0KFxuICAgICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICAgIHtcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiB0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgICh0aGlzLm1vZGVscyAmJiB0aGlzLm1vZGVsc1swXSkgfHwgKE1vZGVsIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3IpXG4gICAgICApKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5oYW5kbGVFdmVudHMpO1xuXG4gICAgbG9nLmluZm8oXG4gICAgICBgTGlzdGVuaW5nIGZvciBpbmNvbWluZyBldmVudHMgb24gY2hhaW5jb2RlIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWV9XCIgb24gY2hhbm5lbCBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFubmVsfVwiLi4uYFxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBldnQgb2YgdGhpcy5saXN0ZW5pbmdTdGFjaykge1xuICAgICAgICBjb25zdCB7IHRhYmxlLCBldmVudCwgb3duZXIgfSA9IHBhcnNlRXZlbnROYW1lKGV2dC5ldmVudE5hbWUpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5hZGFwdGVyLmNvbmZpZz8ubXNwRXZlbnRPbmx5ICYmXG4gICAgICAgICAgb3duZXIgJiZcbiAgICAgICAgICBvd25lciAhPT0gdGhpcy5hZGFwdGVyLmNvbmZpZz8ubXNwSWRcbiAgICAgICAgKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiB7IGlkOiBzdHJpbmc7IHJlc3VsdD86IGFueSB9ID0gdGhpcy5wYXJzZVBheWxvYWQoXG4gICAgICAgICAgZXZ0LnBheWxvYWRcbiAgICAgICAgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0YXJnZXRNb2RlbCA9IHRhYmxlXG4gICAgICAgICAgICA/IE1vZGVsLmdldCh0YWJsZSlcbiAgICAgICAgICAgIDogTW9kZWwuZ2V0KHRoaXMubW9kZWxzWzBdLm5hbWUpO1xuICAgICAgICAgIGNvbnN0IG1vZGVsUmVmID0gdGFyZ2V0TW9kZWwgPz8gKHRhYmxlIHx8IHRoaXMubW9kZWxzWzBdPy5uYW1lKTtcbiAgICAgICAgICBjb25zdCBvYnNlcnZlckFyZ3MgPSBwYXlsb2FkLnJlc3VsdCA/IFtwYXlsb2FkLnJlc3VsdCwgY3R4XSA6IFtjdHhdO1xuICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlT2JzZXJ2ZXJzKFxuICAgICAgICAgICAgbW9kZWxSZWYgYXMgQ29uc3RydWN0b3IgfCBzdHJpbmcsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIHBheWxvYWQuaWQgYXMgc3RyaW5nLFxuICAgICAgICAgICAgLi4uKG9ic2VydmVyQXJncyBhcyBDb250ZXh0dWFsQXJnczxhbnk+KVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHVwZGF0ZSBvYnNlcnZhYmxlcyBmb3IgdGFibGUgJHt0YWJsZX0gZXZlbnQgJHtldmVudH0gaWQ6ICR7cGF5bG9hZC5pZH06ICR7ZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgbG9nLmVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHJlYWQgZXZlbnQgZm9yIGNoYWluY29kZSBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lfVwiIG9uIGNoYW5uZWwgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhbm5lbH1cIjogJHtlfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLmNsb3NlKGN0eCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgZXZlbnQgbGlzdGVuZXJcbiAgICogQHN1bW1hcnkgU2V0cyB1cCBldmVudCBkaXNwYXRjaGluZyBmb3IgdGhlIG9ic2VydmVkIGFkYXB0ZXIuIFdoZW5cbiAgICogYHN5bnRoZXRpY0V2ZW50c2AgaXMgdHJ1ZSAodGhlIGRlZmF1bHQpIG5vIGdhdGV3YXkgY29ubmVjdGlvbiBpcyBvcGVuZWQ7XG4gICAqIGluc3RlYWQgZXZlcnkgQ1JVRCBvcGVyYXRpb24gaXMgd3JhcHBlZCB3aXRoIGEgUHJveHkgdGhhdCBmaXJlc1xuICAgKiBgdXBkYXRlT2JzZXJ2ZXJzYCBmb3IgKiphbGwqKiBtb2RlbHMuIFdoZW4gYHN5bnRoZXRpY0V2ZW50c2AgaXMgZmFsc2UgdGhlXG4gICAqIGV4aXN0aW5nIGdhdGV3YXktYmFzZWQgY2hhaW5jb2RlLWV2ZW50IHN1YnNjcmlwdGlvbiBpcyBlc3RhYmxpc2hlZCBhbmQgdGhlXG4gICAqIGxvY2FsIFByb3h5IGZhbGxiYWNrIGlzIGxpbWl0ZWQgdG8gZnVsbHktc2VncmVnYXRlZCAodHJhbnNpZW50KSBtb2RlbHMgb25seS5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGVcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5hZGFwdGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGFkYXB0ZXIgb3IgY29uZmlnIG9ic2VydmVkIGZvciBkaXNwYXRjaGApO1xuXG4gICAgY29uc3Qgc3ludGhldGljRXZlbnRzID0gdGhpcy5hZGFwdGVyLmNvbmZpZy5zeW50aGV0aWNFdmVudHMgIT09IGZhbHNlO1xuXG4gICAgaWYgKCFzeW50aGV0aWNFdmVudHMpIHtcbiAgICAgIC8vIEdhdGV3YXktYmFzZWQgY2hhaW5jb2RlLWV2ZW50IHN1YnNjcmlwdGlvbiAobm9uLXN5bnRoZXRpYyBwYXRoKVxuICAgICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jb250ZXh0KFxuICAgICAgICBcImRpc3BhdGNoXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiB0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIE1vZGVsIGFzIGFueVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgICBjb25zdCBnYXRld2F5ID0gYXdhaXQgRmFicmljQ2xpZW50QWRhcHRlci5nZXRHYXRld2F5KFxuICAgICAgICBjdHgsXG4gICAgICAgIHRoaXMuYWRhcHRlci5jb25maWcgYXMgUGVlckNvbmZpZyxcbiAgICAgICAgdGhpcy5jbGllbnRcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXR3b3JrID0gZ2F0ZXdheS5nZXROZXR3b3JrKHRoaXMuYWRhcHRlci5jb25maWcuY2hhbm5lbCk7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlcilcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGFkYXB0ZXIgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoYCk7XG4gICAgICB0aGlzLmxpc3RlbmluZ1N0YWNrID0gYXdhaXQgbmV0d29yay5nZXRDaGFpbmNvZGVFdmVudHMoXG4gICAgICAgIHRoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZVxuICAgICAgKTtcbiAgICAgIHRoaXMuaGFuZGxlRXZlbnRzKGN0eCk7XG4gICAgfVxuXG4gICAgLy8gUHJveHkgQ1JVRCBtZXRob2RzLlxuICAgIC8vIOKAoiBzeW50aGV0aWNFdmVudHMgPSB0cnVlICDihpIgbm90aWZ5IGZvciBBTEwgbW9kZWxzIChyZXBsYWNlcyBnYXRld2F5IGV2ZW50cyBlbnRpcmVseSlcbiAgICAvLyDigKIgc3ludGhldGljRXZlbnRzID0gZmFsc2Ug4oaSIG5vdGlmeSBvbmx5IGZvciBmdWxseS1zZWdyZWdhdGVkICh0cmFuc2llbnQpIG1vZGVsc1xuICAgIC8vICAgKHRoZSBnYXRld2F5IHN1YnNjcmlwdGlvbiBoYW5kbGVzIHB1YmxpYyBtb2RlbHMpXG4gICAgKFxuICAgICAgW1xuICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMLFxuICAgICAgXSBhcyAoa2V5b2YgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+KVtdXG4gICAgKS5mb3JFYWNoKCh0b1dyYXApID0+IHtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTm8gYWRhcHRlciBwcm92aWRlZCBmb3IgdGhlIGZhbGxiYWNrIG9mIGZ1bGx5IHNlZ3JlZ2F0ZWQgbW9kZWxzYFxuICAgICAgICApO1xuICAgICAgaWYgKCF0aGlzLmFkYXB0ZXJbdG9XcmFwXSlcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE1ldGhvZCAke3RvV3JhcH0gbm90IGZvdW5kIGluICR7dGhpcy5hZGFwdGVyLmFsaWFzfSBhZGFwdGVyIHRvIGJpbmQgT2JzZXJ2YWJsZXMgRGlzcGF0Y2hgXG4gICAgICAgICk7XG5cbiAgICAgIGxldCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLmFkYXB0ZXIsIHRvV3JhcCk7XG4gICAgICBsZXQgcHJvdG86IGFueSA9IHRoaXMuYWRhcHRlcjtcbiAgICAgIHdoaWxlICghZGVzY3JpcHRvciAmJiBwcm90byAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gICAgICAgIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCB0b1dyYXApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRlc2NyaXB0b3IgfHwgIWRlc2NyaXB0b3Iud3JpdGFibGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1ldGhvZCAke3RvV3JhcH0gdG8gYmluZCBPYnNlcnZhYmxlcyBEaXNwYXRjaGBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gYnVsa1RvU2luZ2xlKG1ldGhvZDogc3RyaW5nKSB7XG4gICAgICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLkNSRUFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuVVBEQVRFO1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5ERUxFVEU7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBiZWNhdXNlIHRoZXJlIGFyZSByZWFkIG9ubHkgcHJvcGVydGllc1xuICAgICAgdGhpcy5hZGFwdGVyW3RvV3JhcF0gPSBuZXcgUHJveHkodGhpcy5hZGFwdGVyW3RvV3JhcF0sIHtcbiAgICAgICAgYXBwbHk6IGFzeW5jIChcbiAgICAgICAgICB0YXJnZXQ6IGFueSxcbiAgICAgICAgICB0aGlzQXJnOiBGYWJyaWNDbGllbnRBZGFwdGVyLFxuICAgICAgICAgIGFyZ0FycmF5OiBhbnlbXVxuICAgICAgICApID0+IHtcbiAgICAgICAgICAvLyBSdW4gdGhlIG9yaWdpbmFsIG1ldGhvZCB1bmNoYW5nZWQgc28gdHJhbnNpZW50IGRhdGEgaXMgcHJlc2VydmVkXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGFyZ2V0LmFwcGx5KHRoaXNBcmcsIGFyZ0FycmF5KTtcblxuICAgICAgICAgIGNvbnN0IGNsYXp6OiBDb25zdHJ1Y3Rvcjxhbnk+ID0gYXJnQXJyYXlbMF07XG4gICAgICAgICAgLy8gV2hlbiBzeW50aGV0aWNFdmVudHMgaXMgZmFsc2UsIHB1YmxpYyBtb2RlbHMgZW1pdCBhIGNoYWluY29kZSBldmVudFxuICAgICAgICAgIC8vIG9uIHRoZSBjb250cmFjdCBzaWRlOyBza2lwIHRoZSBsb2NhbCBmYWxsYmFjayB0byBhdm9pZFxuICAgICAgICAgIC8vIGRvdWJsZS1ub3RpZmljYXRpb24uIFdoZW4gc3ludGhldGljRXZlbnRzIGlzIHRydWUgd2UgaGFuZGxlIGFsbCBtb2RlbHMuXG4gICAgICAgICAgaWYgKCFzeW50aGV0aWNFdmVudHMgJiYgIU1vZGVsLmlzVHJhbnNpZW50KGNsYXp6KSkgcmV0dXJuIHJlc3VsdDtcblxuICAgICAgICAgIC8vIENvbnRleHQgaXMgYWx3YXlzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYXJnQXJyYXlcbiAgICAgICAgICBjb25zdCB7IGxvZywgY3R4QXJncywgY3R4IH0gPSB0aGlzQXJnW1wibG9nQ3R4XCJdKFxuICAgICAgICAgICAgYXJnQXJyYXkuc2xpY2UoYXJnQXJyYXkubGVuZ3RoIC0gMSksXG4gICAgICAgICAgICB0YXJnZXRcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGlkcyA9IGFyZ0FycmF5WzFdO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdEFyZ3M6IGFueVtdID0gW2NsYXp6LCBidWxrVG9TaW5nbGUodG9XcmFwKSwgaWRzXTtcblxuICAgICAgICAgIGlmIChjdHguZ2V0T3JVbmRlZmluZWQoXCJvYnNlcnZlRnVsbFJlc3VsdFwiKSkge1xuICAgICAgICAgICAgcmVzdWx0QXJncy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKFxuICAgICAgICAgICAgLi4uKHJlc3VsdEFyZ3MgYXMgUGFyYW1ldGVyczx0eXBlb2YgdGhpcy51cGRhdGVPYnNlcnZlcnM+KSxcbiAgICAgICAgICAgIC4uLmN0eEFyZ3NcbiAgICAgICAgICApLmNhdGNoKChlOiB1bmtub3duKSA9PlxuICAgICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGRpc3BhdGNoIG9ic2VydmVyIHJlZnJlc2ggZm9yICR7dG9XcmFwfSBvbiAke2NsYXp6Lm5hbWUgfHwgY2xhenp9IGZvciAke2lkc306ICR7ZX1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuaWYgKEZhYnJpY0NsaWVudEFkYXB0ZXIpXG4gIEZhYnJpY0NsaWVudEFkYXB0ZXJbXCJfYmFzZURpc3BhdGNoXCJdID0gRmFicmljQ2xpZW50RGlzcGF0Y2g7XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSBcIiMjUEFDS0FHRSMjXCI7XG5cbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShQQUNLQUdFX05BTUUsIFZFUlNJT04pO1xuIl0sIm5hbWVzIjpbImVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZSIsImZpbGVQYXRoIiwiZnMiLCJyZXF1aXJlIiwicGF0aCIsImRpcm5hbWUiLCJleGlzdHNTeW5jIiwibWtkaXJTeW5jIiwiZ2VuZXJhdGVNb2RlbEluZGV4ZXMiLCJtIiwiZ2VuZXJhdGVJbmRleGVzIiwiZ2VuZXJhdGVNb2RlbERlc2lnbkRvY3MiLCJhY2N1bSIsInZpZXdzIiwiZ2VuZXJhdGVWaWV3cyIsInN0b3JhZ2UiLCJmb3JFYWNoIiwiZG9jIiwiX2lkIiwicmVhZE1vZGVsRmlsZSIsImZpbGUiLCJleHBvcnRzIiwiam9pbiIsInByb2Nlc3MiLCJjd2QiLCJwYXJlbnRQYXRoIiwibmFtZSIsInZhbHVlcyIsIk9iamVjdCIsImZpbHRlciIsImUiLCJNb2RlbCIsImFzeW5jIiwicmVhZE1vZGVsRm9sZGVycyIsImZvbGRlcnMiLCJyZXN1bHQiLCJmb2xkZXIiLCJmaWxlcyIsInJlYWRkaXJTeW5jIiwid2l0aEZpbGVUeXBlcyIsInJlY3Vyc2l2ZSIsImYiLCJpc0ZpbGUiLCJlbmRzV2l0aCIsInB1c2giLCJ3cml0ZUluZGV4ZXMiLCJpbmRleGVzIiwicCIsImNvbGxlY3Rpb24iLCJpbmRleCIsInJlc29sdmUiLCJ3cml0ZUZpbGVTeW5jIiwiSlNPTiIsInN0cmluZ2lmeSIsInVuZGVmaW5lZCIsIndyaXRlRGVzaWduRG9jcyIsImRlc2lnbkRvY3MiLCJsZW5ndGgiLCJkb2NJZCIsInJlcGxhY2UiLCJwYXlsb2FkIiwiX3JldiIsImNvbGxlY3Rpb25Gb3IiLCJjb2xsZWN0aW9uTmFtZSIsInBvbGljeSIsInJlcXVpcmVkUGVlckNvdW50IiwibWF4UGVlckNvdW50IiwiYmxvY2tUb0xpdmUiLCJtZW1iZXJPbmx5UmVhZCIsIm1lbWJlck9ubHlXcml0ZSIsInByaXZhdGVDb2xsZWN0aW9uRm9yIiwibXNwSWQiLCJjIiwiZW5kb3JzZW1lbnRQb2xpY3kiLCJzaWduYXR1cmVQb2xpY3kiLCJzaGFyZWRDb2xsZWN0aW9uRm9yIiwibXNwSWRzIiwibWFwIiwiZXh0cmFjdENvbGxlY3Rpb25zIiwib3ZlcnJpZGVzIiwibWlycm9yIiwicHJpdmF0ZUNvbHMiLCJzaGFyZWRDb2xzIiwiY29sbGVjdGlvbnNGb3IiLCJyZXNvbHZlQ29sbGVjdGlvbiIsImFyZyIsIkludGVybmFsRXJyb3IiLCJwcml2YXRlRGVmYXVsdHMiLCJhc3NpZ24iLCJzaGFyZWREZWZhdWx0cyIsIm1pcnJvck1ldGEiLCJtaXJyb3JlZEF0IiwicHJpdmF0ZXMiLCJmbGF0IiwicmVzb2x2ZWQiLCJyZXNvbHZlciIsInNvbWUiLCJpbmNsdWRlcyIsInNoYXJlZCIsIndyaXRlQ29sbGVjdGlvbnMiLCJjb2xzIiwiZmlsZU5hbWUiLCJ3cml0ZUNvbGxlY3Rpb25EZXNpZ25Eb2NzIiwiZG9jcyIsIkZhYnJpY0NsaWVudFBhZ2luYXRvciIsIlBhZ2luYXRvciIsImNvbnN0cnVjdG9yIiwiYWRhcHRlciIsInF1ZXJ5Iiwic2l6ZSIsImNsYXp6Iiwic3VwZXIiLCJwcmVwYXJlIiwicmF3U3RhdGVtZW50IiwiVW5zdXBwb3J0ZWRFcnJvciIsInBhZ2UiLCJhcmdzIiwiaXNTZXJpYWxpemVkUGFnZSIsIm9iaiIsIkFycmF5IiwiaXNBcnJheSIsImRhdGEiLCJGYWJyaWNDbGllbnRSZXBvc2l0b3J5IiwiUmVwb3NpdG9yeSIsImZvcmNlIiwidGhpcyIsIl9vdmVycmlkZXMiLCJpZ25vcmVWYWxpZGF0aW9uIiwiaWdub3JlSGFuZGxlcnMiLCJhbGxvd1Jhd1N0YXRlbWVudHMiLCJmb3JjZVByZXBhcmVTaW1wbGVRdWVyaWVzIiwiZm9yY2VQcmVwYXJlQ29tcGxleFF1ZXJpZXMiLCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZSIsInJlYnVpbGRXaXRoVHJhbnNpZW50Iiwib3ZlcnJpZGUiLCJmbGFncyIsImZvciIsIk9ic2VydmVySGFuZGxlciIsInBhZ2luYXRlQnkiLCJrZXkiLCJvcmRlciIsInJlZiIsIm9mZnNldCIsImxpbWl0IiwibG9nIiwiY3R4QXJncyIsImxvZ0N0eCIsIlByZXBhcmVkU3RhdGVtZW50S2V5cyIsIlBBR0VfQlkiLCJ2ZXJib3NlIiwidGFibGVOYW1lIiwiY2xhc3MiLCJzdGF0ZW1lbnQiLCJib29rbWFyayIsImxpc3RCeSIsIkxJU1RfQlkiLCJmaW5kQnkiLCJ2YWx1ZSIsIkZJTkRfQlkiLCJmaW5kT25lQnkiLCJGSU5EX09ORV9CWSIsImZpbmQiLCJPcmRlckRpcmVjdGlvbiIsIkFTQyIsIkZJTkQiLCJkaXJlY3Rpb24iLCJQQUdFIiwiY3R4IiwiUGVyc2lzdGVuY2VLZXlzIiwiU1RBVEVNRU5UIiwiY2FsbEFyZ3MiLCJzbGljZSIsInBhcnNlIiwiZGVjb2RlIiwiZXZhbHVhdGVUcmFuc2FjdGlvbiIsImh5ZHJhdGVkIiwiciIsIkNvdWNoREJLZXlzIiwiVEFCTEUiLCJkIiwiYXBwbHlBZnRlclJlYWQiLCJnZXRPclVuZGVmaW5lZCIsImVuZm9yY2VEQkRlY29yYXRvcnMiLCJPcGVyYXRpb25LZXlzIiwiUkVBRCIsIkFGVEVSIiwiUHJvbWlzZSIsImFsbCIsImVudHJ5IiwiY291bnRPZiIsIkNPVU5UX09GIiwic3RtdEFyZ3MiLCJtYXhPZiIsIk1BWF9PRiIsIm1pbk9mIiwiTUlOX09GIiwiYXZnT2YiLCJBVkdfT0YiLCJzdW1PZiIsIlNVTV9PRiIsImRpc3RpbmN0T2YiLCJESVNUSU5DVF9PRiIsImdyb3VwT2YiLCJHUk9VUF9PRiIsImhlYWx0aGNoZWNrIiwiY3JlYXRlIiwibW9kZWwiLCJkZWJ1ZyIsImVuc3VyZUxlZ2FjeU1pcnJvckZsYWciLCJwcmVwYXJlZCIsInJlY29yZCIsImlkIiwidHJhbnNpZW50IiwicmV2ZXJ0IiwidXBkYXRlIiwiY3JlYXRlQWxsUHJlZml4IiwibW9kZWxzIiwiQ1JFQVRFIiwiZ2V0IiwiaWdub3JlVmFsaWRhdGUiLCJPTiIsImlnbm9yZWRQcm9wcyIsImVycm9ycyIsImhhc0Vycm9ycyIsImVycm9yTWVzc2FnZXMiLCJyZWR1Y2VFcnJvcnNUb1ByaW50IiwiVmFsaWRhdGlvbkVycm9yIiwiY3JlYXRlQWxsIiwiaWRzIiwicGF5bG9hZHMiLCJ0cmFuc2llbnRzIiwiY3JlYXRlZCIsImkiLCJyZWFkQWxsIiwia2V5cyIsInJlY29yZHMiLCJ1cGRhdGVBbGwiLCJ1cGRhdGVkIiwidSIsImFjY3VtdWxhdGUiLCJsZWdhY3kiLCJFUkMyMFRva2VuIiwiQmFzZU1vZGVsIiwiX19kZWNvcmF0ZSIsInBrIiwidHlwZSIsIlN0cmluZyIsInByb3RvdHlwZSIsImNvbHVtbiIsInJlcXVpcmVkIiwidGFibGUiLCJFUkMyMFdhbGxldCIsIkFsbG93YW5jZSIsIkNsaWVudFNlcmlhbGl6ZXIiLCJKU09OU2VyaWFsaXplciIsInByZVNlcmlhbGl6ZSIsIm1vZGVsTmFtZSIsInRvU2VyaWFsaXplIiwibWV0YWRhdGEiLCJNZXRhZGF0YSIsIlNlcmlhbGl6YXRpb25FcnJvciIsIk1vZGVsS2V5cyIsIkFOQ0hPUiIsImRlc2VyaWFsaXplIiwic3RyIiwiZGVzZXJpYWxpemF0aW9uIiwiY2xhc3NOYW1lIiwiRXJyb3IiLCJidWlsZCIsInNlcmlhbGl6ZSIsIkZhYnJpY0VSQzIwQ2xpZW50UmVwb3NpdG9yeSIsInNlcmlhbGl6ZXIiLCJkZWNvZGVyIiwiVGV4dERlY29kZXIiLCJ1cGRhdGVPYnNlcnZlcnMiLCJldmVudCIsIm9ic2VydmVySGFuZGxlciIsImNvdW50IiwicGFyc2VkSWQiLCJTZXF1ZW5jZSIsInBhcnNlVmFsdWUiLCJzZXF1ZW5jZUZvciIsInRva2VuTmFtZSIsInN5bWJvbCIsImRlY2ltYWxzIiwiTnVtYmVyIiwidG90YWxTdXBwbHkiLCJ0b3RhbCIsImJhbGFuY2VPZiIsIm93bmVyIiwiYmFsYW5jZSIsInRyYW5zZmVyIiwidG8iLCJ0cmFuc2ZlcnJlZCIsInN1Ym1pdFRyYW5zYWN0aW9uIiwidG9TdHJpbmciLCJ0cmFuc2ZlckZyb20iLCJmcm9tIiwiY29udGV4dEFyZ3MiLCJDb250ZXh0IiwiYXBwcm92ZSIsInNwZW5kZXIiLCJhcHByb3ZlZCIsImFsbG93YW5jZSIsImluaXRpYWxpemUiLCJ0b2tlbiIsImluaXRpbGlhemVkIiwiY2hlY2tJbml0aWFsaXplZCIsIm1pbnQiLCJhbW91bnQiLCJidXJuIiwiYnVybkZyb20iLCJhY2NvdW50IiwiY2xpZW50QWNjb3VudEJhbGFuY2UiLCJzZXJpYWxpemVkQWNjb3VudEJhbGFuY2UiLCJjbGllbnRBY2NvdW50SUQiLCJleHRyYWN0SWRzIiwiY29tcG9zZWQiLCJwa1Byb3BzIiwiZXh0cmFjdElkIiwiY29tcG9zZUF0dHJpYnV0ZVZhbHVlIiwiSWRlbnRpdHlDcmVkZW50aWFscyIsImRlc2NyaXB0aW9uIiwiRmFicmljTW9kZWxLZXlzIiwiSWRlbnRpdHlUeXBlIiwiRmFicmljRmxhdm91ciIsIklkZW50aXR5IiwiWDUwOSIsIm9uZVRvT25lIiwiQ2FzY2FkZSIsIkNBU0NBREUiLCJkZWxldGUiLCJDb3JlVXRpbHMiLCJsb2dnZXIiLCJNaW5pTG9nZ2VyIiwiY29udGVudE9mTG9hZEZpbGUiLCJjb250ZW50T3JQYXRoIiwiZmlsZVJlYWRlciIsIlVpbnQ4QXJyYXkiLCJtYXRjaCIsInJlYWRGaWxlIiwicHJvbWlzZXMiLCJub3JtYWxpemVJbXBvcnQiLCJpbXBvcnQiLCJnZXRDQVVzZXIiLCJ1c2VyTmFtZSIsInByaXZhdGVLZXkiLCJjZXJ0aWZpY2F0ZSIsIm9wdGlvbnMiLCJzdHJpbmdGb3JtYXQiLCJ1c2VyIiwiVXNlciIsImNvbmZpZyIsImhzbSIsInNvZnR3YXJlIiwibGliIiwibGlicmFyeSIsInNsb3QiLCJsYWJlbCIsInRva2VuTGFiZWwiLCJwaW4iLCJjcnlwdG9TdWl0ZSIsImdldENyeXB0b1N1aXRlIiwic2V0Q3J5cHRvU3VpdGUiLCJlbnJvbGxtZW50S2V5IiwiZ2V0SFNNRW5yb2xsbWVudEtleSIsImdldFNvZnR3YXJlRW5yb2xsbWVudEtleSIsInNldEVucm9sbG1lbnQiLCJuZXdDcnlwdG9TdWl0ZSIsImNyZWF0ZUtleUZyb21SYXciLCJza2kiLCJrZXlJZEhleCIsInRyaW0iLCJCdWZmZXIiLCJnZXRDZXJ0aWZpY2F0ZVNLSSIsImdldEtleSIsImlzUHJpdmF0ZSIsIng1MDkiLCJYNTA5Q2VydGlmaWNhdGUiLCJqd2siLCJwdWJsaWNLZXkiLCJleHBvcnQiLCJmb3JtYXQiLCJwcmVmaXgiLCJ4IiwieSIsImNyeXB0byIsImNyZWF0ZUhhc2giLCJjb25jYXQiLCJkaWdlc3QiLCJnZXRJZGVudGl0eSIsImNlcnREaXJlY3RvcnlQYXRoIiwiaWRlbnRpdHlGaWxlUmVhZGVyIiwiY2VydFBhdGgiLCJnZXRGaXJzdERpckZpbGVOYW1lIiwiY3JlZGVudGlhbHMiLCJkaXJQYXRoIiwicmVhZGRpciIsImdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50IiwiZ2V0RmlsZUNvbnRlbnQiLCJnZXRTaWduZXIiLCJrZXlEaXJlY3RvcnlQYXRoIiwic2lnbmVyRmlsZVJlYWRlciIsImtleVBhdGgiLCJwcml2YXRlS2V5UGVtIiwiZXh0cmFjdFByaXZhdGVLZXkiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJrIiwic2lnbmVycyIsIm5ld1ByaXZhdGVLZXlTaWduZXIiLCJwZW0iLCJsaWJOYW1lIiwic3VidGxlIiwiZ2xvYmFsVGhpcyIsIndpbmRvdyIsIkNyeXB0byIsIndlYmNyeXB0byIsInN0cjJhYiIsImJ1ZiIsIkFycmF5QnVmZmVyIiwiYnVmVmlldyIsInN0ckxlbiIsImNoYXJDb2RlQXQiLCJyZXBsYWNlQWxsIiwiZGVjb2RlZCIsImJpbmFyeURlciIsImltcG9ydEtleSIsIm5hbWVkQ3VydmUiLCJnZXRBa2lBbmRTZXJpYWxGcm9tQ2VydCIsImNlcnQiLCJ4NTA5Q2VydGlmaWNhdGUiLCJYNTA5Q2VydCIsImFraUV4dCIsImV4dGVuc2lvbnMiLCJha2kiLCJ0b1VwcGVyQ2FzZSIsInN0YXJ0c1dpdGgiLCJzZXJpYWwiLCJzZXJpYWxOdW1iZXIiLCJjcnlwdG9Qcm92aWRlciIsInNldCIsIkJBU0VfQUxQSEFCRVQiLCJDUllQVE8iLCJCYXNlRW5jb2RlciIsImFscGhhYmV0IiwiYmFzZU1hcCIsImoiLCJjaGFyQXQiLCJ4YyIsImJhc2UiLCJsZWFkZXIiLCJmYWN0b3IiLCJNYXRoIiwiaUZhY3RvciIsImVuY29kZSIsInNvdXJjZSIsImlzVmlldyIsImJ1ZmZlciIsImJ5dGVPZmZzZXQiLCJieXRlTGVuZ3RoIiwiemVyb2VzIiwicGJlZ2luIiwicGVuZCIsImI1OCIsImNhcnJ5IiwiaXQxIiwiaXQyIiwicmVwZWF0IiwiZGVjb2RlVW5zYWZlIiwicHN6IiwiYjI1NiIsIml0MyIsIml0NCIsInZjaCIsIkNyeXB0b1V0aWxzIiwiYjU4ZW5jb2RlciIsIkJBU0U1OCIsImZhYnJpY0lkRnJvbUNlcnRpZmljYXRlIiwic3ViamVjdCIsImlzc3VlciIsInN0cmluZ1RvQXJyYXlCdWZmZXIiLCJleHRyYWN0S2V5IiwidXNhZ2VzIiwiUmVnRXhwIiwiZXh0cmFjdFB1YmxpY0tleSIsInNpZ24iLCJidWZmIiwiaGFzaCIsImIiLCJwYWRTdGFydCIsInZlcmlmeSIsInNpZ25hdHVyZSIsImVuY3J5cHQiLCJnZXRTdWJ0bGVDcnlwdG8iLCJpc0Jyb3dzZXIiLCJkZWNyeXB0IiwiZ2V0TWFzdGVyIiwidGV4dEVuY29kZXIiLCJUZXh0RW5jb2RlciIsImdlbkdlbmVzaXMiLCJyYW5kb21VVUlEIiwiaW1wb3J0ZWRLZXkiLCJLRVlfQUxHT1JZVEhNIiwiaXYiLCJnZXREZXJpdmF0aW9uS2V5Iiwic2FsdCIsInNhbHRCdWZmZXIiLCJzYWx0SGFzaGVkIiwicGFyYW1zIiwiSEFTSCIsIml0ZXJhdGlvbnMiLCJJVEVSQVRJT05TIiwiZGVyaXZhdGlvbiIsImRlcml2ZUJpdHMiLCJLRVlMRU5HVEgiLCJpdmxlbiIsImtleWxlbiIsImRlcml2ZWRLZXkiLCJpbXBvcnRlZEVuY3J5cHRpb25LZXkiLCJBTEdPUllUSE0iLCJlbmNyeXB0UGluIiwidGV4dCIsImtleU9iamVjdCIsInRleHRCdWZmZXIiLCJlbmNyeXB0ZWRUZXh0IiwiZGVjcnlwdFBpbiIsInRleHREZWNvZGVyIiwiZGVjcnlwdGVkVGV4dCIsIk92ZXJmbG93RXJyb3IiLCJtc2ciLCJCYWxhbmNlRXJyb3IiLCJBbGxvd2FuY2VFcnJvciIsIlJlZ2lzdHJhdGlvbkVycm9yIiwiQXV0aG9yaXphdGlvbkVycm9yIiwiTWlzc2luZ0NvbnRleHRFcnJvciIsIlVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzIiwiQmFzZUVycm9yIiwiTm90SW5pdGlhbGl6ZWRFcnJvciIsIk1pc3NpbmdQS0NTUzExTGliIiwiRW5kb3JzZW1lbnRFcnJvciIsIm1lc3NhZ2UiLCJNdmNjUmVhZENvbmZsaWN0RXJyb3IiLCJQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IiLCJFbmRvcnNlbWVudFBvbGljeUVycm9yIiwiVHJhbnNhY3Rpb25MaW1pdHNFcnJvciIsImNvZGUiLCJUcmFuc2FjdGlvblRpbWVvdXRFcnJvciIsIlRyYW5zYWN0aW9uQnVmZmVyU2l6ZUVycm9yIiwiSEZDQUlkZW50aXR5VHlwZSIsIkhGQ0FJZGVudGl0eUF0dHJpYnV0ZXMiLCJGYWJyaWNFbnJvbGxtZW50U2VydmljZSIsIkxvZ2dlZENsYXNzIiwiY2FDb25maWciLCJjYU5hbWUiLCJjYUNlcnQiLCJjYUtleSIsInVybCIsIkNBIiwiY2EiLCJ0bHMiLCJ0cnVzdGVkUm9vdHMiLCJyb290IiwiRmFicmljQ0FTZXJ2aWNlcyIsIkNsaWVudCIsImNsaWVudCIsIkNlcnRpZmljYXRlIiwiY2VydGlmaWNhdGVTZXJ2aWNlIiwibmV3Q2VydGlmaWNhdGVTZXJ2aWNlIiwiQWZmaWxpYXRpb25zIiwiYWZmaWxpYXRpb25TZXJ2aWNlIiwibmV3QWZmaWxpYXRpb25TZXJ2aWNlIiwiSWRlbnRpdGllcyIsImlkZW50aXR5U2VydmljZSIsIm5ld0lkZW50aXR5U2VydmljZSIsImdldENlcnRpZmljYXRlcyIsInJlcXVlc3QiLCJkb01hcCIsInJlc3BvbnNlIiwiY2VydHMiLCJQRU0iLCJnZXRJZGVudGl0aWVzIiwiaWRlbnRpdGllc1NlcnZpY2UiLCJnZXRBbGwiLCJpZGVudGl0aWVzIiwicGFyc2VFcnJvciIsInJlZ2V4cCIsImV4ZWMiLCJDb25mbGljdEVycm9yIiwiZ2V0QWZmaWxpYXRpb25zIiwiYSIsInJlYWQiLCJlbnJvbGxtZW50SWQiLCJnZXRPbmUiLCJOb3RGb3VuZEVycm9yIiwic3VjY2VzcyIsInJlZ2lzdGVyIiwiaXNTdXBlclVzZXIiLCJhZmZpbGlhdGlvbiIsInVzZXJSb2xlIiwiYXR0cnMiLCJtYXhFbnJvbGxtZW50cyIsInJlZ2lzdHJhdGlvbiIsInBhc3N3b3JkIiwicHJvcHMiLCJlbnJvbGxtZW50SUQiLCJlbnJvbGxtZW50U2VjcmV0IiwiaW5mbyIsImlkZW50aXR5RnJvbUVucm9sbG1lbnQiLCJlbnJvbGxtZW50Iiwicm9vdENlcnRpZmljYXRlIiwiTG9nZ2luZyIsImNsaWVudElkIiwibm93IiwiRGF0ZSIsInRvQnl0ZXMiLCJjcmVhdGVkT24iLCJ1cGRhdGVkT24iLCJlbnJvbGwiLCJpZGVudGl0eSIsInJlZ2lzdGVyQW5kRW5yb2xsIiwicmV2b2tlIiwicmVhc29uIiwiUmVnaXN0cmF0aW9uUmVxdWVzdEJ1aWxkZXIiLCJlcnJzIiwicm9sZSIsInNldEFmZmlsaWF0aW9uIiwiYWRkQXR0ciIsImF0dHIiLCJzZXRBdHRycyIsInNldEVucm9sbG1lbnRJRCIsInNldEVucm9sbG1lbnRTZWNyZXQiLCJzZXRNYXhFbnJvbGxtZW50cyIsInNldFJvbGUiLCJtaW5sZW5ndGgiLCJtaW4iLCJFUkMyMEV2ZW50cyIsIkZhYnJpY0Jhc2VNb2RlbCIsImNyZWF0ZWRBdCIsInVwZGF0ZWRBdCIsInZlcnNpb24iLCJ1c2VzIiwiRmFicmljSWRlbnRpZmllZEJhc2VNb2RlbCIsImNyZWF0ZWRCeSIsInVwZGF0ZWRCeSIsImlzU2hhcmVkIiwic2VncmVnYXRlIiwiaXNUcmFuc2llbnQiLCJkZWNvcmF0ZWRQcm9wZXJ0aWVzIiwiZ2V0QXR0cmlidXRlcyIsInRyYW5zaWVudFByb3BzIiwiREJLZXlzIiwiVFJBTlNJRU5UIiwicHJpdmF0ZVByb3BlcnRpZXMiLCJQUklWQVRFIiwic2hhcmVkUHJvcGVydGllcyIsIlNIQVJFRCIsInB1YmxpYyIsInRyYW5zaWVudEtleXMiLCJwcml2YXRlS2V5cyIsInNoYXJlZEtleXMiLCJpc1B1YmxpYyIsImJpbmQiLCJtaXJyb3JlZCIsIkZBQlJJQyIsIk1JUlJPUiIsIm93bmVyT2YiLCJtZXRhIiwiT1dORURfQlkiLCJzaGFyZWRLZXkiLCJjb25zdHIiLCJwcml2YXRlTWV0YSIsInNoYXJlZE1ldGEiLCJjb2xsZWN0aW9ucyIsImV4dHJhY3RNc3BJZCIsImdldE1TUElEIiwiT3duZXIiLCJ0YXJnZXQiLCJwcm9wZXJ0eUtleSIsImRlc2NyaXB0b3IiLCJvcmlnaW5hbE1ldGhvZCIsImFjb3VudElkIiwiY2xpZW50SWRlbnRpdHkiLCJnZXRJRCIsInNlbGVjdCIsInRva2VucyIsImV4ZWN1dGUiLCJhcHBseSIsIm93bmVkQnlPbkNyZWF0ZSIsImNvbnRleHQiLCJzdHViIiwiY3JlYXRvciIsImdldENyZWF0b3IiLCJtc3BpZCIsInNldE93bmVkQnlLZXlWYWx1ZSIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwib3duZWRCeSIsImF0dHJpYnV0ZSIsImdlbmVyYXRlZCIsInJlYWRvbmx5Iiwib25DcmVhdGUiLCJwcm9wTWV0YWRhdGEiLCJEZWNvcmF0aW9uIiwiZGVmaW5lIiwiZGVjb3JhdG9yIiwidHJhbnNhY3Rpb25JZE9uQ3JlYXRlIiwiZ2V0VHhJRCIsInRyYW5zYWN0aW9uSWQiLCJvblVwZGF0ZSIsIlRSQU5TQUNUSU9OX0lEIiwiZXZhbE1pcnJvck1ldGFkYXRhIiwiY3JlYXRlTWlycm9ySGFuZGxlciIsImZhYnJpY0N0eCIsInNvdXJjZU1vZGVsIiwicHV0IiwicmVwbyIsIm1pcnJvckNvbGxlY3Rpb24iLCJ1cGRhdGVNaXJyb3JIYW5kbGVyIiwiYXBwbHlVcGRhdGVWYWxpZGF0aW9uIiwibWVyZ2VGb3JVcGRhdGUiLCJkZWxldGVNaXJyb3JIYW5kbGVyIiwicGtQcm9wIiwic2VncmVnYXRlZCIsIm1pcnJvcldyaXRlR3VhcmQiLCJtc3AiLCJjb25kaXRpb24iLCJyZWFkTWlycm9ySGFuZGxlciIsIm1hdGNoZXMiLCJyZWFkRnJvbSIsIm1zcElkT3JDb25kaXRpb24iLCJpc0NvbmRpdGlvbk9ubHkiLCJCb29sZWFuIiwiY29uZCIsIm9uUmVhZCIsInByaW9yaXR5Iiwib25EZWxldGUiLCJNb2RlbENvbGxlY3Rpb24iLCJvcmdOYW1lIiwidG9QYXNjYWxDYXNlIiwiTmFtZXNwYWNlQ29sbGVjdGlvbiIsIm5hbWVzcGFjZSIsIkltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb24iLCJTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSIsImFwcGx5U2VncmVnYXRpb25GbGFncyIsImlzRnVsbHlTZWdyZWdhdGVkIiwiaGFzUHVibGljUHJvcGVydGllcyIsIm1hcmtGdWxseVNlZ3JlZ2F0ZWQiLCJhcHBseU1pcnJvckZsYWdzIiwiYXR0cmlidXRlcyIsInRyYW5zaWVudE1ldGEiLCJleHRyYWN0U2VncmVnYXRlZENvbGxlY3Rpb25zIiwiZGF0YUFycmF5IiwiY29sbGVjdGlvblJlc29sdmVyIiwia2V5QXJyYXkiLCJwa0tleSIsInBrU2VxTmFtZSIsInNlcXVlbmNlTmFtZSIsImlkVmFsdWUiLCJjYW5CdWlsZFBlckluc3RhbmNlIiwic2V0U2VxdWVuY2VTZWdyZWdhdGlvbiIsInByb3BTZXFOYW1lIiwic2VncmVnYXRlZERhdGFPbkNyZWF0ZSIsIl9rIiwia2V5U3RyaW5ncyIsIndyaXRlVG8iLCJzZWdyZWdhdGVkRGF0YU9uUmVhZCIsInNlZ3JlZ2F0ZWREYXRhT25VcGRhdGUiLCJvbGRNb2RlbCIsInNlZ3JlZ2F0ZWREYXRhT25EZWxldGUiLCJpbm5lclNlZ3JlZ2F0ZWQiLCJzZWdyZWdhdGVkRGVjIiwiU2V0IiwiYWRkIiwiY29uc3RyTWV0YSIsImNvbnN0ckNvbGxlY3Rpb25zIiwidXBkYXRlZFRyYW5zaWVudE1ldGEiLCJkZWNzIiwicHJvcGVydGllcyIsImdyb3VwTmFtZSIsImV4dHJhY3RHcm91cE5hbWUiLCJkYXRhR3JvdXBOYW1lIiwiZWFybHlFeHRyYWN0aW9uTWV0YSIsImVhcmx5RXh0cmFjdGlvbkdyb3VwU29ydCIsImdyb3VwIiwicHJvcCIsIm9uIiwiREJPcGVyYXRpb25zIiwiQUxMIiwicHJpdmF0ZURhdGEiLCJzaGFyZWREYXRhIiwic29ydEtleXNPbmx5UmVjdXJzaXZlIiwic29ydCIsInJlZHVjZSIsImFjYyIsIkRldGVybWluaXN0aWNTZXJpYWxpemVyIiwiZXJyb3IiLCJzZWxmIiwibyIsImNhbGwiLCJyZWxhdGlvbnMiLCJnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZSIsInBhcnNlRXZlbnROYW1lIiwicGFydHMiLCJzcGxpdCIsInN1YiIsInNhZmVQYXJzZUludCIsInN0cmluZyIsImRpZ2l0UmVnZXgiLCJ0ZXN0IiwicGFyc2VkaW50IiwicGFyc2VJbnQiLCJpc05hTiIsIlNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyIiwicHV0QW5jaG9yIiwicHJlU2VyaWFsaXphdGlvbiIsIkZhYnJpY0lkZW50aXR5U2VydmljZSIsIkNsaWVudEJhc2VkU2VydmljZSIsInJvb3RDbGllbnQiLCJfdXNlciIsImNlcnRpZmljYXRlcyIsImFmZmlsaWF0aW9ucyIsImdldFVzZXIiLCJjZmciLCJJTklUSUFMSVpBVElPTiIsImdldE5hbWUiLCJ1cGRhdGVJZGVudGl0eSIsImlkZW50aXR5UmVxdWVzdCIsImNhVXNlcklkZW50aXR5IiwicmVlbnJvbGxVc2VyIiwiY3JlYXRlVXNlciIsImdldE1zcGlkIiwiZW5yb2xsbWVudEF0dHJzIiwib3B0aW9uYWwiLCJyZWVucm9sbCIsInJlbmV3ZWRJZGVudGl0eSIsInJldm9rZU9wdGlvbnMiLCJyZXZva2VSZXF1ZXN0IiwiQ0FfUk9MRSIsIkRlZmF1bHRGYWJyaWNDbGllbnRGbGFncyIsImV2YWx1YXRlVGltZW91dCIsImVuZG9yc2VUaW1lb3V0Iiwic3VibWl0VGltZW91dCIsImNvbW1pdFRpbWVvdXQiLCJhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3MiLCJhbGxvd0dhdGV3YXlPdmVycmlkZSIsImVuY3J5cHRUcmFuc2llbnQiLCJzeW50aGV0aWNFdmVudHMiLCJlc2NhcGVSZWdFeHAiLCJuZXh0TGV4aWNvZ3JhcGhpY1N0cmluZyIsImNoYXJzIiwiY29kZVBvaW50QXQiLCJmcm9tQ29kZVBvaW50IiwicHJlZml4UmFuZ2UiLCJzdGFydCIsImVuZCIsIkZhYnJpY0NsaWVudFN0YXRlbWVudCIsIlN0YXRlbWVudCIsInNxdWFzaCIsInNxdWFzaGVkIiwibWV0aG9kIiwiZXhlY3V0ZVByZXBhcmVkIiwiYXJneiIsImZvck1vZGVsIiwiZnJvbVNlbGVjdG9yIiwiYWxpYXMiLCJRVUVSWSIsImlzU2ltcGxlUXVlcnkiLCJRdWVyeUNsYXVzZSIsIndoZXJlQ29uZGl0aW9uIiwicGFyc2VkIiwicHJlcGFyZUNvbmRpdGlvbiIsInNlbGVjdFNlbGVjdG9yIiwiU0VMRUNUIiwiQU5EIiwidG9Mb3dlckNhc2UiLCJvcmRlckJ5U2VsZWN0b3JzIiwiT1JERVJfQlkiLCJ0b0NhbWVsQ2FzZSIsInByb2Nlc3NSZWNvcmQiLCJwa0F0dHIiLCJJRCIsImtleUFyZ3MiLCJTRVBBUkFUT1IiLCJyYXciLCJyYXdJbnB1dCIsImFnZ3JlZ2F0b3IiLCJhZ2dyZWdhdGVJbmZvIiwiYWdncmVnYXRlIiwiZXhlY3V0ZUFnZ3JlZ2F0ZSIsInJlc3VsdHMiLCJwcm9jZXNzZWQiLCJhcHBseUFmdGVySGFuZGxlcnNUb1Jlc3VsdCIsImFnZ3JlZ2F0ZVF1ZXJ5IiwiYnVpbGRBZ2dyZWdhdGVRdWVyeSIsInNlbGVjdG9ycyIsInNlbGVjdG9yIiwiZmllbGRzIiwicGFyc2VDb25kaXRpb24iLCJDb25kaXRpb24iLCJhbmQiLCJlcSIsInNlbGVjdG9yS2V5cyIsIkNvdWNoREJHcm91cE9wZXJhdG9yIiwiaW5kZXhPZiIsInZhbCIsIk9SIiwicyIsImVudHJpZXMiLCJ3YXJuIiwic2VsZWN0b3JLZXkiLCJyZWMiLCJDb3VjaERCT3BlcmF0b3IiLCJCSUdHRVIiLCJsaW1pdFNlbGVjdG9yIiwiQ291Y2hEQlF1ZXJ5TGltaXQiLCJvZmZzZXRTZWxlY3RvciIsInNraXAiLCJtZXJnZSIsIm9wIiwib2JqMSIsIm9iajIiLCJhdHRyMSIsIm9wZXJhdG9yIiwiY29tcGFyaXNvbiIsIk9wZXJhdG9yIiwiU1RBUlRTX1dJVEgiLCJRdWVyeUVycm9yIiwicmFuZ2UiLCJCSUdHRVJfRVEiLCJTTUFMTEVSIiwiRU5EU19XSVRIIiwiUkVHRVhQIiwiQkVUV0VFTiIsIm1heCIsIm9wQmV0d2VlbiIsInRyYW5zbGF0ZU9wZXJhdG9ycyIsIlNNQUxMRVJfRVEiLCJHcm91cE9wZXJhdG9yIiwiTk9UIiwib3AxIiwib3AyIiwiYXZnU2VsZWN0b3IiLCJzdW1JbmZvIiwiY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvciIsImNvdW50SW5mbyIsImNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5Iiwia2luZCIsInN1bURlc2NyaXB0b3IiLCJjb3VudERlc2NyaXB0b3IiLCJjb3VudERpc3RpbmN0U2VsZWN0b3IiLCJjb3VudERpc3RpbmN0IiwiYWdncmVnYXRvclVzZWQiLCJjb3VudFNlbGVjdG9yIiwibWluU2VsZWN0b3IiLCJtYXhTZWxlY3RvciIsInN1bVNlbGVjdG9yIiwiZGlzdGluY3RTZWxlY3RvciIsImFnZ3JlZ2F0b3JDaGVja3MiLCJtZXRhcyIsImZpbmRWaWV3TWV0YWRhdGEiLCJ2aWV3TmFtZSIsImdlbmVyYXRlVmlld05hbWUiLCJkZG9jIiwiZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lIiwicmV0dXJuRG9jcyIsInZpZXciLCJnZXRGYWJyaWNBZGFwdGVyIiwiaXNWaWV3QWdncmVnYXRlIiwiaGFuZGxlQXZlcmFnZSIsImZhYnJpY0FkYXB0ZXIiLCJ2aWV3SW5mbyIsInByb2Nlc3NWaWV3UmVzcG9uc2UiLCJzdW1EZXNjIiwiY291bnREZXNjIiwic3VtUmVzcG9uc2UiLCJjb3VudFJlc3BvbnNlIiwic3VtIiwicm93cyIsInJvdyIsIkZhYnJpY0NsaWVudEFkYXB0ZXIiLCJBZGFwdGVyIiwib3BlcmF0aW9uIiwibWVyZ2VkRmxhZ3MiLCJzaWxseSIsInBvcCIsInRvT3ZlcnJpZGVzIiwibmV3Q3R4IiwicGFyZW50Q29udGV4dCIsImNoaWxkQ29udGV4dHMiLCJjdXJyZW50T3AiLCJjdXJyZW50TW9kZWwiLCJyZXBvc2l0b3J5IiwiY3JlYXRlUHJlZml4IiwidXBkYXRlQWxsUHJlZml4Iiwic2hpZnQiLCJoYXNUcmFuc2llbnQiLCJuZWVkc0Z1bGxQYXlsb2FkIiwic2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uIiwidHJhbnNpZW50UGF5bG9hZCIsIkJ1bGtDcnVkT3BlcmF0aW9uS2V5cyIsIkNSRUFURV9BTEwiLCJnZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zIiwicmVzIiwic2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUiLCJSRUFEX0FMTCIsIlVQREFURV9BTEwiLCJkZWxldGVBbGwiLCJzaG91bGRIeWRyYXRlIiwiREVMRVRFX0FMTCIsIk1FVEFEQVRBIiwibWlycm9yTXNwIiwibXNwcyIsIm1lcmdlZCIsImVuZG9yc2luZ09yZ3MiLCJlbmRvcnNpbmdPcmdhbml6YXRpb25zIiwic2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQiLCJ2IiwiY2hpbGRSZWJ1aWxkIiwiZ2V0RnJvbUNoaWxkcmVuIiwicmVzb2x2ZWRPcCIsInJlc29sdmVPcGVyYXRpb24iLCJoYXNJZCIsImRpcmVjdCIsImRlc2VyaWFsaXplZCIsInVwZGF0ZVByZWZpeCIsIlVQREFURSIsIkRFTEVURSIsImRvY3NPbmx5IiwidHJhbnNhY3Rpb25SZXN1bHQiLCJwYXJzZVJlY29yZCIsImlzTW9kZWwiLCJlbCIsImdldENsaWVudCIsIl9jbGllbnQiLCJHYXRld2F5IiwiZ2V0R2F0ZXdheSIsImdldENvbnRyYWN0TmFtZSIsIkNvbnRyYWN0IiwiY29udHJhY3ROYW1lIiwiZ2V0Q29udHJhY3QiLCJ0cmFuc2FjdGlvbiIsImFwaSIsInN1Ym1pdCIsInRyYW5zaWVudERhdGEiLCJnYXRld2F5IiwiY29udHJhY3QiLCJldmFsdWF0ZSIsInByb3Bvc2FsT3B0aW9ucyIsImFyZ3VtZW50cyIsImNsb3NlIiwic2hvdWxkVXNlTGVnYWN5R2F0ZXdheSIsInByZXBhcmVMZWdhY3lBcmdzIiwiYnVpbGRMZWdhY3lUcmFuc2llbnQiLCJyZXNvbHZlTGVnYWN5TXNwQ291bnQiLCJjb25maWd1cmVkIiwibGVnYWN5TXNwQ291bnQiLCJpc0Zpbml0ZSIsImZsb29yIiwicGlja0xlZ2FjeUNhbmRpZGF0ZXMiLCJjYW5kaWRhdGVzIiwiYXZhaWxhYmxlIiwicGlja2VkIiwiaWR4IiwicmFuZG9tIiwic2VsZWN0aW9uIiwic3BsaWNlIiwiYnVpbGRMZWdhY3lQZWVyQ29uZmlncyIsInBlZXJzIiwicGVlckVuZHBvaW50IiwicGVlckhvc3RBbGlhcyIsInRsc0NlcnQiLCJlbmRvcnNlcnMiLCJvcmciLCJleHRyYXMiLCJtc3BNYXAiLCJsZWdhY3lDb3VudCIsInNlbGVjdGlvbnMiLCJjaG9pY2UiLCJlbmRwb2ludCIsInN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyIsImZjbiIsInRyYW5zaWVudE1hcCIsInBlZXJDb25maWdzIiwibm9ybWFsaXplTGVnYWN5UGVlcnMiLCJpZGVudGl0eU1hdGVyaWFsIiwicmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwiLCJ3YWxsZXQiLCJXYWxsZXRzIiwibmV3SW5NZW1vcnlXYWxsZXQiLCJpZGVudGl0eUxhYmVsIiwiY29ubmVjdGlvblByb2ZpbGUiLCJidWlsZExlZ2FjeUNvbm5lY3Rpb25Qcm9maWxlIiwiTGVnYWN5R2F0ZXdheSIsImNvbm5lY3QiLCJkaXNjb3ZlcnkiLCJlbmFibGVkIiwiYXNMb2NhbGhvc3QiLCJzaG91bGRUcmVhdFBlZXJzQXNMb2NhbGhvc3QiLCJ0bHNJbmZvIiwibmV0d29yayIsImdldE5ldHdvcmsiLCJjaGFubmVsIiwiY2hhaW5jb2RlTmFtZSIsImNyZWF0ZVRyYW5zYWN0aW9uIiwic2V0VHJhbnNpZW50IiwicGVlciIsImdldENoYW5uZWwiLCJnZXRFbmRvcnNlciIsImVuZG9yc2VyIiwic2V0RW5kb3JzaW5nUGVlcnMiLCJkaXNjb25uZWN0IiwiZGVkdXBlZCIsIk1hcCIsImFkZFBlZXIiLCJoYXMiLCJyZWFkUGVtSW5wdXQiLCJjZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aCIsImtleUNlcnRPckRpcmVjdG9yeVBhdGgiLCJwZWVyRW50cmllcyIsImNoYW5uZWxQZWVycyIsIm9yZ3MiLCJ0bHNQZW0iLCJob3N0bmFtZSIsImV4dHJhY3RIb3N0IiwiZW5zdXJlR3JwY1VybCIsInRsc0NBQ2VydHMiLCJncnBjT3B0aW9ucyIsImhvc3RuYW1lT3ZlcnJpZGUiLCJlbmRvcnNpbmdQZWVyIiwiY2hhaW5jb2RlUXVlcnkiLCJsZWRnZXJRdWVyeSIsImV2ZW50U291cmNlIiwib3JnYW5pemF0aW9uIiwib3JnYW5pemF0aW9ucyIsIm9yZGVyZXJzIiwiY2hhbm5lbHMiLCJldmVyeSIsImlzTG9jYWxFbmRwb2ludCIsImhvc3QiLCJzYW5pdGl6ZWQiLCJpc0J1ZmZlciIsInRyaW1tZWQiLCJzdGF0cyIsInN0YXQiLCJjYXRjaCIsImlzRGlyZWN0b3J5IiwicmVhZEZzRmlsZSIsImVyciIsImxlZ2FjeUFyZ3MiLCJzaHV0ZG93biIsImNoYW5uZWxOYW1lIiwiZ2V0Q29ubmVjdGlvbiIsInBhdGhPckNlcnQiLCJyZWFkRmlsZVN5bmMiLCJ0bHNDcmVkZW50aWFscyIsImdycGMiLCJjcmVhdGVTc2wiLCJzaXplTGltaXQiLCJzaWduZXIiLCJldmFsdWF0ZU9wdGlvbnMiLCJkZWFkbGluZSIsImVuZG9yc2VPcHRpb25zIiwic3VibWl0T3B0aW9ucyIsImNvbW1pdFN0YXR1c09wdGlvbnMiLCJQcm94eSIsInRoaXNBcmciLCJhcmdBcnJheSIsIlJlZmxlY3QiLCJEaXNwYXRjaCIsIkdhdGV3YXlFcnJvciIsImRldGFpbHMiLCJFbmRvcnNlRXJyb3IiLCJCYWRSZXF1ZXN0RXJyb3IiLCJQYWdpbmdFcnJvciIsIk1pZ3JhdGlvbkVycm9yIiwiT2JzZXJ2ZXJFcnJvciIsIkZvcmJpZGRlbkVycm9yIiwiQ29ubmVjdGlvbkVycm9yIiwiZmluYWwiLCJEIiwiX2EiLCJkZWNvcmF0aW9uIiwic2V0Q3VycmVudCIsIkZhYnJpY0NsaWVudERpc3BhdGNoIiwibG9nZ2VkQXJncyIsIlNIVVRET1dOIiwibGlzdGVuaW5nU3RhY2siLCJwYXJzZVBheWxvYWQiLCJqc29uQnl0ZXMiLCJqc29uIiwib2JzZXJ2ZSIsIm9ic2VydmVyIiwidW5PYnNlcnZlIiwicmVmcmVzaCIsImhhbmRsZUV2ZW50cyIsImN0eEFyZyIsImNvcnJlbGF0aW9uSWQiLCJldnQiLCJldmVudE5hbWUiLCJtc3BFdmVudE9ubHkiLCJ0YXJnZXRNb2RlbCIsIm1vZGVsUmVmIiwib2JzZXJ2ZXJBcmdzIiwiZ2V0Q2hhaW5jb2RlRXZlbnRzIiwidG9XcmFwIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwicHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsImJ1bGtUb1NpbmdsZSIsInJlc3VsdEFyZ3MiLCJWRVJTSU9OIiwiUEFDS0FHRV9OQU1FIiwicmVnaXN0ZXJMaWJyYXJ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXQSxTQUFTQSx5QkFBeUJDO0lBRWhDLE1BQU1DLEtBQUtDLFFBQVE7SUFFbkIsTUFBTUMsT0FBT0QsUUFBUTtJQUNyQixNQUFNRSxVQUFrQkQsS0FBS0MsUUFBUUo7SUFDckMsSUFBSUMsR0FBR0ksV0FBV0QsVUFBVTtRQUMxQixPQUFPO0FBQ1Q7SUFDQUwseUJBQXlCSztJQUN6QkgsR0FBR0ssVUFBVUY7QUFDZjs7QUFFTSxTQUFVRyxxQkFDZEM7SUFFQSxPQUFPQyxnQkFBZ0IsRUFBQ0Q7QUFDMUI7O0FBRU0sU0FBVUUsd0JBQ2RGLEdBQ0FHO0lBRUEsTUFBTUMsUUFBUUMsY0FBYyxFQUFDTDtJQUM3QixNQUFNTSxVQUE0Q0gsU0FBUyxDQUFBO0lBQzNEQyxNQUFNRyxRQUFTQztRQUNiRixRQUFRRSxJQUFJQyxPQUFPRDs7SUFFckIsT0FBT0o7QUFDVDs7QUFFTSxTQUFVTSxjQUFjQztJQUU1QixNQUFNaEIsT0FBT0QsUUFBUTtJQUVyQixNQUFNa0IsWUFBVWxCLFFBQVFDLEtBQUtrQixLQUFLQyxRQUFRQyxPQUFP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