All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.pulumi.azurenative.securityinsights.ScheduledAlertRuleArgs Maven / Gradle / Ivy

There is a newer version: 2.89.2
Show newest version
// *** WARNING: this file was generated by pulumi-java-gen. ***
// *** Do not edit by hand unless you're certain you know what you are doing! ***

package com.pulumi.azurenative.securityinsights;

import com.pulumi.azurenative.securityinsights.enums.AlertSeverity;
import com.pulumi.azurenative.securityinsights.enums.AttackTactic;
import com.pulumi.azurenative.securityinsights.enums.TriggerOperator;
import com.pulumi.azurenative.securityinsights.inputs.AlertDetailsOverrideArgs;
import com.pulumi.azurenative.securityinsights.inputs.EntityMappingArgs;
import com.pulumi.azurenative.securityinsights.inputs.EventGroupingSettingsArgs;
import com.pulumi.azurenative.securityinsights.inputs.IncidentConfigurationArgs;
import com.pulumi.core.Either;
import com.pulumi.core.Output;
import com.pulumi.core.annotations.Import;
import com.pulumi.core.internal.Codegen;
import com.pulumi.exceptions.MissingRequiredPropertyException;
import java.lang.Boolean;
import java.lang.Integer;
import java.lang.String;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import javax.annotation.Nullable;


public final class ScheduledAlertRuleArgs extends com.pulumi.resources.ResourceArgs {

    public static final ScheduledAlertRuleArgs Empty = new ScheduledAlertRuleArgs();

    /**
     * The alert details override settings
     * 
     */
    @Import(name="alertDetailsOverride")
    private @Nullable Output alertDetailsOverride;

    /**
     * @return The alert details override settings
     * 
     */
    public Optional> alertDetailsOverride() {
        return Optional.ofNullable(this.alertDetailsOverride);
    }

    /**
     * The Name of the alert rule template used to create this rule.
     * 
     */
    @Import(name="alertRuleTemplateName")
    private @Nullable Output alertRuleTemplateName;

    /**
     * @return The Name of the alert rule template used to create this rule.
     * 
     */
    public Optional> alertRuleTemplateName() {
        return Optional.ofNullable(this.alertRuleTemplateName);
    }

    /**
     * Dictionary of string key-value pairs of columns to be attached to the alert
     * 
     */
    @Import(name="customDetails")
    private @Nullable Output> customDetails;

    /**
     * @return Dictionary of string key-value pairs of columns to be attached to the alert
     * 
     */
    public Optional>> customDetails() {
        return Optional.ofNullable(this.customDetails);
    }

    /**
     * The description of the alert rule.
     * 
     */
    @Import(name="description")
    private @Nullable Output description;

    /**
     * @return The description of the alert rule.
     * 
     */
    public Optional> description() {
        return Optional.ofNullable(this.description);
    }

    /**
     * The display name for alerts created by this alert rule.
     * 
     */
    @Import(name="displayName", required=true)
    private Output displayName;

    /**
     * @return The display name for alerts created by this alert rule.
     * 
     */
    public Output displayName() {
        return this.displayName;
    }

    /**
     * Determines whether this alert rule is enabled or disabled.
     * 
     */
    @Import(name="enabled", required=true)
    private Output enabled;

    /**
     * @return Determines whether this alert rule is enabled or disabled.
     * 
     */
    public Output enabled() {
        return this.enabled;
    }

    /**
     * Array of the entity mappings of the alert rule
     * 
     */
    @Import(name="entityMappings")
    private @Nullable Output> entityMappings;

    /**
     * @return Array of the entity mappings of the alert rule
     * 
     */
    public Optional>> entityMappings() {
        return Optional.ofNullable(this.entityMappings);
    }

    /**
     * The event grouping settings.
     * 
     */
    @Import(name="eventGroupingSettings")
    private @Nullable Output eventGroupingSettings;

    /**
     * @return The event grouping settings.
     * 
     */
    public Optional> eventGroupingSettings() {
        return Optional.ofNullable(this.eventGroupingSettings);
    }

    /**
     * The settings of the incidents that created from alerts triggered by this analytics rule
     * 
     */
    @Import(name="incidentConfiguration")
    private @Nullable Output incidentConfiguration;

    /**
     * @return The settings of the incidents that created from alerts triggered by this analytics rule
     * 
     */
    public Optional> incidentConfiguration() {
        return Optional.ofNullable(this.incidentConfiguration);
    }

    /**
     * The kind of the alert rule
     * Expected value is 'Scheduled'.
     * 
     */
    @Import(name="kind", required=true)
    private Output kind;

    /**
     * @return The kind of the alert rule
     * Expected value is 'Scheduled'.
     * 
     */
    public Output kind() {
        return this.kind;
    }

    /**
     * The query that creates alerts for this rule.
     * 
     */
    @Import(name="query", required=true)
    private Output query;

    /**
     * @return The query that creates alerts for this rule.
     * 
     */
    public Output query() {
        return this.query;
    }

    /**
     * The frequency (in ISO 8601 duration format) for this alert rule to run.
     * 
     */
    @Import(name="queryFrequency", required=true)
    private Output queryFrequency;

    /**
     * @return The frequency (in ISO 8601 duration format) for this alert rule to run.
     * 
     */
    public Output queryFrequency() {
        return this.queryFrequency;
    }

    /**
     * The period (in ISO 8601 duration format) that this alert rule looks at.
     * 
     */
    @Import(name="queryPeriod", required=true)
    private Output queryPeriod;

    /**
     * @return The period (in ISO 8601 duration format) that this alert rule looks at.
     * 
     */
    public Output queryPeriod() {
        return this.queryPeriod;
    }

    /**
     * The name of the resource group. The name is case insensitive.
     * 
     */
    @Import(name="resourceGroupName", required=true)
    private Output resourceGroupName;

    /**
     * @return The name of the resource group. The name is case insensitive.
     * 
     */
    public Output resourceGroupName() {
        return this.resourceGroupName;
    }

    /**
     * Alert rule ID
     * 
     */
    @Import(name="ruleId")
    private @Nullable Output ruleId;

    /**
     * @return Alert rule ID
     * 
     */
    public Optional> ruleId() {
        return Optional.ofNullable(this.ruleId);
    }

    /**
     * The severity for alerts created by this alert rule.
     * 
     */
    @Import(name="severity", required=true)
    private Output> severity;

    /**
     * @return The severity for alerts created by this alert rule.
     * 
     */
    public Output> severity() {
        return this.severity;
    }

    /**
     * The suppression (in ISO 8601 duration format) to wait since last time this alert rule been triggered.
     * 
     */
    @Import(name="suppressionDuration", required=true)
    private Output suppressionDuration;

    /**
     * @return The suppression (in ISO 8601 duration format) to wait since last time this alert rule been triggered.
     * 
     */
    public Output suppressionDuration() {
        return this.suppressionDuration;
    }

    /**
     * Determines whether the suppression for this alert rule is enabled or disabled.
     * 
     */
    @Import(name="suppressionEnabled", required=true)
    private Output suppressionEnabled;

    /**
     * @return Determines whether the suppression for this alert rule is enabled or disabled.
     * 
     */
    public Output suppressionEnabled() {
        return this.suppressionEnabled;
    }

    /**
     * The tactics of the alert rule
     * 
     */
    @Import(name="tactics")
    private @Nullable Output>> tactics;

    /**
     * @return The tactics of the alert rule
     * 
     */
    public Optional>>> tactics() {
        return Optional.ofNullable(this.tactics);
    }

    /**
     * The techniques of the alert rule
     * 
     */
    @Import(name="techniques")
    private @Nullable Output> techniques;

    /**
     * @return The techniques of the alert rule
     * 
     */
    public Optional>> techniques() {
        return Optional.ofNullable(this.techniques);
    }

    /**
     * The version of the alert rule template used to create this rule - in format <a.b.c>, where all are numbers, for example 0 <1.0.2>
     * 
     */
    @Import(name="templateVersion")
    private @Nullable Output templateVersion;

    /**
     * @return The version of the alert rule template used to create this rule - in format <a.b.c>, where all are numbers, for example 0 <1.0.2>
     * 
     */
    public Optional> templateVersion() {
        return Optional.ofNullable(this.templateVersion);
    }

    /**
     * The operation against the threshold that triggers alert rule.
     * 
     */
    @Import(name="triggerOperator", required=true)
    private Output triggerOperator;

    /**
     * @return The operation against the threshold that triggers alert rule.
     * 
     */
    public Output triggerOperator() {
        return this.triggerOperator;
    }

    /**
     * The threshold triggers this alert rule.
     * 
     */
    @Import(name="triggerThreshold", required=true)
    private Output triggerThreshold;

    /**
     * @return The threshold triggers this alert rule.
     * 
     */
    public Output triggerThreshold() {
        return this.triggerThreshold;
    }

    /**
     * The name of the workspace.
     * 
     */
    @Import(name="workspaceName", required=true)
    private Output workspaceName;

    /**
     * @return The name of the workspace.
     * 
     */
    public Output workspaceName() {
        return this.workspaceName;
    }

    private ScheduledAlertRuleArgs() {}

    private ScheduledAlertRuleArgs(ScheduledAlertRuleArgs $) {
        this.alertDetailsOverride = $.alertDetailsOverride;
        this.alertRuleTemplateName = $.alertRuleTemplateName;
        this.customDetails = $.customDetails;
        this.description = $.description;
        this.displayName = $.displayName;
        this.enabled = $.enabled;
        this.entityMappings = $.entityMappings;
        this.eventGroupingSettings = $.eventGroupingSettings;
        this.incidentConfiguration = $.incidentConfiguration;
        this.kind = $.kind;
        this.query = $.query;
        this.queryFrequency = $.queryFrequency;
        this.queryPeriod = $.queryPeriod;
        this.resourceGroupName = $.resourceGroupName;
        this.ruleId = $.ruleId;
        this.severity = $.severity;
        this.suppressionDuration = $.suppressionDuration;
        this.suppressionEnabled = $.suppressionEnabled;
        this.tactics = $.tactics;
        this.techniques = $.techniques;
        this.templateVersion = $.templateVersion;
        this.triggerOperator = $.triggerOperator;
        this.triggerThreshold = $.triggerThreshold;
        this.workspaceName = $.workspaceName;
    }

    public static Builder builder() {
        return new Builder();
    }
    public static Builder builder(ScheduledAlertRuleArgs defaults) {
        return new Builder(defaults);
    }

    public static final class Builder {
        private ScheduledAlertRuleArgs $;

        public Builder() {
            $ = new ScheduledAlertRuleArgs();
        }

        public Builder(ScheduledAlertRuleArgs defaults) {
            $ = new ScheduledAlertRuleArgs(Objects.requireNonNull(defaults));
        }

        /**
         * @param alertDetailsOverride The alert details override settings
         * 
         * @return builder
         * 
         */
        public Builder alertDetailsOverride(@Nullable Output alertDetailsOverride) {
            $.alertDetailsOverride = alertDetailsOverride;
            return this;
        }

        /**
         * @param alertDetailsOverride The alert details override settings
         * 
         * @return builder
         * 
         */
        public Builder alertDetailsOverride(AlertDetailsOverrideArgs alertDetailsOverride) {
            return alertDetailsOverride(Output.of(alertDetailsOverride));
        }

        /**
         * @param alertRuleTemplateName The Name of the alert rule template used to create this rule.
         * 
         * @return builder
         * 
         */
        public Builder alertRuleTemplateName(@Nullable Output alertRuleTemplateName) {
            $.alertRuleTemplateName = alertRuleTemplateName;
            return this;
        }

        /**
         * @param alertRuleTemplateName The Name of the alert rule template used to create this rule.
         * 
         * @return builder
         * 
         */
        public Builder alertRuleTemplateName(String alertRuleTemplateName) {
            return alertRuleTemplateName(Output.of(alertRuleTemplateName));
        }

        /**
         * @param customDetails Dictionary of string key-value pairs of columns to be attached to the alert
         * 
         * @return builder
         * 
         */
        public Builder customDetails(@Nullable Output> customDetails) {
            $.customDetails = customDetails;
            return this;
        }

        /**
         * @param customDetails Dictionary of string key-value pairs of columns to be attached to the alert
         * 
         * @return builder
         * 
         */
        public Builder customDetails(Map customDetails) {
            return customDetails(Output.of(customDetails));
        }

        /**
         * @param description The description of the alert rule.
         * 
         * @return builder
         * 
         */
        public Builder description(@Nullable Output description) {
            $.description = description;
            return this;
        }

