UNPKG

cdk-iam-floyd

Version:

AWS IAM policy statement generator with fluent interface for AWS CDK

686 lines 67.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.HealthAgent = void 0; const shared_1 = require("../../shared"); /** * Statement provider for service [health-agent](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonconnecthealth.html). * * @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement */ class HealthAgent extends shared_1.PolicyStatement { /** * Grants permission to activate a subscription to enable billing for a user * * Access Level: Write * * https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_ActivateSubscription.html */ toActivateSubscription() { return this.to('ActivateSubscription'); } /** * Grants permission to cancel an appointment * * Access Level: Write * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toCancelAppointment() { return this.to('CancelAppointment'); } /** * Grants permission to create a new agent with an initial version in DRAFT state * * Access Level: Write * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toCreateAgent() { return this.to('CreateAgent'); } /** * Grants permission to create a new domain for managing HealthAgent resources * * Access Level: Write * * Possible conditions: * - .ifAwsRequestTag() * - .ifAwsTagKeys() * * Dependent actions: * - health-agent:TagResource * - iam:PassRole * * https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_CreateDomain.html */ toCreateDomain() { return this.to('CreateDomain'); } /** * Grants permission to create a new integration for a domain * * Access Level: Write * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toCreateIntegration() { return this.to('CreateIntegration'); } /** * Grants permission to create a new session with specified agent configurations * * Access Level: Write * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toCreateSession() { return this.to('CreateSession'); } /** * Grants permission to create a new subscription within a domain for billing and user management * * Access Level: Write * * https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_CreateSubscription.html */ toCreateSubscription() { return this.to('CreateSubscription'); } /** * Grants permission to deactivate a subscription to stop billing for a user * * Access Level: Write * * https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_DeactivateSubscription.html */ toDeactivateSubscription() { return this.to('DeactivateSubscription'); } /** * Grants permission to delete an agent configuration and all its versions * * Access Level: Write * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toDeleteAgent() { return this.to('DeleteAgent'); } /** * Grants permission to delete a domain and all associated resources * * Access Level: Write * * https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_DeleteDomain.html */ toDeleteDomain() { return this.to('DeleteDomain'); } /** * Grants permission to delete an integration * * Access Level: Write * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toDeleteIntegration() { return this.to('DeleteIntegration'); } /** * Grants permission to retrieve an agent configuration, defaulting to the most recent version if not specified * * Access Level: Read * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toGetAgent() { return this.to('GetAgent'); } /** * Grants permission to retrieve the care team provider of a patient * * Access Level: Read * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toGetCareTeamProvider() { return this.to('GetCareTeamProvider'); } /** * Grants permission to retrieve information about a domain * * Access Level: Read * * https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_GetDomain.html */ toGetDomain() { return this.to('GetDomain'); } /** * Grants permission to retrieve aggregated analytics for a domain * * Access Level: Read * * https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_GetDomainAnalytics.html */ toGetDomainAnalytics() { return this.to('GetDomainAnalytics'); } /** * Grants permission to get an existing integration * * Access Level: Read * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toGetIntegration() { return this.to('GetIntegration'); } /** * Grants permission to retrieve details about an existing Medical Scribe listening session * * Access Level: Read * * https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_GetMedicalScribeListeningSession.html */ toGetMedicalScribeListeningSession() { return this.to('GetMedicalScribeListeningSession'); } /** * Grants permission to retrieve patient information * * Access Level: Read * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toGetPatient() { return this.to('GetPatient'); } /** * Grants permission to get details of a started patient insights job * * Access Level: Read * * https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_GetPatientInsightsJob.html */ toGetPatientInsightsJob() { return this.to('GetPatientInsightsJob'); } /** * Grants permission to retrieve practitioner information * * Access Level: Read * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toGetPractitioner() { return this.to('GetPractitioner'); } /** * Grants permission to retrieve structured session context including attributes and collected data * * Access Level: Read * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toGetSessionContext() { return this.to('GetSessionContext'); } /** * Grants permission to retrieve information about a subscription * * Access Level: Read * * https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_GetSubscription.html */ toGetSubscription() { return this.to('GetSubscription'); } /** * Grants permission to invoke an agent within a session with streaming response support * * Access Level: Write * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toInvokeAgent() { return this.to('InvokeAgent'); } /** * Grants permission to list all agents in a domain * * Access Level: List * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toListAgents() { return this.to('ListAgents'); } /** * Grants permission to list available appointment slots * * Access Level: Read * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toListAppointmentSlots() { return this.to('ListAppointmentSlots'); } /** * Grants permission to list domains for a given account * * Access Level: List * * https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_ListDomains.html */ toListDomains() { return this.to('ListDomains'); } /** * Grants permission to list integrations for a domain * * Access Level: List * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toListIntegrations() { return this.to('ListIntegrations'); } /** * Grants permission to list patient appointments * * Access Level: Read * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toListPatientAppointments() { return this.to('ListPatientAppointments'); } /** * Grants permission to list patient insurance coverages * * Access Level: Read * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toListPatientInsuranceCoverages() { return this.to('ListPatientInsuranceCoverages'); } /** * Grants permission to retrieve active providers available for scheduling appointments with a patient * * Access Level: Read * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toListProviders() { return this.to('ListProviders'); } /** * Grants permission to list session records for a domain * * Access Level: List * * https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_ListSessionRecords.html */ toListSessionRecords() { return this.to('ListSessionRecords'); } /** * Grants permission to list all subscriptions within a domain * * Access Level: List * * https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_ListSubscriptions.html */ toListSubscriptions() { return this.to('ListSubscriptions'); } /** * Grants permission to list the tags for the specified resource * * Access Level: List * * https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_ListTagsForResource.html */ toListTagsForResource() { return this.to('ListTagsForResource'); } /** * Grants permission to match a patient * * Access Level: Read * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toMatchPatient() { return this.to('MatchPatient'); } /** * Grants permission to publish an agent configuration version * * Access Level: Write * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toPublishAgent() { return this.to('PublishAgent'); } /** * Grants permission to reschedule an appointment * * Access Level: Write * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toRescheduleAppointment() { return this.to('RescheduleAppointment'); } /** * Grants permission to schedule an appointment for a patient * * Access Level: Write * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toScheduleAppointment() { return this.to('ScheduleAppointment'); } /** * Grants permission to start a new Medical Scribe listening session for real-time audio transcription * * Access Level: Write * * https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_StartMedicalScribeListeningSession.html */ toStartMedicalScribeListeningSession() { return this.to('StartMedicalScribeListeningSession'); } /** * Grants permission to start a new patient insights job * * Access Level: Write * * https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_StartPatientInsightsJob.html */ toStartPatientInsightsJob() { return this.to('StartPatientInsightsJob'); } /** * Grants permission to add the specified tags to the specified resource * * Access Level: Tagging * * Possible conditions: * - .ifAwsTagKeys() * - .ifAwsRequestTag() * * https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_TagResource.html */ toTagResource() { return this.to('TagResource'); } /** * Grants permission to remove the tags identified by the TagKeys list from a resource * * Access Level: Tagging * * Possible conditions: * - .ifAwsTagKeys() * * https://docs.aws.amazon.com/connecthealth/latest/APIReference/API_UntagResource.html */ toUntagResource() { return this.to('UntagResource'); } /** * Grants permission to update a draft agent configuration, creating a new draft version if none exists * * Access Level: Write * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toUpdateAgent() { return this.to('UpdateAgent'); } /** * Grants permission to update an existing integration * * Access Level: Write * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toUpdateIntegration() { return this.to('UpdateIntegration'); } /** * Grants permission to update session attributes such as departmentId and appointmentType * * Access Level: Write * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html */ toUpdateSession() { return this.to('UpdateSession'); } /** * Adds a resource of type Domain to the statement * * https://docs.aws.amazon.com/connecthealth/latest/userguide/setting-up.html#setting-up-create-domain * * @param domainId - Identifier for the domainId. * @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() */ onDomain(domainId, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:health-agent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:domain/${domainId}`); } /** * Adds a resource of type PatientInsightsJob to the statement * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-insights.html * * @param domainId - Identifier for the domainId. * @param jobId - Identifier for the jobId. * @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() */ onPatientInsightsJob(domainId, jobId, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:health-agent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:domain/${domainId}/patient-insights-job/${jobId}`); } /** * Adds a resource of type Subscription to the statement * * https://docs.aws.amazon.com/connecthealth/latest/userguide/ambient-documentation.html#al-subscription-management * * @param domainId - Identifier for the domainId. * @param subscriptionId - Identifier for the subscriptionId. * @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() */ onSubscription(domainId, subscriptionId, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:health-agent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:domain/${domainId}/subscription/${subscriptionId}`); } /** * Adds a resource of type Integration to the statement * * https://docs.aws.amazon.com/connecthealth/latest/userguide/configuring-testing-pe-agents.html * * @param domainId - Identifier for the domainId. * @param integrationId - Identifier for the integrationId. * @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() */ onIntegration(domainId, integrationId, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:health-agent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:domain/${domainId}/integration/${integrationId}`); } /** * Adds a resource of type Agent to the statement * * https://docs.aws.amazon.com/connecthealth/latest/userguide/agent-customization.html * * @param domainId - Identifier for the domainId. * @param agentId - Identifier for the agentId. * @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() */ onAgent(domainId, agentId, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:health-agent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:domain/${domainId}/agent/${agentId}`); } /** * Adds a resource of type Session to the statement * * https://docs.aws.amazon.com/connecthealth/latest/userguide/patient-engagement-overview.html * * @param domainId - Identifier for the domainId. * @param sessionId - Identifier for the sessionId. * @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() */ onSession(domainId, sessionId, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:health-agent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:domain/${domainId}/session/${sessionId}`); } /** * Filters access by the tags that are passed in the request * * https://docs.aws.amazon.com/connecthealth/latest/userguide/security-iam-service-with-iam.htmlsecurity-iam-service-with-iam.html#security-iam-service-with-iam-tags * * Applies to actions: * - .toCreateDomain() * - .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 tags associated with the resource * * https://docs.aws.amazon.com/connecthealth/latest/userguide/security-iam-service-with-iam.htmlsecurity-iam-service-with-iam.html#security-iam-service-with-iam-tags * * Applies to actions: * - .toTagResource() * * Applies to resource types: * - Domain * - PatientInsightsJob * - Subscription * - Integration * - Agent * - Session * * @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 that are passed in the request * * https://docs.aws.amazon.com/connecthealth/latest/userguide/security-iam-service-with-iam.htmlsecurity-iam-service-with-iam.html#security-iam-service-with-iam-tags * * Applies to actions: * - .toCreateDomain() * - .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 [health-agent](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonconnecthealth.html). * */ constructor(props) { super(props); this.servicePrefix = 'health-agent'; this.accessLevelList = { Write: [ 'ActivateSubscription', 'CancelAppointment', 'CreateAgent', 'CreateDomain', 'CreateIntegration', 'CreateSession', 'CreateSubscription', 'DeactivateSubscription', 'DeleteAgent', 'DeleteDomain', 'DeleteIntegration', 'InvokeAgent', 'PublishAgent', 'RescheduleAppointment', 'ScheduleAppointment', 'StartMedicalScribeListeningSession', 'StartPatientInsightsJob', 'UpdateAgent', 'UpdateIntegration', 'UpdateSession' ], Read: [ 'GetAgent', 'GetCareTeamProvider', 'GetDomain', 'GetDomainAnalytics', 'GetIntegration', 'GetMedicalScribeListeningSession', 'GetPatient', 'GetPatientInsightsJob', 'GetPractitioner', 'GetSessionContext', 'GetSubscription', 'ListAppointmentSlots', 'ListPatientAppointments', 'ListPatientInsuranceCoverages', 'ListProviders', 'MatchPatient' ], List: [ 'ListAgents', 'ListDomains', 'ListIntegrations', 'ListSessionRecords', 'ListSubscriptions', 'ListTagsForResource' ], Tagging: [ 'TagResource', 'UntagResource' ] }; } } exports.HealthAgent = HealthAgent; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGhlYWx0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbm5lY3RoZWFsdGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBQXlEO0FBR3pEOzs7O0dBSUc7QUFDSCxNQUFhLFdBQVksU0FBUSx3QkFBZTtJQUc5Qzs7Ozs7O09BTUc7SUFDSSxzQkFBc0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG1CQUFtQjtRQUN4QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksYUFBYTtRQUNsQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0ksY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG1CQUFtQjtRQUN4QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG9CQUFvQjtRQUN6QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksd0JBQXdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEVBQUUs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QkFDVixxQkFBcUI7Z0JBQ3JCLFdBQVc7Z0JBQ1gsb0JBQW9CO2dCQUNwQixnQkFBZ0I7Z0JBQ2hCLGtDQUFrQztnQkFDbEMsWUFBWTtnQkFDWix1QkFBdUI7Z0JBQ3ZCLGlCQUFpQjtnQkFDakIsbUJBQW1CO2dCQUNuQixpQkFBaUI7Z0JBQ2pCLHNCQUFzQjtnQkFDdEIseUJBQXlCO2dCQUN6QiwrQkFBK0I7Z0JBQy9CLGVBQWU7Z0JBQ2YsY0FBYzthQUNmO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLFlBQVk7Z0JBQ1osYUFBYTtnQkFDYixrQkFBa0I7Z0JBQ2xCLG9CQUFvQjtnQkFDcEIsbUJBQW1CO2dCQUNuQixxQkFBcUI7YUFDdEI7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsYUFBYTtnQkFDYixlQUFlO2FBQ2hCO1NBQ0YsQ0FBQztJQTZLRixDQUFDO0NBQ0Y7QUF6dEJELGtDQXl0QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY2Nlc3NMZXZlbExpc3QgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWNjZXNzLWxldmVsJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCwgT3BlcmF0b3IgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgYXdzX2lhbSBhcyBpYW0gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuLyoqXG4gKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW2hlYWx0aC1hZ2VudF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3RfYW1hem9uY29ubmVjdGhlYWx0aC5odG1sKS5cbiAqXG4gKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIEhlYWx0aEFnZW50IGV4dGVuZHMgUG9saWN5U3RhdGVtZW50IHtcbiAgcHVibGljIHNlcnZpY2VQcmVmaXggPSAnaGVhbHRoLWFnZW50JztcblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWN0aXZhdGUgYSBzdWJzY3JpcHRpb24gdG8gZW5hYmxlIGJpbGxpbmcgZm9yIGEgdXNlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0aGVhbHRoL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0FjdGl2YXRlU3Vic2NyaXB0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0FjdGl2YXRlU3Vic2NyaXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBY3RpdmF0ZVN1YnNjcmlwdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNhbmNlbCBhbiBhcHBvaW50bWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0aGVhbHRoL2xhdGVzdC91c2VyZ3VpZGUvcGF0aWVudC1lbmdhZ2VtZW50LW92ZXJ2aWV3Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NhbmNlbEFwcG9pbnRtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDYW5jZWxBcHBvaW50bWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyBhZ2VudCB3aXRoIGFuIGluaXRpYWwgdmVyc2lvbiBpbiBEUkFGVCBzdGF0ZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0aGVhbHRoL2xhdGVzdC91c2VyZ3VpZGUvcGF0aWVudC1lbmdhZ2VtZW50LW92ZXJ2aWV3Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUFnZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVBZ2VudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyBkb21haW4gZm9yIG1hbmFnaW5nIEhlYWx0aEFnZW50IHJlc291cmNlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGhlYWx0aC1hZ2VudDpUYWdSZXNvdXJjZVxuICAgKiAtIGlhbTpQYXNzUm9sZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVEb21haW4uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlRG9tYWluKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVEb21haW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBuZXcgaW50ZWdyYXRpb24gZm9yIGEgZG9tYWluXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L3VzZXJndWlkZS9wYXRpZW50LWVuZ2FnZW1lbnQtb3ZlcnZpZXcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlSW50ZWdyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUludGVncmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgbmV3IHNlc3Npb24gd2l0aCBzcGVjaWZpZWQgYWdlbnQgY29uZmlndXJhdGlvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvdXNlcmd1aWRlL3BhdGllbnQtZW5nYWdlbWVudC1vdmVydmlldy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVTZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVTZXNzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgbmV3IHN1YnNjcmlwdGlvbiB3aXRoaW4gYSBkb21haW4gZm9yIGJpbGxpbmcgYW5kIHVzZXIgbWFuYWdlbWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0aGVhbHRoL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVN1YnNjcmlwdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVTdWJzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVN1YnNjcmlwdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlYWN0aXZhdGUgYSBzdWJzY3JpcHRpb24gdG8gc3RvcCBiaWxsaW5nIGZvciBhIHVzZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWFjdGl2YXRlU3Vic2NyaXB0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlYWN0aXZhdGVTdWJzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlYWN0aXZhdGVTdWJzY3JpcHRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYW4gYWdlbnQgY29uZmlndXJhdGlvbiBhbmQgYWxsIGl0cyB2ZXJzaW9uc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0aGVhbHRoL2xhdGVzdC91c2VyZ3VpZGUvcGF0aWVudC1lbmdhZ2VtZW50LW92ZXJ2aWV3Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUFnZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVBZ2VudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIGRvbWFpbiBhbmQgYWxsIGFzc29jaWF0ZWQgcmVzb3VyY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlRG9tYWluLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZURvbWFpbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlRG9tYWluJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFuIGludGVncmF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L3VzZXJndWlkZS9wYXRpZW50LWVuZ2FnZW1lbnQtb3ZlcnZpZXcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlSW50ZWdyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUludGVncmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgYW4gYWdlbnQgY29uZmlndXJhdGlvbiwgZGVmYXVsdGluZyB0byB0aGUgbW9zdCByZWNlbnQgdmVyc2lvbiBpZiBub3Qgc3BlY2lmaWVkXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvdXNlcmd1aWRlL3BhdGllbnQtZW5nYWdlbWVudC1vdmVydmlldy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRBZ2VudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0QWdlbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSB0aGUgY2FyZSB0ZWFtIHByb3ZpZGVyIG9mIGEgcGF0aWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L3VzZXJndWlkZS9wYXRpZW50LWVuZ2FnZW1lbnQtb3ZlcnZpZXcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0Q2FyZVRlYW1Qcm92aWRlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0Q2FyZVRlYW1Qcm92aWRlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgZG9tYWluXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXREb21haW4uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0RG9tYWluKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXREb21haW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBhZ2dyZWdhdGVkIGFuYWx5dGljcyBmb3IgYSBkb21haW5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0aGVhbHRoL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldERvbWFpbkFuYWx5dGljcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXREb21haW5BbmFseXRpY3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldERvbWFpbkFuYWx5dGljcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhbiBleGlzdGluZyBpbnRlZ3JhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L3VzZXJndWlkZS9wYXRpZW50LWVuZ2FnZW1lbnQtb3ZlcnZpZXcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0SW50ZWdyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEludGVncmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgZGV0YWlscyBhYm91dCBhbiBleGlzdGluZyBNZWRpY2FsIFNjcmliZSBsaXN0ZW5pbmcgc2Vzc2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0TWVkaWNhbFNjcmliZUxpc3RlbmluZ1Nlc3Npb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0TWVkaWNhbFNjcmliZUxpc3RlbmluZ1Nlc3Npb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE1lZGljYWxTY3JpYmVMaXN0ZW5pbmdTZXNzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgcGF0aWVudCBpbmZvcm1hdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L3VzZXJndWlkZS9wYXRpZW50LWVuZ2FnZW1lbnQtb3ZlcnZpZXcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UGF0aWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UGF0aWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBkZXRhaWxzIG9mIGEgc3RhcnRlZCBwYXRpZW50IGluc2lnaHRzIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0UGF0aWVudEluc2lnaHRzSm9iLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFBhdGllbnRJbnNpZ2h0c0pvYigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UGF0aWVudEluc2lnaHRzSm9iJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgcHJhY3RpdGlvbmVyIGluZm9ybWF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvdXNlcmd1aWRlL3BhdGllbnQtZW5nYWdlbWVudC1vdmVydmlldy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRQcmFjdGl0aW9uZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFByYWN0aXRpb25lcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIHN0cnVjdHVyZWQgc2Vzc2lvbiBjb250ZXh0IGluY2x1ZGluZyBhdHRyaWJ1dGVzIGFuZCBjb2xsZWN0ZWQgZGF0YVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L3VzZXJndWlkZS9wYXRpZW50LWVuZ2FnZW1lbnQtb3ZlcnZpZXcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0U2Vzc2lvbkNvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFNlc3Npb25Db250ZXh0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBzdWJzY3JpcHRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0aGVhbHRoL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFN1YnNjcmlwdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRTdWJzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFN1YnNjcmlwdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBhbiBhZ2VudCB3aXRoaW4gYSBzZXNzaW9uIHdpdGggc3RyZWFtaW5nIHJlc3BvbnNlIHN1cHBvcnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvdXNlcmd1aWRlL3BhdGllbnQtZW5nYWdlbWVudC1vdmVydmlldy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9JbnZva2VBZ2VudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnSW52b2tlQWdlbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBhZ2VudHMgaW4gYSBkb21haW5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0aGVhbHRoL2xhdGVzdC91c2VyZ3VpZGUvcGF0aWVudC1lbmdhZ2VtZW50LW92ZXJ2aWV3Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RBZ2VudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RBZ2VudHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGF2YWlsYWJsZSBhcHBvaW50bWVudCBzbG90c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L3VzZXJndWlkZS9wYXRpZW50LWVuZ2FnZW1lbnQtb3ZlcnZpZXcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEFwcG9pbnRtZW50U2xvdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RBcHBvaW50bWVudFNsb3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBkb21haW5zIGZvciBhIGdpdmVuIGFjY291bnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0aGVhbHRoL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3REb21haW5zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3REb21haW5zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RG9tYWlucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgaW50ZWdyYXRpb25zIGZvciBhIGRvbWFpblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3RoZWFsdGgvbGF0ZXN0L3VzZXJndWlkZS9wYXRpZW50LWVuZ2FnZW1lbnQtb3ZlcnZpZXcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEludGVncmF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEludGVncmF0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgcGF0aWVudCBhcHBvaW50bWVudHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0aGVhbHRoL2xhdGVzdC91c2VyZ3VpZGUvcGF0aWVudC1lbmdhZ2VtZW50LW92ZXJ2aWV3Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RQYXRpZW50QXBwb2ludG1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0UGF0aWVudEFwcG9pbnRtZW50cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgcGF0aWVudCBpbnN1cmFuY2UgY292ZXJhZ2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvdXNlcmd1aWRlL3BhdGllbnQtZW5nYWdlbWVudC1vdmVydmlldy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0UGF0aWVudEluc3VyYW5jZUNvdmVyYWdlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFBhdGllbnRJbnN1cmFuY2VDb3ZlcmFnZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBhY3RpdmUgcHJvdmlkZXJzIGF2YWlsYWJsZSBmb3Igc2NoZWR1bGluZyBhcHBvaW50bWVudHMgd2l0aCBhIHBhdGllbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0aGVhbHRoL2xhdGVzdC91c2VyZ3VpZGUvcGF0aWVudC1lbmdhZ2VtZW50LW92ZXJ2aWV3Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RQcm92aWRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RQcm92aWRlcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHNlc3Npb24gcmVjb3JkcyBmb3IgYSBkb21haW5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0aGVhbHRoL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTZXNzaW9uUmVjb3Jkcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0U2Vzc2lvblJlY29yZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RTZXNzaW9uUmVjb3JkcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHN1YnNjcmlwdGlvbnMgd2l0aGluIGEgZG9tYWluXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0U3Vic2NyaXB0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0U3Vic2NyaXB0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFN1YnNjcmlwdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHRoZSB0YWdzIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0VGFnc0ZvclJlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RUYWdzRm9yUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUYWdzRm9yUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtYXRjaCBhIHBhdGllbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0aGVhbHRoL2xhdGVzdC91c2VyZ3VpZGUvcGF0aWVudC1lbmdhZ2VtZW50LW92ZXJ2aWV3Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b01hdGNoUGF0aWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTWF0Y2hQYXRpZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcHVibGlzaCBhbiBhZ2VudCBjb25maWd1cmF0aW9uIHZlcnNpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvdXNlcmd1aWRlL3BhdGllbnQtZW5nYWdlbWVudC1vdmVydmlldy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9QdWJsaXNoQWdlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1B1Ymxpc2hBZ2VudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlc2NoZWR1bGUgYW4gYXBwb2ludG1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvdXNlcmd1aWRlL3BhdGllbnQtZW5nYWdlbWVudC1vdmVydmlldy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9SZXNjaGVkdWxlQXBwb2ludG1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1Jlc2NoZWR1bGVBcHBvaW50bWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNjaGVkdWxlIGFuIGFwcG9pbnRtZW50IGZvciBhIHBhdGllbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdGhlYWx0aC9sYXRlc3QvdXNlcmd1aWRlL3BhdGllbnQtZW5nYWdlbWVudC1vdmVydmlldy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TY2hlZHVsZUFwcG9pbnRtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTY2hlZHVsZUFwcG9pbnRtZW50Jyk7XG4gIH1cblxuICAvK