UNPKG

cdk-iam-floyd

Version:

AWS IAM policy statement generator with fluent interface for AWS CDK

650 lines 57.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Healthlake = void 0; const shared_1 = require("../../shared"); /** * Statement provider for service [healthlake](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awshealthlake.html). * * @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement */ class Healthlake extends shared_1.PolicyStatement { /** * Grants permission to cancel an on going FHIR Export job with Delete * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/devguide/export-datastore-rest.html */ toCancelFHIRExportJobWithDelete() { return this.to('CancelFHIRExportJobWithDelete'); } /** * Grants permission to allow customers to indicate to a Producer that the Consumer does not have any more changes to be made to the Attribution List * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/devguide/reference-fhir-operations-confirm-attribution-list.html */ toConfirmAttributionList() { return this.to('ConfirmAttributionList'); } /** * Grants permission to create a datastore that can ingest and export FHIR data * * Access Level: Write * * Possible conditions: * - .ifAwsResourceTag() * - .ifAwsRequestTag() * - .ifAwsTagKeys() * * https://docs.aws.amazon.com/healthlake/latest/APIReference/API_CreateFHIRDatastore.html */ toCreateFHIRDatastore() { return this.to('CreateFHIRDatastore'); } /** * Grants permission to create resource * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/devguide/crud-healthlake.html */ toCreateResource() { return this.to('CreateResource'); } /** * Grants permission to delete a datastore * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/APIReference/API_DeleteFHIRDatastore.html */ toDeleteFHIRDatastore() { return this.to('DeleteFHIRDatastore'); } /** * Grants permission to delete resource * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/devguide/crud-healthlake.html */ toDeleteResource() { return this.to('DeleteResource'); } /** * Grants permission to describe a FHIR Bulk Delete Job * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/devguide/reference-fhir-operations-bulk-delete.html */ toDescribeFHIRBulkDeleteJob() { return this.to('DescribeFHIRBulkDeleteJob'); } /** * Grants permission to describe a FHIR Bulk Member Match Job * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/devguide/reference-fhir-operations-bulk-member-match.html */ toDescribeFHIRBulkMemberMatchJob() { return this.to('DescribeFHIRBulkMemberMatchJob'); } /** * Grants permission to get the properties associated with the FHIR datastore, including the datastore ID, datastore ARN, datastore name, datastore status, created at, datastore type version, and datastore endpoint * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/APIReference/API_DescribeFHIRDatastore.html */ toDescribeFHIRDatastore() { return this.to('DescribeFHIRDatastore'); } /** * Grants permission to display the properties of a FHIR export job, including the ID, ARN, name, and the status of the datastore * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/APIReference/API_DescribeFHIRExportJob.html */ toDescribeFHIRExportJob() { return this.to('DescribeFHIRExportJob'); } /** * Grants permission to display the properties of a FHIR export job, including the ID, ARN, name, and the status of the datastore with Get * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/devguide/export-datastore-rest.html */ toDescribeFHIRExportJobWithGet() { return this.to('DescribeFHIRExportJobWithGet'); } /** * Grants permission to display the properties of a FHIR import job, including the ID, ARN, name, and the status of the datastore * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/APIReference/API_DescribeFHIRImportJob.html */ toDescribeFHIRImportJob() { return this.to('DescribeFHIRImportJob'); } /** * Grants permission to search and expand ValueSet resource * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/devguide/reference-fhir-operations-expand.html */ toExpandValueSetWithGet() { return this.to('ExpandValueSetWithGet'); } /** * Grants permission to search and expand ValueSet resource * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/devguide/reference-fhir-operations-expand.html */ toExpandValueSetWithPost() { return this.to('ExpandValueSetWithPost'); } /** * Grants permission to generate a clinical document resource * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/devguide/reference-fhir-operations-document.html */ toGenerateDocumentWithGet() { return this.to('GenerateDocumentWithGet'); } /** * Grants permission to generate a clinical document resource * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/devguide/reference-fhir-operations-document.html */ toGenerateDocumentWithPost() { return this.to('GenerateDocumentWithPost'); } /** * Grants permission to get the capabilities of a FHIR datastore * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/devguide/crud-healthlake.html */ toGetCapabilities() { return this.to('GetCapabilities'); } /** * Grants permission to access exported files from a FHIR Export job initiated with Get * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/devguide/export-datastore-rest.html */ toGetExportedFile() { return this.to('GetExportedFile'); } /** * Grants permission to read resource history * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/devguide/crud-healthlake.html */ toGetHistoryByResourceId() { return this.to('GetHistoryByResourceId'); } /** * Grants permission to inquire about the status of a prior authorization Claim * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/devguide/reference-fhir-operations-inquire.html */ toInquirePreAuthClaim() { return this.to('InquirePreAuthClaim'); } /** * Grants permission to list all FHIR datastores that are in the user's account, regardless of datastore status * * Access Level: List * * https://docs.aws.amazon.com/healthlake/latest/APIReference/API_ListFHIRDatastores.html */ toListFHIRDatastores() { return this.to('ListFHIRDatastores'); } /** * Grants permission to get a list of export jobs for the specified datastore * * Access Level: List * * https://docs.aws.amazon.com/healthlake/latest/APIReference/API_ListFHIRExportJobs.html */ toListFHIRExportJobs() { return this.to('ListFHIRExportJobs'); } /** * Grants permission to get a list of import jobs for the specified datastore * * Access Level: List * * https://docs.aws.amazon.com/healthlake/latest/APIReference/API_ListFHIRImportJobs.html */ toListFHIRImportJobs() { return this.to('ListFHIRImportJobs'); } /** * Grants permission to get a list of tags for the specified datastore * * Access Level: List * * https://docs.aws.amazon.com/healthlake/latest/APIReference/API_ListTagsForResource.html */ toListTagsForResource() { return this.to('ListTagsForResource'); } /** * Grants permission to retrieve Codes for a CodeSystem resource * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/devguide/reference-fhir-operations-lookup.html */ toLookupCodeSystemWithGet() { return this.to('LookupCodeSystemWithGet'); } /** * Grants permission to retrieve Codes for a CodeSystem resource * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/devguide/reference-fhir-operations-lookup.html */ toLookupCodeSystemWithPost() { return this.to('LookupCodeSystemWithPost'); } /** * Grants permission to attribute a member with a specific provider group * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/devguide/reference-fhir-operations-member-add.html */ toMemberAdd() { return this.to('MemberAdd'); } /** * Grants permission to enable cross-system patient matching * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/devguide/reference-fhir-operations-member-match.html */ toMemberMatch() { return this.to('MemberMatch'); } /** * Grants permission to remove a member from a group * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/devguide/reference-fhir-operations-member-remove.html */ toMemberRemove() { return this.to('MemberRemove'); } /** * Grants permission to patch a resource * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/devguide/managing-fhir-resources-patch.html */ toPatchResource() { return this.to('PatchResource'); } /** * Grants permission to bundle multiple resource operations * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/devguide/crud-healthlake.html */ toProcessBundle() { return this.to('ProcessBundle'); } /** * Grants permission to retrieve Questionnaire packages with dependency Library and ValueSet resources * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/devguide/reference-fhir-operations-questionnaire-package.html */ toQuestionnairePackage() { return this.to('QuestionnairePackage'); } /** * Grants permission to read resource * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/devguide/crud-healthlake.html */ toReadResource() { return this.to('ReadResource'); } /** * Grants permission to retrieve member attribution status * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/devguide/reference-fhir-operations-attribution-status.html */ toRetrieveAttributionStatus() { return this.to('RetrieveAttributionStatus'); } /** * Grants permission to search all resources related to a patient * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/devguide/search-healthlake.html */ toSearchEverything() { return this.to('SearchEverything'); } /** * Grants permission to search resources with GET method * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/devguide/search-healthlake.html */ toSearchWithGet() { return this.to('SearchWithGet'); } /** * Grants permission to search resources with POST method * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/devguide/search-healthlake.html */ toSearchWithPost() { return this.to('SearchWithPost'); } /** * Grants permission to begin a FHIR Bulk Delete Job * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/devguide/reference-fhir-operations-bulk-delete.html */ toStartFHIRBulkDeleteJob() { return this.to('StartFHIRBulkDeleteJob'); } /** * Grants permission to begin a FHIR Bulk Member Match Job * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/devguide/reference-fhir-operations-bulk-member-match.html */ toStartFHIRBulkMemberMatchJob() { return this.to('StartFHIRBulkMemberMatchJob'); } /** * Grants permission to begin a FHIR Export job * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/APIReference/API_StartFHIRExportJob.html */ toStartFHIRExportJob() { return this.to('StartFHIRExportJob'); } /** * Grants permission to begin a FHIR Export job with Get * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/devguide/export-datastore-rest.html */ toStartFHIRExportJobWithGet() { return this.to('StartFHIRExportJobWithGet'); } /** * Grants permission to begin a FHIR Export job with Post * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/devguide/export-datastore-rest.html */ toStartFHIRExportJobWithPost() { return this.to('StartFHIRExportJobWithPost'); } /** * Grants permission to begin a FHIR Import job * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/APIReference/API_StartFHIRImportJob.html */ toStartFHIRImportJob() { return this.to('StartFHIRImportJob'); } /** * Grants permission to submit a prior authorization Claim request * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/devguide/reference-fhir-operations-submit.html */ toSubmitPreAuthClaim() { return this.to('SubmitPreAuthClaim'); } /** * Grants permission to add tags to a datastore * * Access Level: Tagging * * Possible conditions: * - .ifAwsTagKeys() * - .ifAwsRequestTag() * - .ifAwsResourceTag() * * https://docs.aws.amazon.com/healthlake/latest/APIReference/API_TagResource.html */ toTagResource() { return this.to('TagResource'); } /** * Grants permission to remove tags associated with a datastore * * Access Level: Tagging * * Possible conditions: * - .ifAwsTagKeys() * * https://docs.aws.amazon.com/healthlake/latest/APIReference/API_UntagResource.html */ toUntagResource() { return this.to('UntagResource'); } /** * Grants permission to update resource * * Access Level: Write * * https://docs.aws.amazon.com/healthlake/latest/devguide/crud-healthlake.html */ toUpdateResource() { return this.to('UpdateResource'); } /** * Grants permission to validate a resource * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/devguide/reference-fhir-operations-validate.html */ toValidateResource() { return this.to('ValidateResource'); } /** * Grants permission to read version of a resource * * Access Level: Read * * https://docs.aws.amazon.com/healthlake/latest/devguide/crud-healthlake.html */ toVersionReadResource() { return this.to('VersionReadResource'); } /** * Adds a resource of type datastore to the statement * * https://docs.aws.amazon.com/healthlake/latest/APIReference/API_DatastoreProperties.html * * @param datastoreId - Identifier for the datastoreId. * @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() */ onDatastore(datastoreId, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:healthlake:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:datastore/fhir/${datastoreId}`); } /** * Filters access by the presence of tag key-value pairs in the request * * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag * * Applies to actions: * - .toCreateFHIRDatastore() * - .toTagResource() * * @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 the presence of tag key-value pairs attached to the resource * * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag * * Applies to actions: * - .toCreateFHIRDatastore() * - .toTagResource() * * Applies to resource types: * - datastore * * @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 presence of tag keys in the request * * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys * * Applies to actions: * - .toCreateFHIRDatastore() * - .toTagResource() * - .toUntagResource() * * @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'); } /** * Statement provider for service [healthlake](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awshealthlake.html). * */ constructor(props) { super(props); this.servicePrefix = 'healthlake'; this.accessLevelList = { Write: [ 'CancelFHIRExportJobWithDelete', 'ConfirmAttributionList', 'CreateFHIRDatastore', 'CreateResource', 'DeleteFHIRDatastore', 'DeleteResource', 'GenerateDocumentWithGet', 'GenerateDocumentWithPost', 'MemberAdd', 'MemberMatch', 'MemberRemove', 'PatchResource', 'ProcessBundle', 'RetrieveAttributionStatus', 'StartFHIRBulkDeleteJob', 'StartFHIRBulkMemberMatchJob', 'StartFHIRExportJob', 'StartFHIRExportJobWithGet', 'StartFHIRExportJobWithPost', 'StartFHIRImportJob', 'SubmitPreAuthClaim', 'UpdateResource' ], Read: [ 'DescribeFHIRBulkDeleteJob', 'DescribeFHIRBulkMemberMatchJob', 'DescribeFHIRDatastore', 'DescribeFHIRExportJob', 'DescribeFHIRExportJobWithGet', 'DescribeFHIRImportJob', 'ExpandValueSetWithGet', 'ExpandValueSetWithPost', 'GetCapabilities', 'GetExportedFile', 'GetHistoryByResourceId', 'InquirePreAuthClaim', 'LookupCodeSystemWithGet', 'LookupCodeSystemWithPost', 'QuestionnairePackage', 'ReadResource', 'SearchEverything', 'SearchWithGet', 'SearchWithPost', 'ValidateResource', 'VersionReadResource' ], List: [ 'ListFHIRDatastores', 'ListFHIRExportJobs', 'ListFHIRImportJobs', 'ListTagsForResource' ], Tagging: [ 'TagResource', 'UntagResource' ] }; } } exports.Healthlake = Healthlake; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRobGFrZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhlYWx0aGxha2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBQXlEO0FBR3pEOzs7O0dBSUc7QUFDSCxNQUFhLFVBQVcsU0FBUSx3QkFBZTtJQUc3Qzs7Ozs7O09BTUc7SUFDSSwrQkFBK0I7UUFDcEMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHdCQUF3QjtRQUM3QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSSxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGdCQUFnQjtRQUNyQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kscUJBQXFCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxnQkFBZ0I7UUFDckIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDJCQUEyQjtRQUNoQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZ0NBQWdDO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSx1QkFBdUI7UUFDNUIsT0FBTyxJQUFJLENBQUMs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O2dCQUNwQiwyQkFBMkI7Z0JBQzNCLDRCQUE0QjtnQkFDNUIsb0JBQW9CO2dCQUNwQixvQkFBb0I7Z0JBQ3BCLGdCQUFnQjthQUNqQjtZQUNELElBQUksRUFBRTtnQkFDSiwyQkFBMkI7Z0JBQzNCLGdDQUFnQztnQkFDaEMsdUJBQXVCO2dCQUN2Qix1QkFBdUI7Z0JBQ3ZCLDhCQUE4QjtnQkFDOUIsdUJBQXVCO2dCQUN2Qix1QkFBdUI7Z0JBQ3ZCLHdCQUF3QjtnQkFDeEIsaUJBQWlCO2dCQUNqQixpQkFBaUI7Z0JBQ2pCLHdCQUF3QjtnQkFDeEIscUJBQXFCO2dCQUNyQix5QkFBeUI7Z0JBQ3pCLDBCQUEwQjtnQkFDMUIsc0JBQXNCO2dCQUN0QixjQUFjO2dCQUNkLGtCQUFrQjtnQkFDbEIsZUFBZTtnQkFDZixnQkFBZ0I7Z0JBQ2hCLGtCQUFrQjtnQkFDbEIscUJBQXFCO2FBQ3RCO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLG9CQUFvQjtnQkFDcEIsb0JBQW9CO2dCQUNwQixvQkFBb0I7Z0JBQ3BCLHFCQUFxQjthQUN0QjtZQUNELE9BQU8sRUFBRTtnQkFDUCxhQUFhO2dCQUNiLGVBQWU7YUFDaEI7U0FDRixDQUFDO0lBK0VGLENBQUM7Q0FDRjtBQXJyQkQsZ0NBcXJCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjY2Vzc0xldmVsTGlzdCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hY2Nlc3MtbGV2ZWwnO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50LCBPcGVyYXRvciB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBhd3NfaWFtIGFzIGlhbSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG4vKipcbiAqIFN0YXRlbWVudCBwcm92aWRlciBmb3Igc2VydmljZSBbaGVhbHRobGFrZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3RfYXdzaGVhbHRobGFrZS5odG1sKS5cbiAqXG4gKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIEhlYWx0aGxha2UgZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICdoZWFsdGhsYWtlJztcblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2FuY2VsIGFuIG9uIGdvaW5nIEZISVIgRXhwb3J0IGpvYiB3aXRoIERlbGV0ZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhsYWtlL2xhdGVzdC9kZXZndWlkZS9leHBvcnQtZGF0YXN0b3JlLXJlc3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ2FuY2VsRkhJUkV4cG9ydEpvYldpdGhEZWxldGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NhbmNlbEZISVJFeHBvcnRKb2JXaXRoRGVsZXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWxsb3cgY3VzdG9tZXJzIHRvIGluZGljYXRlIHRvIGEgUHJvZHVjZXIgdGhhdCB0aGUgQ29uc3VtZXIgZG9lcyBub3QgaGF2ZSBhbnkgbW9yZSBjaGFuZ2VzIHRvIGJlIG1hZGUgdG8gdGhlIEF0dHJpYnV0aW9uIExpc3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRobGFrZS9sYXRlc3QvZGV2Z3VpZGUvcmVmZXJlbmNlLWZoaXItb3BlcmF0aW9ucy1jb25maXJtLWF0dHJpYnV0aW9uLWxpc3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ29uZmlybUF0dHJpYnV0aW9uTGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ29uZmlybUF0dHJpYnV0aW9uTGlzdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGRhdGFzdG9yZSB0aGF0IGNhbiBpbmdlc3QgYW5kIGV4cG9ydCBGSElSIGRhdGFcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGxha2UvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlRkhJUkRhdGFzdG9yZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVGSElSRGF0YXN0b3JlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVGSElSRGF0YXN0b3JlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGxha2UvbGF0ZXN0L2Rldmd1aWRlL2NydWQtaGVhbHRobGFrZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBkYXRhc3RvcmVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRobGFrZS9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVGSElSRGF0YXN0b3JlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUZISVJEYXRhc3RvcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUZISVJEYXRhc3RvcmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRobGFrZS9sYXRlc3QvZGV2Z3VpZGUvY3J1ZC1oZWFsdGhsYWtlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVJlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIGEgRkhJUiBCdWxrIERlbGV0ZSBKb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhsYWtlL2xhdGVzdC9kZXZndWlkZS9yZWZlcmVuY2UtZmhpci1vcGVyYXRpb25zLWJ1bGstZGVsZXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlRkhJUkJ1bGtEZWxldGVKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlRkhJUkJ1bGtEZWxldGVKb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBhIEZISVIgQnVsayBNZW1iZXIgTWF0Y2ggSm9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRobGFrZS9sYXRlc3QvZGV2Z3VpZGUvcmVmZXJlbmNlLWZoaXItb3BlcmF0aW9ucy1idWxrLW1lbWJlci1tYXRjaC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUZISVJCdWxrTWVtYmVyTWF0Y2hKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlRkhJUkJ1bGtNZW1iZXJNYXRjaEpvYicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgcHJvcGVydGllcyBhc3NvY2lhdGVkIHdpdGggdGhlIEZISVIgZGF0YXN0b3JlLCBpbmNsdWRpbmcgdGhlIGRhdGFzdG9yZSBJRCwgZGF0YXN0b3JlIEFSTiwgZGF0YXN0b3JlIG5hbWUsIGRhdGFzdG9yZSBzdGF0dXMsIGNyZWF0ZWQgYXQsIGRhdGFzdG9yZSB0eXBlIHZlcnNpb24sIGFuZCBkYXRhc3RvcmUgZW5kcG9pbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhsYWtlL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlRkhJUkRhdGFzdG9yZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUZISVJEYXRhc3RvcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlRkhJUkRhdGFzdG9yZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc3BsYXkgdGhlIHByb3BlcnRpZXMgb2YgYSBGSElSIGV4cG9ydCBqb2IsIGluY2x1ZGluZyB0aGUgSUQsIEFSTiwgbmFtZSwgYW5kIHRoZSBzdGF0dXMgb2YgdGhlIGRhdGFzdG9yZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGxha2UvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVGSElSRXhwb3J0Sm9iLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlRkhJUkV4cG9ydEpvYigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVGSElSRXhwb3J0Sm9iJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzcGxheSB0aGUgcHJvcGVydGllcyBvZiBhIEZISVIgZXhwb3J0IGpvYiwgaW5jbHVkaW5nIHRoZSBJRCwgQVJOLCBuYW1lLCBhbmQgdGhlIHN0YXR1cyBvZiB0aGUgZGF0YXN0b3JlIHdpdGggR2V0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRobGFrZS9sYXRlc3QvZGV2Z3VpZGUvZXhwb3J0LWRhdGFzdG9yZS1yZXN0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlRkhJUkV4cG9ydEpvYldpdGhHZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlRkhJUkV4cG9ydEpvYldpdGhHZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNwbGF5IHRoZSBwcm9wZXJ0aWVzIG9mIGEgRkhJUiBpbXBvcnQgam9iLCBpbmNsdWRpbmcgdGhlIElELCBBUk4sIG5hbWUsIGFuZCB0aGUgc3RhdHVzIG9mIHRoZSBkYXRhc3RvcmVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhsYWtlL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlRkhJUkltcG9ydEpvYi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUZISVJJbXBvcnRKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlRkhJUkltcG9ydEpvYicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlYXJjaCBhbmQgZXhwYW5kIFZhbHVlU2V0IHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRobGFrZS9sYXRlc3QvZGV2Z3VpZGUvcmVmZXJlbmNlLWZoaXItb3BlcmF0aW9ucy1leHBhbmQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRXhwYW5kVmFsdWVTZXRXaXRoR2V0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdFeHBhbmRWYWx1ZVNldFdpdGhHZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZWFyY2ggYW5kIGV4cGFuZCBWYWx1ZVNldCByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGxha2UvbGF0ZXN0L2Rldmd1aWRlL3JlZmVyZW5jZS1maGlyLW9wZXJhdGlvbnMtZXhwYW5kLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0V4cGFuZFZhbHVlU2V0V2l0aFBvc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0V4cGFuZFZhbHVlU2V0V2l0aFBvc3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZW5lcmF0ZSBhIGNsaW5pY2FsIGRvY3VtZW50IHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGxha2UvbGF0ZXN0L2Rldmd1aWRlL3JlZmVyZW5jZS1maGlyLW9wZXJhdGlvbnMtZG9jdW1lbnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2VuZXJhdGVEb2N1bWVudFdpdGhHZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dlbmVyYXRlRG9jdW1lbnRXaXRoR2V0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2VuZXJhdGUgYSBjbGluaWNhbCBkb2N1bWVudCByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhsYWtlL2xhdGVzdC9kZXZndWlkZS9yZWZlcmVuY2UtZmhpci1vcGVyYXRpb25zLWRvY3VtZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dlbmVyYXRlRG9jdW1lbnRXaXRoUG9zdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2VuZXJhdGVEb2N1bWVudFdpdGhQb3N0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHRoZSBjYXBhYmlsaXRpZXMgb2YgYSBGSElSIGRhdGFzdG9yZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGxha2UvbGF0ZXN0L2Rldmd1aWRlL2NydWQtaGVhbHRobGFrZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRDYXBhYmlsaXRpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldENhcGFiaWxpdGllcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFjY2VzcyBleHBvcnRlZCBmaWxlcyBmcm9tIGEgRkhJUiBFeHBvcnQgam9iIGluaXRpYXRlZCB3aXRoIEdldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGxha2UvbGF0ZXN0L2Rldmd1aWRlL2V4cG9ydC1kYXRhc3RvcmUtcmVzdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRFeHBvcnRlZEZpbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEV4cG9ydGVkRmlsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlYWQgcmVzb3VyY2UgaGlzdG9yeVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGxha2UvbGF0ZXN0L2Rldmd1aWRlL2NydWQtaGVhbHRobGFrZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRIaXN0b3J5QnlSZXNvdXJjZUlkKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRIaXN0b3J5QnlSZXNvdXJjZUlkJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW5xdWlyZSBhYm91dCB0aGUgc3RhdHVzIG9mIGEgcHJpb3IgYXV0aG9yaXphdGlvbiBDbGFpbVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGxha2UvbGF0ZXN0L2Rldmd1aWRlL3JlZmVyZW5jZS1maGlyLW9wZXJhdGlvbnMtaW5xdWlyZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9JbnF1aXJlUHJlQXV0aENsYWltKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdJbnF1aXJlUHJlQXV0aENsYWltJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbGwgRkhJUiBkYXRhc3RvcmVzIHRoYXQgYXJlIGluIHRoZSB1c2VyJ3MgYWNjb3VudCwgcmVnYXJkbGVzcyBvZiBkYXRhc3RvcmUgc3RhdHVzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRobGFrZS9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0RkhJUkRhdGFzdG9yZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEZISVJEYXRhc3RvcmVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RkhJUkRhdGFzdG9yZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBsaXN0IG9mIGV4cG9ydCBqb2JzIGZvciB0aGUgc3BlY2lmaWVkIGRhdGFzdG9yZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGxha2UvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEZISVJFeHBvcnRKb2JzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RGSElSRXhwb3J0Sm9icygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEZISVJFeHBvcnRKb2JzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGEgbGlzdCBvZiBpbXBvcnQgam9icyBmb3IgdGhlIHNwZWNpZmllZCBkYXRhc3RvcmVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhsYWtlL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RGSElSSW1wb3J0Sm9icy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0RkhJUkltcG9ydEpvYnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RGSElSSW1wb3J0Sm9icycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIGxpc3Qgb2YgdGFncyBmb3IgdGhlIHNwZWNpZmllZCBkYXRhc3RvcmVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhsYWtlL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RUYWdzRm9yUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFRhZ3NGb3JSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIENvZGVzIGZvciBhIENvZGVTeXN0ZW0gcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhsYWtlL2xhdGVzdC9kZXZndWlkZS9yZWZlcmVuY2UtZmhpci1vcGVyYXRpb25zLWxvb2t1cC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Mb29rdXBDb2RlU3lzdGVtV2l0aEdldCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTG9va3VwQ29kZVN5c3RlbVdpdGhHZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBDb2RlcyBmb3IgYSBDb2RlU3lzdGVtIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRobGFrZS9sYXRlc3QvZGV2Z3VpZGUvcmVmZXJlbmNlLWZoaXItb3BlcmF0aW9ucy1sb29rdXAuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTG9va3VwQ29kZVN5c3RlbVdpdGhQb3N0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMb29rdXBDb2RlU3lzdGVtV2l0aFBvc3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhdHRyaWJ1dGUgYSBtZW1iZXIgd2l0aCBhIHNwZWNpZmljIHByb3ZpZGVyIGdyb3VwXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGxha2UvbGF0ZXN0L2Rldmd1aWRlL3JlZmVyZW5jZS1maGlyLW9wZXJhdGlvbnMtbWVtYmVyLWFkZC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9NZW1iZXJBZGQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01lbWJlckFkZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGVuYWJsZSBjcm9zcy1zeXN0ZW0gcGF0aWVudCBtYXRjaGluZ1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhsYWtlL2xhdGVzdC9kZXZndWlkZS9yZWZlcmVuY2UtZmhpci1vcGVyYXRpb25zLW1lbWJlci1tYXRjaC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9NZW1iZXJNYXRjaCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTWVtYmVyTWF0Y2gnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZW1vdmUgYSBtZW1iZXIgZnJvbSBhIGdyb3VwXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGxha2UvbGF0ZXN0L2Rldmd1aWRlL3JlZmVyZW5jZS1maGlyLW9wZXJhdGlvbnMtbWVtYmVyLXJlbW92ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9NZW1iZXJSZW1vdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01lbWJlclJlbW92ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHBhdGNoIGEgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRobGFrZS9sYXRlc3QvZGV2Z3VpZGUvbWFuYWdpbmctZmhpci1yZXNvdXJjZXMtcGF0Y2guaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUGF0Y2hSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUGF0Y2hSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGJ1bmRsZSBtdWx0aXBsZSByZXNvdXJjZSBvcGVyYXRpb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGxha2UvbGF0ZXN0L2Rldmd1aWRlL2NydWQtaGVhbHRobGFrZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Qcm9jZXNzQnVuZGxlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQcm9jZXNzQnVuZGxlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgUXVlc3Rpb25uYWlyZSBwYWNrYWdlcyB3aXRoIGRlcGVuZGVuY3kgTGlicmFyeSBhbmQgVmFsdWVTZXQgcmVzb3VyY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRobGFrZS9sYXRlc3QvZGV2Z3VpZGUvcmVmZXJlbmNlLWZoaXItb3BlcmF0aW9ucy1xdWVzdGlvbm5haXJlLXBhY2thZ2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUXVlc3Rpb25uYWlyZVBhY2thZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1F1ZXN0aW9ubmFpcmVQYWNrYWdlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVhZCByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGxha2UvbGF0ZXN0L2Rldmd1aWRlL2NydWQtaGVhbHRobGFrZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9SZWFkUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1JlYWRSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIG1lbWJlciBhdHRyaWJ1dGlvbiBzdGF0dXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRobGFrZS9sYXRlc3QvZGV2Z3VpZGUvcmVmZXJlbmNlLWZoaXItb3BlcmF0aW9ucy1hdHRyaWJ1dGlvbi1zdGF0dXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmV0cmlldmVBdHRyaWJ1dGlvblN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmV0cmlldmVBdHRyaWJ1dGlvblN0YXR1cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlYXJjaCBhbGwgcmVzb3VyY2VzIHJlbGF0ZWQgdG8gYSBwYXRpZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRobGFrZS9sYXRlc3QvZGV2Z3VpZGUvc2VhcmNoLWhlYWx0aGxha2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU2VhcmNoRXZlcnl0aGluZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2VhcmNoRXZlcnl0aGluZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlYXJjaCByZXNvdXJjZXMgd2l0aCBHRVQgbWV0aG9kXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRobGFrZS9sYXRlc3QvZGV2Z3VpZGUvc2VhcmNoLWhlYWx0aGxha2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU2VhcmNoV2l0aEdldCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2VhcmNoV2l0aEdldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlYXJjaCByZXNvdXJjZXMgd2l0aCBQT1NUIG1ldGhvZFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGxha2UvbGF0ZXN0L2Rldmd1aWRlL3NlYXJjaC1oZWFsdGhsYWtlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1NlYXJjaFdpdGhQb3N0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZWFyY2hXaXRoUG9zdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGJlZ2luIGEgRkhJUiBCdWxrIERlbGV0ZSBKb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRobGFrZS9sYXRlc3QvZGV2Z3VpZGUvcmVmZXJlbmNlLWZoaXItb3BlcmF0aW9ucy1idWxrLWRlbGV0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydEZISVJCdWxrRGVsZXRlSm9iKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydEZISVJCdWxrRGVsZXRlSm9iJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYmVnaW4gYSBGSElSIEJ1bGsgTWVtYmVyIE1hdGNoIEpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhsYWtlL2xhdGVzdC9kZXZndWlkZS9yZWZlcmVuY2UtZmhpci1vcGVyYXRpb25zLWJ1bGstbWVtYmVyLW1hdGNoLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0RkhJUkJ1bGtNZW1iZXJNYXRjaEpvYigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RhcnRGSElSQnVsa01lbWJlck1hdGNoSm9iJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYmVnaW4gYSBGSElSIEV4cG9ydCBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRobGFrZS9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TdGFydEZISVJFeHBvcnRKb2IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRGSElSRXhwb3J0Sm9iKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydEZISVJFeHBvcnRKb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBiZWdpbiBhIEZISVIgRXhwb3J0IGpvYiB3aXRoIEdldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhsYWtlL2xhdGVzdC9kZXZndWlkZS9leHBvcnQtZGF0YXN0b3JlLXJlc3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRGSElSRXhwb3J0Sm9iV2l0aEdldCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RhcnRGSElSRXhwb3J0Sm9iV2l0aEdldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGJlZ2luIGEgRkhJUiBFeHBvcnQgam9iIHdpdGggUG9zdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhsYWtlL2xhdGVzdC9kZXZndWlkZS9leHBvcnQtZGF0YXN0b3JlLXJlc3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRGSElSRXhwb3J0Sm9iV2l0aFBvc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0RkhJUkV4cG9ydEpvYldpdGhQb3N0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYmVnaW4gYSBGSElSIEltcG9ydCBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRobGFrZS9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TdGFydEZISVJJbXBvcnRKb2IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRGSElSSW1wb3J0Sm9iKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydEZISVJJbXBvcnRKb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdWJtaXQgYSBwcmlvciBhdXRob3JpemF0aW9uIENsYWltIHJlcXVlc3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRobGFrZS9sYXRlc3QvZGV2Z3VpZGUvcmVmZXJlbmNlLWZoaXItb3BlcmF0aW9ucy1zdWJtaXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3VibWl0UHJlQXV0aENsYWltKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdWJtaXRQcmVBdXRoQ2xhaW0nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhZGQgdGFncyB0byBhIGRhdGFzdG9yZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFRhZ2dpbmdcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhsYWtlL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1RhZ1Jlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1RhZ1Jlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdUYWdSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlbW92ZSB0YWdzIGFzc29jaWF0ZWQgd2l0aCBhIGRhdGFzdG9yZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFRhZ2dpbmdcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGxha2UvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVW50YWdSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VbnRhZ1Jlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVbnRhZ1Jlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGxha2UvbGF0ZXN0L2Rldmd1aWRlL2NydWQtaGVhbHRobGFrZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMg