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_sagemaker-mlflow.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_sagemaker-mlflow.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FnZW1ha2VyLW1sZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNhZ2VtYWtlci1tbGZsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBQXlEO0FBR3pEOzs7O0dBSUc7QUFDSCxNQUFhLGVBQWdCLFNBQVEsd0JBQWU7SUFHbEQ7Ozs7T0FJRztJQUNJLFVBQVU7UUFDZixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxrQkFBa0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxvQkFBb0I7UUFDekIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSx1QkFBdUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxXQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLG1CQUFtQjtRQUN4QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLHNCQUFzQjtRQUMzQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLG9CQUFvQjtRQUN6QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENB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QixXQUFXO2dCQUNYLFVBQVU7Z0JBQ1YsWUFBWTtnQkFDWixVQUFVO2dCQUNWLHVCQUF1QjtnQkFDdkIsbUJBQW1CO2dCQUNuQixZQUFZO2dCQUNaLGtCQUFrQjtnQkFDbEIsb0JBQW9CO2dCQUNwQixvQkFBb0I7Z0JBQ3BCLHlCQUF5QjtnQkFDekIsdUJBQXVCO2dCQUN2QixRQUFRO2dCQUNSLGFBQWE7Z0JBQ2IsWUFBWTtnQkFDWiw2QkFBNkI7Z0JBQzdCLGtCQUFrQjtnQkFDbEIsb0JBQW9CO2dCQUNwQix1QkFBdUI7Z0JBQ3ZCLFdBQVc7YUFDWjtZQUNELElBQUksRUFBRTtnQkFDSix3QkFBd0I7Z0JBQ3hCLGVBQWU7Z0JBQ2YsMEJBQTBCO2FBQzNCO1NBQ0YsQ0FBQztJQWlHRixDQUFDO0NBQ0Y7QUE5c0JELDBDQThzQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY2Nlc3NMZXZlbExpc3QgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWNjZXNzLWxldmVsJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCwgT3BlcmF0b3IgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgYXdzX2lhbSBhcyBpYW0gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuLyoqXG4gKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW3NhZ2VtYWtlci1tbGZsb3ddKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X3NhZ2VtYWtlci1tbGZsb3cuaHRtbCkuXG4gKlxuICogQHBhcmFtIHNpZCBbU0lEXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX3NpZC5odG1sKSBvZiB0aGUgc3RhdGVtZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBTYWdlbWFrZXJNbGZsb3cgZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICdzYWdlbWFrZXItbWxmbG93JztcblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSBNTGZsb3cgVUlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9BY2Nlc3NVSSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQWNjZXNzVUknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYW4gTUxmbG93IGV4cGVyaW1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlRXhwZXJpbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlRXhwZXJpbWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyBtb2RlbCB2ZXJzaW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZU1vZGVsVmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTW9kZWxWZXJzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgcmVnaXN0ZXJlZCBtb2RlbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVSZWdpc3RlcmVkTW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVJlZ2lzdGVyZWRNb2RlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyBydW4gd2l0aGluIGFuIGV4cGVyaW1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlUnVuKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVSdW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtYXJrIGFuIE1MZmxvdyBleHBlcmltZW50IGZvciBkZWxldGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVFeHBlcmltZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVFeHBlcmltZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgbG9nZ2VkIG1vZGVsIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVMb2dnZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTG9nZ2VkTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSB0YWcgZm9yIGEgbG9nZ2VkIG1vZGVsIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVMb2dnZWRNb2RlbFRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTG9nZ2VkTW9kZWxUYWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBtb2RlbCB2ZXJzaW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZU1vZGVsVmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTW9kZWxWZXJzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgbW9kZWwgdmVyc2lvbiB0YWdcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlTW9kZWxWZXJzaW9uVGFnKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVNb2RlbFZlcnNpb25UYWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSByZWdpc3RlcmVkIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVJlZ2lzdGVyZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUmVnaXN0ZXJlZE1vZGVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgcmVnaXN0ZXJlZCBtb2RlbCBhbGlhc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVSZWdpc3RlcmVkTW9kZWxBbGlhcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUmVnaXN0ZXJlZE1vZGVsQWxpYXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSByZWdpc3RlcmVkIG1vZGVsIHRhZ1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVSZWdpc3RlcmVkTW9kZWxUYWcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVJlZ2lzdGVyZWRNb2RlbFRhZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1hcmsgYSBydW4gZm9yIGRlbGV0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVJ1bigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUnVuJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgdGFnIG9uIGEgcnVuXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlVGFnJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgdHJhY2UgdGFnIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVUcmFjZVRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlVHJhY2VUYWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgdHJhY2VzIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVUcmFjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVRyYWNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGVuZCBhIHRyYWNlIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9FbmRUcmFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRW5kVHJhY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZXQgc3RhdHVzIGZvciBhIGxvZ2dlZCBtb2RlbCBpbiBNTGZsb3dcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvRmluYWxpemVMb2dnZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRmluYWxpemVMb2dnZWRNb2RlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIFVSSSB0byBkb3dubG9hZCBtb2RlbCBhcnRpZmFjdHMgZm9yIGEgc3BlY2lmaWMgbW9kZWwgdmVyc2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICovXG4gIHB1YmxpYyB0b0dldERvd25sb2FkVVJJRm9yTW9kZWxWZXJzaW9uQXJ0aWZhY3RzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXREb3dubG9hZFVSSUZvck1vZGVsVmVyc2lvbkFydGlmYWN0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBtZXRhZGF0YSBmb3IgYW4gTUxmbG93IGV4cGVyaW1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9HZXRFeHBlcmltZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRFeHBlcmltZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IG1ldGFkYXRhIGZvciBhbiBNTGZsb3cgZXhwZXJpbWVudCBieSBuYW1lXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKi9cbiAgcHVibGljIHRvR2V0RXhwZXJpbWVudEJ5TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RXhwZXJpbWVudEJ5TmFtZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgbGF0ZXN0IG1vZGVsIHZlcnNpb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKi9cbiAgcHVibGljIHRvR2V0TGF0ZXN0TW9kZWxWZXJzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TGF0ZXN0TW9kZWxWZXJzaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIGxvZ2dlZCBtb2RlbCBpbiBNTGZsb3dcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9HZXRMb2dnZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TG9nZ2VkTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBsaXN0IG9mIGFsbCB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpZWQgbWV0cmljIGZvciBhIGdpdmVuIHJ1blxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICovXG4gIHB1YmxpYyB0b0dldE1ldHJpY0hpc3RvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE1ldHJpY0hpc3RvcnknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBtb2RlbCB2ZXJzaW9uIGJ5IG1vZGVsIG5hbWUgYW5kIHZlcnNpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9HZXRNb2RlbFZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE1vZGVsVmVyc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBtb2RlbCB2ZXJzaW9uIGJ5IGFsaWFzIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICovXG4gIHB1YmxpYyB0b0dldE1vZGVsVmVyc2lvbkJ5QWxpYXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE1vZGVsVmVyc2lvbkJ5QWxpYXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSByZWdpc3RlcmVkIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKi9cbiAgcHVibGljIHRvR2V0UmVnaXN0ZXJlZE1vZGVsKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRSZWdpc3RlcmVkTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgbWV0YWRhdGEsIG1ldHJpY3MsIHBhcmFtZXRlcnMsIGFuZCB0YWdzIGZvciBhIHJ1blxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICovXG4gIHB1YmxpYyB0b0dldFJ1bigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UnVuJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IGEgdHJhY2UgaW4gTUxmbG93XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKi9cbiAgcHVibGljIHRvR2V0VHJhY2VJbmZvKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUcmFjZUluZm8nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFydGlmYWN0cyBmb3IgYSBydW5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QXJ0aWZhY3RzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QXJ0aWZhY3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhcnRpZmFjdHMgZm9yIGEgbG9nZ2VkIG1vZGVsIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RMb2dnZWRNb2RlbEFydGlmYWN0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdExvZ2dlZE1vZGVsQXJ0aWZhY3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbG9nIGEgYmF0Y2ggb2YgbWV0cmljcywgcGFyYW1ldGVycywgYW5kIHRhZ3MgZm9yIGEgcnVuXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0xvZ0JhdGNoKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMb2dCYXRjaCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxvZyBpbnB1dHMgZm9yIGEgcnVuXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0xvZ0lucHV0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTG9nSW5wdXRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbG9nIHBhcmFtcyBmb3IgYSBsb2dnZWQgbW9kZWwgaW4gTUxmbG93XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0xvZ0xvZ2dlZE1vZGVsUGFyYW1zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMb2dMb2dnZWRNb2RlbFBhcmFtcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxvZyBhIG1ldHJpYyBmb3IgYSBydW5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvTG9nTWV0cmljKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMb2dNZXRyaWMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsb2cgdGhlIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCBhIHJ1blxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9Mb2dNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTG9nTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsb2cgb3V0cHV0cywgc3VjaCBhcyBtb2RlbHMsIGZvciBhIHJ1biBpbiBNTGZsb3dcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvTG9nT3V0cHV0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTG9nT3V0cHV0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxvZyBhIHBhcmFtZXRlciB0cmFja2VkIGR1cmluZyBhIHJ1blxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9Mb2dQYXJhbSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTG9nUGFyYW0nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZW5hbWUgYSByZWdpc3RlcmVkIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1JlbmFtZVJlZ2lzdGVyZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVuYW1lUmVnaXN0ZXJlZE1vZGVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVzdG9yZSBhbiBleHBlcmltZW50IG1hcmtlZCBmb3IgZGVsZXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvUmVzdG9yZUV4cGVyaW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1Jlc3RvcmVFeHBlcmltZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVzdG9yZSBhIGRlbGV0ZWQgcnVuXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1Jlc3RvcmVSdW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1Jlc3RvcmVSdW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZWFyY2ggZm9yIE1MZmxvdyBleHBlcmltZW50c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICovXG4gIHB1YmxpYyB0b1NlYXJjaEV4cGVyaW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZWFyY2hFeHBlcmltZW50cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlYXJjaCBmb3IgbG9nZ2VkIG1vZGVscyBpbiBNTGZsb3dcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9TZWFyY2hMb2dnZWRNb2RlbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1NlYXJjaExvZ2dlZE1vZGVscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlYXJjaCBmb3IgYSBtb2RlbCB2ZXJzaW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKi9cbiAgcHVibGljIHRvU2VhcmNoTW9kZWxWZXJzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2VhcmNoTW9kZWxWZXJzaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlYXJjaCBmb3IgcmVnaXN0ZXJlZCBtb2RlbHMgaW4gTUxmbG93XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKi9cbiAgcHVibGljIHRvU2VhcmNoUmVnaXN0ZXJlZE1vZGVscygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2VhcmNoUmVnaXN0ZXJlZE1vZGVscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlYXJjaCBmb3IgcnVucyB0aGF0IHNhdGlzZnkgZXhwcmVzc2lvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9TZWFyY2hSdW5zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZWFyY2hSdW5zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2VhcmNoIGZvciB0cmFjZXMgaW4gTUxmbG93XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKi9cbiAgcHVibGljIHRvU2VhcmNoVHJhY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZWFyY2hUcmFjZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZXQgYSB0YWcgb24gYW4gZXhwZXJpbWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9TZXRFeHBlcmltZW50VGFnKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZXRFeHBlcmltZW50VGFnJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2V0IHRhZ3MgZm9yIGEgbG9nZ2VkIG1vZGVsIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9TZXRMb2dnZWRNb2RlbFRhZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1NldExvZ2dlZE1vZGVsVGFncycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNldCBhIHRhZyBmb3IgdGhlIG1vZGVsIHZlcnNpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvU2V0TW9kZWxWZXJzaW9uVGFnKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZXRNb2RlbFZlcnNpb25UYWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZXQgYSByZWdpc3RlcmVkIG1vZGVsIGFsaWFzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1NldFJlZ2lzdGVyZWRNb2RlbEFsaWFzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZXRSZWdpc3RlcmVkTW9kZWxBbGlhcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNldCBhIHRhZyBmb3IgYSByZWdpc3RlcmVkIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1NldFJlZ2lzdGVyZWRNb2RlbFRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2V0UmVnaXN0ZXJlZE1vZGVsVGFnJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2V0IGEgdGFnIG9uIGEgcnVuXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1NldFRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2V0VGFnJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2V0IGEgdHJhY2UgdGFnIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9TZXRUcmFjZVRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2V0VHJhY2VUYWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdGFydCBhIHRyYWNlIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydFRyYWNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydFRyYWNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdHJhbnNpdGlvbiBhIG1vZGVsIHZlcnNpb24gdG8gYSBwYXJ0aWN1bGFyIHN0YWdlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1RyYW5zaXRpb25Nb2RlbFZlcnNpb25TdGFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVHJhbnNpdGlvbk1vZGVsVmVyc2lvblN0YWdlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIHRoZSBtZXRhZGF0YSBmb3IgYW4gTUxmbG93IGV4cGVyaW1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlRXhwZXJpbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlRXhwZXJpbWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgbW9kZWwgdmVyc2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVNb2RlbFZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZU1vZGVsVmVyc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHJlZ2lzdGVyZWQgbW9kZWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlUmVnaXN0ZXJlZE1vZGVsKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVSZWdpc3RlcmVkTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgcnVuIG1ldGFkYXRhXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVJ1bigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlUnVuJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWNjZXNzTGV2ZWxMaXN0OiBBY2Nlc3NMZXZlbExpc3QgPSB7XG4gICAgUmVhZDogW1xuICAgICAgJ0FjY2Vzc1VJJyxcbiAgICAgICdHZXREb3dubG9hZFVSSUZvck1vZGVsVmVyc2lvbkFydGlmYWN0cycsXG4gICAgICAnR2V0RXhwZXJpbWVudCcsXG4gICAgICAnR2V0RXhwZXJpbWVudEJ5TmFtZScsXG4gICAgICAnR2V0TG9nZ2VkTW9kZWwnLFxuICAgICAgJ0dldE1ldHJpY0hpc3RvcnknLFxuICAgICAgJ0dldE1vZGVsVmVyc2lvbicsXG4gICAgICAnR2V0TW9kZWxWZXJzaW9uQnlBbGlhcycsXG4gICAgICAnR2V0UmVnaXN0ZXJlZE1vZGVsJyxcbiAgICAgICdHZXRSdW4nLFxuICAgICAgJ0dldFRyYWNlSW5mbycsXG4gICAgICAnU2VhcmNoRXhwZXJpbWVudHMnLFxuICAgICAgJ1NlYXJjaExvZ2dlZE1vZGVscycsXG4gICAgICAnU2VhcmNoTW9kZWxWZXJzaW9ucycsXG4gICAgICAnU2VhcmNoUmVnaXN0ZXJlZE1vZGVscycsXG4gICAgICAnU2VhcmNoUnVucycsXG4gICAgICAnU2VhcmNoVHJhY2VzJ1xuICAgIF0sXG4gICAgV3JpdGU6IFtcbiAgICAgICdDcmVhdGVFeHBlcmltZW50JyxcbiAgICAgICdDcmVhdGVNb2RlbFZlcnNpb24nLFxuICAgICAgJ0NyZWF0ZVJlZ2lzdGVyZWRNb2RlbCcsXG4gICAgICAnQ3JlYXRlUnVuJyxcbiAgICAgICdEZWxldGVFeHBlcmltZW50JyxcbiAgICAgICdEZWxldGVMb2dnZWRNb2RlbCcsXG4gICAgICAnRGVsZXRlTG9nZ2VkTW9kZWxUYWcnLFxuICAgICAgJ0RlbGV0ZU1vZGVsVmVyc2lvbicsXG4gICAgICAnRGVsZXRlTW9kZWxWZXJzaW9uVGFnJyxcbiAgICAgICdEZWxldGVSZWdpc3RlcmVkTW9kZWwnLFxuICAgICAgJ0RlbGV0ZVJlZ2lzdGVyZWRNb2RlbEFsaWFzJyxcbiAgICAgICdEZWxldGVSZWdpc3RlcmVkTW9kZWxUYWcnLFxuICAgICAgJ0RlbGV0ZVJ1bicsXG4gICAgICAnRGVsZXRlVGFnJyxcbiAgICAgICdEZWxldGVUcmFjZVRhZycsXG4gICAgICAnRGVsZXRlVHJhY2VzJyxcbiAgICAgICdFbmRUcmFjZScsXG4gICAgICAnRmluYWxpemVMb2dnZWRNb2RlbCcsXG4gICAgICAnTG9nQmF0Y2gnLFxuICAgICAgJ0xvZ0lucHV0cycsXG4gICAgICAnTG9nTG9nZ2VkTW9kZWxQYXJhbXMnLFxuICAgICAgJ0xvZ01ldHJpYycsXG4gICAgICAnTG9nTW9kZWwnLFxuICAgICAgJ0xvZ091dHB1dHMnLFxuICAgICAgJ0xvZ1BhcmFtJyxcbiAgICAgICdSZW5hbWVSZWdpc3RlcmVkTW9kZWwnLFxuICAgICAgJ1Jlc3RvcmVFeHBlcmltZW50JyxcbiAgICAgICdSZXN0b3JlUnVuJyxcbiAgICAgICdTZXRFeHBlcmltZW50VGFnJyxcbiAgICAgICdTZXRMb2dnZWRNb2RlbFRhZ3MnLFxuICAgICAgJ1NldE1vZGVsVmVyc2lvblRhZycsXG4gICAgICAnU2V0UmVnaXN0ZXJlZE1vZGVsQWxpYXMnLFxuICAgICAgJ1NldFJlZ2lzdGVyZWRNb2RlbFRhZycsXG4gICAgICAnU2V0VGFnJyxcbiAgICAgICdTZXRUcmFjZVRhZycsXG4gICAgICAnU3RhcnRUcmFjZScsXG4gICAgICAnVHJhbnNpdGlvbk1vZGVsVmVyc2lvblN0YWdlJyxcbiAgICAgICdVcGRhdGVFeHBlcmltZW50JyxcbiAgICAgICdVcGRhdGVNb2RlbFZlcnNpb24nLFxuICAgICAgJ1VwZGF0ZVJlZ2lzdGVyZWRNb2RlbCcsXG4gICAgICAnVXBkYXRlUnVuJ1xuICAgIF0sXG4gICAgTGlzdDogW1xuICAgICAgJ0dldExhdGVzdE1vZGVsVmVyc2lvbnMnLFxuICAgICAgJ0xpc3RBcnRpZmFjdHMnLFxuICAgICAgJ0xpc3RMb2dnZWRNb2RlbEFydGlmYWN0cydcbiAgICBdXG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIG1sZmxvdy10cmFja2luZy1zZXJ2ZXIgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2FnZW1ha2VyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01sZmxvd1RyYWNraW5nU2VydmVyLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIG1sZmxvd1RyYWNraW5nU2VydmVyTmFtZSAtIElkZW50aWZpZXIgZm9yIHRoZSBtbGZsb3dUcmFja2luZ1NlcnZlck5hbWUuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKi9cbiAgcHVibGljIG9uTWxmbG93VHJhY2tpbmdTZXJ2ZXIobWxmbG93VHJhY2tpbmdTZXJ2ZXJOYW1lOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06c2FnZW1ha2VyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTptbGZsb3ctdHJhY2tpbmctc2VydmVyLyR7IG1sZmxvd1RyYWNraW5nU2VydmVyTmFtZSB9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgYSB0YWcga2V5IGFuZCB2YWx1ZSBwYWlyXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9saXN0X2FtYXpvbnNhZ2VtYWtlci5odG1sI2FtYXpvbnNhZ2VtYWtlci1wb2xpY3kta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlRXhwZXJpbWVudCgpXG4gICAqIC0gLnRvQ3JlYXRlTW9kZWxWZXJzaW9uKClcbiAgICogLSAudG9DcmVhdGVSZWdpc3RlcmVkTW9kZWwoKVxuICAgKiAtIC50b0NyZWF0ZVJ1bigpXG4gICAqIC0gLnRvRGVsZXRlRXhwZXJpbWVudCgpXG4gICAqIC0gLnRvRGVsZXRlTG9nZ2VkTW9kZWwoKVxuICAgKiAtIC50b0RlbGV0ZUxvZ2dlZE1vZGVsVGFnKClcbiAgICogLSAudG9EZWxldGVNb2RlbFZlcnNpb24oKVxuICAgKiAtIC50b0RlbGV0ZU1vZGVsVmVyc2lvblRhZygpXG4gICAqIC0gLnRvRGVsZXRlUmVnaXN0ZXJlZE1vZGVsKClcbiAgICogLSAudG9EZWxldGVSZWdpc3RlcmVkTW9kZWxBbGlhcygpXG4gICAqIC0gLnRvRGVsZXRlUmVnaXN0ZXJlZE1vZGVsVGFnKClcbiAgICogLSAudG9EZWxldGVSdW4oKVxuICAgKiAtIC50b0RlbGV0ZVRhZygpXG4gICAqIC0gLnRvRGVsZXRlVHJhY2VUYWcoKVxuICAgKiAtIC50b0RlbGV0ZVRyYWNlcygpXG4gICAqIC0gLnRvRW5kVHJhY2UoKVxuICAgKiAtIC50b0ZpbmFsaXplTG9nZ2VkTW9kZWwoKVxuICAgKiAtIC50b0dldERvd25sb2FkVVJJRm9yTW9kZWxWZXJzaW9uQXJ0aWZhY3RzKClcbiAgICogLSAudG9HZXRFeHBlcmltZW50KClcbiAgICogLSAudG9HZXRFeHBlcmltZW50QnlOYW1lKClcbiAgICogLSAudG9HZXRMYXRlc3RNb2RlbFZlcnNpb25zKClcbiAgICogLSAudG9HZXRMb2dnZWRNb2RlbCgpXG4gICAqIC0gLnRvR2V0TWV0cmljSGlzdG9yeSgpXG4gICAqIC0gLnRvR2V0TW9kZWxWZXJzaW9uKClcbiAgICogLSAudG9HZXRNb2RlbFZlcnNpb25CeUFsaWFzKClcbiAgICogLSAudG9HZXRSZWdpc3RlcmVkTW9kZWwoKVxuICAgKiAtIC50b0dldFJ1bigpXG4gICAqIC0gLnRvR2V0VHJhY2VJbmZvKClcbiAgICogLSAudG9MaXN0QXJ0aWZhY3RzKClcbiAgICogLSAudG9MaXN0TG9nZ2VkTW9kZWxBcnRpZmFjdHMoKVxuICAgKiAtIC50b0xvZ0JhdGNoKClcbiAgICogLSAudG9Mb2dJbnB1dHMoKVxuICAgKiAtIC50b0xvZ0xvZ2dlZE1vZGVsUGFyYW1zKClcbiAgICogLSAudG9Mb2dNZXRyaWMoKVxuICAgKiAtIC50b0xvZ01vZGVsKClcbiAgICogLSAudG9Mb2dPdXRwdXRzKClcbiAgICogLSAudG9Mb2dQYXJhbSgpXG4gICAqIC0gLnRvUmVuYW1lUmVnaXN0ZXJlZE1vZGVsKClcbiAgICogLSAudG9SZXN0b3JlRXhwZXJpbWVudCgpXG4gICAqIC0gLnRvUmVzdG9yZVJ1bigpXG4gICAqIC0gLnRvU2VhcmNoRXhwZXJpbWVudHMoKVxuICAgKiAtIC50b1NlYXJjaExvZ2dlZE1vZGVscygpXG4gICAqIC0gLnRvU2VhcmNoTW9kZWxWZXJzaW9ucygpXG4gICAqIC0gLnRvU2VhcmNoUmVnaXN0ZXJlZE1vZGVscygpXG4gICAqIC0gLnRvU2VhcmNoUnVucygpXG4gICAqIC0gLnRvU2VhcmNoVHJhY2VzKClcbiAgICogLSAudG9TZXRFeHBlcmltZW50VGFnKClcbiAgICogLSAudG9TZXRMb2dnZWRNb2RlbFRhZ3MoKVxuICAgKiAtIC50b1NldE1vZGVsVmVyc2lvblRhZygpXG4gICAqIC0gLnRvU2V0UmVnaXN0ZXJlZE1vZGVsQWxpYXMoKVxuICAgKiAtIC50b1NldFJlZ2lzdGVyZWRNb2RlbFRhZygpXG4gICAqIC0gLnRvU2V0VGFnKClcbiAgICogLSAudG9TZXRUcmFjZVRhZygpXG4gICAqIC0gLnRvU3RhcnRUcmFjZSgpXG4gICAqIC0gLnRvVHJhbnNpdGlvbk1vZGVsVmVyc2lvblN0YWdlKClcbiAgICogLSAudG9VcGRhdGVFeHBlcmltZW50KClcbiAgICogLSAudG9VcGRhdGVNb2RlbFZlcnNpb24oKVxuICAgKiAtIC50b1VwZGF0ZVJlZ2lzdGVyZWRNb2RlbCgpXG4gICAqIC0gLnRvVXBkYXRlUnVuKClcbiAgICpcbiAgICogQHBhcmFtIHRhZ0tleSBUaGUgdGFnIGtleSB0byBjaGVja1xuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1Jlc291cmNlVGFnKHRhZ0tleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgYXdzOlJlc291cmNlVGFnLyR7IHRhZ0tleSB9YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFtzYWdlbWFrZXItbWxmbG93XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9zYWdlbWFrZXItbWxmbG93Lmh0bWwpLlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IocHJvcHM/OiBpYW0uUG9saWN5U3RhdGVtZW50UHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbn1cbiJdfQ==