UNPKG

cdk-iam-floyd

Version:

AWS IAM policy statement generator with fluent interface for AWS CDK

665 lines 50.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SagemakerMlflow = void 0; const shared_1 = require("../../shared"); /** * Statement provider for service [sagemaker-mlflow](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonsagemakerwithmlflow.html). * * @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement */ class SagemakerMlflow extends shared_1.PolicyStatement { /** * Grants permission to access the MLflow UI * * Access Level: Read */ toAccessUI() { return this.to('AccessUI'); } /** * Grants permission to create an MLflow experiment * * Access Level: Write */ toCreateExperiment() { return this.to('CreateExperiment'); } /** * Grants permission to create a new model version * * Access Level: Write */ toCreateModelVersion() { return this.to('CreateModelVersion'); } /** * Grants permission to create a registered model * * Access Level: Write */ toCreateRegisteredModel() { return this.to('CreateRegisteredModel'); } /** * Grants permission to create a new run within an experiment * * Access Level: Write */ toCreateRun() { return this.to('CreateRun'); } /** * Grants permission to mark an MLflow experiment for deletion * * Access Level: Write */ toDeleteExperiment() { return this.to('DeleteExperiment'); } /** * Grants permission to delete a logged model in MLflow * * Access Level: Write */ toDeleteLoggedModel() { return this.to('DeleteLoggedModel'); } /** * Grants permission to delete a tag for a logged model in MLflow * * Access Level: Write */ toDeleteLoggedModelTag() { return this.to('DeleteLoggedModelTag'); } /** * Grants permission to delete a model version * * Access Level: Write */ toDeleteModelVersion() { return this.to('DeleteModelVersion'); } /** * Grants permission to delete a model version tag * * Access Level: Write */ toDeleteModelVersionTag() { return this.to('DeleteModelVersionTag'); } /** * Grants permission to delete a registered model * * Access Level: Write */ toDeleteRegisteredModel() { return this.to('DeleteRegisteredModel'); } /** * Grants permission to delete a registered model alias * * Access Level: Write */ toDeleteRegisteredModelAlias() { return this.to('DeleteRegisteredModelAlias'); } /** * Grants permission to delete a registered model tag * * Access Level: Write */ toDeleteRegisteredModelTag() { return this.to('DeleteRegisteredModelTag'); } /** * Grants permission to mark a run for deletion * * Access Level: Write */ toDeleteRun() { return this.to('DeleteRun'); } /** * Grants permission to delete a tag on a run * * Access Level: Write */ toDeleteTag() { return this.to('DeleteTag'); } /** * Grants permission to delete a trace tag in MLflow * * Access Level: Write */ toDeleteTraceTag() { return this.to('DeleteTraceTag'); } /** * Grants permission to delete traces in MLflow * * Access Level: Write */ toDeleteTraces() { return this.to('DeleteTraces'); } /** * Grants permission to end a trace in MLflow * * Access Level: Write */ toEndTrace() { return this.to('EndTrace'); } /** * Grants permission to set status for a logged model in MLflow * * Access Level: Write */ toFinalizeLoggedModel() { return this.to('FinalizeLoggedModel'); } /** * Grants permission to get a URI to download model artifacts for a specific model version * * Access Level: Read */ toGetDownloadURIForModelVersionArtifacts() { return this.to('GetDownloadURIForModelVersionArtifacts'); } /** * Grants permission to get metadata for an MLflow experiment * * Access Level: Read */ toGetExperiment() { return this.to('GetExperiment'); } /** * Grants permission to get metadata for an MLflow experiment by name * * Access Level: Read */ toGetExperimentByName() { return this.to('GetExperimentByName'); } /** * Grants permission to get the latest model versions * * Access Level: List */ toGetLatestModelVersions() { return this.to('GetLatestModelVersions'); } /** * Grants permission to get a logged model in MLflow * * Access Level: Read */ toGetLoggedModel() { return this.to('GetLoggedModel'); } /** * Grants permission to get a list of all values for the specified metric for a given run * * Access Level: Read */ toGetMetricHistory() { return this.to('GetMetricHistory'); } /** * Grants permission to get a model version by model name and version * * Access Level: Read */ toGetModelVersion() { return this.to('GetModelVersion'); } /** * Grants permission to get model version by alias in MLflow * * Access Level: Read */ toGetModelVersionByAlias() { return this.to('GetModelVersionByAlias'); } /** * Grants permission to get a registered model * * Access Level: Read */ toGetRegisteredModel() { return this.to('GetRegisteredModel'); } /** * Grants permission to get metadata, metrics, parameters, and tags for a run * * Access Level: Read */ toGetRun() { return this.to('GetRun'); } /** * Grants permission to get information about a trace in MLflow * * Access Level: Read */ toGetTraceInfo() { return this.to('GetTraceInfo'); } /** * Grants permission to list artifacts for a run * * Access Level: List */ toListArtifacts() { return this.to('ListArtifacts'); } /** * Grants permission to list artifacts for a logged model in MLflow * * Access Level: List */ toListLoggedModelArtifacts() { return this.to('ListLoggedModelArtifacts'); } /** * Grants permission to log a batch of metrics, parameters, and tags for a run * * Access Level: Write */ toLogBatch() { return this.to('LogBatch'); } /** * Grants permission to log inputs for a run * * Access Level: Write */ toLogInputs() { return this.to('LogInputs'); } /** * Grants permission to log params for a logged model in MLflow * * Access Level: Write */ toLogLoggedModelParams() { return this.to('LogLoggedModelParams'); } /** * Grants permission to log a metric for a run * * Access Level: Write */ toLogMetric() { return this.to('LogMetric'); } /** * Grants permission to log the model associated with a run * * Access Level: Write */ toLogModel() { return this.to('LogModel'); } /** * Grants permission to log outputs, such as models, for a run in MLflow * * Access Level: Write */ toLogOutputs() { return this.to('LogOutputs'); } /** * Grants permission to log a parameter tracked during a run * * Access Level: Write */ toLogParam() { return this.to('LogParam'); } /** * Grants permission to rename a registered model * * Access Level: Write */ toRenameRegisteredModel() { return this.to('RenameRegisteredModel'); } /** * Grants permission to restore an experiment marked for deletion * * Access Level: Write */ toRestoreExperiment() { return this.to('RestoreExperiment'); } /** * Grants permission to restore a deleted run * * Access Level: Write */ toRestoreRun() { return this.to('RestoreRun'); } /** * Grants permission to search for MLflow experiments * * Access Level: Read */ toSearchExperiments() { return this.to('SearchExperiments'); } /** * Grants permission to search for logged models in MLflow * * Access Level: Read */ toSearchLoggedModels() { return this.to('SearchLoggedModels'); } /** * Grants permission to search for a model version * * Access Level: Read */ toSearchModelVersions() { return this.to('SearchModelVersions'); } /** * Grants permission to search for registered models in MLflow * * Access Level: Read */ toSearchRegisteredModels() { return this.to('SearchRegisteredModels'); } /** * Grants permission to search for runs that satisfy expressions * * Access Level: Read */ toSearchRuns() { return this.to('SearchRuns'); } /** * Grants permission to search for traces in MLflow * * Access Level: Read */ toSearchTraces() { return this.to('SearchTraces'); } /** * Grants permission to set a tag on an experiment * * Access Level: Write */ toSetExperimentTag() { return this.to('SetExperimentTag'); } /** * Grants permission to set tags for a logged model in MLflow * * Access Level: Write */ toSetLoggedModelTags() { return this.to('SetLoggedModelTags'); } /** * Grants permission to set a tag for the model version * * Access Level: Write */ toSetModelVersionTag() { return this.to('SetModelVersionTag'); } /** * Grants permission to set a registered model alias * * Access Level: Write */ toSetRegisteredModelAlias() { return this.to('SetRegisteredModelAlias'); } /** * Grants permission to set a tag for a registered model * * Access Level: Write */ toSetRegisteredModelTag() { return this.to('SetRegisteredModelTag'); } /** * Grants permission to set a tag on a run * * Access Level: Write */ toSetTag() { return this.to('SetTag'); } /** * Grants permission to set a trace tag in MLflow * * Access Level: Write */ toSetTraceTag() { return this.to('SetTraceTag'); } /** * Grants permission to start a trace in MLflow * * Access Level: Write */ toStartTrace() { return this.to('StartTrace'); } /** * Grants permission to transition a model version to a particular stage * * Access Level: Write */ toTransitionModelVersionStage() { return this.to('TransitionModelVersionStage'); } /** * Grants permission to update the metadata for an MLflow experiment * * Access Level: Write */ toUpdateExperiment() { return this.to('UpdateExperiment'); } /** * Grants permission to update the model version * * Access Level: Write */ toUpdateModelVersion() { return this.to('UpdateModelVersion'); } /** * Grants permission to update a registered model * * Access Level: Write */ toUpdateRegisteredModel() { return this.to('UpdateRegisteredModel'); } /** * Grants permission to update run metadata * * Access Level: Write */ toUpdateRun() { return this.to('UpdateRun'); } /** * Adds a resource of type mlflow-tracking-server to the statement * * https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_MlflowTrackingServer.html * * @param mlflowTrackingServerName - Identifier for the mlflowTrackingServerName. * @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. */ onMlflowTrackingServer(mlflowTrackingServerName, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:sagemaker:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:mlflow-tracking-server/${mlflowTrackingServerName}`); } /** * Filters access by a tag key and value pair * * https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazonsagemaker.html#amazonsagemaker-policy-keys * * Applies to actions: * - .toCreateExperiment() * - .toCreateModelVersion() * - .toCreateRegisteredModel() * - .toCreateRun() * - .toDeleteExperiment() * - .toDeleteLoggedModel() * - .toDeleteLoggedModelTag() * - .toDeleteModelVersion() * - .toDeleteModelVersionTag() * - .toDeleteRegisteredModel() * - .toDeleteRegisteredModelAlias() * - .toDeleteRegisteredModelTag() * - .toDeleteRun() * - .toDeleteTag() * - .toDeleteTraceTag() * - .toDeleteTraces() * - .toEndTrace() * - .toFinalizeLoggedModel() * - .toGetDownloadURIForModelVersionArtifacts() * - .toGetExperiment() * - .toGetExperimentByName() * - .toGetLatestModelVersions() * - .toGetLoggedModel() * - .toGetMetricHistory() * - .toGetModelVersion() * - .toGetModelVersionByAlias() * - .toGetRegisteredModel() * - .toGetRun() * - .toGetTraceInfo() * - .toListArtifacts() * - .toListLoggedModelArtifacts() * - .toLogBatch() * - .toLogInputs() * - .toLogLoggedModelParams() * - .toLogMetric() * - .toLogModel() * - .toLogOutputs() * - .toLogParam() * - .toRenameRegisteredModel() * - .toRestoreExperiment() * - .toRestoreRun() * - .toSearchExperiments() * - .toSearchLoggedModels() * - .toSearchModelVersions() * - .toSearchRegisteredModels() * - .toSearchRuns() * - .toSearchTraces() * - .toSetExperimentTag() * - .toSetLoggedModelTags() * - .toSetModelVersionTag() * - .toSetRegisteredModelAlias() * - .toSetRegisteredModelTag() * - .toSetTag() * - .toSetTraceTag() * - .toStartTrace() * - .toTransitionModelVersionStage() * - .toUpdateExperiment() * - .toUpdateModelVersion() * - .toUpdateRegisteredModel() * - .toUpdateRun() * * @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'); } /** * Statement provider for service [sagemaker-mlflow](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonsagemakerwithmlflow.html). * */ constructor(props) { super(props); this.servicePrefix = 'sagemaker-mlflow'; this.accessLevelList = { Read: [ 'AccessUI', 'GetDownloadURIForModelVersionArtifacts', 'GetExperiment', 'GetExperimentByName', 'GetLoggedModel', 'GetMetricHistory', 'GetModelVersion', 'GetModelVersionByAlias', 'GetRegisteredModel', 'GetRun', 'GetTraceInfo', 'SearchExperiments', 'SearchLoggedModels', 'SearchModelVersions', 'SearchRegisteredModels', 'SearchRuns', 'SearchTraces' ], Write: [ 'CreateExperiment', 'CreateModelVersion', 'CreateRegisteredModel', 'CreateRun', 'DeleteExperiment', 'DeleteLoggedModel', 'DeleteLoggedModelTag', 'DeleteModelVersion', 'DeleteModelVersionTag', 'DeleteRegisteredModel', 'DeleteRegisteredModelAlias', 'DeleteRegisteredModelTag', 'DeleteRun', 'DeleteTag', 'DeleteTraceTag', 'DeleteTraces', 'EndTrace', 'FinalizeLoggedModel', 'LogBatch', 'LogInputs', 'LogLoggedModelParams', 'LogMetric', 'LogModel', 'LogOutputs', 'LogParam', 'RenameRegisteredModel', 'RestoreExperiment', 'RestoreRun', 'SetExperimentTag', 'SetLoggedModelTags', 'SetModelVersionTag', 'SetRegisteredModelAlias', 'SetRegisteredModelTag', 'SetTag', 'SetTraceTag', 'StartTrace', 'TransitionModelVersionStage', 'UpdateExperiment', 'UpdateModelVersion', 'UpdateRegisteredModel', 'UpdateRun' ], List: [ 'GetLatestModelVersions', 'ListArtifacts', 'ListLoggedModelArtifacts' ] }; } } exports.SagemakerMlflow = SagemakerMlflow; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FnZW1ha2Vyd2l0aG1sZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNhZ2VtYWtlcndpdGhtbGZsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBQXlEO0FBR3pEOzs7O0dBSUc7QUFDSCxNQUFhLGVBQWdCLFNBQVEsd0JBQWU7SUFHbEQ7Ozs7T0FJRztJQUNJLFVBQVU7UUFDZixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxrQkFBa0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxvQkFBb0I7UUFDekIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSx1QkFBdUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxXQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLG1CQUFtQjtRQUN4QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLHNCQUFzQjtRQUMzQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLG9CQUFvQjtRQUN6QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsb0JB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O2dCQUN0QixXQUFXO2dCQUNYLFVBQVU7Z0JBQ1YsWUFBWTtnQkFDWixVQUFVO2dCQUNWLHVCQUF1QjtnQkFDdkIsbUJBQW1CO2dCQUNuQixZQUFZO2dCQUNaLGtCQUFrQjtnQkFDbEIsb0JBQW9CO2dCQUNwQixvQkFBb0I7Z0JBQ3BCLHlCQUF5QjtnQkFDekIsdUJBQXVCO2dCQUN2QixRQUFRO2dCQUNSLGFBQWE7Z0JBQ2IsWUFBWTtnQkFDWiw2QkFBNkI7Z0JBQzdCLGtCQUFrQjtnQkFDbEIsb0JBQW9CO2dCQUNwQix1QkFBdUI7Z0JBQ3ZCLFdBQVc7YUFDWjtZQUNELElBQUksRUFBRTtnQkFDSix3QkFBd0I7Z0JBQ3hCLGVBQWU7Z0JBQ2YsMEJBQTBCO2FBQzNCO1NBQ0YsQ0FBQztJQWlHRixDQUFDO0NBQ0Y7QUE5c0JELDBDQThzQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY2Nlc3NMZXZlbExpc3QgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWNjZXNzLWxldmVsJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCwgT3BlcmF0b3IgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgYXdzX2lhbSBhcyBpYW0gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuLyoqXG4gKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW3NhZ2VtYWtlci1tbGZsb3ddKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2FtYXpvbnNhZ2VtYWtlcndpdGhtbGZsb3cuaHRtbCkuXG4gKlxuICogQHBhcmFtIHNpZCBbU0lEXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX3NpZC5odG1sKSBvZiB0aGUgc3RhdGVtZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBTYWdlbWFrZXJNbGZsb3cgZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICdzYWdlbWFrZXItbWxmbG93JztcblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSBNTGZsb3cgVUlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9BY2Nlc3NVSSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQWNjZXNzVUknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYW4gTUxmbG93IGV4cGVyaW1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlRXhwZXJpbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlRXhwZXJpbWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyBtb2RlbCB2ZXJzaW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZU1vZGVsVmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTW9kZWxWZXJzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgcmVnaXN0ZXJlZCBtb2RlbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVSZWdpc3RlcmVkTW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVJlZ2lzdGVyZWRNb2RlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyBydW4gd2l0aGluIGFuIGV4cGVyaW1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlUnVuKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVSdW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtYXJrIGFuIE1MZmxvdyBleHBlcmltZW50IGZvciBkZWxldGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVFeHBlcmltZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVFeHBlcmltZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgbG9nZ2VkIG1vZGVsIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVMb2dnZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTG9nZ2VkTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSB0YWcgZm9yIGEgbG9nZ2VkIG1vZGVsIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVMb2dnZWRNb2RlbFRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTG9nZ2VkTW9kZWxUYWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBtb2RlbCB2ZXJzaW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZU1vZGVsVmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTW9kZWxWZXJzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgbW9kZWwgdmVyc2lvbiB0YWdcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlTW9kZWxWZXJzaW9uVGFnKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVNb2RlbFZlcnNpb25UYWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSByZWdpc3RlcmVkIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVJlZ2lzdGVyZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUmVnaXN0ZXJlZE1vZGVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgcmVnaXN0ZXJlZCBtb2RlbCBhbGlhc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVSZWdpc3RlcmVkTW9kZWxBbGlhcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUmVnaXN0ZXJlZE1vZGVsQWxpYXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSByZWdpc3RlcmVkIG1vZGVsIHRhZ1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVSZWdpc3RlcmVkTW9kZWxUYWcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVJlZ2lzdGVyZWRNb2RlbFRhZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1hcmsgYSBydW4gZm9yIGRlbGV0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVJ1bigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUnVuJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgdGFnIG9uIGEgcnVuXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlVGFnJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgdHJhY2UgdGFnIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVUcmFjZVRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlVHJhY2VUYWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgdHJhY2VzIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVUcmFjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVRyYWNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGVuZCBhIHRyYWNlIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9FbmRUcmFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRW5kVHJhY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZXQgc3RhdHVzIGZvciBhIGxvZ2dlZCBtb2RlbCBpbiBNTGZsb3dcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvRmluYWxpemVMb2dnZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRmluYWxpemVMb2dnZWRNb2RlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIFVSSSB0byBkb3dubG9hZCBtb2RlbCBhcnRpZmFjdHMgZm9yIGEgc3BlY2lmaWMgbW9kZWwgdmVyc2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICovXG4gIHB1YmxpYyB0b0dldERvd25sb2FkVVJJRm9yTW9kZWxWZXJzaW9uQXJ0aWZhY3RzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXREb3dubG9hZFVSSUZvck1vZGVsVmVyc2lvbkFydGlmYWN0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBtZXRhZGF0YSBmb3IgYW4gTUxmbG93IGV4cGVyaW1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9HZXRFeHBlcmltZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRFeHBlcmltZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IG1ldGFkYXRhIGZvciBhbiBNTGZsb3cgZXhwZXJpbWVudCBieSBuYW1lXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKi9cbiAgcHVibGljIHRvR2V0RXhwZXJpbWVudEJ5TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RXhwZXJpbWVudEJ5TmFtZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgbGF0ZXN0IG1vZGVsIHZlcnNpb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKi9cbiAgcHVibGljIHRvR2V0TGF0ZXN0TW9kZWxWZXJzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TGF0ZXN0TW9kZWxWZXJzaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIGxvZ2dlZCBtb2RlbCBpbiBNTGZsb3dcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9HZXRMb2dnZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TG9nZ2VkTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBsaXN0IG9mIGFsbCB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpZWQgbWV0cmljIGZvciBhIGdpdmVuIHJ1blxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICovXG4gIHB1YmxpYyB0b0dldE1ldHJpY0hpc3RvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE1ldHJpY0hpc3RvcnknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBtb2RlbCB2ZXJzaW9uIGJ5IG1vZGVsIG5hbWUgYW5kIHZlcnNpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9HZXRNb2RlbFZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE1vZGVsVmVyc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBtb2RlbCB2ZXJzaW9uIGJ5IGFsaWFzIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICovXG4gIHB1YmxpYyB0b0dldE1vZGVsVmVyc2lvbkJ5QWxpYXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE1vZGVsVmVyc2lvbkJ5QWxpYXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSByZWdpc3RlcmVkIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKi9cbiAgcHVibGljIHRvR2V0UmVnaXN0ZXJlZE1vZGVsKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRSZWdpc3RlcmVkTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgbWV0YWRhdGEsIG1ldHJpY3MsIHBhcmFtZXRlcnMsIGFuZCB0YWdzIGZvciBhIHJ1blxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICovXG4gIHB1YmxpYyB0b0dldFJ1bigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UnVuJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IGEgdHJhY2UgaW4gTUxmbG93XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKi9cbiAgcHVibGljIHRvR2V0VHJhY2VJbmZvKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUcmFjZUluZm8nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFydGlmYWN0cyBmb3IgYSBydW5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QXJ0aWZhY3RzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QXJ0aWZhY3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhcnRpZmFjdHMgZm9yIGEgbG9nZ2VkIG1vZGVsIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RMb2dnZWRNb2RlbEFydGlmYWN0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdExvZ2dlZE1vZGVsQXJ0aWZhY3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbG9nIGEgYmF0Y2ggb2YgbWV0cmljcywgcGFyYW1ldGVycywgYW5kIHRhZ3MgZm9yIGEgcnVuXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0xvZ0JhdGNoKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMb2dCYXRjaCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxvZyBpbnB1dHMgZm9yIGEgcnVuXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0xvZ0lucHV0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTG9nSW5wdXRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbG9nIHBhcmFtcyBmb3IgYSBsb2dnZWQgbW9kZWwgaW4gTUxmbG93XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0xvZ0xvZ2dlZE1vZGVsUGFyYW1zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMb2dMb2dnZWRNb2RlbFBhcmFtcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxvZyBhIG1ldHJpYyBmb3IgYSBydW5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvTG9nTWV0cmljKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMb2dNZXRyaWMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsb2cgdGhlIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCBhIHJ1blxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9Mb2dNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTG9nTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsb2cgb3V0cHV0cywgc3VjaCBhcyBtb2RlbHMsIGZvciBhIHJ1biBpbiBNTGZsb3dcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvTG9nT3V0cHV0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTG9nT3V0cHV0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxvZyBhIHBhcmFtZXRlciB0cmFja2VkIGR1cmluZyBhIHJ1blxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9Mb2dQYXJhbSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTG9nUGFyYW0nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZW5hbWUgYSByZWdpc3RlcmVkIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1JlbmFtZVJlZ2lzdGVyZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVuYW1lUmVnaXN0ZXJlZE1vZGVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVzdG9yZSBhbiBleHBlcmltZW50IG1hcmtlZCBmb3IgZGVsZXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvUmVzdG9yZUV4cGVyaW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1Jlc3RvcmVFeHBlcmltZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVzdG9yZSBhIGRlbGV0ZWQgcnVuXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1Jlc3RvcmVSdW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1Jlc3RvcmVSdW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZWFyY2ggZm9yIE1MZmxvdyBleHBlcmltZW50c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICovXG4gIHB1YmxpYyB0b1NlYXJjaEV4cGVyaW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZWFyY2hFeHBlcmltZW50cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlYXJjaCBmb3IgbG9nZ2VkIG1vZGVscyBpbiBNTGZsb3dcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9TZWFyY2hMb2dnZWRNb2RlbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1NlYXJjaExvZ2dlZE1vZGVscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlYXJjaCBmb3IgYSBtb2RlbCB2ZXJzaW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKi9cbiAgcHVibGljIHRvU2VhcmNoTW9kZWxWZXJzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2VhcmNoTW9kZWxWZXJzaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlYXJjaCBmb3IgcmVnaXN0ZXJlZCBtb2RlbHMgaW4gTUxmbG93XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKi9cbiAgcHVibGljIHRvU2VhcmNoUmVnaXN0ZXJlZE1vZGVscygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2VhcmNoUmVnaXN0ZXJlZE1vZGVscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlYXJjaCBmb3IgcnVucyB0aGF0IHNhdGlzZnkgZXhwcmVzc2lvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9TZWFyY2hSdW5zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZWFyY2hSdW5zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2VhcmNoIGZvciB0cmFjZXMgaW4gTUxmbG93XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKi9cbiAgcHVibGljIHRvU2VhcmNoVHJhY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZWFyY2hUcmFjZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZXQgYSB0YWcgb24gYW4gZXhwZXJpbWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9TZXRFeHBlcmltZW50VGFnKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZXRFeHBlcmltZW50VGFnJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2V0IHRhZ3MgZm9yIGEgbG9nZ2VkIG1vZGVsIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9TZXRMb2dnZWRNb2RlbFRhZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1NldExvZ2dlZE1vZGVsVGFncycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNldCBhIHRhZyBmb3IgdGhlIG1vZGVsIHZlcnNpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvU2V0TW9kZWxWZXJzaW9uVGFnKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZXRNb2RlbFZlcnNpb25UYWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZXQgYSByZWdpc3RlcmVkIG1vZGVsIGFsaWFzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1NldFJlZ2lzdGVyZWRNb2RlbEFsaWFzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZXRSZWdpc3RlcmVkTW9kZWxBbGlhcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNldCBhIHRhZyBmb3IgYSByZWdpc3RlcmVkIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1NldFJlZ2lzdGVyZWRNb2RlbFRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2V0UmVnaXN0ZXJlZE1vZGVsVGFnJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2V0IGEgdGFnIG9uIGEgcnVuXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1NldFRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2V0VGFnJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2V0IGEgdHJhY2UgdGFnIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9TZXRUcmFjZVRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2V0VHJhY2VUYWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdGFydCBhIHRyYWNlIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydFRyYWNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydFRyYWNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdHJhbnNpdGlvbiBhIG1vZGVsIHZlcnNpb24gdG8gYSBwYXJ0aWN1bGFyIHN0YWdlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1RyYW5zaXRpb25Nb2RlbFZlcnNpb25TdGFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVHJhbnNpdGlvbk1vZGVsVmVyc2lvblN0YWdlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIHRoZSBtZXRhZGF0YSBmb3IgYW4gTUxmbG93IGV4cGVyaW1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlRXhwZXJpbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlRXhwZXJpbWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgbW9kZWwgdmVyc2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVNb2RlbFZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZU1vZGVsVmVyc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHJlZ2lzdGVyZWQgbW9kZWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlUmVnaXN0ZXJlZE1vZGVsKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVSZWdpc3RlcmVkTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgcnVuIG1ldGFkYXRhXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVJ1bigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlUnVuJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWNjZXNzTGV2ZWxMaXN0OiBBY2Nlc3NMZXZlbExpc3QgPSB7XG4gICAgUmVhZDogW1xuICAgICAgJ0FjY2Vzc1VJJyxcbiAgICAgICdHZXREb3dubG9hZFVSSUZvck1vZGVsVmVyc2lvbkFydGlmYWN0cycsXG4gICAgICAnR2V0RXhwZXJpbWVudCcsXG4gICAgICAnR2V0RXhwZXJpbWVudEJ5TmFtZScsXG4gICAgICAnR2V0TG9nZ2VkTW9kZWwnLFxuICAgICAgJ0dldE1ldHJpY0hpc3RvcnknLFxuICAgICAgJ0dldE1vZGVsVmVyc2lvbicsXG4gICAgICAnR2V0TW9kZWxWZXJzaW9uQnlBbGlhcycsXG4gICAgICAnR2V0UmVnaXN0ZXJlZE1vZGVsJyxcbiAgICAgICdHZXRSdW4nLFxuICAgICAgJ0dldFRyYWNlSW5mbycsXG4gICAgICAnU2VhcmNoRXhwZXJpbWVudHMnLFxuICAgICAgJ1NlYXJjaExvZ2dlZE1vZGVscycsXG4gICAgICAnU2VhcmNoTW9kZWxWZXJzaW9ucycsXG4gICAgICAnU2VhcmNoUmVnaXN0ZXJlZE1vZGVscycsXG4gICAgICAnU2VhcmNoUnVucycsXG4gICAgICAnU2VhcmNoVHJhY2VzJ1xuICAgIF0sXG4gICAgV3JpdGU6IFtcbiAgICAgICdDcmVhdGVFeHBlcmltZW50JyxcbiAgICAgICdDcmVhdGVNb2RlbFZlcnNpb24nLFxuICAgICAgJ0NyZWF0ZVJlZ2lzdGVyZWRNb2RlbCcsXG4gICAgICAnQ3JlYXRlUnVuJyxcbiAgICAgICdEZWxldGVFeHBlcmltZW50JyxcbiAgICAgICdEZWxldGVMb2dnZWRNb2RlbCcsXG4gICAgICAnRGVsZXRlTG9nZ2VkTW9kZWxUYWcnLFxuICAgICAgJ0RlbGV0ZU1vZGVsVmVyc2lvbicsXG4gICAgICAnRGVsZXRlTW9kZWxWZXJzaW9uVGFnJyxcbiAgICAgICdEZWxldGVSZWdpc3RlcmVkTW9kZWwnLFxuICAgICAgJ0RlbGV0ZVJlZ2lzdGVyZWRNb2RlbEFsaWFzJyxcbiAgICAgICdEZWxldGVSZWdpc3RlcmVkTW9kZWxUYWcnLFxuICAgICAgJ0RlbGV0ZVJ1bicsXG4gICAgICAnRGVsZXRlVGFnJyxcbiAgICAgICdEZWxldGVUcmFjZVRhZycsXG4gICAgICAnRGVsZXRlVHJhY2VzJyxcbiAgICAgICdFbmRUcmFjZScsXG4gICAgICAnRmluYWxpemVMb2dnZWRNb2RlbCcsXG4gICAgICAnTG9nQmF0Y2gnLFxuICAgICAgJ0xvZ0lucHV0cycsXG4gICAgICAnTG9nTG9nZ2VkTW9kZWxQYXJhbXMnLFxuICAgICAgJ0xvZ01ldHJpYycsXG4gICAgICAnTG9nTW9kZWwnLFxuICAgICAgJ0xvZ091dHB1dHMnLFxuICAgICAgJ0xvZ1BhcmFtJyxcbiAgICAgICdSZW5hbWVSZWdpc3RlcmVkTW9kZWwnLFxuICAgICAgJ1Jlc3RvcmVFeHBlcmltZW50JyxcbiAgICAgICdSZXN0b3JlUnVuJyxcbiAgICAgICdTZXRFeHBlcmltZW50VGFnJyxcbiAgICAgICdTZXRMb2dnZWRNb2RlbFRhZ3MnLFxuICAgICAgJ1NldE1vZGVsVmVyc2lvblRhZycsXG4gICAgICAnU2V0UmVnaXN0ZXJlZE1vZGVsQWxpYXMnLFxuICAgICAgJ1NldFJlZ2lzdGVyZWRNb2RlbFRhZycsXG4gICAgICAnU2V0VGFnJyxcbiAgICAgICdTZXRUcmFjZVRhZycsXG4gICAgICAnU3RhcnRUcmFjZScsXG4gICAgICAnVHJhbnNpdGlvbk1vZGVsVmVyc2lvblN0YWdlJyxcbiAgICAgICdVcGRhdGVFeHBlcmltZW50JyxcbiAgICAgICdVcGRhdGVNb2RlbFZlcnNpb24nLFxuICAgICAgJ1VwZGF0ZVJlZ2lzdGVyZWRNb2RlbCcsXG4gICAgICAnVXBkYXRlUnVuJ1xuICAgIF0sXG4gICAgTGlzdDogW1xuICAgICAgJ0dldExhdGVzdE1vZGVsVmVyc2lvbnMnLFxuICAgICAgJ0xpc3RBcnRpZmFjdHMnLFxuICAgICAgJ0xpc3RMb2dnZWRNb2RlbEFydGlmYWN0cydcbiAgICBdXG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIG1sZmxvdy10cmFja2luZy1zZXJ2ZXIgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2FnZW1ha2VyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01sZmxvd1RyYWNraW5nU2VydmVyLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIG1sZmxvd1RyYWNraW5nU2VydmVyTmFtZSAtIElkZW50aWZpZXIgZm9yIHRoZSBtbGZsb3dUcmFja2luZ1NlcnZlck5hbWUuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKi9cbiAgcHVibGljIG9uTWxmbG93VHJhY2tpbmdTZXJ2ZXIobWxmbG93VHJhY2tpbmdTZXJ2ZXJOYW1lOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06c2FnZW1ha2VyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTptbGZsb3ctdHJhY2tpbmctc2VydmVyLyR7IG1sZmxvd1RyYWNraW5nU2VydmVyTmFtZSB9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgYSB0YWcga2V5IGFuZCB2YWx1ZSBwYWlyXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9saXN0X2FtYXpvbnNhZ2VtYWtlci5odG1sI2FtYXpvbnNhZ2VtYWtlci1wb2xpY3kta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlRXhwZXJpbWVudCgpXG4gICAqIC0gLnRvQ3JlYXRlTW9kZWxWZXJzaW9uKClcbiAgICogLSAudG9DcmVhdGVSZWdpc3RlcmVkTW9kZWwoKVxuICAgKiAtIC50b0NyZWF0ZVJ1bigpXG4gICAqIC0gLnRvRGVsZXRlRXhwZXJpbWVudCgpXG4gICAqIC0gLnRvRGVsZXRlTG9nZ2VkTW9kZWwoKVxuICAgKiAtIC50b0RlbGV0ZUxvZ2dlZE1vZGVsVGFnKClcbiAgICogLSAudG9EZWxldGVNb2RlbFZlcnNpb24oKVxuICAgKiAtIC50b0RlbGV0ZU1vZGVsVmVyc2lvblRhZygpXG4gICAqIC0gLnRvRGVsZXRlUmVnaXN0ZXJlZE1vZGVsKClcbiAgICogLSAudG9EZWxldGVSZWdpc3RlcmVkTW9kZWxBbGlhcygpXG4gICAqIC0gLnRvRGVsZXRlUmVnaXN0ZXJlZE1vZGVsVGFnKClcbiAgICogLSAudG9EZWxldGVSdW4oKVxuICAgKiAtIC50b0RlbGV0ZVRhZygpXG4gICAqIC0gLnRvRGVsZXRlVHJhY2VUYWcoKVxuICAgKiAtIC50b0RlbGV0ZVRyYWNlcygpXG4gICAqIC0gLnRvRW5kVHJhY2UoKVxuICAgKiAtIC50b0ZpbmFsaXplTG9nZ2VkTW9kZWwoKVxuICAgKiAtIC50b0dldERvd25sb2FkVVJJRm9yTW9kZWxWZXJzaW9uQXJ0aWZhY3RzKClcbiAgICogLSAudG9HZXRFeHBlcmltZW50KClcbiAgICogLSAudG9HZXRFeHBlcmltZW50QnlOYW1lKClcbiAgICogLSAudG9HZXRMYXRlc3RNb2RlbFZlcnNpb25zKClcbiAgICogLSAudG9HZXRMb2dnZWRNb2RlbCgpXG4gICAqIC0gLnRvR2V0TWV0cmljSGlzdG9yeSgpXG4gICAqIC0gLnRvR2V0TW9kZWxWZXJzaW9uKClcbiAgICogLSAudG9HZXRNb2RlbFZlcnNpb25CeUFsaWFzKClcbiAgICogLSAudG9HZXRSZWdpc3RlcmVkTW9kZWwoKVxuICAgKiAtIC50b0dldFJ1bigpXG4gICAqIC0gLnRvR2V0VHJhY2VJbmZvKClcbiAgICogLSAudG9MaXN0QXJ0aWZhY3RzKClcbiAgICogLSAudG9MaXN0TG9nZ2VkTW9kZWxBcnRpZmFjdHMoKVxuICAgKiAtIC50b0xvZ0JhdGNoKClcbiAgICogLSAudG9Mb2dJbnB1dHMoKVxuICAgKiAtIC50b0xvZ0xvZ2dlZE1vZGVsUGFyYW1zKClcbiAgICogLSAudG9Mb2dNZXRyaWMoKVxuICAgKiAtIC50b0xvZ01vZGVsKClcbiAgICogLSAudG9Mb2dPdXRwdXRzKClcbiAgICogLSAudG9Mb2dQYXJhbSgpXG4gICAqIC0gLnRvUmVuYW1lUmVnaXN0ZXJlZE1vZGVsKClcbiAgICogLSAudG9SZXN0b3JlRXhwZXJpbWVudCgpXG4gICAqIC0gLnRvUmVzdG9yZVJ1bigpXG4gICAqIC0gLnRvU2VhcmNoRXhwZXJpbWVudHMoKVxuICAgKiAtIC50b1NlYXJjaExvZ2dlZE1vZGVscygpXG4gICAqIC0gLnRvU2VhcmNoTW9kZWxWZXJzaW9ucygpXG4gICAqIC0gLnRvU2VhcmNoUmVnaXN0ZXJlZE1vZGVscygpXG4gICAqIC0gLnRvU2VhcmNoUnVucygpXG4gICAqIC0gLnRvU2VhcmNoVHJhY2VzKClcbiAgICogLSAudG9TZXRFeHBlcmltZW50VGFnKClcbiAgICogLSAudG9TZXRMb2dnZWRNb2RlbFRhZ3MoKVxuICAgKiAtIC50b1NldE1vZGVsVmVyc2lvblRhZygpXG4gICAqIC0gLnRvU2V0UmVnaXN0ZXJlZE1vZGVsQWxpYXMoKVxuICAgKiAtIC50b1NldFJlZ2lzdGVyZWRNb2RlbFRhZygpXG4gICAqIC0gLnRvU2V0VGFnKClcbiAgICogLSAudG9TZXRUcmFjZVRhZygpXG4gICAqIC0gLnRvU3RhcnRUcmFjZSgpXG4gICAqIC0gLnRvVHJhbnNpdGlvbk1vZGVsVmVyc2lvblN0YWdlKClcbiAgICogLSAudG9VcGRhdGVFeHBlcmltZW50KClcbiAgICogLSAudG9VcGRhdGVNb2RlbFZlcnNpb24oKVxuICAgKiAtIC50b1VwZGF0ZVJlZ2lzdGVyZWRNb2RlbCgpXG4gICAqIC0gLnRvVXBkYXRlUnVuKClcbiAgICpcbiAgICogQHBhcmFtIHRhZ0tleSBUaGUgdGFnIGtleSB0byBjaGVja1xuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1Jlc291cmNlVGFnKHRhZ0tleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhd