iam-floyd
Version:
AWS IAM policy statement generator with fluent interface
577 lines • 58.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.PaymentCryptography = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [payment-cryptography](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awspaymentcryptography.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class PaymentCryptography extends shared_1.PolicyStatement {
/**
* Statement provider for service [payment-cryptography](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awspaymentcryptography.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
constructor(sid) {
super(sid);
this.servicePrefix = 'payment-cryptography';
this.accessLevelList = {
Write: [
'CreateAlias',
'CreateKey',
'DecryptData',
'DeleteAlias',
'DeleteKey',
'EncryptData',
'ExportKey',
'GenerateCardValidationData',
'GenerateMac',
'GenerateMacEmvPinChange',
'GeneratePinData',
'ImportKey',
'ReEncryptData',
'RestoreKey',
'StartKeyUsage',
'StopKeyUsage',
'TranslatePinData',
'UpdateAlias',
'VerifyAuthRequestCryptogram',
'VerifyCardValidationData',
'VerifyMac',
'VerifyPinData'
],
Read: [
'GetAlias',
'GetKey',
'GetParametersForExport',
'GetParametersForImport',
'GetPublicKeyCertificate',
'ListTagsForResource'
],
List: [
'ListAliases',
'ListKeys'
],
Tagging: [
'TagResource',
'UntagResource'
]
};
}
/**
* Grants permission to create a user-friendly name for a Key
*
* Access Level: Write
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_CreateAlias.html
*/
toCreateAlias() {
return this.to('CreateAlias');
}
/**
* Grants permission to create a unique customer managed key in the caller's AWS account and region
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* Dependent actions:
* - payment-cryptography:TagResource
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_CreateKey.html
*/
toCreateKey() {
return this.to('CreateKey');
}
/**
* Grants permission to decrypt ciphertext data to plaintext using symmetric, asymmetric or DUKPT data encryption key
*
* Access Level: Write
*
* https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_DecryptData.html
*/
toDecryptData() {
return this.to('DecryptData');
}
/**
* Grants permission to delete the specified alias
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_DeleteAlias.html
*/
toDeleteAlias() {
return this.to('DeleteAlias');
}
/**
* Grants permission to schedule the deletion of a Key
*
* Access Level: Write
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_DeleteKey.html
*/
toDeleteKey() {
return this.to('DeleteKey');
}
/**
* Grants permission to encrypt plaintext data to ciphertext using symmetric, asymmetric or DUKPT data encryption key
*
* Access Level: Write
*
* https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_EncryptData.html
*/
toEncryptData() {
return this.to('EncryptData');
}
/**
* Grants permission to export a key from the service
*
* Access Level: Write
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_ExportKey.html
*/
toExportKey() {
return this.to('ExportKey');
}
/**
* Grants permission to generate card-related data using algorithms such as Card Verification Values (CVV/CVV2), Dynamic Card Verification Values (dCVV/dCVV2) or Card Security Codes (CSC) that check the validity of a magnetic stripe card
*
* Access Level: Write
*
* https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_GenerateCardValidationData.html
*/
toGenerateCardValidationData() {
return this.to('GenerateCardValidationData');
}
/**
* Grants permission to generate a MAC (Message Authentication Code) cryptogram
*
* Access Level: Write
*
* https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_GenerateMac.html
*/
toGenerateMac() {
return this.to('GenerateMac');
}
/**
* Grants permission to generate a MAC (Message Authentication Code) cryptogram
*
* Access Level: Write
*
* https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_GenerateMacEmvPinChange.html
*/
toGenerateMacEmvPinChange() {
return this.to('GenerateMacEmvPinChange');
}
/**
* Grants permission to generate pin-related data such as PIN, PIN Verification Value (PVV), PIN Block and PIN Offset during new card issuance or card re-issuance
*
* Access Level: Write
*
* https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_GeneratePinData.html
*/
toGeneratePinData() {
return this.to('GeneratePinData');
}
/**
* Grants permission to return the keyArn associated with an aliasName
*
* Access Level: Read
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_GetAlias.html
*/
toGetAlias() {
return this.to('GetAlias');
}
/**
* Grants permission to return the detailed information about the specified key
*
* Access Level: Read
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_GetKey.html
*/
toGetKey() {
return this.to('GetKey');
}
/**
* Grants permission to get the export token and the signing key certificate to initiate a TR-34 key export
*
* Access Level: Read
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_GetParametersForExport.html
*/
toGetParametersForExport() {
return this.to('GetParametersForExport');
}
/**
* Grants permission to get the import token and the wrapping key certificate to initiate a TR-34 key import
*
* Access Level: Read
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_GetParametersForImport.html
*/
toGetParametersForImport() {
return this.to('GetParametersForImport');
}
/**
* Grants permission to return the public key from a key of class PUBLIC_KEY
*
* Access Level: Read
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_GetPublicKeyCertificate.html
*/
toGetPublicKeyCertificate() {
return this.to('GetPublicKeyCertificate');
}
/**
* Grants permission to imports keys and public key certificates
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* Dependent actions:
* - payment-cryptography:TagResource
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_ImportKey.html
*/
toImportKey() {
return this.to('ImportKey');
}
/**
* Grants permission to return a list of aliases created for all keys in the caller's AWS account and Region
*
* Access Level: List
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_ListAliases.html
*/
toListAliases() {
return this.to('ListAliases');
}
/**
* Grants permission to return a list of keys created in the caller's AWS account and Region
*
* Access Level: List
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_ListKeys.html
*/
toListKeys() {
return this.to('ListKeys');
}
/**
* Grants permission to return a list of tags created in the caller's AWS account and Region
*
* Access Level: Read
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_ListTagsForResource.html
*/
toListTagsForResource() {
return this.to('ListTagsForResource');
}
/**
* Grants permission to re-encrypt ciphertext using DUKPT, Symmetric and Asymmetric Data Encryption Keys
*
* Access Level: Write
*
* https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_ReEncryptData.html
*/
toReEncryptData() {
return this.to('ReEncryptData');
}
/**
* Grants permission to cancel a scheduled key deletion if at any point during the waiting period a Key needs to be revived
*
* Access Level: Write
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_RestoreKey.html
*/
toRestoreKey() {
return this.to('RestoreKey');
}
/**
* Grants permission to enable a disabled Key
*
* Access Level: Write
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_StartKeyUsage.html
*/
toStartKeyUsage() {
return this.to('StartKeyUsage');
}
/**
* Grants permission to disable an enabled Key
*
* Access Level: Write
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_StopKeyUsage.html
*/
toStopKeyUsage() {
return this.to('StopKeyUsage');
}
/**
* Grants permission to add or overwrites one or more tags for the specified resource
*
* Access Level: Tagging
*
* Possible conditions:
* - .ifAwsTagKeys()
* - .ifAwsRequestTag()
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_TagResource.html
*/
toTagResource() {
return this.to('TagResource');
}
/**
* Grants permission to translate encrypted PIN block from and to ISO 9564 formats 0,1,3,4
*
* Access Level: Write
*
* https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_TranslatePinData.html
*/
toTranslatePinData() {
return this.to('TranslatePinData');
}
/**
* Grants permission to remove the specified tag or tags from the specified resource
*
* Access Level: Tagging
*
* Possible conditions:
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_UntagResource.html
*/
toUntagResource() {
return this.to('UntagResource');
}
/**
* Grants permission to change the key to which an alias is assigned, or unassign it from its current key
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_UpdateAlias.html
*/
toUpdateAlias() {
return this.to('UpdateAlias');
}
/**
* Grants permission to verify Authorization Request Cryptogram (ARQC) for a EMV chip payment card authorization
*
* Access Level: Write
*
* https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_VerifyAuthRequestCryptogram.html
*/
toVerifyAuthRequestCryptogram() {
return this.to('VerifyAuthRequestCryptogram');
}
/**
* Grants permission to verify card-related validation data using algorithms such as Card Verification Values (CVV/CVV2), Dynamic Card Verification Values (dCVV/dCVV2) and Card Security Codes (CSC)
*
* Access Level: Write
*
* https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_VerifyCardValidationData.html
*/
toVerifyCardValidationData() {
return this.to('VerifyCardValidationData');
}
/**
* Grants permission to verify MAC (Message Authentication Code) of input data against a provided MAC
*
* Access Level: Write
*
* https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_VerifyMac.html
*/
toVerifyMac() {
return this.to('VerifyMac');
}
/**
* Grants permission to verify pin-related data such as PIN and PIN Offset using algorithms including VISA PVV and IBM3624
*
* Access Level: Write
*
* https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_VerifyPinData.html
*/
toVerifyPinData() {
return this.to('VerifyPinData');
}
/**
* Adds a resource of type key to the statement
*
* @param keyId - Identifier for the keyId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
* - .ifResourceAliases()
*/
onKey(keyId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:payment-cryptography:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:key/${keyId}`);
}
/**
* Adds a resource of type alias to the statement
*
* @param alias - Identifier for the alias.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifResourceAliases()
*/
onAlias(alias, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:payment-cryptography:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:alias/${alias}`);
}
/**
* Filters access by both the key and value of the tag in the request for the specified operation
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag
*
* Applies to actions:
* - .toCreateKey()
* - .toDeleteAlias()
* - .toGetAlias()
* - .toImportKey()
* - .toTagResource()
* - .toUpdateAlias()
*
* @param tagKey The tag key to check
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAwsRequestTag(tagKey, value, operator) {
return this.if(`aws:RequestTag/${tagKey}`, value, operator ?? 'StringLike');
}
/**
* Filters access by tags assigned to a key for the specified operation
*
* https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/security_iam_service-with-iam.html#security_iam_service-with-iam-tags
*
* Applies to resource types:
* - key
*
* @param tagKey The tag key to check
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAwsResourceTag(tagKey, value, operator) {
return this.if(`aws:ResourceTag/${tagKey}`, value, operator ?? 'StringLike');
}
/**
* Filters access by the tag keys in the request for the specified operation
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys
*
* Applies to actions:
* - .toCreateKey()
* - .toDeleteAlias()
* - .toGetAlias()
* - .toImportKey()
* - .toTagResource()
* - .toUntagResource()
* - .toUpdateAlias()
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAwsTagKeys(value, operator) {
return this.if(`aws:TagKeys`, value, operator ?? 'StringLike');
}
/**
* Filters access by the CertificateAuthorityPublicKeyIdentifier specified in the request or the ImportKey, and ExportKey operations
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifCertificateAuthorityPublicKeyIdentifier(value, operator) {
return this.if(`CertificateAuthorityPublicKeyIdentifier`, value, operator ?? 'StringLike');
}
/**
* Filters access by the type of key material being imported [RootCertificatePublicKey, TrustedCertificatePublicKey, Tr34KeyBlock, Tr31KeyBlock] for the ImportKey operation
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifImportKeyMaterial(value, operator) {
return this.if(`ImportKeyMaterial`, value, operator ?? 'StringLike');
}
/**
* Filters access by KeyAlgorithm specified in the request for the CreateKey operation
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifKeyAlgorithm(value, operator) {
return this.if(`KeyAlgorithm`, value, operator ?? 'StringLike');
}
/**
* Filters access by KeyClass specified in the request for the CreateKey operation
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifKeyClass(value, operator) {
return this.if(`KeyClass`, value, operator ?? 'StringLike');
}
/**
* Filters access by KeyClass specified in the request or associated with a key for the CreateKey operation
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifKeyUsage(value, operator) {
return this.if(`KeyUsage`, value, operator ?? 'StringLike');
}
/**
* Filters access by aliases in the request for the specified operation
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifRequestAlias(value, operator) {
return this.if(`RequestAlias`, value, operator ?? 'StringLike');
}
/**
* Filters access by aliases associated with a key for the specified operation
*
* Applies to resource types:
* - key
* - alias
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifResourceAliases(value, operator) {
return this.if(`ResourceAliases`, value, operator ?? 'StringLike');
}
/**
* Filters access by the WrappingKeyIdentifier specified in the request for the ImportKey, and ExportKey operations
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifWrappingKeyIdentifier(value, operator) {
return this.if(`WrappingKeyIdentifier`, value, operator ?? 'StringLike');
}
}
exports.PaymentCryptography = PaymentCryptography;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudGNyeXB0b2dyYXBoeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBheW1lbnRjcnlwdG9ncmFwaHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBQXlEO0FBRXpEOzs7O0dBSUc7QUFDSCxNQUFhLG1CQUFvQixTQUFRLHdCQUFlO0lBR3REOzs7O09BSUc7SUFDSCxZQUFZLEdBQVk7UUFDdEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBUk4sa0JBQWEsR0FBRyxzQkFBc0IsQ0FBQztRQTRZcEMsb0JBQWUsR0FBb0I7WUFDM0MsS0FBSyxFQUFFO2dCQUNMLGFBQWE7Z0JBQ2IsV0FBVztnQkFDWCxhQUFhO2dCQUNiLGFBQWE7Z0JBQ2IsV0FBVztnQkFDWCxhQUFhO2dCQUNiLFdBQVc7Z0JBQ1gsNEJBQTRCO2dCQUM1QixhQUFhO2dCQUNiLHlCQUF5QjtnQkFDekIsaUJBQWlCO2dCQUNqQixXQUFXO2dCQUNYLGVBQWU7Z0JBQ2YsWUFBWTtnQkFDWixlQUFlO2dCQUNmLGNBQWM7Z0JBQ2Qsa0JBQWtCO2dCQUNsQixhQUFhO2dCQUNiLDZCQUE2QjtnQkFDN0IsMEJBQTBCO2dCQUMxQixXQUFXO2dCQUNYLGVBQWU7YUFDaEI7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osVUFBVTtnQkFDVixRQUFRO2dCQUNSLHdCQUF3QjtnQkFDeEIsd0JBQXdCO2dCQUN4Qix5QkFBeUI7Z0JBQ3pCLHFCQUFxQjthQUN0QjtZQUNELElBQUksRUFBRTtnQkFDSixhQUFhO2dCQUNiLFVBQVU7YUFDWDtZQUNELE9BQU8sRUFBRTtnQkFDUCxhQUFhO2dCQUNiLGVBQWU7YUFDaEI7U0FDRixDQUFDO0lBNWFGLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNJLFdBQVc7UUFDaEIsT0FBTyxJQUFJ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O1FBQ25GLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLEVBQUUsUUFBUSxJQUFJLFlBQVksQ0FBQyxDQUFDO0lBQzNFLENBQUM7Q0FDRjtBQXBtQkQsa0RBb21CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjY2Vzc0xldmVsTGlzdCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hY2Nlc3MtbGV2ZWwnO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50LCBPcGVyYXRvciB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5cbi8qKlxuICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFtwYXltZW50LWNyeXB0b2dyYXBoeV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3RfYXdzcGF5bWVudGNyeXB0b2dyYXBoeS5odG1sKS5cbiAqXG4gKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIFBheW1lbnRDcnlwdG9ncmFwaHkgZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICdwYXltZW50LWNyeXB0b2dyYXBoeSc7XG5cbiAgLyoqXG4gICAqIFN0YXRlbWVudCBwcm92aWRlciBmb3Igc2VydmljZSBbcGF5bWVudC1jcnlwdG9ncmFwaHldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2F3c3BheW1lbnRjcnlwdG9ncmFwaHkuaHRtbCkuXG4gICAqXG4gICAqIEBwYXJhbSBzaWQgW1NJRF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19zaWQuaHRtbCkgb2YgdGhlIHN0YXRlbWVudFxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2lkPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSB1c2VyLWZyaWVuZGx5IG5hbWUgZm9yIGEgS2V5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUFsaWFzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUFsaWFzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVBbGlhcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHVuaXF1ZSBjdXN0b21lciBtYW5hZ2VkIGtleSBpbiB0aGUgY2FsbGVyJ3MgQVdTIGFjY291bnQgYW5kIHJlZ2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIHBheW1lbnQtY3J5cHRvZ3JhcGh5OlRhZ1Jlc291cmNlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVLZXkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlS2V5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVLZXknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWNyeXB0IGNpcGhlcnRleHQgZGF0YSB0byBwbGFpbnRleHQgdXNpbmcgc3ltbWV0cmljLCBhc3ltbWV0cmljIG9yIERVS1BUIGRhdGEgZW5jcnlwdGlvbiBrZXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0RhdGFBUElSZWZlcmVuY2UvQVBJX0RlY3J5cHREYXRhLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlY3J5cHREYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWNyeXB0RGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSB0aGUgc3BlY2lmaWVkIGFsaWFzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUFsaWFzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUFsaWFzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVBbGlhcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNjaGVkdWxlIHRoZSBkZWxldGlvbiBvZiBhIEtleVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVLZXkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlS2V5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVLZXknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBlbmNyeXB0IHBsYWludGV4dCBkYXRhIHRvIGNpcGhlcnRleHQgdXNpbmcgc3ltbWV0cmljLCBhc3ltbWV0cmljIG9yIERVS1BUIGRhdGEgZW5jcnlwdGlvbiBrZXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0RhdGFBUElSZWZlcmVuY2UvQVBJX0VuY3J5cHREYXRhLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0VuY3J5cHREYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdFbmNyeXB0RGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGV4cG9ydCBhIGtleSBmcm9tIHRoZSBzZXJ2aWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0V4cG9ydEtleS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9FeHBvcnRLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0V4cG9ydEtleScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdlbmVyYXRlIGNhcmQtcmVsYXRlZCBkYXRhIHVzaW5nIGFsZ29yaXRobXMgc3VjaCBhcyBDYXJkIFZlcmlmaWNhdGlvbiBWYWx1ZXMgKENWVi9DVlYyKSwgRHluYW1pYyBDYXJkIFZlcmlmaWNhdGlvbiBWYWx1ZXMgKGRDVlYvZENWVjIpIG9yIENhcmQgU2VjdXJpdHkgQ29kZXMgKENTQykgdGhhdCBjaGVjayB0aGUgdmFsaWRpdHkgb2YgYSBtYWduZXRpYyBzdHJpcGUgY2FyZFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvRGF0YUFQSVJlZmVyZW5jZS9BUElfR2VuZXJhdGVDYXJkVmFsaWRhdGlvbkRhdGEuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2VuZXJhdGVDYXJkVmFsaWRhdGlvbkRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dlbmVyYXRlQ2FyZFZhbGlkYXRpb25EYXRhJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2VuZXJhdGUgYSBNQUMgKE1lc3NhZ2UgQXV0aGVudGljYXRpb24gQ29kZSkgY3J5cHRvZ3JhbVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvRGF0YUFQSVJlZmVyZW5jZS9BUElfR2VuZXJhdGVNYWMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2VuZXJhdGVNYWMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dlbmVyYXRlTWFjJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2VuZXJhdGUgYSBNQUMgKE1lc3NhZ2UgQXV0aGVudGljYXRpb24gQ29kZSkgY3J5cHRvZ3JhbVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvRGF0YUFQSVJlZmVyZW5jZS9BUElfR2VuZXJhdGVNYWNFbXZQaW5DaGFuZ2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2VuZXJhdGVNYWNFbXZQaW5DaGFuZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dlbmVyYXRlTWFjRW12UGluQ2hhbmdlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2VuZXJhdGUgcGluLXJlbGF0ZWQgZGF0YSBzdWNoIGFzIFBJTiwgUElOIFZlcmlmaWNhdGlvbiBWYWx1ZSAoUFZWKSwgUElOIEJsb2NrIGFuZCBQSU4gT2Zmc2V0IGR1cmluZyBuZXcgY2FyZCBpc3N1YW5jZSBvciBjYXJkIHJlLWlzc3VhbmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9EYXRhQVBJUmVmZXJlbmNlL0FQSV9HZW5lcmF0ZVBpbkRhdGEuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2VuZXJhdGVQaW5EYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZW5lcmF0ZVBpbkRhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gdGhlIGtleUFybiBhc3NvY2lhdGVkIHdpdGggYW4gYWxpYXNOYW1lXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0QWxpYXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0QWxpYXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEFsaWFzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIHRoZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3BlY2lmaWVkIGtleVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldEtleS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEtleScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgZXhwb3J0IHRva2VuIGFuZCB0aGUgc2lnbmluZyBrZXkgY2VydGlmaWNhdGUgdG8gaW5pdGlhdGUgYSBUUi0zNCBrZXkgZXhwb3J0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0UGFyYW1ldGVyc0ZvckV4cG9ydC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRQYXJhbWV0ZXJzRm9yRXhwb3J0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRQYXJhbWV0ZXJzRm9yRXhwb3J0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHRoZSBpbXBvcnQgdG9rZW4gYW5kIHRoZSB3cmFwcGluZyBrZXkgY2VydGlmaWNhdGUgdG8gaW5pdGlhdGUgYSBUUi0zNCBrZXkgaW1wb3J0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0UGFyYW1ldGVyc0ZvckltcG9ydC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRQYXJhbWV0ZXJzRm9ySW1wb3J0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRQYXJhbWV0ZXJzRm9ySW1wb3J0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIHRoZSBwdWJsaWMga2V5IGZyb20gYSBrZXkgb2YgY2xhc3MgUFVCTElDX0tFWVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFB1YmxpY0tleUNlcnRpZmljYXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFB1YmxpY0tleUNlcnRpZmljYXRlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRQdWJsaWNLZXlDZXJ0aWZpY2F0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGltcG9ydHMga2V5cyBhbmQgcHVibGljIGtleSBjZXJ0aWZpY2F0ZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBwYXltZW50LWNyeXB0b2dyYXBoeTpUYWdSZXNvdXJjZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfSW1wb3J0S2V5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0ltcG9ydEtleSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnSW1wb3J0S2V5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGEgbGlzdCBvZiBhbGlhc2VzIGNyZWF0ZWQgZm9yIGFsbCBrZXlzIGluIHRoZSBjYWxsZXIncyBBV1MgYWNjb3VudCBhbmQgUmVnaW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEFsaWFzZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEFsaWFzZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RBbGlhc2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGEgbGlzdCBvZiBrZXlzIGNyZWF0ZWQgaW4gdGhlIGNhbGxlcidzIEFXUyBhY2NvdW50IGFuZCBSZWdpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0S2V5cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0S2V5cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEtleXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gYSBsaXN0IG9mIHRhZ3MgY3JlYXRlZCBpbiB0aGUgY2FsbGVyJ3MgQVdTIGFjY291bnQgYW5kIFJlZ2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RUYWdzRm9yUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFRhZ3NGb3JSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlLWVuY3J5cHQgY2lwaGVydGV4dCB1c2luZyBEVUtQVCwgU3ltbWV0cmljIGFuZCBBc3ltbWV0cmljIERhdGEgRW5jcnlwdGlvbiBLZXlzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9EYXRhQVBJUmVmZXJlbmNlL0FQSV9SZUVuY3J5cHREYXRhLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1JlRW5jcnlwdERhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1JlRW5jcnlwdERhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjYW5jZWwgYSBzY2hlZHVsZWQga2V5IGRlbGV0aW9uIGlmIGF0IGFueSBwb2ludCBkdXJpbmcgdGhlIHdhaXRpbmcgcGVyaW9kIGEgS2V5IG5lZWRzIHRvIGJlIHJldml2ZWRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVzdG9yZUtleS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9SZXN0b3JlS2V5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZXN0b3JlS2V5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZW5hYmxlIGEgZGlzYWJsZWQgS2V5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1N0YXJ0S2V5VXNhZ2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRLZXlVc2FnZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RhcnRLZXlVc2FnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2FibGUgYW4gZW5hYmxlZCBLZXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU3RvcEtleVVzYWdlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0b3BLZXlVc2FnZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RvcEtleVVzYWdlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWRkIG9yIG92ZXJ3cml0ZXMgb25lIG9yIG1vcmUgdGFncyBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFRhZ2dpbmdcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1RhZ1Jlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1RhZ1Jlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdUYWdSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHRyYW5zbGF0ZSBlbmNyeXB0ZWQgUElOIGJsb2NrIGZyb20gYW5kIHRvIElTTyA5NTY0IGZvcm1hdHMgMCwxLDMsNFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvRGF0YUFQSVJlZmVyZW5jZS9BUElfVHJhbnNsYXRlUGluRGF0YS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9UcmFuc2xhdGVQaW5EYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdUcmFuc2xhdGVQaW5EYXRhJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVtb3ZlIHRoZSBzcGVjaWZpZWQgdGFnIG9yIHRhZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZ1xuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVW50YWdSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VbnRhZ1Jlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVbnRhZ1Jlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2hhbmdlIHRoZSBrZXkgdG8gd2hpY2ggYW4gYWxpYXMgaXMgYXNzaWduZWQsIG9yIHVuYXNzaWduIGl0IGZyb20gaXRzIGN1cnJlbnQga2V5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZUFsaWFzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUFsaWFzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVBbGlhcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHZlcmlmeSBBdXRob3JpemF0aW9uIFJlcXVlc3QgQ3J5cHRvZ3JhbSAoQVJRQykgZm9yIGEgRU1WIGNoaXAgcGF5bWVudCBjYXJkIGF1dGhvcml6YXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0RhdGFBUElSZWZlcmVuY2UvQVBJX1ZlcmlmeUF1dGhSZXF1ZXN0Q3J5cHRvZ3JhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9WZXJpZnlBdXRoUmVxdWVzdENyeXB0b2dyYW0oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1ZlcmlmeUF1dGhSZXF1ZXN0Q3J5cHRvZ3JhbScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHZlcmlmeSBjYXJkLXJlbGF0ZWQgdmFsaWRhdGlvbiBkYXRhIHVzaW5nIGFsZ29yaXRobXMgc3VjaCBhcyBDYXJkIFZlcmlmaWNhdGlvbiBWYWx1ZXMgKENWVi9DVlYyKSwgRHluYW1pYyBDYXJkIFZlcmlmaWNhdGlvbiBWYWx1ZXMgKGRDVlYvZENWVjIpIGFuZCBDYXJkIFNlY3VyaXR5IENvZGVzIChDU0MpXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9EYXRhQVBJUmVmZXJlbmNlL0FQSV9WZXJpZnlDYXJkVmFsaWRhdGlvbkRhdGEuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVmVyaWZ5Q2FyZFZhbGlkYXRpb25EYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdWZXJpZnlDYXJkVmFsaWRhdGlvbkRhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB2ZXJpZnkgTUFDIChNZXNzYWdlIEF1dGhlbnRpY2F0aW9uIENvZGUpIG9mIGlucHV0IGRhdGEgYWdhaW5zdCBhIHByb3ZpZGVkIE1BQ1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvRGF0YUFQSVJlZmVyZW5jZS9BUElfVmVyaWZ5TWFjLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1ZlcmlmeU1hYygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVmVyaWZ5TWFjJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdmVyaWZ5IHBpbi1yZWxhdGVkIGRhdGEgc3VjaCBhcyBQSU4gYW5kIFBJTiBPZmZzZXQgdXNpbmcgYWxnb3JpdGhtcyBpbmNsdWRpbmcgVklTQSBQVlYgYW5kIElCTTM2MjRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0RhdGFBUElSZWZlcmVuY2UvQVBJX1ZlcmlmeVBpbkRhdGEuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVmVyaWZ5UGluRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVmVyaWZ5UGluRGF0YScpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFjY2Vzc0xldmVsTGlzdDogQWNjZXNzTGV2ZWxMaXN0ID0ge1xuICAgIFdyaXRlOiBbXG4gICAgICAnQ3JlYXRlQWxpYXMnLFxuICAgICAgJ0NyZWF0ZUtleScsXG4gICAgICAnRGVjcnlwdERhdGEnLFxuICAgICAgJ0RlbGV0ZUFsaWFzJyxcbiAgICAgICdEZWxldGVLZXknLFxuICAgICAgJ0VuY3J5cHREYXRhJyxcbiAgICAgICdFeHBvcnRLZXknLFxuICAgICAgJ0dlbmVyYXRlQ2FyZFZhbGlkYXRpb25EYXRhJyxcbiAgICAgICdHZW5lcmF0ZU1hYycsXG4gICAgICAnR2VuZXJhdGVNYWNFbXZQaW5DaGFuZ2UnLFxuICAgICAgJ0dlbmVyYXRlUGluRGF0YScsXG4gICAgICAnSW1wb3J0S2V5JyxcbiAgICAgICdSZUVuY3J5cHREYXRhJyxcbiAgICAgICdSZXN0b3JlS2V5JyxcbiAgICAgICdTdGFydEtleVVzYWdlJyxcbiAgICAgICdTdG9wS2V5VXNhZ2UnLFxuICAgICAgJ1RyYW5zbGF0ZVBpbkRhdGEnLFxuICAgICAgJ1VwZGF0ZUFsaWFzJyxcbiAgICAgICdWZXJpZnlBdXRoUmVxdWVzdENyeXB0b2dyYW0nLFxuICAgICAgJ1ZlcmlmeUNhcmRWYWxpZGF0aW9uRGF0YScsXG4gICAgICAnVmVyaWZ5TWFjJyxcbiAgICAgICdWZXJpZnlQaW5EYXRhJ1xuICAgIF0sXG4gICAgUmVhZDogW1xuICAgICAgJ0dldEFsaWFzJyxcbiAgICAgICdHZXRLZXknLFxuICAgICAgJ0dldFBhcmFtZXRlcnNGb3JFeHBvcnQnLFxuICAgICAgJ0dldFBhcmFtZXRlcnNGb3JJbXBvcnQnLFxuICAgICAgJ0dldFB1YmxpY0tleUNlcnRpZmljYXRlJyxcbiAgICAgICdMaXN0VGFnc0ZvclJlc291cmNlJ1xuICAgIF0sXG4gICAgTGlzdDogW1xuICAgICAgJ0xpc3RBbGlhc2VzJyxcbiAgICAgICdMaXN0S2V5cydcbiAgICBdLFxuICAgIFRhZ2dpbmc6IFtcbiAgICAgICdUYWdSZXNvdXJjZScsXG4gICAgICAnVW50YWdSZXNvdXJjZSdcbiAgICBdXG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGtleSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSBrZXlJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBrZXlJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZlJlc291cmNlQWxpYXNlcygpXG4gICAqL1xuICBwdWJsaWMgb25LZXkoa2V5SWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpwYXltZW50LWNyeXB0b2dyYXBoeTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06a2V5LyR7IGtleUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBhbGlhcyB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSBhbGlhcyAtIElkZW50aWZpZXIgZm9yIHRoZSBhbGlhcy5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVzb3VyY2VBbGlhc2VzKClcbiAgICovXG4gIHB1YmxpYyBvbkFsaWFzKGFsaWFzOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06cGF5bWVudC1jcnlwdG9ncmFwaHk6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmFsaWFzLyR7IGFsaWFzIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSBib3RoIHRoZSBrZXkgYW5kIHZhbHVlIG9mIHRoZSB0YWcgaW4gdGhlIHJlcXVlc3QgZm9yIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfY29uZGl0aW9uLWtleXMuaHRtbCNjb25kaXRpb24ta2V5cy1yZXF1ZXN0dGFnXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVLZXkoKVxuICAgKiAtIC50b0RlbGV0ZUFsaWFzKClcbiAgICogLSAudG9HZXRBbGlhcygpXG4gICAqIC0gLnRvSW1wb3J0S2V5KClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVXBkYXRlQWxpYXMoKVxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9u