        /**
         * @param description The description of the alert rule.
         * 
         * @return builder
         * 
         */
        public Builder description(String description) {
            return description(Output.of(description));
        }

        /**
         * @param displayName The display name for alerts created by this alert rule.
         * 
         * @return builder
         * 
         */
        public Builder displayName(Output displayName) {
            $.displayName = displayName;
            return this;
        }

        /**
         * @param displayName The display name for alerts created by this alert rule.
         * 
         * @return builder
         * 
         */
        public Builder displayName(String displayName) {
            return displayName(Output.of(displayName));
        }

        /**
         * @param enabled Determines whether this alert rule is enabled or disabled.
         * 
         * @return builder
         * 
         */
        public Builder enabled(Output enabled) {
            $.enabled = enabled;
            return this;
        }

        /**
         * @param enabled Determines whether this alert rule is enabled or disabled.
         * 
         * @return builder
         * 
         */
        public Builder enabled(Boolean enabled) {
            return enabled(Output.of(enabled));
        }

        /**
         * @param entityMappings Array of the entity mappings of the alert rule
         * 
         * @return builder
         * 
         */
        public Builder entityMappings(@Nullable Output> entityMappings) {
            $.entityMappings = entityMappings;
            return this;
        }

        /**
         * @param entityMappings Array of the entity mappings of the alert rule
         * 
         * @return builder
         * 
         */
        public Builder entityMappings(List entityMappings) {
            return entityMappings(Output.of(entityMappings));
        }

        /**
         * @param entityMappings Array of the entity mappings of the alert rule
         * 
         * @return builder
         * 
         */
        public Builder entityMappings(EntityMappingArgs... entityMappings) {
            return entityMappings(List.of(entityMappings));
        }

        /**
         * @param eventGroupingSettings The event grouping settings.
         * 
         * @return builder
         * 
         */
        public Builder eventGroupingSettings(@Nullable Output eventGroupingSettings) {
            $.eventGroupingSettings = eventGroupingSettings;
            return this;
        }

        /**
         * @param eventGroupingSettings The event grouping settings.
         * 
         * @return builder
         * 
         */
        public Builder eventGroupingSettings(EventGroupingSettingsArgs eventGroupingSettings) {
            return eventGroupingSettings(Output.of(eventGroupingSettings));
        }

        /**
         * @param incidentConfiguration The settings of the incidents that created from alerts triggered by this analytics rule
         * 
         * @return builder
         * 
         */
        public Builder incidentConfiguration(@Nullable Output incidentConfiguration) {
            $.incidentConfiguration = incidentConfiguration;
            return this;
        }

        /**
         * @param incidentConfiguration The settings of the incidents that created from alerts triggered by this analytics rule
         * 
         * @return builder
         * 
         */
        public Builder incidentConfiguration(IncidentConfigurationArgs incidentConfiguration) {
            return incidentConfiguration(Output.of(incidentConfiguration));
        }

        /**
         * @param kind The kind of the alert rule
         * Expected value is 'Scheduled'.
         * 
         * @return builder
         * 
         */
        public Builder kind(Output kind) {
            $.kind = kind;
            return this;
        }

        /**
         * @param kind The kind of the alert rule
         * Expected value is 'Scheduled'.
         * 
         * @return builder
         * 
         */
        public Builder kind(String kind) {
            return kind(Output.of(kind));
        }

        /**
         * @param query The query that creates alerts for this rule.
         * 
         * @return builder
         * 
         */
        public Builder query(Output query) {
            $.query = query;
            return this;
        }

        /**
         * @param query The query that creates alerts for this rule.
         * 
         * @return builder
         * 
         */
        public Builder query(String query) {
            return query(Output.of(query));
        }

        /**
         * @param queryFrequency The frequency (in ISO 8601 duration format) for this alert rule to run.
         * 
         * @return builder
         * 
         */
        public Builder queryFrequency(Output queryFrequency) {
            $.queryFrequency = queryFrequency;
            return this;
        }

        /**
         * @param queryFrequency The frequency (in ISO 8601 duration format) for this alert rule to run.
         * 
         * @return builder
         * 
         */
        public Builder queryFrequency(String queryFrequency) {
            return queryFrequency(Output.of(queryFrequency));
        }

        /**
         * @param queryPeriod The period (in ISO 8601 duration format) that this alert rule looks at.
         * 
         * @return builder
         * 
         */
        public Builder queryPeriod(Output queryPeriod) {
            $.queryPeriod = queryPeriod;
            return this;
        }

        /**
         * @param queryPeriod The period (in ISO 8601 duration format) that this alert rule looks at.
         * 
         * @return builder
         * 
         */
        public Builder queryPeriod(String queryPeriod) {
            return queryPeriod(Output.of(queryPeriod));
        }

        /**
         * @param resourceGroupName The name of the resource group. The name is case insensitive.
         * 
         * @return builder
         * 
         */
        public Builder resourceGroupName(Output resourceGroupName) {
            $.resourceGroupName = resourceGroupName;
            return this;
        }

        /**
         * @param resourceGroupName The name of the resource group. The name is case insensitive.
         * 
         * @return builder
         * 
         */
        public Builder resourceGroupName(String resourceGroupName) {
            return resourceGroupName(Output.of(resourceGroupName));
        }

        /**
         * @param ruleId Alert rule ID
         * 
         * @return builder
         * 
         */
        public Builder ruleId(@Nullable Output ruleId) {
            $.ruleId = ruleId;
            return this;
        }

        /**
         * @param ruleId Alert rule ID
         * 
         * @return builder
         * 
         */
        public Builder ruleId(String ruleId) {
            return ruleId(Output.of(ruleId));
        }

        /**
         * @param severity The severity for alerts created by this alert rule.
         * 
         * @return builder
         * 
         */
        public Builder severity(Output> severity) {
            $.severity = severity;
            return this;
        }

        /**
         * @param severity The severity for alerts created by this alert rule.
         * 
         * @return builder
         * 
         */
        public Builder severity(Either severity) {
            return severity(Output.of(severity));
        }

        /**
         * @param severity The severity for alerts created by this alert rule.
         * 
         * @return builder
         * 
         */
        public Builder severity(String severity) {
            return severity(Either.ofLeft(severity));
        }

        /**
         * @param severity The severity for alerts created by this alert rule.
         * 
         * @return builder
         * 
         */
        public Builder severity(AlertSeverity severity) {
            return severity(Either.ofRight(severity));
        }

        /**
         * @param suppressionDuration The suppression (in ISO 8601 duration format) to wait since last time this alert rule been triggered.
         * 
         * @return builder
         * 
         */
        public Builder suppressionDuration(Output suppressionDuration) {
            $.suppressionDuration = suppressionDuration;
            return this;
        }

        /**
         * @param suppressionDuration The suppression (in ISO 8601 duration format) to wait since last time this alert rule been triggered.
         * 
         * @return builder
         * 
         */
        public Builder suppressionDuration(String suppressionDuration) {
            return suppressionDuration(Output.of(suppressionDuration));
        }

        /**
         * @param suppressionEnabled Determines whether the suppression for this alert rule is enabled or disabled.
         * 
         * @return builder
         * 
         */
        public Builder suppressionEnabled(Output suppressionEnabled) {
            $.suppressionEnabled = suppressionEnabled;
            return this;
        }

        /**
         * @param suppressionEnabled Determines whether the suppression for this alert rule is enabled or disabled.
         * 
         * @return builder
         * 
         */
        public Builder suppressionEnabled(Boolean suppressionEnabled) {
            return suppressionEnabled(Output.of(suppressionEnabled));
        }

        /**
         * @param tactics The tactics of the alert rule
         * 
         * @return builder
         * 
         */
        public Builder tactics(@Nullable Output>> tactics) {
            $.tactics = tactics;
            return this;
        }

        /**
         * @param tactics The tactics of the alert rule
         * 
         * @return builder
         * 
         */
        public Builder tactics(List> tactics) {
            return tactics(Output.of(tactics));
        }

        /**
         * @param tactics The tactics of the alert rule
         * 
         * @return builder
         * 
         */
        public Builder tactics(Either... tactics) {
            return tactics(List.of(tactics));
        }

        /**
         * @param techniques The techniques of the alert rule
         * 
         * @return builder
         * 
         */
        public Builder techniques(@Nullable Output> techniques) {
            $.techniques = techniques;
            return this;
        }

        /**
         * @param techniques The techniques of the alert rule
         * 
         * @return builder
         * 
         */
        public Builder techniques(List techniques) {
            return techniques(Output.of(techniques));
        }

        /**
         * @param techniques The techniques of the alert rule
         * 
         * @return builder
         * 
         */
        public Builder techniques(String... techniques) {
            return techniques(List.of(techniques));
        }

        /**
         * @param templateVersion The version of the alert rule template used to create this rule - in format <a.b.c>, where all are numbers, for example 0 <1.0.2>
         * 
         * @return builder
         * 
         */
        public Builder templateVersion(@Nullable Output templateVersion) {
            $.templateVersion = templateVersion;
            return this;
        }

        /**
         * @param templateVersion The version of the alert rule template used to create this rule - in format <a.b.c>, where all are numbers, for example 0 <1.0.2>
         * 
         * @return builder
         * 
         */
        public Builder templateVersion(String templateVersion) {
            return templateVersion(Output.of(templateVersion));
        }

        /**
         * @param triggerOperator The operation against the threshold that triggers alert rule.
         * 
         * @return builder
         * 
         */
        public Builder triggerOperator(Output triggerOperator) {
            $.triggerOperator = triggerOperator;
            return this;
        }

        /**
         * @param triggerOperator The operation against the threshold that triggers alert rule.
         * 
         * @return builder
         * 
         */
        public Builder triggerOperator(TriggerOperator triggerOperator) {
            return triggerOperator(Output.of(triggerOperator));
        }

        /**
         * @param triggerThreshold The threshold triggers this alert rule.
         * 
         * @return builder
         * 
         */
        public Builder triggerThreshold(Output triggerThreshold) {
            $.triggerThreshold = triggerThreshold;
            return this;
        }

        /**
         * @param triggerThreshold The threshold triggers this alert rule.
         * 
         * @return builder
         * 
         */
        public Builder triggerThreshold(Integer triggerThreshold) {
            return triggerThreshold(Output.of(triggerThreshold));
        }

        /**
         * @param workspaceName The name of the workspace.
         * 
         * @return builder
         * 
         */
        public Builder workspaceName(Output workspaceName) {
            $.workspaceName = workspaceName;
            return this;
        }

        /**
         * @param workspaceName The name of the workspace.
         * 
         * @return builder
         * 
         */
        public Builder workspaceName(String workspaceName) {
            return workspaceName(Output.of(workspaceName));
        }

        public ScheduledAlertRuleArgs build() {
            if ($.displayName == null) {
                throw new MissingRequiredPropertyException("ScheduledAlertRuleArgs", "displayName");
            }
            if ($.enabled == null) {
                throw new MissingRequiredPropertyException("ScheduledAlertRuleArgs", "enabled");
            }
            $.kind = Codegen.stringProp("kind").output().arg($.kind).require();
            if ($.query == null) {
                throw new MissingRequiredPropertyException("ScheduledAlertRuleArgs", "query");
            }
            if ($.queryFrequency == null) {
                throw new MissingRequiredPropertyException("ScheduledAlertRuleArgs", "queryFrequency");
            }
            if ($.queryPeriod == null) {
                throw new MissingRequiredPropertyException("ScheduledAlertRuleArgs", "queryPeriod");
            }
            if ($.resourceGroupName == null) {
                throw new MissingRequiredPropertyException("ScheduledAlertRuleArgs", "resourceGroupName");
            }
            if ($.severity == null) {
                throw new MissingRequiredPropertyException("ScheduledAlertRuleArgs", "severity");
            }
            if ($.suppressionDuration == null) {
                throw new MissingRequiredPropertyException("ScheduledAlertRuleArgs", "suppressionDuration");
            }
            if ($.suppressionEnabled == null) {
                throw new MissingRequiredPropertyException("ScheduledAlertRuleArgs", "suppressionEnabled");
            }
            if ($.triggerOperator == null) {
                throw new MissingRequiredPropertyException("ScheduledAlertRuleArgs", "triggerOperator");
            }
            if ($.triggerThreshold == null) {
                throw new MissingRequiredPropertyException("ScheduledAlertRuleArgs", "triggerThreshold");
            }
            if ($.workspaceName == null) {
                throw new MissingRequiredPropertyException("ScheduledAlertRuleArgs", "workspaceName");
            }
            return $;
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy