import * as i0 from '@angular/core';
import { PipeTransform, EnvironmentInjector, Injector, NgModuleRef, Type, InjectionToken, ValueProvider, ClassProvider, ExistingProvider, StaticProvider, AfterViewInit, OnDestroy, OnChanges, EventEmitter, ElementRef, ChangeDetectorRef, SimpleChanges, Provider, ModuleWithProviders, ViewContainerRef, Renderer2, TemplateRef, OnInit, AfterViewChecked, EnvironmentProviders, QueryList, AfterContentInit, DoCheck, NgZone, DestroyRef, ApplicationRef } from '@angular/core';
import * as _c8y_client from '@c8y/client';
import { IApplication, VersioningMatrix, IManagedObject, SystemOptionsService, TenantOptionsService, IUser, ICurrentUser, ICurrentTenant, ApplicationService, FetchClient, TenantLoginOptionsService, Realtime, InventoryService, UserService, IIdentified, IResultList, Paging, InventoryBinaryService, IManagedObjectBinary, IdReference, IEvent, OperationStatus, ITenantLoginOption, TenantLoginOptionType, ICustomProperties, FeatureService, BasicAuth, CookieAuth, PasswordStrength, Client, ITotp, TenantService, QueriesUtil, ApplicationType, IResult, Service, aggregationType, AuditRecordType, IAuditRecord, AuditService, IAlarm, IMeasurement, MeasurementService, IOperationBulk, IOperation, DeviceRegistrationStatus, ApplicationRemotePlugins, IManifest } from '@c8y/client';
import * as rxjs from 'rxjs';
import { Observable, BehaviorSubject, ReplaySubject, Subject, UnaryFunction, MonoTypeOperatorFunction, Subscription } from 'rxjs';
import * as _c8y_options from '@c8y/options';
import { ApplicationOptions as ApplicationOptions$1, BrandingCssVars, Languages, I18nExtra, Docs, Icon, LoginExtraLink, CookieBannerConfiguration, CookiePreferencesConfiguration, MessageBannerConfiguration, PluginsExports, RemotePlugins, MapTileLayer, MapDefaultConfig } from '@c8y/options';
export { ApplicationOptions } from '@c8y/options';
import * as i1$2 from '@angular/router';
import { ActivatedRoute, Router, NavigationExtras, Route as Route$1, RouterStateSnapshot, ActivatedRouteSnapshot, Data, Routes, ExtraOptions, Event as Event$1 } from '@angular/router';
import { ApiService, ApiCall } from '@c8y/ngx-components/api';
import { BootstrapMetaData, RemoteModuleFactoryWithMetadata } from '@c8y/bootstrap';
import { SupportedIconsSuggestions } from '@c8y/ngx-components/icon-selector/icons';
import { TranslateService as TranslateService$1, TranslatePipe, TranslateDirective, Language, TranslationObject, TranslateStore, InterpolatableTranslation, RootTranslateServiceConfig, MissingTranslationHandler, TranslateParser, MissingTranslationHandlerParams, TranslateLoader } from '@ngx-translate/core';
import * as i1 from '@angular/common';
import { DatePipe as DatePipe$1, DatePipeConfig, DecimalPipe, LocationStrategy, Location } from '@angular/common';
import * as i3 from 'ngx-bootstrap/tooltip';
import * as i4 from '@angular/cdk/scrolling';
import { CdkVirtualScrollViewport, VirtualScrollStrategy } from '@angular/cdk/scrolling';
import * as _angular_platform_browser from '@angular/platform-browser';
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
import { Stream } from 'stream';
import * as i5 from 'ngx-bootstrap/dropdown';
import { BsDropdownDirective } from 'ngx-bootstrap/dropdown';
import * as i1$1 from '@angular/cdk/a11y';
import * as i2 from 'ngx-bootstrap/collapse';
import * as i3$1 from 'ngx-bootstrap/popover';
import { PopoverDirective } from 'ngx-bootstrap/popover';
import * as i2$3 from '@angular/cdk/stepper';
import { StepState, CdkStepper, CdkStep } from '@angular/cdk/stepper';
import * as i2$1 from '@angular/forms';
import { NgModel, FormControlName, ValidationErrors, FormControl, Validator, AbstractControl, ValidatorFn, ControlValueAccessor, AsyncValidatorFn, NgControl, CheckboxControlValueAccessor, FormGroup, FormBuilder, NgForm, AbstractControlOptions } from '@angular/forms';
import * as i1$3 from 'ngx-bootstrap/modal';
import { BsModalRef, BsModalService, ModalOptions } from 'ngx-bootstrap/modal';
import * as i5$1 from 'angularx-qrcode';
import * as i4$1 from 'ngx-bootstrap/datepicker';
import { BsLocaleService, BsDatepickerDirective, BsDaterangepickerConfig } from 'ngx-bootstrap/datepicker';
import * as i6 from '@ngx-formly/core';
import { FormlyFieldConfig, FieldArrayType, FormlyFieldProps, FieldType, FieldWrapper, FieldTypeConfig, FormlyFormOptions } from '@ngx-formly/core';
import * as _c8y_ngx_components_dist_icon_selector_icons from '@c8y/ngx-components/dist/icon-selector/icons';
import { Directionality } from '@angular/cdk/bidi';
import { Entry } from '@zip.js/zip.js';
import * as i10 from '@ngx-formly/core/select';
import * as i5$2 from 'ngx-bootstrap/timepicker';
import * as i16 from '@angular/cdk/text-field';
import { FormlyJsonschema } from '@ngx-formly/core/json-schema';
import { JSONSchema7 } from 'json-schema';
import * as i3$2 from '@angular/cdk/drag-drop';
import { CdkDrag, CdkDragStart, CdkDragEnd } from '@angular/cdk/drag-drop';
import * as i16$1 from '@c8y/ngx-components/interval-picker';
import { Interval } from '@c8y/ngx-components/interval-picker';
import * as packages_client_lib from 'packages/client/lib';
import * as i2$2 from '@angular/cdk/table';
import { CdkTable } from '@angular/cdk/table';
import * as i12 from 'ngx-bootstrap/pagination';
import { DataSource, CollectionViewer } from '@angular/cdk/collections';
import { ComponentType } from '@angular/cdk/overlay';

declare class AppSwitcherComponent {
    static ɵfac: i0.ɵɵFactoryDeclaration<AppSwitcherComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<AppSwitcherComponent, "c8y-app-switcher", never, {}, {}, never, never, true, never>;
}

declare class ApplicationOptions implements ApplicationOptions$1 {
    /** Application name (saved to the server). */
    name: string;
    /** Application context path (saved to the server). */
    contextPath: string;
    /** Application key (saved to the server). */
    key: string;
    /** The version of the application */
    version: string;
    /** The version of the used WebSDK version */
    webSdkVersion?: string;
    /** Set to `true` if the application is hybrid and uses Angular and AngularJS simultaneously. */
    upgrade?: boolean;
    /**
     * Path to the branding entry file. (Set it to false to disable any styling. You can handle the styling then on your own e.g. in an angular.json file using ng-cli)
     * @deprecated Add your global styles via the angular.json file.
     */
    brandingEntry?: false;
    /**
     * Enables all preview features in the application UI.
     *
     * Note: This only affects features on the frontend.
     * If a preview feature also requires backend support it must be enabled separately on the backend.
     */
    enableAllPreviewFeatures?: boolean;
    /**
     * Hides the feature preview section in the right drawer.
     */
    hidePreviewFeature?: boolean;
    /** Path to tsccnfig.json file if TypeScript is used (default: ./tsconfig.json). */
    tsConfigPath?: string;
    /** Entry module for Angular compiler (only used with lazy loaded routes), e.g. `'app.module.ts#AppModule'`. */
    entryModule?: string;
    /** Path to custom index.html (otherwise default one will be used). */
    indexTemplate?: string;
    /**
     * URL to dynamically fetched options.
     * If set to `true` or left undefined, an URL will be used based on the applications contextPath.
     * If set to `false`, no dynamic options will be fetched.
     * */
    dynamicOptionsUrl?: string | boolean;
    /** URL to favicon. Will be ignored for security reasons if provided as a URL query parameter. */
    faviconUrl?: string;
    /** URL to `*.css` file which will replace default branding. Will be ignored for security reasons if provided as a URL query parameter. */
    brandingUrl?: string;
    /** Enables the branding preview mode. If set to true, the `dynamicOptionsUrl` will be polled regularly for changes. In case the `lastUpdated` field of the dynamic options changes, the page is reloaded in order to apply the new branding. */
    brandingPreview?: boolean;
    /** Object with properties that will be converted to CSS custom variables. Will be ignored for security reasons if provided as a URL query parameter. */
    brandingCssVars?: BrandingCssVars;
    /**
     * Allows for adding or overriding languages available in the application.
     *
     * Its keys are language codes and its values are objects with the following properties:
     *
     * - **name:** English name of the language,
     * - **nativeName:** native name of the language,
     * - **url:** full URL to JSON file with compiled translations;
     *    if not defined, translations will be loaded from `${localePath}/${langCode}.json.
     *
     * ```json
     * "languages": {
     *   "de": {
     *     "name": "German",
     *     "nativeName": "Deutsch",
     *     "url": "/apps/public/ui-assets/de.json"
     *   }
     * }
     * ```
     */
    languages?: Languages;
    /**
     * Allows to add custom translations. It is an optional property.
     *
     * Its keys are language codes (https://cumulocity.com/guides/users-guide/getting-started/#a-name-languages-a-available-languages)
     * and its values are objects with key-value pairs, where the key is the original string in English and the value - its translation.
     *
     * - **Home:** "Startseite"`
     *
     * For example you can add the translation of your custom cookie banner configured in the branding settings:
     * ```json
     * "i18nExtra": {
     *   "de": {
     *     "About cookies on Cumulocity IoT": "Informationen zu Cookies in Cumulocity IoT",
     *     "Click Agree and Proceed to accept cookies and go directly to the platform or click on Privacy Policy to see detailed descriptions of the used cookies.": "Klicken Sie auf Zustimmen und fortfahren, um Cookies zu akzeptieren und direkt zur Plattform zu gelangen, oder klicken Sie auf Datenschutzrichtlinie, um detaillierte Beschreibungen der verwendeten Cookies anzuzeigen."
     *   }
     * }
     * ```
     */
    i18nExtra?: I18nExtra;
    /** Path to the folder from which *.po files will be loaded. */
    localePath?: string;
    /** Array of URLs to additional `*.css` files to be loaded at runtime. Will be ignored for security reasons if provided as a URL query parameter. */
    extraCssUrls?: string[];
    /** Stylesheet (CSS) that will be added at runtime. The string should actually contain the CSS not a path or URL to it. Will be ignored for security reasons if provided as a URL query parameter. */
    extraCss?: string;
    /** Documentation links settings. */
    docs?: Docs;
    /** Application icon to be displayed in app switcher and header bar. */
    icon?: Icon;
    /** Hide application in app switcher (saved to the server).
     * If the value is provided as a string, it will be treated as the feature toggle key that needs to be activated in order to see the application in the app switcher.
     * This allows to hide the application from the app switcher for everyone, except for users that have access to this feature toggle.
     */
    noAppSwitcher?: boolean | string;
    /** HTML page title. */
    globalTitle?: string;
    /** Hide "powered by" and version info at the bottom of the navigator and in the right drawer. */
    hidePowered?: boolean;
    /** Hides the header bar */
    hideHeader?: boolean;
    /** Hides the "Platform information" in the right drawer, will overrule the "hidePowered" option */
    hidePlatformInformation?: boolean;
    /** URL to support page (set to `false` to hide the link). */
    supportUrl?: boolean | string;
    /**
     * Replacement string for `user` field in audit logs for actions performed by a support user
     * (available placeholders: `{{support_user}}`, `{{supported_user}}`).
     */
    supportUserString?: string;
    /**
     * Disables realtime updates on the map widget and maps in general.
     */
    mapWidgetRealtimeDisabled?: boolean;
    /**
     * Allows to adjust the default pagesize of 100 items of the map widget and maps in general.
     */
    mapWidgetPageSize?: number;
    /**
     * Allows to hide the hint that there are more devices with geo coordinates then displayed on the map widget and maps in general.
     */
    mapWidgetHideMaxDeviceOnMapHint?: boolean;
    /** Enable or disable the right drawer. */
    rightDrawer?: boolean;
    /** Enable or disable breadcrumbs in the header for groups and devices (default: false). */
    breadcrumbs?: boolean;
    /** Collapse navigator on initial load. */
    hideNavigator?: boolean;
    /** Show tabs horizontally or vertically. */
    tabsHorizontal?: boolean;
    /** Additional link(s) to display on login screen. */
    loginExtraLink?: LoginExtraLink | LoginExtraLink[];
    /** Enable or disable storage limitation feature. */
    storageLimitationFeatureEnabled?: boolean;
    /** Name of company handling support requests from app users (displayed in notification message). */
    companyName?: string;
    /** URL template for documentation links (default: `'${docsBaseUrl}${partialUrl}'`). */
    guideHrefTemplate?: string;
    /** Base URL for documentation links (include `{{ version }}` placeholder, if you want versioned links). */
    docsBaseUrl?: string;
    /** CSP string to be applied to `index.html` by replacing default values. */
    contentSecurityPolicy?: string;
    /** Enables cloud sensor wizard */
    sensorPhone?: boolean;
    /** Show or hide a newsletter subscription checkbox in edit user modal. */
    newsletter?: boolean;
    /** Path to the root node_modules dir (useful when working in monorepo setup, e.g. yarn workspaces). */
    rootNodeModulesPath?: string;
    /** Cookie Banner configuration */
    cookieBanner?: CookieBannerConfiguration;
    /** Cookie preferences configuration. Here you can enable or disable cookie categories */
    cookiePreferences?: CookiePreferencesConfiguration;
    /** Message Banner configuration */
    messageBanner?: MessageBannerConfiguration;
    /** A key for the product experience software Gainsight. */
    gainsightKey?: string;
    /** Disable user tracking */
    disableTracking?: boolean;
    /** NgModule export for plugins. */
    exports?: PluginsExports[];
    /** List of imported remote plugins. */
    remotes?: RemotePlugins;
    /** If set to true, only remotes defined in the `remotes` query parameter will be loaded. */
    forceUrlRemotes?: boolean;
    /**
     * Defines if the application is a package. Packages can be distributed as blueprint or allow plugins.
     */
    isPackage?: boolean;
    /**
     * Defines what is contained in the package.
     */
    package?: 'plugin' | 'blueprint';
    /**
     * Allows to override the attributes of the deployed bluprint application in order to have better user readable ones.
     */
    blueprintDeploymentOptions?: {
        name?: string;
        contextPath?: string;
        key?: string;
    };
    /** The package source a application origins from as IApplication or simply the id of the source */
    source?: string | number | IApplication;
    /**
     * Additional assets to copy to the build output.
     * See https://github.com/webpack-contrib/copy-webpack-plugin for more information
     * about the patterns to add here.
     */
    copy?: [];
    /**
     * Allows to enable or disable context help, or to override the default base URL used to load its contents.
     * By default, the context help uses the same base URL as defined in the `docsBaseUrl` option
     * (if this option is undefined, then the following value will be used: `https://cumulocity.com/guides/{{version}}`).
     * Alternatively, if a string is provided here, it'll be used as the base URL
     * and any `{{ version }}` placeholder will be replaced with the relevant docs version.
     */
    contextHelp?: boolean | string;
    /**
     * By default, cockpit and devicemanagement use the onlyRoots query to resolve root nodes. This
     * could lead to performance issues, if a customer has a lot of root nodes. Therefore you can disable
     * the use of this query with this flag.
     */
    disableOnlyRootsQuery?: boolean;
    /**
     * Allows to force showing the setup wizard.
     */
    forceSetup?: boolean;
    /**
     * Indicates if the application needs to show the setup wizard.
     */
    isSetup?: boolean;
    /**
     * By default a WebSDK app requires the user to be logged in.
     * In case you would like to develop just a static application, that does not require any kind of access to the backend,
     * you can use this flag to disable the login screen.
     * NOTE: not all WebSDK components support this, some might require the user to be logged in and won't work.
     */
    noLogin?: boolean;
    /**
     * Allows to opt out of supporting/loading plugins for this application.
     */
    noPlugins?: boolean;
    /**
     * Allows to opt out of the version warning which is shown in the dev tools.
     */
    noVersionWarning?: boolean;
    /**
     * Allows to set the map layers. If not set, defaults to open street map layer.
     */
    mapLayers?: MapTileLayer[];
    /**
     * Allows to set default configurations on the maps.
     */
    mapConfig?: MapDefaultConfig;
    /**
     * The URL used to lookup geo coordinates for a user provided address via [nominatim API](https://nominatim.org/release-docs/develop/api/Search/).
     * Can be set to empty to disable the find address feature on the location tab.
     * Uses: `https://nominatim.openstreetmap.org/search?format=json&q={searchTerm}` if not set.
     */
    mapNominatimUrl?: string;
    /**
     * The name of the root element. By default c8y-bootstrap.
     */
    rootTagName?: string;
    /**
     * Hides possibility to create typed dashboards for assets (and groups). If true, typed dashboards can be created only for devices.
     * It is true by default.
     */
    hideTypeDashboardForAssets?: boolean;
    /**
     * A matrix of versions indicating which versions of the application (key) are dependent on which version of a cumulocity component (API version and Web SDK version of the shell application currently supported, indicated by the value).
     * The versions of the dependent components can be indicated by a semver range.
     * ```json
     * {
     *  "1.0.0": {
     *    "sdk": ">=1016.0.0 <1017.0.0",
     *    "api": ">=1016.0.0 <1017.0.0"
     *  },
     *  "2.0.0": {
     *    "sdk": "~1017.0.0",
     *    "api": "~1017.0.0"
     *  },
     *  "3.0.0": {
     *    "sdk": ">=1018.0.0",
     *    "api": ">=1018.0.0"
     *  },
     * }
     * ```
     */
    versioningMatrix?: VersioningMatrix;
    /**
     * Is used for plugins to indicate their owner. Cumulocity plugins are marked with OFFICIAL label.
     * You can use the special "ARCHIVED" label to mark them as archived.
     */
    label?: string;
    /**
     * Defines the type of refresh mechanism used for alarms in the application.
     *
     * - **realtime:** Utilizes a realtime mechanism for updating alarms.
     * - **interval:** Utilizes HTTP polling at regular intervals to refresh the alarms.
     *
     * This setting allows to switch between realtime and interval-based refresh methods.
     */
    alarmsRefreshType?: 'interval' | 'realtime';
    /**
     * A map of import paths to their corresponding URLs.
     * This is used to resolve module paths when loading remote modules
     * (e.g. in the HTML-Widget). The keys are the import paths and the values are the URLs.
     *
     * You can also add a js file but need to copy it. Or you can add a node module name but
     * this need to have a single entry point. Otherwise you need to copy the files. A url can also
     * be used but you need to ensure that the CSP rules are not blocking the loading of the file.
     *
     * ```
     * {
     *  'my-widget': 'https://example.com/path/to/widget.js',
     *  'node-module': '@scope/my-node-module',
     *  'local-js': './my-local-file.js'
     * }
     * ```
     */
    importMap?: {
        [key: string]: string;
    };
    /**
     * Defines to which path the user will be redirected in case he is not logged in yet.
     *
     * This needs to be used for e.g. people who embed the application in an iframe in order to redirect to a none index.html file.
     */
    loginRedirectPath?: string;
    /**
     * Allows to skip the Single Sign-On (SSO) redirect during the login process.
     *
     * Can be used to avoid the redirect to the Identity Provider, when you still want to use the built-in login instead.
     * This is needed in scenarios like e.g. support user access.
     */
    skipSSORedirect?: boolean;
    /**
     * Represents a list of AI Agents defined for the application.
     * These agents can be utilized for various AI-driven functionalities within the application.
     *
     * The Agent are stored as JSON in files generated during the build process ending with `agent.c8y.ts`. Usually
     * this option does not need to be aligned manual.
     */
    agents?: {
        [name: string]: string;
    };
}
/**
 * Tells how a plugin is scoped.
 */
declare enum PluginsExportScopes {
    /**
     * Limit the plugin to the current application. It is imported by default.
     */
    SELF = "self",
    /**
     * Allows to add the plugin to a global scope, meaning it is imported to all applications at the same time.
     * This is not used at the moment but planned to be implemented in the new branding editor.
     */
    GLOBAL = "global",
    /**
     * Limit the plugin to the current application. The plugin is not imported by default.
     */
    SELF_OPTIONAL = "self-optional",
    /**
     * Like undefined the plugin is available for any private application.
     */
    DEFAULT = ""
}

interface ColorRangeBoundaries {
    yellowRangeMin: number;
    yellowRangeMax: number;
    redRangeMin: number;
    redRangeMax: number;
}

/**
 * Applies CSS classes based on the value's range.
 */
declare class ApplyRangeClassPipe implements PipeTransform {
    /**
     * Transforms the input value based on the specified ranges.
     *
     * @param value - Initial value used to determine the CSS class.
     * @param ranges - An object containing the min and max range values for yellow and red colors.
     * @returns The CSS class to be applied.
     */
    transform(value: number, ranges: ColorRangeBoundaries): null | 'text-warning' | 'text-danger' | 'default';
    static ɵfac: i0.ɵɵFactoryDeclaration<ApplyRangeClassPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<ApplyRangeClassPipe, "applyRangeClass", true>;
}

/**
 * Converts a managed object into a context-aware URL, depending on its type and fragments.
 * Usage:
 *
 * ```html
 *  {{ managedObject | assetLink }} <!-- e.g. '/device/<moId>' or '/group/<moId> -->
 * ```
 */
declare class AssetLinkPipe implements PipeTransform {
    private groupService;
    transform(mo: IManagedObject): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<AssetLinkPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<AssetLinkPipe, "assetLink", true>;
}

interface BytesOptions {
    precision?: number;
    binary?: boolean;
}
/**
 * Converts the file size to a readable format.
 * Supports both decimal (default) and binary units.
 *
 * Usage:
 * ```html
 * {{ myData | bytes }}                              <!-- e.g. 100.1 MB (decimal) -->
 * {{ myData | bytes:2 }}                           <!-- e.g. 100.12 MB (decimal) -->
 * {{ myData | bytes:1:true }}                      <!-- e.g. 97.7 MiB (binary) -->
 * {{ myData | bytes:{binary: true} }}              <!-- e.g. 97.7 MiB (binary) -->
 * {{ myData | bytes:{precision: 2, binary: true} }} <!-- e.g. 97.66 MiB (binary) -->
 * ```
 *
 * @param value The number of bytes to convert
 * @param precisionOrOptions Number of decimal places or options object
 * @param binary Whether to use binary (1024) or decimal (1000) units (legacy parameter)
 *
 * Options object properties:
 * - precision: number of decimal places (default: 1)
 * - binary: whether to use binary units (default: false)
 *
 * Decimal units: bytes, kB, MB, GB, TB, PB
 * Binary units: bytes, KiB, MiB, GiB, TiB, PiB
 */
declare class BytesPipe implements PipeTransform {
    static bytes(bytes: number, precisionOrOptions?: number | BytesOptions, binary?: boolean, translateService?: TranslateService$1): string | number;
    private translateService;
    transform(value: number, precisionOrOptions?: number | BytesOptions, binary?: boolean): string | number;
    static ɵfac: i0.ɵɵFactoryDeclaration<BytesPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<BytesPipe, "bytes", true>;
}

declare class ColorService {
    generateColor(data: string): Promise<string>;
    generateColorForDatapoint(fragment: string, series: string): Promise<string>;
    protected sha256(message: string): Promise<string>;
    protected stringToColor(str: string): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<ColorService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<ColorService>;
}

/**
 * The maximum pageSize used in API queries to c8y.
 */
declare const MAX_PAGE_SIZE = 2000;

declare class PluginsResolveService {
    /**
     * Emits all injectors of already loaded plugins on subscription.
     */
    injectors$: Observable<EnvironmentInjector | Injector>;
    /**
     * Emits once remotePlugins have been resolved.
     */
    refresh$: Observable<void>;
    /**
     * Emits all plugin details of already loaded plugins on subscription.
     */
    pluginDetails$: Observable<{
        remoteNgModule: NgModuleRef<unknown> | Type<unknown>;
        moduleRef: NgModuleRef<unknown>;
    }>;
    allPluginsLoaded$: Observable<boolean>;
    loadedPluginNames$: Observable<string[]>;
    /**
     * Emits all contextPaths (including the corresponding version/tag, if provided) that have been already loaded on startup and further any newload loaded.
     */
    contextPathsFromWhereRemotesHaveBeenLoaded$: Observable<string[]>;
    private _refresh$;
    private _allPluginsLoaded$;
    _contextPathsFromWhereRemotesHaveBeenLoaded$: BehaviorSubject<string[]>;
    _loadedPluginNames$: BehaviorSubject<string[]>;
    _injectors$: ReplaySubject<EnvironmentInjector | Injector>;
    _pluginDetails$: ReplaySubject<{
        remoteNgModule: NgModuleRef<unknown> | Type<unknown>;
        moduleRef: NgModuleRef<unknown>;
    }>;
    constructor();
    /**
     * Will refresh all current registered hooks.
     */
    refreshHooks(): void;
    addInjector(injector: EnvironmentInjector | Injector): void;
    waitForPluginsToLoad(): Promise<void>;
    getAllInjectors(): Promise<(EnvironmentInjector | Injector)[]>;
    getAllInjectors$(): Observable<EnvironmentInjector | Injector>;
    getFromAllInjectors<T>(token: Type<T>, notFoundValue?: any): Observable<T>;
    markPluginsAsLoaded(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<PluginsResolveService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<PluginsResolveService>;
}

/**
 * A abstract state which should be included in each state.
 * @abstract
 */
declare abstract class StateService {
    /**
     * Saves the state. Should not be accessible directly. Use map or the getter to access
     * the state. Use functions in the implementation to change the state.
     */
    protected abstract state$: BehaviorSubject<any> | any;
    /**
     * Should return the current state of this StateService
     */
    abstract get state(): any;
    /**
     * Maps to a property and just returns that property.
     * @param mappedProperty The property to map to.
     */
    map(mappedProperty: (stateProperty: any) => any): Observable<any>;
    /**
     * Emits a new state.
     */
    protected emitNewState(): void;
}

declare function fromTrigger<T>(router: Router, refresh: Observable<any> | Observable<any>[], factories: Array<T | T[] | ExtensionFactory<T> | ExtensionFactory<T>[] | (() => T | ExtensionFactory<T> | Array<T | ExtensionFactory<T>>)>): Observable<T[]>;
declare function fromTriggerOnce<T>(router: Router, refresh: Observable<any> | Observable<any>[], factories: Array<T | T[] | ExtensionFactory<T> | ExtensionFactory<T>[] | (() => T | ExtensionFactory<T> | Array<T | ExtensionFactory<T>>)>, withFirstEmpty?: boolean): Observable<T[]>;
declare enum InjectionType {
    COMPONENT = 0,
    ROUTE = 1
}
declare function getInjectedHooks<T>(token: InjectionToken<T[]>, injectors: Injector[], type?: InjectionType): () => T[];
declare function fromFactories<T>(factories?: Array<T | T[] | ExtensionFactory<T> | ExtensionFactory<T>[] | (() => T | ExtensionFactory<T> | Array<T | ExtensionFactory<T>>)>, router?: Router, withFirstEmpty?: boolean): Observable<T[]>;
declare function resolveInjectedFactories<T>(factories: Array<T | T[] | ExtensionFactory<T> | ExtensionFactory<T>[] | (() => T | ExtensionFactory<T> | Array<T | ExtensionFactory<T>>)>): Array<T | T[] | ExtensionFactory<T>>;
declare function stateToFactory<T>(componentsState: any): ExtensionFactory<T>;
declare function sortByPriority<T>(items: T[]): T[];
declare function removeDuplicatesIds<T extends {
    id?: string;
    priority?: number;
}>(items: T[]): T[];
declare function toObservableOfArrays<T>(factoryResult: T | T[] | Promise<T | T[]> | Observable<T | T[]>, withFirstEmpty: boolean): Observable<T[]>;
declare function isPromise<T = any>(obj: any): obj is Promise<T>;
declare function isExtensionFactory<T = any>(obj: any): obj is ExtensionFactory<T>;
/**
 * Converts any value provided to an Observable that emits this value once and then completes.
 * A convenience method to represent all the data as Observables rather than
 * a mixture of Observables and other types.
 *
 * @param value The value the resulting Observable will emit.
 */
declare function toObservable<T>(value: T | Promise<T> | Observable<T>): Observable<T>;
/**
 * Allows to extend the existing applications from a module.
 */
interface ExtensionFactory<T> {
    /**
     * Allows to resolve the data of an extension point.
     * The return value can be a Promise or Observable
     * (allowing for asynchronous data resolution).
     *
     * @param activatedRoute The current activated route (if possible to resolve).
     */
    get(activatedRoute?: ActivatedRoute): Observable<T[] | T> | Promise<T[] | T> | T[] | T;
}
/**
 * Extension points allow to extend the application from
 * any module
 */
interface ExtensionPoint<T> {
    /**
     * Observable that emits of array of extensions active at any give time
     */
    readonly items$: Observable<T[]>;
    /**
     * Additional factories that can be added dynamically. (without hook)
     */
    factories: ExtensionFactory<T>[];
    /**
     * Call the extension factories to refresh them.
     */
    refresh(): any;
}
declare abstract class ExtensionPointWithoutStateForPlugins<T> implements ExtensionPoint<T> {
    items$: Observable<T[]>;
    factories: ExtensionFactory<T>[];
    readonly refresh$: Observable<void>;
    /**
     * All injectors to search for an extension.
     */
    protected injectors: Injector[];
    private readonly refreshTrigger;
    constructor(rootInjector: Injector, pluginService: PluginsResolveService);
    /**
     * Refresh the extension factories
     */
    refresh(): void;
    /**
     * Should be called within the constructor of the extending class and set the items$ attribute.
     */
    protected abstract setupItemsObservable(): Observable<T[]>;
}
declare abstract class ExtensionPointForPlugins<T> extends StateService implements ExtensionPoint<T> {
    items$: Observable<T[]>;
    factories: ExtensionFactory<T>[];
    readonly refresh$: Observable<void>;
    readonly state$: BehaviorSubject<Set<T>>;
    /**
     * All injectors to search for an extension.
     */
    protected injectors: Injector[];
    private readonly refreshTrigger;
    constructor(rootInjector: Injector, pluginService: PluginsResolveService);
    /**
     * Refresh the extension factories
     */
    refresh(): void;
    /**
     * Should be called within the constructor of the extending class and set the items$ attribute.
     */
    protected abstract setupItemsObservable(): Observable<T[]>;
}
/**
 * Helper function to get the activated route in
 * a service (as ActivatedRoute injection only
 * works in components). Works as long as we only use
 * a tree and no child is active at the same time.
 *
 * @param router The current router
 */
declare function getActivatedRoute(router: Router): ActivatedRoute;
type GenericHookType<T> = T | T[] | Type<ExtensionFactory<T>>;
type HookValueType<T> = T | T[] | Type<T>;
/**
 * A generic function to be used by specific implementations of the HOOK concept.
 * @param items The items that should be provided under the `useValue` or `useClass` attribute.
 * Allows an extension factory to be passed as an argument, which can create instances of type T.
 * @param token The InjectionToken/HOOK to be provided.
 * @param options If this is a multi provider or not (defaults to true) and provider type definition (defaults to ClassProvider) - `HookOptions`.
 * @returns A `Provider` (either `ValueProvider` or `ClassProvider`) to be provided in a module.
 */
declare function hookGeneric<T>(items: GenericHookType<T> | HookValueType<T>, token: InjectionToken<T>, options?: Partial<GenericHookOptions>): ValueProvider | ClassProvider | ExistingProvider;
interface GenericHookOptions {
    multi: boolean;
    providerType: HookProviderTypes;
}
declare enum HookProviderTypes {
    ExistingProvider = "ExistingProvider",
    ClassProvider = "ClassProvider"
}
declare function allEntriesAreEqual(previous: Array<unknown>, next: Array<unknown>): boolean;

/**
 * @deprecated Consider using the `hookOptions` function instead.
 */
declare const HOOK_OPTIONS: InjectionToken<ExtensionFactory<ApplicationOptions>>;
/**
 * You can either provide a single `ApplicationOptions` as parameter:
 * ```typescript
 *  hookOptions(...)
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  hookOptions([...])
 * ```
 *
 * Or you provide an Service that implements `ExtensionFactory<ApplicationOptions>`
 * ```typescript
 *  export class MyApplicationOptionsFactory implements ExtensionFactory<ApplicationOptions> {...}
 *  ...
 *  hookOptions(MyApplicationOptionsFactory)
 * ```
 * A typed alternative to `HOOK_OPTIONS`.
 * @param options The `ApplicationOptions`'s or `ExtensionFactory` to be provided.
 * @returns An `Provider` to be provided in your module.
 */
declare function hookOptions(options: GenericHookType<ApplicationOptions>, hookOptions?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
/**
 * A service that allows to set or get application options
 * which configure the default behavior of the UI.
 */
declare class OptionsService extends ApplicationOptions {
    private systemOptionsService;
    private tenantOptionService;
    optionsUpdated$: Observable<void>;
    [key: string]: any;
    private _optionsUpdated$;
    constructor(options: any, systemOptionsService: SystemOptionsService, tenantOptionService: TenantOptionsService);
    /**
     * Returns an application option used to configure the UI.
     * @param optionKey The application options key.
     * @param defaultValue A value to return if non is set.
     * @param attemptParse Indicates whether the value should be parsed with JSON.parse.
     */
    get<T extends keyof OptionsService>(optionKey: T, defaultValue?: OptionsService[T], attemptParse?: boolean): OptionsService[T];
    /**
     * Returns an observable of an application option used to configure the UI.
     * @param optionKey The application options key.
     * @param defaultValue A value to return if non is set.
     * @param attemptParse Indicates whether the value should be parsed with JSON.parse.
     */
    get$<T extends keyof OptionsService>(optionKey: T, defaultValue?: OptionsService[T], attemptParse?: boolean): Observable<OptionsService[T]>;
    /**
     * Sets an application option.
     * @param key The key to set.
     * @param value The value to set.
     */
    set<T extends keyof OptionsService>(key: T, value: OptionsService[T]): void;
    /**
     * Deletes an application option.
     * @param key The key to remove.
     */
    delete<T extends keyof OptionsService>(key: T): void;
    /**
     * Gets support URL from:
     * - application option: `supportUrl`
     * - or current tenant's option: `configuration / system.support.url`
     * - or current tenant's inherited option: `configuration / system.support.url`
     * - or system option: `configuration / system.support.url`
     * - otherwise defaults to: `false`
     *
     * @returns Returns support url or false.
     */
    getSupportUrl(): Promise<string | boolean>;
    /**
     * Returns if the tenant allows to show the activate-support user menu entry.
     * Note: Only if system-level support-user/enabled is false we can activate it at tenant level.
     */
    getActivateSupportUser(): Promise<boolean>;
    /**
     * Gets a value from the system service and parses it.
     *
     * @param category The category for this option.
     * @param key The key for that option.
     * @param defaultValue The default if the option was not found.
     */
    getSystemOption<T = string>(category: string, key: string, defaultValue?: T): Promise<T | string>;
    /**
     * Gets a value from the tenant service and parses it.
     *
     * @param category The category for this option.
     * @param key The key for that option.
     * @param defaultValue The default if the option was not found.
     */
    getTenantOption<T = string>(category: string, key: string, defaultValue?: T): Promise<T | string>;
    /**
     * Gets an inherited from parent value from the tenant service if inheritance supported based on given parameters.
     *
     * @param category The category for this option.
     * @param key The key for that option.
     * @param defaultValue The default if the option was not found.
     */
    getInheritedTenantOption<T = string>(category: string, key: string, defaultValue?: T): Promise<T | string>;
    /**
     * Gets current tenant option value from the tenant service omitting the inheritance supported based on given parameters.
     *
     * @param category The category for this option.
     * @param key The key for that option.
     * @param defaultValue The default if the option was not found.
     */
    getCurrentTenantOption<T = string>(category: string, key: string, defaultValue?: T): Promise<T | string>;
    private setupOptions;
    private applyOptions;
    private getOptionFromService;
    private parseOptionRawValue;
    static ɵfac: i0.ɵɵFactoryDeclaration<OptionsService, [{ optional: true; }, null, null]>;
    static ɵprov: i0.ɵɵInjectableDeclaration<OptionsService>;
}

declare const HOOK_CURRENT_USER: InjectionToken<IUser | ICurrentUser>;
declare const HOOK_CURRENT_APPLICATION: InjectionToken<IApplication>;
declare const HOOK_CURRENT_TENANT: InjectionToken<IApplication>;
declare function hookCurrentUser(user: IUser | ICurrentUser): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
declare function hookCurrentApplication(application: IApplication): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
declare function hookCurrentTenant(tenant: ICurrentTenant): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
declare function provideBootstrapMetadata(metadata: BootstrapMetaData): StaticProvider[];
declare class AppStateService extends StateService {
    private applicationService;
    apiService: ApiService;
    private options;
    private fetchClient;
    private tenantLoginOptionsService;
    /**
     * Saves the state. Should not be accessible directly. Use map or the getter to access
     * the state. Use functions in the implementation to change the state.
     */
    state$: BehaviorSubject<any>;
    currentSupportUserName: BehaviorSubject<string | null>;
    currentUser: BehaviorSubject<IUser | ICurrentUser | null>;
    currentTenant: BehaviorSubject<ICurrentTenant | null>;
    currentApplication: BehaviorSubject<IApplication | null>;
    currentApplicationConfig: Observable<any>;
    /**
     * An Observable of the applications available for the current user.
     * The Observable emits a new array on user changes or if the application
     * performs POST, PUT or DELETE requests to the application API.
     */
    currentAppsOfUser: Observable<IApplication[]>;
    constructor(applicationService: ApplicationService, apiService: ApiService, options: OptionsService, fetchClient: FetchClient, tenantLoginOptionsService: TenantLoginOptionsService, user?: IUser, application?: IApplication, tenant?: ICurrentTenant);
    assignApplicationKeyToDefaultHeaders(): void;
    /**
     * Returns the current state.
     */
    get state(): any;
    getLangs(): any;
    /**
     * Returns the correct UI version. In hybrid mode for angular and ngx.
     */
    get uiVersion(): any;
    /**
     * Dynamic options are stored on the API in a specific config: {} object. They can
     * be used to configure the app dynamically.
     *
     * Note: To avoids conflicts with the default Config, it is recommended
     * to use a certain namespace.
     */
    updateCurrentApplicationConfig<T = ApplicationOptions>(config: T): Promise<T>;
    /**
     * When this function called, it refreshes the values of loginOptions stored within ui state object.
     * Function is throttled to execute the refresh once in a time specified by params of @throttled decorator,
     * it should be called on leading edge of the timeout.
     */
    refreshLoginOptions(): Promise<void>;
    /**
     * Checks current users application list and matches it against given application name.
     * Returns true if application is in the list.
     * @param name application name
     */
    isApplicationAvailable(name: string): Promise<boolean>;
    /**
     * Sets current user (including support user).
     * @param userInfo Info about current user and support user to be set.
     */
    setUser(userInfo: {
        user: IUser | ICurrentUser;
        supportUserName?: string;
    }): void;
    /**
     * Verifies if the current application is owned by the current tenant.
     * @param app The application to verify.
     * @returns true if it belongs to the current tenant.
     */
    isOwnerOfApplication(app?: IApplication): boolean;
    /**
     * Verifies if the current application is owned by the current tenant.
     * @param app The application to verify.
     * @returns true if it belongs to the current tenant.
     */
    isOwnerOfApplication$(app?: IApplication): Observable<boolean>;
    loadDefaultOptions(): Promise<void>;
    protected currentAppsOfUser$(): Observable<IApplication[]>;
    /**
     * An Observable emitting once all POST, PUT, DELETE requests to the application API finished
     */
    protected onAppChangesCompletion$(): Observable<void>;
    static ɵfac: i0.ɵɵFactoryDeclaration<AppStateService, [null, null, null, null, null, { optional: true; }, { optional: true; }, { optional: true; }]>;
    static ɵprov: i0.ɵɵInjectableDeclaration<AppStateService>;
}

interface DateFormatOptions {
    locale?: string;
    useUppercaseFormat?: boolean;
}
declare class DateFormatService {
    private appStateService;
    constructor(appStateService: AppStateService);
    /**
     * Returns date format pattern based on locale and formatting syntax.
     *
     * @param formattingOptions - Object containing formatting options
     * @returns A string containing the date format pattern for the specified locale
     */
    getDateFormat(formattingOptions?: DateFormatOptions): string;
    /**
     * Determines whether a given locale should use 12-hour clock format with AM/PM.
     *
     * @param locale - The locale code (e.g., 'en', 'pl', 'en_US')
     * @returns boolean indicating whether meridian format (AM/PM) should be used
     */
    shouldUseMeridianFormat(locale?: any): boolean;
    private isNonEmptyString;
    private isValidLocale;
    static ɵfac: i0.ɵɵFactoryDeclaration<DateFormatService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<DateFormatService>;
}

/**
 * The range of times supported by ECMAScript Date objects in milliseconds.
 * @see http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.1
 */
declare const ES_MAX_TIME_MILLISECONDS = 8640000000000000;
/**
 * Formats a date value according to locale rules. If no other format specified it defaults to `medium`
 * used as standard date/time format.
 *
 * Extends Angular's DatePipe in a way so that date values exceeding the range supported by ECMAScript
 * are displayed as earliest/latest supported point in time printed in the desired format pre- or postfixed
 * by the word `before` or `after`, respectively.
 * In all other cases the pipe behaves as the standard [DatePipe](https://angular.io/api/common/DatePipe).
 *
 * ```html
 * <span class="highlight">{{ deadline | c8yDate }}</span> <!-- e.g. 7 May 2020, 17:45:19 (en-GB) or 07.05.2020, 17:45:19 (de) -->
 * <span>{{ lastUpdated | c8yDate: 'a h:MM:ss' }}</span> <!-- e.g. pm 5:45:19 -->
 * <span>{{ 8640000000000000 + 1 | c8yDate }}</span> <!-- e.g. after 13 Sep 275760, 03:00:00 -->
 * <span>{{ timestamp | c8yDate: 'adaptiveDate' }}</span> <!-- e.g. 2:45 PM for today's date or Oct 23, 2025 for other dates -->
 * ```
 *
 * The `adaptiveDate` format type automatically selects the appropriate format based on the date:
 * - For dates from today: Uses the `shortTime` format (e.g., "2:45 PM")
 * - For all other dates: Uses the `mediumDate` format (e.g., "Oct 23, 2025")
 */
declare class DatePipe extends DatePipe$1 {
    private translateService;
    private appStateService?;
    private dateFormatService?;
    constructor(locale: string, translateService: TranslateService$1, appStateService?: AppStateService, dateFormatService?: DateFormatService, defaultTimezone?: string | null, defaultOptions?: DatePipeConfig | null);
    transform(value: any, format?: string, timezone?: string, locale?: string): any;
    static ɵfac: i0.ɵɵFactoryDeclaration<DatePipe, [null, null, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }]>;
    static ɵpipe: i0.ɵɵPipeDeclaration<DatePipe, "c8yDate", true>;
}

declare class RealtimeMessage<T> {
    id: string;
    channel: string;
    realtimeAction: RealtimeAction;
    data: T | number;
}
type RealtimeAction = 'UPDATE' | 'DELETE' | 'CREATE';

/**
 * Service (providedIn root) that ensures to only create a single realtime subscription for each channel
 */
declare class RealtimeSubjectService {
    protected realtime: Realtime;
    reconnect$: Observable<void>;
    connectionStatus$: Observable<'connected' | 'disconnected'>;
    private subjects$;
    constructor(realtime: Realtime);
    getObservableForChannel<T>(channel: string): Observable<RealtimeMessage<T>>;
    protected createObservableForChannel<T>(channel: string, realtime: Realtime): Observable<RealtimeMessage<T>>;
    protected createObservableForReconnect(): Observable<void>;
    protected createObservableForConnectionStatus(): Observable<"connected" | "disconnected">;
    static ɵfac: i0.ɵɵFactoryDeclaration<RealtimeSubjectService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<RealtimeSubjectService>;
}

/**
 * AssetTypesRealtimeService is being used to manage a cache of all existing asset types.
 * This service is injected in the AssetOverviewNavigationFactory class, which will trigger
 * the initialization of the cache as the constructor is called.
 */
declare class AssetTypesRealtimeService {
    private inventory;
    private appStateService;
    private realtimeSubject;
    private readonly DEFAULT_ASSET_ICON;
    private readonly assetTypes$;
    private readonly refreshTrigger;
    private managedObjectRealtimeService;
    constructor(inventory: InventoryService, appStateService: AppStateService, realtimeSubject: RealtimeSubjectService);
    /**
     * Returns an asset type from the cache based on the unique name property.
     * @param name Name of the asset type.
     * @returns IManagedObject which represents the asset type.
     */
    getAssetTypeByName$(name: string): Observable<IManagedObject>;
    /**
     * Returns an asset type from the cache based on the id.
     * @param assetTypeId Id of the asset type.
     * @returns IManagedObject which represents the asset type.
     */
    getAssetTypeById$(assetTypeId: string): Observable<IManagedObject>;
    /**
     * Returns all the available asset types from the cache.
     * @returns available asset types.
     */
    getAssetTypesCache$(): Observable<Record<string, IManagedObject>>;
    /**
     * Extracts an icon from an asset type.
     * @param type Type of the asset type.
     * @returns Returns an icon for a given asset type.
     */
    getIcon$(type: string): Observable<string>;
    /**
     * Refreshes the asset types cache
     */
    refreshCache(): void;
    private initAssetTypes$;
    /**
     * Queries available asset types and adds every asset type to the local cache.
     * @returns available asset types.
     */
    private getAssetTypes;
    private getAssetTypes$;
    /**
     * Validates whether the MO to update local asset types cache is already present.
     * If present, the MO gets subscribed for future updates.
     * else, the MO will not be subscribed
     */
    private subscribeToCacheInvalidatorUpdates$;
    /**
     * Gets the MO that is used to update the local asset types cache.
     * @returns the id of the MO that has 'c8yAssetTypesCacheInvalidator' fragment, or 'null'
     */
    private getAssetTypesCacheInvalidator;
    static ɵfac: i0.ɵɵFactoryDeclaration<AssetTypesRealtimeService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<AssetTypesRealtimeService>;
}

declare const MO_TYPES: readonly ["asset", "dynamicGroup", "brokerSource", "brokerSourceInactive", "group", "other"];
type MoTypes = (typeof MO_TYPES)[number];
type AssetTypes = Omit<MoTypes, 'brokerSource' | 'brokerSourceInactive'>;
/**
 * Enumerates the supported asset paths.
 */
declare enum ASSET_PATH {
    /**
     * The default asset path.
     */
    DEFAULT = "group",
    /**
     * The asset path for devices.
     */
    DEVICE = "device"
}
/**
 * Asset paths.
 */
type AssetPath = `${ASSET_PATH}`;
declare class GroupService {
    private assetTypesRealtimeService;
    readonly icons: {
        readonly brokerSourceInactive: {
            readonly icon: "c8y-group-remote-inactive";
            readonly iconOpen: "c8y-group-remote-inactive";
        };
        readonly brokerSource: {
            readonly icon: "c8y-group-remote";
            readonly iconOpen: "c8y-group-remote-open";
        };
        readonly group: {
            readonly icon: "c8y-group";
            readonly iconOpen: "c8y-group-open";
        };
        readonly dynamicGroup: {
            readonly icon: "c8y-group-smart";
            readonly iconOpen: "c8y-group-smart-open";
        };
        readonly other: {
            readonly icon: "exchange";
            readonly iconClass: "statusUnknown";
        };
    };
    /**
     * A mapping of managed object types to their corresponding asset path.
     */
    assetPaths: Map<AssetTypes, AssetPath>;
    dataBrokerSourceFragmentInactive: string;
    constructor(assetTypesRealtimeService: AssetTypesRealtimeService);
    /**
     * Finds an icon based on the asset type; if none is found, it looks for an asset-specific icon,
     * and if that is also unavailable, it uses the default icon.
     * @param mo Managed object to be checked.
     * @param open Determines whether the method should return an alternative icon showing the open state.
     * @param fallbackIcon If no icon is found, this icon is returned.
     * @returns Returns an icon.
     */
    getIcon(mo: IManagedObject, open?: boolean, fallbackIcon?: string): Promise<string>;
    /**
     * Checks whether a given managed object is a group.
     * @param mo Managed object to be checked.
     * @returns Returns true if the managed object is a group.
     */
    isGroup(mo: IManagedObject): boolean;
    /**
     * Checks whether a given managed object is a dynamic group.
     * @param mo Managed object to be checked.
     * @returns Returns true if the managed object is a dynamic group.
     */
    isDynamicGroup(mo: IManagedObject): boolean;
    /**
     * Checks whether a given managed object is a data broker.
     * @param mo Managed object to be checked.
     * @returns Returns true if the managed object is a data broker.
     */
    isDataBroker(mo: IManagedObject): boolean;
    /**
     * Checks whether a given managed object is a data broker active.
     * @param mo Managed object to be checked.
     * @returns Returns true if the managed object is a data broker active.
     */
    isDataBrokerActive(mo: IManagedObject): boolean;
    /**
     * Checks whether a given managed object is an asset.
     * @param mo Managed object to be checked.
     * @returns Returns true if the managed object is an asset.
     */
    isAsset(mo: IManagedObject): boolean;
    /**
     * Checks whether the object belongs to any type of group.
     * Types of groups: group, dynamic group, data broker, data broker active.
     * @param mo Managed object to be checked.
     * @returns Returns true if the managed object belongs to the group category.
     */
    isAnyGroup(mo: IManagedObject): boolean;
    /**
     * Checks whether a given managed object is a device.
     * @param mo Managed object to be checked.
     * @returns Returns true if the managed object is a device.
     */
    isDevice(mo: IManagedObject): boolean;
    /**
     * Retrieves the path associated with a given managed object.
     * @param mo The managed object for which the asset path is to be retrieved.
     * @returns The path associated with the managed object's type.
     */
    getAssetPath(mo: IManagedObject): AssetPath;
    private getAssetCustomIcon;
    private getDefaultIcon;
    private determineMoType;
    static ɵfac: i0.ɵɵFactoryDeclaration<GroupService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<GroupService>;
}

declare class GetGroupIconPipe implements PipeTransform {
    private groupService;
    private inventoryService;
    constructor(groupService: GroupService, inventoryService: InventoryService);
    transform(moOrId: IManagedObject | string, open?: boolean, defaultIcon?: SupportedIconsSuggestions): Promise<string>;
    static ɵfac: i0.ɵɵFactoryDeclaration<GetGroupIconPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<GetGroupIconPipe, "getGroupIcon", true>;
}

/**
 * Humanize an application name and translates it.
 *
 * ```html
 * <p>{{ appNameOrApp | humanizeAppName | async }}</p>
 * ```
 */
declare class HumanizeAppNamePipe implements PipeTransform {
    private translateService;
    constructor(translateService: TranslateService$1);
    transform(appNameOrApp?: IApplication | string): Observable<string>;
    private getAppName;
    private getFirstDefined;
    private isPublicApp;
    private humanize;
    static ɵfac: i0.ɵɵFactoryDeclaration<HumanizeAppNamePipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<HumanizeAppNamePipe, "humanizeAppName", true>;
}

declare class MapFunctionPipe implements PipeTransform {
    transform(value: any, mappingFunction: (arg: any) => any, thisArg?: any): any;
    static ɵfac: i0.ɵɵFactoryDeclaration<MapFunctionPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<MapFunctionPipe, "map", true>;
}

declare class ShouldShowMoPipe implements PipeTransform {
    private groupService;
    constructor(groupService: GroupService);
    transform(mo: IManagedObject, option: string): boolean;
    static ɵfac: i0.ɵɵFactoryDeclaration<ShouldShowMoPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<ShouldShowMoPipe, "shouldShowMo", true>;
}

declare class PropertyValueTransformService {
    getName(namedObject: {
        name: string;
    }): any;
    static ɵfac: i0.ɵɵFactoryDeclaration<PropertyValueTransformService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<PropertyValueTransformService>;
}

/**
 * Service transforms the name for translation based on mapping provided by
 * PropertyValueTransformService.
 * Usage:
 *  value | nameTransform | translate
 * Example:
 *  {{ 'admins' | nameTransform | translate }}
 *  transforms original string to: 'Admin User`role`' and then translates it like 'Admin User'
 */
declare class NameTransformPipe implements PipeTransform {
    private propertyTransformService;
    constructor(propertyTransformService: PropertyValueTransformService);
    transform(value: string): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<NameTransformPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<NameTransformPipe, "nameTransform", true>;
}

/**
 * Provides copy of original pipe for C8yTranslateModule
 */
declare class C8yTranslatePipe extends TranslatePipe {
    transform(query: string, ...args: any[]): any;
    static ɵfac: i0.ɵɵFactoryDeclaration<C8yTranslatePipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<C8yTranslatePipe, "translate", true>;
}

declare class C8yTranslateDirective extends TranslateDirective implements AfterViewInit, OnDestroy, OnChanges {
    /**
     * Used to get private element property from TranslateDirective, so it doesn't throw tsErrors
     */
    private get _elementRef();
    /**
     * Used to get private translateService property from TranslateDirective, so it doesn't throw tsErrors
     */
    private get _translateService();
    /**
     * Used to trigger events when html is replaced by directive.
     */
    htmlUpdateEvent: EventEmitter<void>;
    /**
     * When this directive successfully translates node, it stores its value in this property.
     * Another translation will be performed only if new translation value differs from stored one.
     */
    lastTranslation: string;
    /**
     * When this directive encounters element that is HTML, it should switch to Html mode even if
     * new translated element does not contain any HTML.
     */
    htmlMode: boolean;
    initialValue: string;
    destroy$: Subject<void>;
    elementTranslated: boolean;
    constructor(_translateService: TranslateService$1, _element: ElementRef, _ref: ChangeDetectorRef);
    /**
     * Overridden method from original directive.
     * For simple text nodes, it just invokes the base method.
     * For complex nodes, it builds translation key from whole `inner HTML`
     * and replaces it with its translation.
     * This prevents splitting `HTML` into pieces and attempting to translate each one separately
     * which doesn't work, because we extract strings in whole.
     */
    checkNodes(forceUpdate?: boolean, translations?: any): void;
    ngOnChanges(changes: SimpleChanges): void;
    ngOnDestroy(): void;
    ngAfterViewInit(): void;
    setTranslatedStatus(status: boolean): void;
    /**
     * Builds lookup key from innerHTML, removes comments (that might be added by Angular) and trims it.
     */
    private getLookupKey;
    private isElementSimpleTextType;
    private isElementInnerHtmlEmpty;
    private isLookupKeyMissing;
    private lookupKeyExist;
    private getNewTranslation;
    private updateHtmlContent;
    static ɵfac: i0.ɵɵFactoryDeclaration<C8yTranslateDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<C8yTranslateDirective, "[translate],[ngx-translate]", never, {}, {}, never, never, true, never>;
}

/**
 * Module must be redeclared, as Components cant be declared by two modules.
 */
declare class C8yTranslateModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<C8yTranslateModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<C8yTranslateModule, never, [typeof NameTransformPipe, typeof C8yTranslatePipe, typeof C8yTranslateDirective], [typeof C8yTranslatePipe, typeof C8yTranslateDirective, typeof NameTransformPipe]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<C8yTranslateModule>;
}

declare function localePathFactory(options: OptionsService): string;
declare function languagesFactory(options: OptionsService): _c8y_options.Languages;
declare function localeId(appStateService: AppStateService): {
    readonly lang: string;
    toLowerCase(): any;
    toString(): any;
};
declare function getAngularLocalesLanguageString(language?: string): string;
declare class CustomTranslateStore extends TranslateStore {
    protected getValue(language: Language, key: string): InterpolatableTranslation;
    static ɵfac: i0.ɵɵFactoryDeclaration<CustomTranslateStore, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<CustomTranslateStore>;
}
/**
 * Custom TranslateService that prevents setting translations before the current language is set.
 * Required since apama team sets their translations too early before even the user language is determined.
 */
declare class CustomTranslateService extends TranslateService$1 {
    setTranslation(lang: Language, translations: TranslationObject, shouldMerge?: boolean): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<CustomTranslateService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<CustomTranslateService>;
}
declare function provideTranslationServiceInstance(options?: RootTranslateServiceConfig): Provider[];
declare function provideI18n(): Provider[];
/**
 * The angular module definition for i18n (translation).
 * @exports I18nModule
 */
declare class I18nModule {
    static providers(): Provider[];
    static forRoot(): ModuleWithProviders<I18nModule>;
    static ɵfac: i0.ɵɵFactoryDeclaration<I18nModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<I18nModule, never, never, [typeof C8yTranslateModule]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<I18nModule>;
}

/**
 * Simplified version of [NgComponentOutlet](https://github.com/angular/angular/blob/main/packages/common/src/directives/ng_component_outlet.ts)
 *
 * In contrast to NgComponentOutlet it allows to set the environment injector.
 *
 * A [PR](https://github.com/angular/angular/pull/54764) has been raised to add that functionality in Angular.
 *
 * TODO: Remove this directive once the PR is merged.
 */
declare class C8yComponentOutlet implements OnChanges, OnDestroy {
    private __viewContainerRef;
    c8yComponentOutlet: Type<any> | null;
    c8yComponentOutletInjector?: Injector;
    c8yComponentOutletEnvironmentInjector?: EnvironmentInjector;
    c8yComponentOutletProviders?: Type<unknown>[];
    c8yComponentOutletInitialState?: any;
    private _componentRef;
    private environment;
    private _newEnvInjector;
    constructor(__viewContainerRef: ViewContainerRef);
    ngOnChanges(changes: SimpleChanges): void;
    ngOnDestroy(): void;
    private _needToReCreateComponentInstance;
    static ɵfac: i0.ɵɵFactoryDeclaration<C8yComponentOutlet, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<C8yComponentOutlet, "[c8yComponentOutlet]", never, { "c8yComponentOutlet": { "alias": "c8yComponentOutlet"; "required": false; }; "c8yComponentOutletInjector": { "alias": "c8yComponentOutletInjector"; "required": false; }; "c8yComponentOutletEnvironmentInjector": { "alias": "c8yComponentOutletEnvironmentInjector"; "required": false; }; "c8yComponentOutletProviders": { "alias": "c8yComponentOutletProviders"; "required": false; }; "c8yComponentOutletInitialState": { "alias": "c8yComponentOutletInitialState"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * Allows to set a icon. Switches between c8y default icons
 * and font awesome icons.
 * ```html
 * <i [c8yIcon]="'clock'">
 * ```
 */
declare class IconDirective {
    private el;
    private renderer;
    /**
     * Sets the icon to be displayed. This directive handles the correct CSS classes
     * for Cumulocity IoT's dual-color icon sets.
     *
     * There are two main icon sets:
     * 1. **Cumulocity Icons**: These are specific to the platform. To use them, provide the icon name prefixed with **c8y-**.
     * 2. **Delight Icons**: This is the default icon set. To use them, provide just the icon name without any prefix.
     *
     * ```html
     * <!-- To display a Cumulocity IoT icon (e.g., cockpit) -->
     * <i [c8yIcon]="'c8y-cockpit'"></i>
     *
     * <!-- To display a default Delight icon (e.g., download) -->
     * <i [c8yIcon]="'download'"></i>
     *
     * <!-- You can also use it without property binding for static icons -->
     * <i c8yIcon="building"></i>
     * ```
     */
    set c8yIcon(icon: SupportedIconsSuggestions | {
        class: string;
    });
    private c8yMatch;
    private dltC8yMatch;
    private currentClasses;
    constructor(el: ElementRef, renderer: Renderer2);
    private isC8y;
    private isDltC8y;
    private getClasses;
    private updateIcon;
    private mapFontAwesomeToDelightIcons;
    static ɵfac: i0.ɵɵFactoryDeclaration<IconDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<IconDirective, "[c8yIcon]", never, { "c8yIcon": { "alias": "c8yIcon"; "required": false; }; }, {}, never, never, true, never>;
}

declare class LoadingComponent {
    /**
     * Defining the layout of the loading component. By default the
     * component loading activity is used.
     */
    layout: 'component' | 'application' | 'page';
    /**
     * If set, a progress bar is shown. The layout property is ignored.
     */
    progress: number;
    /**
     * Showing a message while loading. The application layout by default shows the label `Loading…`.
     */
    message: string;
    /**
     * @ignore
     */
    get defaultLoadingMessage(): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<LoadingComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<LoadingComponent, "c8y-loading", never, { "layout": { "alias": "layout"; "required": false; }; "progress": { "alias": "progress"; "required": false; }; "message": { "alias": "message"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * A component to show generic empty state.
 * Title and subtitle should be used with translate pipe to mark strings for translation.
 * Component can be displayed vertically (default) or horizontally.
 * Additional markup elements can be placed inside the tag.
 *
 * ```html
 * <c8y-ui-empty-state
 *   [icon]="'c8y-icon'"
 *   [title]="'Place your title here' | translate"
 *   [subtitle]="'Place your subtitle here' | translate"
 *   [horizontal]="true"
 * >
 *   (...)
 * </c8y-ui-empty-state>
 * ```
 */
declare class EmptyStateComponent {
    /** Icon name. */
    icon: SupportedIconsSuggestions;
    /** Required title. */
    title: string;
    /** Optional subtitle. */
    subtitle: string;
    /** Whether to display it in horizontal layout. */
    horizontal: boolean;
    static ɵfac: i0.ɵɵFactoryDeclaration<EmptyStateComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<EmptyStateComponent, "c8y-ui-empty-state", never, { "icon": { "alias": "icon"; "required": false; }; "title": { "alias": "title"; "required": false; }; "subtitle": { "alias": "subtitle"; "required": false; }; "horizontal": { "alias": "horizontal"; "required": false; }; }, {}, never, ["*"], true, never>;
}

/**
 * Injects data statistics object of type `DataSourceStats` into your template
 * so that you can adjust your empty state messages according to them.
 *
 * Works only within the `c8y-data-grid` component.
 *
 * ```html
 * <c8y-data-grid [...]>
 * <c8y-ui-empty-state
 *   *emptyStateContext="let stats"
 *   [title]="
 *     stats?.size > 0
 *       ? (noMatchingDevices | translate)
 *       : (noDevicesToDisplay | translate)
 *   "
 *   [...]
 * ></c8y-ui-empty-state>
 * [...]
 * </c8y-data-grid>
 * ```
 */
declare class EmptyStateContextDirective {
    templateRef: TemplateRef<unknown>;
    constructor(templateRef: TemplateRef<unknown>);
    static ɵfac: i0.ɵɵFactoryDeclaration<EmptyStateContextDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<EmptyStateContextDirective, "[emptyStateContext]", never, {}, {}, never, never, true, never>;
}

/**
 * A pipe that transforms a user object into their initials.

 * ```html
 * {{ user | userNameInitials }}
 * ```
 */
declare class UserNameInitialsPipe implements PipeTransform {
    transform(user: any): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<UserNameInitialsPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<UserNameInitialsPipe, "userNameInitials", true>;
}

declare class ShortenUserNamePipe implements PipeTransform {
    transform(user: any): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<ShortenUserNamePipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<ShortenUserNamePipe, "shortenUserName", true>;
}

/**
 * Transforms a string into a human-readable format.
 *
 * ```html
 * <p>{{ 'c8y_hello world' | humanize }}</p> <!-- e.g. Hello world -->
 * ```
 */
declare class HumanizePipe implements PipeTransform {
    static humanize(str?: string): string;
    transform(str: string): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<HumanizePipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<HumanizePipe, "humanize", true>;
}

type CanEditConfig = {
    /**
     * Skips roles check.
     */
    skipRolesCheck?: boolean;
    /**
     * Skips managed object ownership check.
     */
    skipOwnerCheck?: boolean;
    /**
     * Skips checks with a query to the inventory API.
     */
    skipRequestCheck?: boolean;
};
declare class Permissions {
    private appState;
    private inventory;
    private user;
    static ROLE_ADVANCED_SOFTWARE_ADMIN: string;
    static ROLE_ADVANCED_SOFTWARE_READ: string;
    static ROLE_ALARM_ADMIN: string;
    static ROLE_ALARM_READ: string;
    static ROLE_ANALYTICSBUILDER_READ: string;
    static ROLE_APPLICATION_MANAGEMENT_ADMIN: string;
    static ROLE_APPLICATION_MANAGEMENT_READ: string;
    static ROLE_AUDIT_ADMIN: string;
    static ROLE_AUDIT_READ: string;
    static ROLE_BINARY_ADMIN: string;
    static ROLE_BINARY_CREATE: string;
    static ROLE_BINARY_READ: string;
    static ROLE_BULK_OPERATION_ADMIN: string;
    static ROLE_BULK_OPERATION_READ: string;
    static ROLE_CEP_MANAGEMENT_ADMIN: string;
    static ROLE_CEP_MANAGEMENT_READ: string;
    static ROLE_DATA_BROKER_ADMIN: string;
    static ROLE_DATA_BROKER_READ: string;
    static ROLE_DEVICE_CONTROL_ADMIN: string;
    static ROLE_DEVICE_CONTROL_READ: string;
    static ROLE_EMAIL_CREATE: string;
    static ROLE_EPLAPPS_READ: string;
    static ROLE_EVENT_ADMIN: string;
    static ROLE_EVENT_READ: string;
    static ROLE_GENERIC_MQTT_ADMIN: string;
    static ROLE_IDENTITY_ADMIN: string;
    static ROLE_IDENTITY_READ: string;
    static ROLE_INVENTORY_ADMIN: string;
    static ROLE_INVENTORY_CREATE: string;
    static ROLE_INVENTORY_READ: string;
    static ROLE_MACHINE_LEARNING_READ: string;
    static ROLE_MANAGED_OBJECT_ADMIN: string;
    static ROLE_MANAGED_OBJECT_CREATE: string;
    static ROLE_MANAGED_OBJECT_READ: string;
    static ROLE_MEASUREMENT_ADMIN: string;
    static ROLE_MEASUREMENT_READ: string;
    static ROLE_MQTT_CONNECT_ADMIN: string;
    static ROLE_MQTT_SERVICE_ADMIN: string;
    static ROLE_NOTIFICATION_2_ADMIN: string;
    static ROLE_OPTION_MANAGEMENT_ADMIN: string;
    static ROLE_OPTION_MANAGEMENT_READ: string;
    static ROLE_PROVISIONING_CREATE: string;
    static ROLE_PROVISIONING_READ: string;
    static ROLE_PROVISIONING_UPDATE: string;
    static ROLE_REMOTE_ACCESS_ADMIN: string;
    static ROLE_RETENTION_RULE_ADMIN: string;
    static ROLE_RETENTION_RULE_READ: string;
    static ROLE_SCHEDULE_REPORT_ADMIN: string;
    static ROLE_SIMULATOR_ADMIN: string;
    static ROLE_SMARTGROUP_ADMIN: string;
    static ROLE_SMARTGROUP_CREATE: string;
    static ROLE_SMARTGROUP_UPDATE: string;
    static ROLE_SMARTRULE_ADMIN: string;
    static ROLE_SMARTRULE_READ: string;
    static ROLE_SMS_ADMIN: string;
    static ROLE_SMS_READ: string;
    static ROLE_SUPPORT_ADMIN: string;
    static ROLE_SUPPORT_READ: string;
    static ROLE_TENANT_ADMIN: string;
    static ROLE_TENANT_MANAGEMENT_ADMIN: string;
    static ROLE_TENANT_MANAGEMENT_CREATE: string;
    static ROLE_TENANT_MANAGEMENT_READ: string;
    static ROLE_TENANT_MANAGEMENT_UPDATE: string;
    static ROLE_TENANT_STATISTICS_READ: string;
    static ROLE_USER_MANAGEMENT_ADMIN: string;
    static ROLE_USER_MANAGEMENT_CREATE: string;
    static ROLE_USER_MANAGEMENT_OWN_ADMIN: string;
    static ROLE_USER_MANAGEMENT_OWN_READ: string;
    static ROLE_USER_MANAGEMENT_READ: string;
    constructor(appState: AppStateService, inventory: InventoryService, user: UserService);
    /**
     * Checks if the current user has write permissions for the given mo
     * (either through global role, individual device permissions or via inventory roles).
     *
     * ```ts
     * async canEditGroup(group: IManagedObject): Promise<boolean> {
     *   return await this.permissions.canEdit(
     *     [Permissions.ROLE_INVENTORY_ADMIN, Permissions.ROLE_MANAGED_OBJECT_ADMIN],
     *     group
     *   );
     * }
     * ```
     *
     * @param roleIds The array of role ids to check if the current user have at least one of them.
     * @param mo The managed object for which we are checking whether the user has access.
     * @param config A configuration object that can take the following values: `skipRolesCheck`: `boolean` - skips roles check, `skipOwnerCheck`: `boolean` - skips ownership check, `skipRequestCheck`: `boolean` - skips checks with a query to the inventory API. UI will make a query to backend whether the user can edit the managed object. A rejection from BE indicates a lack of permission.
     *
     * @returns A Promise resolving to a boolean value. `true` if editing is permitted based on the given parameters and configuration; otherwise, `false`.
     *
     */
    canEdit(roleIds: string[], mo: IManagedObject | IIdentified, config?: CanEditConfig): Promise<boolean>;
    /**
     * Checks if the current user has the specified role.
     *
     * ```ts
     * hasSmsReadRole(): boolean {
     *  return this.permissions.hasRole(Permissions.ROLE_SMS_READ);
     * };
     * ```
     *
     * @param roleId The ID of the role to check against the current user's roles.
     * @returns A boolean value indicating whether the current user has the specified role.
     * @throws Error if no user is currently logged in.
     *
     */
    hasRole(roleId: string): boolean;
    /**
     * Checks if the current user possesses all the specified roles.
     *
     * ```ts
     * hasMOReadAndBinaryReadRoles(): boolean {
     *   return this.permissions.hasAllRoles([
     *     Permissions.ROLE_MANAGED_OBJECT_READ,
     *     Permissions.ROLE_BINARY_READ
     *   ]);
     * }
     * ```
     *
     * @param roleIds An array of strings representing the role IDs to check against the current user's roles.
     * @returns A boolean value indicating whether the current user has all the specified roles.
     * @throws Error if no user is currently logged in.
     *
     */
    hasAllRoles(roleIds: string[]): boolean;
    /**
     * Checks if the current user possesses any of the specified roles.
     *
     * ```ts
     * hasTenantAdminOrTenantManagementAdminRoles(): boolean {
     *  return this.permissions.hasAnyRole([
     *    Permissions.ROLE_TENANT_ADMIN,
     *    Permissions.ROLE_TENANT_MANAGEMENT_ADMIN
     *  ]);
     * };
     * ```
     *
     * @param roleIds An array of strings representing the role IDs to check against the current user's roles.
     * @returns A boolean value indicating whether the current user has any of the specified roles.
     * @throws Error if no user is currently logged in.
     *
     */
    hasAnyRole(roleIds: string[]): boolean;
    /**
     * Checks if the current user possesses any of the specified global roles.
     *
     * ```ts
     * hasAnyGlobalRoles(dashboard: ContextDashboardManagedObject): boolean {
     *   const globalRolesIds = dashboard?.c8y_Dashboard?.globalRolesIds;
     *   return this.permissions.hasAnyGlobalRole(globalRolesIds);
     * }
     * ```
     *
     * @param globalRolesIds An array of numbers representing the global role IDs to check against the current user's roles.
     * @returns A boolean value indicating whether the current user has any of the specified global roles.
     * @throws Error if no user is currently logged in.
     *
     */
    hasAnyGlobalRole(globalRolesIds: number[]): boolean;
    /**
     * Checks if the current user is the owner of the managed object.
     * Utilizes memoization to cache the result based on the managed object's id,
     * improving performance for subsequent checks of the same object.
     *
     * ```ts
     * const managedObject = { id: '123', owner: 'johnDoe' };
     * this.checkIfOwner(managedObject).then(isOwner => {
     *   console.log(isOwner);
     * });
     * ```
     *
     * @param mo The managed object to check ownership against.
     * @returns A promise that resolves to `true` if the current user is the owner of the managed object, and `false` otherwise.
     *
     */
    protected checkIfOwner(mo: IManagedObject | IIdentified): Promise<boolean>;
    /**
     * Attempts to perform a partial update on a managed object as a means to check for edit permissions.
     * Utilizes memoization to cache the result based on the managed object's id,
     * thereby avoiding unnecessary repeated requests for the same object.
     *
     * This method essentially tests if the current user has permission to update the managed object,
     * serving as an indirect permission check.
     *
     * ```ts
     * const managedObject = { id: '456' };
     * this.checkWithRequest(managedObject).then(hasPermission => {
     *   console.log(hasPermission);
     * }).catch(error => {
     *   console.error(error);
     * });
     * ```
     *
     * @param mo The managed object to test edit permissions on.
     * @returns A promise that resolves to `true` if the update request succeeds (indicating edit permissions), and `false` if it fails.
     *
     */
    protected checkWithRequest(mo: IManagedObject | IIdentified): Promise<boolean>;
    /**
     * Checks if the current user has the necessary permissions to edit a managed object.
     * This method considers various conditions to determine editability, including role checks,
     * ownership, and custom request-based checks. Each of these checks can be optionally skipped
     * based on the provided configuration.
     *
     * @param roleIds An array of role IDs to check against the current user's roles.
     * @param mo The managed object or an identified resource to check edit permissions for.
     * @param config Configuration options to customize the checks performed. This includes options to skip role checks, owner checks, or custom request checks.
     * @returns A promise that resolves to `true` if the current user can edit the managed object based on the given conditions, and `false` otherwise.
     *
     */
    private checkIfCanEdit;
    static ɵfac: i0.ɵɵFactoryDeclaration<Permissions, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<Permissions>;
}

/**
 * A structural directive that conditionally includes a template only if the user has
 * all or any of the roles passed as an input. By default the directive checks all roles:
 *
 * ```html
 * <button *c8yIfAllowed="['ROLE_RECORD_DELETE', 'ROLE_ENTRY_DELETE']" (click)="delete()" title="Delete">
 *   Delete
 * </button>
 * ```
 *
 * To check if the user has any of the required roles to view the element you need to use the `allowAny` input:
 *
 * ```html
 * <button *c8yIfAllowed="['ROLE_RECORD_DELETE', 'ROLE_ENTRY_DELETE']; allowAny: true" (click)="delete()" title="Delete">
 *   Delete
 * </button>
 * ```
 *
 * or use the shorter version
 *
 * ```html
 * <button *c8yIfAllowed="['ROLE_RECORD_DELETE', 'ROLE_ENTRY_DELETE']; allowAny" (click)="delete()" title="Delete">
 *   Delete
 * </button>
 * ```
 */
declare class IfAllowedDirective {
    private template;
    private container;
    private permissions;
    /**
     * One or many roles required for the element to be rendered
     */
    set c8yIfAllowed(roleIds: string | string[]);
    /**
     * Switches to the mode where at least one of the provided roles is sufficient for the element to be rendered
     */
    set c8yIfAllowedAllowAny(allowAny: boolean);
    private rolesIds;
    private allowAny;
    constructor(template: TemplateRef<any>, container: ViewContainerRef, permissions: Permissions);
    ngOnInit(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<IfAllowedDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<IfAllowedDirective, "[c8yIfAllowed]", never, { "c8yIfAllowed": { "alias": "c8yIfAllowed"; "required": false; }; "c8yIfAllowedAllowAny": { "alias": "c8yIfAllowedAllowAny"; "required": false; }; }, {}, never, never, true, never>;
}

declare const NUMBER_FORMAT_REGEXP: RegExp;
/**
 * Formats a value according to digit options and locale rules.
 * Extends the behavior of Angular's <code>number</code> pipe by
 * providing an option to define if a truncated value should be
 * rounded up or down (with the <code>number</code> pipe the
 * value will be rounded using the "to-nearest" method).
 *
 * ```html
 * <span>{{ 3.45612 | c8yNumber: 'ceil':'1.1-3' }}</span> <!-- 3.457 -->
 * <span>{{ 3.46 | c8yNumber: 'ceil':'1.3-3' }}</span> <!-- 3.460 -->
 * <span>{{ 3.45685 | c8yNumber: 'floor':'1.1-3' }}</span> <!-- 3.456 -->
 * ```
 */
declare class NumberPipe extends DecimalPipe {
    constructor(locale: string);
    transform(value: number | string, round: 'ceil' | 'floor' | null | undefined, digitsInfo?: string, locale?: string): string | null;
    transform(value: null | undefined, round: 'ceil' | 'floor' | null | undefined, digitsInfo?: string, locale?: string): null;
    static ɵfac: i0.ɵɵFactoryDeclaration<NumberPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<NumberPipe, "c8yNumber", true>;
}

declare class OperationResultComponent {
    text: string;
    vertical: boolean;
    size: number;
    type: string;
    static ɵfac: i0.ɵɵFactoryDeclaration<OperationResultComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<OperationResultComponent, "c8y-operation-result", never, { "text": { "alias": "text"; "required": false; }; "vertical": { "alias": "vertical"; "required": false; }; "size": { "alias": "size"; "required": false; }; "type": { "alias": "type"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * A pipe that transforms a Markdown string into sanitized HTML.
 *
 *
 * ```html
 * <div [innerHTML]="'[Example markdown link](#)' | markdownToHtml | async"></div>
 * ```
 */
declare class MarkdownToHtmlPipe implements PipeTransform {
    private sanitizer;
    constructor(sanitizer: DomSanitizer);
    transform(markdown: string, args?: {
        baseUrl: string;
    }): Observable<string>;
    static ɵfac: i0.ɵɵFactoryDeclaration<MarkdownToHtmlPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<MarkdownToHtmlPipe, "markdownToHtml", true>;
}

declare class MoNameCacheService {
    private inventoryService;
    private clearCacheTimer;
    private cacheLifeSpan;
    getMoName: any;
    constructor(inventoryService: InventoryService);
    resetCacheTimer(id: any): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<MoNameCacheService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<MoNameCacheService>;
}

declare class MoNamePipe implements PipeTransform {
    private moNamePipeService;
    constructor(moNamePipeService: MoNameCacheService);
    transform(entityOrId: Partial<IManagedObject>): Promise<any>;
    static ɵfac: i0.ɵɵFactoryDeclaration<MoNamePipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<MoNamePipe, "moName", true>;
}

/**
 * Directive to set a DOM node, a TemplateRef or any Component to a container or any node.
 * ```html
 * <div *c8yOutlet="template"></div>
 * <div *c8yOutlet="DeviceStatusComponent; properties: { node }"></div>
 * <div *c8yOutlet="nodes"></div>
 * ```
 *
 * Note: When passing a native `HTMLElement`, be aware that a single element instance can only exist in one
 * place in the DOM. If you need to render the same element in multiple locations, the passed element
 * should have a `createCopy` function that returns a new instance or a clone of the element.
 */
declare class OutletDirective {
    private viewContainer;
    private injector;
    private renderer;
    private el;
    private properties;
    private _element;
    private _template;
    constructor(viewContainer: ViewContainerRef, injector: Injector, renderer: Renderer2, el: ElementRef);
    /**
     * Directive to set a `DOM node`, a `TemplateRef` or any `Component` to a container or any node.
     * ```html
     * <div *c8yOutlet="template"></div>
     * <div *c8yOutlet="DeviceStatusComponent; properties: { node }"></div>
     * <div *c8yOutlet="nodes"></div>
     * ```
     */
    set c8yOutlet(template: TemplateRef<any> | Type<any> | Element);
    /**
     * Additional properties that should be added to the component
     * instance.
     */
    set c8yOutletProperties(value: any);
    /**
     * Allows to use a different injector.
     */
    set c8yOutletInjector(value: Injector);
    /**
     * @ignore
     */
    ngOnChanges(): void;
    /**
     * @ignore
     */
    ngOnDestroy(): void;
    private render;
    private destroy;
    static ɵfac: i0.ɵɵFactoryDeclaration<OutletDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<OutletDirective, "[c8yOutlet]", never, { "c8yOutlet": { "alias": "c8yOutlet"; "required": false; }; "c8yOutletProperties": { "alias": "c8yOutletProperties"; "required": false; }; "c8yOutletInjector": { "alias": "c8yOutletInjector"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * A directive to iterate over `IResultList<T>` data from `@c8y/client`.
 * Depending on the `[c8yForLoadMore]` a load more button is:
 *  - **auto**: Tries to automatically load more data (default maximum 10 iterations; can be
 *          change with maxIterations settings).
 *  - **show**: Shows a load more button for the user to decide
 *  - **none**: Doesn't perform any load more action.
 *  - **hidden**: Loads more data automatically but with no visible button for the user.
 *
 * Additional, any rxjs operator pipe can be applied to the `[c8yForPipe]` input, e.g. to
 * filter the data displayed currently as well as the data loaded by subsequent requests.
 *
 * ```html
 * <div *c8yFor="let device of devices; loadMore: 'auto'; let i = index; pipe: filterPipe;">
 *  {{ i + 1 }}. {{device.name}}
 * </div>
 * ```
 * The above example will list all entities that are applied to `devices`:
 * ```typescript
 * this.devices = this.inventoryService.list({ pageSize: 10, fragmentType: 'c8y_IsDevice' })
 * ```
 * It will display the first `10` items, if there is more space left on the screen, and there are more
 * than `10` devices, it will automatically load up to 10 pages more. If it still can't fit the screen
 * it will stop and switch to `show` mode.
 *
 * A pipe can be applied e.g. for filtering or grouping. This pipe is attached to every follow up
 * request done by the load more component:
 * ```typescript
 * this.filterPipe = pipe(
 *    map((data: []) => {
 *     return data.filter(
 *      (mo: any) => mo.name && mo.name.toLowerCase().indexOf(value.toLowerCase()) > -1
 *    );
 *  })
 * );
 * ```
 * The pipe must be an rxjs pipe and can take any operator.
 *
 * Example with realtime support and items count output (e.g. for handling empty state and header):
 *
 * ```html
 * <c8y-list-group>
 *   <div class="c8y-empty-state" *ngIf="count === 0">
 *     (...)
 *   </div>
 *
 *   <div class="page-sticky-header hidden-xs c8y-list__item c8y-list--timeline" *ngIf="count > 0">
 *     (...)
 *   </div>
 *
 *   <ng-template
 *     c8yFor
 *     let-operation
 *     [c8yForOf]="items$"
 *     [c8yForPipe]="filterPipe"
 *     [c8yForRealtime]="realtime"
 *     [c8yForRealtimeOptions]="realtimeOptions"
 *     (c8yForCount)="count = $event"
 *   >
 *     <c8y-li-timeline>
 *       (...)
 *     </c8y-li-timeline>
 *   </ng-template>
 * </c8y-list-group>
 * ```
 *
 * ```typescript
 * @Component({
 *   (...)
 * })
 * export class ExampleComponent {
 *   @Input() deviceId: IIdentified;
 *   items$ = this.operationService.list({
 *     deviceId: this.deviceId,
 *     fragmentType: 'c8y_MyOperation',
 *     dateFrom: new Date(0).toISOString(),
 *     dateTo: new Date(Date.now()).toISOString(),
 *     revert: true,
 *     withTotalPages: true
 *   });
 *   filterPipe = pipe(map((ops: IOperation[]) => ops.filter(op => op.c8y_MyOperation)));
 *   realtimeOptions: ForOfRealtimeOptions = {
 *     entityOrId: this.deviceId,
 *     removeOnUpdate: true,
 *     insertOnUpdate: true
 *   } as ForOfRealtimeOptions;
 *   count: number;
 *
 *   constructor(
 *     private operationService: OperationService,
 *     public realtime: OperationRealtimeService
 *   ) {}
 * }
 * ```
 */
declare class ForOfDirective {
    private tpl;
    private vcr;
    private cdRef;
    private cachedData;
    private paging;
    private loadMoreMode;
    private dataPipe;
    private itemDataPipe;
    private pagingSub;
    private obs$;
    private loadMore;
    private loadingTemplate;
    private maxIterations;
    private notFoundTemplate;
    private loadNextLabel;
    private loadingLabel;
    private realtime;
    private realtimeOptions;
    private comparator;
    private unsubscribe$;
    private virtualScrollInstance;
    private get shouldUseLoadMoreButton();
    private get hasMoreData();
    private get length();
    /**
     * The data setter. Must be a response from @c8y/data or an observable.
     * You can pass an observable with null to explicitly clear the list.
     */
    set c8yForOf(fetchData: IResultList<IIdentified> | Observable<IResultList<IIdentified>>);
    /**
     * The mode setter:
     *  - **auto**: Tries to automatically load more data (default maximum 10 iterations; can be
     *          change with maxIterations settings).
     *  - **show**: Shows a load more button for the user to decide
     *  - **none**: Doesn't perform any load more action.
     *  - **hidden**: Loads more data automatically but with no visible button for the user.
     */
    set c8yForLoadMore(type: ForOfDirective['loadMoreMode']);
    /**
     * The pipe setter to attach any rxjs pipe to the current and more loaded data.
     */
    set c8yForPipe(dataPipe: ForOfDirective['dataPipe']);
    /**
     * A template to use if no data is found at all (e.g. if you apply a filter pipe).
     */
    set c8yForNotFound(notFoundTemplate: ForOfDirective['notFoundTemplate']);
    /**
     * The maximum numbers of iterations to call data from the api.
     */
    set c8yForMaxIterations(maxIterations: number);
    /**
     * A custom loading component.
     */
    set c8yForLoadingTemplate(loadingTemplate: ForOfDirective['loadingTemplate']);
    /**
     * Load next text label.
     */
    set c8yForLoadNextLabel(loadNextLabel: string);
    /**
     * Loading text label.
     */
    set c8yForLoadingLabel(loadingLabel: string);
    /**
     * A `RealtimeService` instance.
     */
    set c8yForRealtime(source: ForOfDirective['realtime']);
    /**
     * Realtime options.
     */
    set c8yForRealtimeOptions(realtimeOptions: ForOfDirective['realtimeOptions']);
    /**
     * A comparator function for comparing list items. Used to determine
     * the position at which a new element should be added to the list.
     */
    set c8yForComparator(comparator: ForOfDirective['comparator']);
    /**
     * Enable virtual scroll rendering method.
     */
    c8yForEnableVirtualScroll: boolean;
    /**
     * Provides fixed item size for virtual scroll window strategy.
     */
    c8yForVirtualScrollElementSize: any;
    /**
     * Sets mode of virtual scroller instance.
     * window is used for case when whole viewport is scrolled.
     * fixed can be used on inner-scroll containers.
     */
    c8yForVirtualScrollStrategy: 'fixed' | 'window';
    /**
     * When used fixed strategy, there needs to be fixed height set on scrolling container.
     */
    c8yForVirtualScrollContainerHeight: number;
    /**
     * The number of items currently loaded in the list.
     *
     * Note: This can only be used if the `forOf` isn't used with
     * the sugared asterisk (*) syntax. Instead you need to use an ng-template:
     * ```html
     * <ng-template
     *  c8yFor
     *  let-operation
     *  [c8yForOf]="operations$"
     *  (c8yForCount)="operationCount = $event"
     * >
     * </ng-template>
     * ```
     */
    private c8yForCount;
    /**
     * The items change event emitting the newly loaded items.
     *
     * Note: This can only be used if the `forOf` isn't used with
     * the sugared asterisk (*) syntax. Instead you need to use an ng-template:
     * ```html
     * <ng-template
     *  c8yFor
     *  let-operation
     *  [c8yForOf]="operations$"
     *  (c8yForChange)="onChangeForOf($event)"
     * >
     * </ng-template>
     * ```
     */
    private c8yForChange;
    /**
     * The current instance of the `LoadMoreComponent`.
     */
    private c8yForLoadMoreComponent;
    private count;
    constructor(tpl: TemplateRef<any>, vcr: ViewContainerRef, cdRef: ChangeDetectorRef);
    ngOnInit(): void;
    ngOnChanges(changes: SimpleChanges): void;
    ngOnDestroy(): void;
    private handleRealtime;
    /**
     * On create notification:
     * - if item passes data pipe, then insert it.
     * @private
     */
    private handleRealtimeCreate;
    /**
     * On update notification:
     * - if item is displayed and passes data pipe, then update it,
     * - if item is displayed and doesn't pass data pipe, then remove it (if `removeOnUpdate` is true),
     * - if item is not displayed and passes data pipe, then insert it (if `insertOnUpdate` is true),
     * - if item is not displayed and doesn't pass data pipe, then ignore it.
     * @private
     */
    private handleRealtimeUpdate;
    /**
     * On delete notification:
     * - remove item from the list (if not there, it will be just ignored).
     * @private
     */
    private handleRealtimeDelete;
    private render;
    private append;
    private loadMoreData;
    private createLoadMoreButtonComponent;
    private createVirtualScrollWrapperComponent;
    private insert;
    private update;
    private remove;
    private updateCount;
    private isDisplayed;
    private forMatchingEmbeddedViewRef;
    private checkForDuplicates;
    private unsubscribePaging;
    private setVirtualScrollContents;
    private appendVirtualScrollContent;
    static ɵfac: i0.ɵɵFactoryDeclaration<ForOfDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<ForOfDirective, "[c8yFor]", never, { "c8yForOf": { "alias": "c8yForOf"; "required": false; }; "c8yForLoadMore": { "alias": "c8yForLoadMore"; "required": false; }; "c8yForPipe": { "alias": "c8yForPipe"; "required": false; }; "c8yForNotFound": { "alias": "c8yForNotFound"; "required": false; }; "c8yForMaxIterations": { "alias": "c8yForMaxIterations"; "required": false; }; "c8yForLoadingTemplate": { "alias": "c8yForLoadingTemplate"; "required": false; }; "c8yForLoadNextLabel": { "alias": "c8yForLoadNextLabel"; "required": false; }; "c8yForLoadingLabel": { "alias": "c8yForLoadingLabel"; "required": false; }; "c8yForRealtime": { "alias": "c8yForRealtime"; "required": false; }; "c8yForRealtimeOptions": { "alias": "c8yForRealtimeOptions"; "required": false; }; "c8yForComparator": { "alias": "c8yForComparator"; "required": false; }; "c8yForEnableVirtualScroll": { "alias": "c8yForEnableVirtualScroll"; "required": false; }; "c8yForVirtualScrollElementSize": { "alias": "c8yForVirtualScrollElementSize"; "required": false; }; "c8yForVirtualScrollStrategy": { "alias": "c8yForVirtualScrollStrategy"; "required": false; }; "c8yForVirtualScrollContainerHeight": { "alias": "c8yForVirtualScrollContainerHeight"; "required": false; }; }, { "c8yForCount": "c8yForCount"; "c8yForChange": "c8yForChange"; "c8yForLoadMoreComponent": "c8yForLoadMoreComponent"; }, never, never, true, never>;
}

declare class LoadMoreComponent {
    private element;
    private cdRef;
    paging: Paging<any>;
    useIntersection: boolean;
    hidden: boolean;
    container: ElementRef;
    class: string;
    maxIterations: number;
    noMoreDataHint: TemplateRef<any>;
    loadingTemplate: TemplateRef<any>;
    hideNoMoreDataHint: boolean;
    loadNextLabel: string;
    loadingLabel: string;
    onLoad: EventEmitter<IIdentified>;
    isLoading: boolean;
    counter: number;
    hasNoMoreData: boolean;
    private loadUntilIntersected;
    private readonly LOAD_SAME_PAGE_THRESHOLD;
    private intersectionObserver;
    private destroyed;
    get hostClass(): string;
    get hasMore(): boolean;
    get isLastPage(): boolean;
    constructor(element: ElementRef, cdRef: ChangeDetectorRef);
    ngAfterContentInit(): void;
    ngOnDestroy(): void;
    loadMore(event?: any): Promise<void>;
    private intersectionLoading;
    private getLoadingThreshold;
    private shouldShowNoMoreDataHint;
    private shouldSwitchMode;
    private buttonInView;
    static ɵfac: i0.ɵɵFactoryDeclaration<LoadMoreComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<LoadMoreComponent, "c8y-load-more", never, { "paging": { "alias": "paging"; "required": false; }; "useIntersection": { "alias": "useIntersection"; "required": false; }; "hidden": { "alias": "hidden"; "required": false; }; "container": { "alias": "container"; "required": false; }; "class": { "alias": "class"; "required": false; }; "maxIterations": { "alias": "maxIterations"; "required": false; }; "noMoreDataHint": { "alias": "noMoreDataHint"; "required": false; }; "loadingTemplate": { "alias": "loadingTemplate"; "required": false; }; "hideNoMoreDataHint": { "alias": "hideNoMoreDataHint"; "required": false; }; "loadNextLabel": { "alias": "loadNextLabel"; "required": false; }; "loadingLabel": { "alias": "loadingLabel"; "required": false; }; }, { "onLoad": "onLoad"; }, never, never, true, never>;
}

/**
 * @deprecated Use `c8y-loading` instead.
 */
declare class ProgressBarComponent {
    message: string;
    progress: number;
    static ɵfac: i0.ɵɵFactoryDeclaration<ProgressBarComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ProgressBarComponent, "c8y-progress-bar", never, { "message": { "alias": "message"; "required": false; }; "progress": { "alias": "progress"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * A directive to determine if a dropdown should open to the top or as usual to the bottom.
 * It starts by checking the available space on the closese parent container with the class
 * `inner-scroll`, fallback to the `window.innerHeight` if no parent is found.
 * This directive has a direct dependency to the bootstrap dropdown (!)
 *
 * Preconditions:
 *  - Bootstrap dropdown is used
 *  - Bootstrap dropdown is not used with container="body"
 *  - Bootstrap dropdown is used like it is intended and documented for e.g.
 * ```html
 * <div dropdown class="dropdown">
 *  <button class="dropdown-toggle" dropdownToggle>Toggle</button>
 *  <ul class="dropdown-menu" *dropdownMenu>
 *    <!-- Content here -->
 *  </ul>
 * </div>
 * ```
 *
 * ```html
 * <div dropdown c8yBsDropdownDirection class="dropdown">
 *  <button class="dropdown-toggle" dropdownToggle>Toggle</button>
 *  <ul class="dropdown-menu" *dropdownMenu>
 *    <!-- Content here -->
 *  </ul>
 * </div>
 * ```
 * Make use of the bootstrap dropdown as usual and additionally add the direction directive to it.
 */
declare class DropdownDirectionDirective {
    private elementRef;
    private renderer;
    private readonly MARGIN_BOTTOM;
    private readonly VISIBILITY;
    private readonly DROPUP;
    private readonly MENUHEIGHT;
    private readonly MAX_ANCESTOR_SEARCH_ITERATIONS;
    constructor(elementRef: ElementRef, renderer: Renderer2);
    onClick(): void;
    private shouldDropup;
    static ɵfac: i0.ɵɵFactoryDeclaration<DropdownDirectionDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<DropdownDirectionDirective, "[dropdown][c8yBsDropdownDirection],[dropdown][c8yDropdownDirection]", never, {}, {}, never, never, true, never>;
}

declare class TextareaAutoresizeDirective implements OnInit {
    private elementRef;
    private focused;
    private resizeObserver;
    constructor(elementRef: ElementRef);
    onInput(): void;
    onFocus(): void;
    onBlur(): void;
    ngOnInit(): void;
    ngOnDestroy(): void;
    resize(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<TextareaAutoresizeDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<TextareaAutoresizeDirective, "[c8y-textarea-autoresize]", never, {}, {}, never, never, true, never>;
}

/**
 * Adds necessary attributes to ngx-bootstrap's tabset markup to comply with a11y requirements.
 */
declare class TabsetAriaDirective implements AfterViewInit {
    private elementRef;
    constructor(elementRef: ElementRef);
    ngAfterViewInit(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<TabsetAriaDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<TabsetAriaDirective, "tabset", never, {}, {}, never, never, true, never>;
}

declare class VirtualScrollerWrapperComponent implements AfterViewChecked {
    virtualScrollViewport: CdkVirtualScrollViewport;
    items: unknown[];
    itemHeight: number;
    containerHeight: number;
    template: TemplateRef<any>;
    filterPipe: rxjs.UnaryFunction<Observable<unknown>, Observable<unknown>>;
    strategy: 'fixed' | 'window';
    items$: Observable<unknown>;
    private checkViewportSize$;
    private readonly destroyRef;
    constructor();
    trackByFn: (i: any, item: any) => any;
    ngAfterViewChecked(): void;
    apply(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<VirtualScrollerWrapperComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<VirtualScrollerWrapperComponent, "c8y-virtual-scroller-wrapper", never, { "items": { "alias": "items"; "required": false; }; "itemHeight": { "alias": "itemHeight"; "required": false; }; "containerHeight": { "alias": "containerHeight"; "required": false; }; "template": { "alias": "template"; "required": false; }; "filterPipe": { "alias": "filterPipe"; "required": false; }; "strategy": { "alias": "strategy"; "required": false; }; "trackByFn": { "alias": "trackByFn"; "required": false; }; }, {}, never, never, true, never>;
}

declare class VirtualScrollWindowStrategy implements VirtualScrollStrategy {
    scrolledIndexChange: Observable<number>;
    private destroy$;
    private _viewport;
    private _itemSizePx;
    private _offsetSizePx;
    private _minBufferPx;
    private _maxBufferPx;
    private readonly _scrolledIndexChange;
    private readonly destroy;
    constructor(itemSizePx: number, offsetSizePx: number, minBufferPx: number, maxBufferPx: number);
    /**
     * Attaches this scroll strategy to a viewport.
     * @param viewport The viewport to attach this strategy to.
     */
    attach(viewport: CdkVirtualScrollViewport): void;
    /** Detaches this scroll strategy from the currently attached viewport. */
    detach(): void;
    /**
     * Update the item size and buffer size.
     * @param itemSize The size of the items in the virtually scrolling list.
     * @param offsetSizePx The size of the offset (in pixels)..
     * @param minBufferPx The minimum amount of buffer (in pixels) before needing to render more
     * @param maxBufferPx The amount of buffer (in pixels) to render when rendering more.
     */
    updateItemAndBufferSize(itemSize: number, offsetSizePx: number, minBufferPx: number, maxBufferPx: number): void;
    /** @docs-private Implemented as part of VirtualScrollStrategy. */
    onContentScrolled(): void;
    /** @docs-private Implemented as part of VirtualScrollStrategy. */
    onDataLengthChanged(): void;
    /** @docs-private Implemented as part of VirtualScrollStrategy. */
    onContentRendered(): void;
    /** @docs-private Implemented as part of VirtualScrollStrategy. */
    onRenderedOffsetChanged(): void;
    /**
     * Scroll to the offset for the given index.
     * @param index The index of the element to scroll to.
     * @param behavior The ScrollBehavior to use when scrolling.
     */
    scrollToIndex(index: number, behavior: ScrollBehavior): void;
    /** Update the viewport's total content size. */
    private _updateTotalContentSize;
    /** Update the viewport's rendered range. */
    private _updateRenderedRange;
}

/**
 * Provider factory for `VirtualScrollWindowStrategy` that simply extracts the already created
 * `VirtualScrollWindowStrategy` from the given directive.
 * @param windowDir The instance of `VirtualScrollWindowDirective` to extract the
 *     `VirtualScrollWindowStrategy` from.
 */
declare function _virtualScrollWindowStrategyFactory(windowDir: VirtualScrollWindowDirective): VirtualScrollWindowStrategy;
declare class VirtualScrollWindowDirective implements OnChanges {
    /** The size of the items in the list (in pixels). */
    get itemSizePx(): number;
    set itemSizePx(value: number);
    _itemSizePx: number;
    /**
     * The minimum amount of buffer rendered beyond the viewport (in pixels).
     * If the amount of buffer dips below this number, more items will be rendered. Defaults to 100px.
     */
    get minBufferPx(): number;
    set minBufferPx(value: number);
    _minBufferPx: number;
    /**
     * The number of pixels worth of buffer to render for when rendering new items. Defaults to 200px.
     */
    get maxBufferPx(): number;
    set maxBufferPx(value: number);
    _maxBufferPx: number;
    /** The size of the offset (in pixels). */
    get offsetSizePx(): number;
    set offsetSizePx(value: number);
    _offsetSizePx: number;
    /** The scroll strategy used by this directive. */
    _scrollStrategy: VirtualScrollWindowStrategy;
    ngOnChanges(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<VirtualScrollWindowDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<VirtualScrollWindowDirective, "cdk-virtual-scroll-viewport[windowVirtualScrollStrategy]", never, { "itemSizePx": { "alias": "itemSizePx"; "required": false; }; "minBufferPx": { "alias": "minBufferPx"; "required": false; }; "maxBufferPx": { "alias": "maxBufferPx"; "required": false; }; "offsetSizePx": { "alias": "offsetSizePx"; "required": false; }; }, {}, never, never, true, never>;
}

declare class ShowIfFilterPipe implements PipeTransform {
    transform<T extends {
        [key: string]: {
            showIf?: boolean | (() => boolean | Promise<boolean> | Observable<boolean>);
        };
    }>(value: T): Observable<Partial<T>>;
    static ɵfac: i0.ɵɵFactoryDeclaration<ShowIfFilterPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<ShowIfFilterPipe, "showIfFilter", true>;
}

/**
 * Sets the focus on the give targetId on click.
 */
declare class SkipLinkDirective {
    targetId: string;
    onClick(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<SkipLinkDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<SkipLinkDirective, "[c8ySkipLink]", never, { "targetId": { "alias": "c8ySkipLink"; "required": false; }; }, {}, never, never, true, never>;
}

interface IFetchWithProgress {
    totalBytes: number;
    bufferedBytes: number;
    percentage: number;
    bytesPerSecond: number;
    blob?: Blob;
}
declare enum GENERIC_FILE_TYPE {
    ARCHIVE = "archive",
    AUDIO = "audio",
    CODE = "code",
    EXCEL = "excel",
    IMAGE = "image",
    PDF = "pdf",
    POWERPOINT = "powerpoint",
    TEXT = "text",
    VIDEO = "video",
    WORD = "word",
    EPL = "epl",
    FONT = "font"
}
declare class FilesService {
    private systemOptionsService;
    private inventoryBinaryService;
    readonly DEFAULT_BYTES_LIMIT = 52428800;
    readonly FILENAME_MAX_LENGTH = 128;
    fileTypeExtensionsMap: {
        readonly archive: {
            readonly exts: readonly ["7z", "apk", "cab", "gz", "iso", "jar", "rar", "tar", "zip"];
        };
        readonly audio: {
            readonly exts: readonly ["3gp", "aiff", "aac", "amr", "m4a", "m4p", "mp3", "oga", "ogg", "raw", "wav", "wma"];
        };
        readonly code: {
            readonly exts: readonly ["aspx", "exe", "htm", "html", "jad", "js", "json", "jsp", "php", "xml"];
        };
        readonly excel: {
            readonly exts: readonly ["xls", "xlsx"];
        };
        readonly image: {
            readonly exts: readonly ["bmp", "gif", "jpeg", "jpg", "png", "tiff", "svg", "ico", "apng", "webp"];
        };
        readonly pdf: {
            readonly exts: readonly ["pdf"];
        };
        readonly powerpoint: {
            readonly exts: readonly ["ppt", "pptx"];
        };
        readonly text: {
            readonly exts: readonly ["txt"];
        };
        readonly video: {
            readonly exts: readonly ["asf", "avi", "flv", "mov", "mp4", "ogv", "qt", "rm", "rmvb", "wmv", "3gp"];
        };
        readonly word: {
            readonly exts: readonly ["doc", "docx"];
        };
        readonly epl: {
            readonly exts: readonly ["mon"];
        };
        readonly font: {
            readonly exts: readonly ["ttf", "otf", "woff", "woff2"];
        };
    };
    private fileSizeLimitCfg;
    constructor(systemOptionsService: SystemOptionsService, inventoryBinaryService: InventoryBinaryService);
    /**
     * Checks if files have valid size.
     * @param files Files to check.
     * @returns Returns true if each file has the correct size.
     */
    haveValidSizes(files: FileList, maxFileSizeInBytes?: number): Promise<boolean>;
    /**
     * Checks the system file size limit, if not available returns the default value.
     * Default limit: [DEFAULT_BYTES_LIMIT]{@link DEFAULT_BYTES_LIMIT}
     * @returns Returns promise with the limit value.
     */
    loadBytesSizeLimit(): Promise<number>;
    /**
     * Checks the size of the file
     * @param file File to check.
     * @returns Returns size of the file in bytes.
     */
    size(file: File | IManagedObjectBinary): number;
    /**
     * Checks whether files have allowed extensions.
     * If the accept parameter is not specified, all extensions are accepted.
     * @param files Files to check.
     * @param accept String of comma separated file extensions and generic types ([GENERIC_FILE_TYPE]{@link GENERIC_FILE_TYPE}), e.g. .zip,.7z,excel.
     * @returns  Returns true if each file has allowed extension.
     */
    haveValidExtensions(files: FileList | File | File[], accept: string): boolean;
    /**
     * Checks if file names have allowed extension.
     * If the accept parameter is not specified, all extensions are accepted.
     * @param fileNames The file names to check.
     * @param accept String of comma separated file extensions and generic types ([GENERIC_FILE_TYPE]{@link GENERIC_FILE_TYPE}), e.g. .zip,.7z,excel.
     * @returns  Returns true if each file has allowed extension.
     */
    fileNamesHaveValidExtension(fileNames: string | string[], accept: string): boolean;
    /**
     * Checks if each file has a valid filename length.
     * @param files Files to check.
     * @returns Returns true if each file has a valid filename length.
     */
    checkMaxLength(files: FileList): boolean;
    /**
     * Extracts the file extension.
     * @param fileOrFileName File or name of file from which the extension should be extracted.
     * @returns Returns the file extension or undefined if the file has no extension.
     */
    getFileExtension(fileOrFileName: File | string): string | undefined;
    /**
     * List of file extensions.
     * @returns Returns list of file extensions.
     */
    getFileExtensions(): string[];
    /**
     * The list of generic file types.
     * @returns Returns the list of generic file types.
     */
    getGenericFileTypes(): GENERIC_FILE_TYPE[];
    /**
     * @ignore
     */
    mapGenericFileTypesToExtensions(genericFileTypes?: GENERIC_FILE_TYPE[]): string[];
    /**
     * Extracts a list of file extensions from a string.
     * Can accept generic file types check: [GENERIC_FILE_TYPE]{@link GENERIC_FILE_TYPE}.
     *
     * @param str String from which the file extensions are extracted (comma separated values).
     * Accepted string format:
     * * ".zip,.iso",
     * * "zip,ISO",
     * * "archive".
     * Important: generic types cannot contain a dot. All values with a dot are treated as a normal extension.
     * @returns Returns a list of the file extensions.
     */
    extractFileExtensions(str: string): string[];
    /**
     * Converts a file to a base64 image string.
     *
     * @param file The file to convert to base 64.
     * @returns The image string in base64 format.
     */
    toBase64(file: File): Promise<string>;
    /**
     * Allows to get a File representation of an managed object binary. Can be used
     * to convert this file toBase64 to show it to the end-user.
     * @param binary The binary managed object
     * @returns The file representation.
     */
    getFile(binary: IManagedObjectBinary): Promise<File>;
    /**
     * Allows to calculate the hash sum of the provided file.
     * @param file The file to hash.
     * @returns The SHA-256 hash of the file.
     */
    getHashSumOfFile(file: File | Blob): Promise<string>;
    /**
     * Allows to download a file (opens the browser download prompt).
     * @param binary The binary managed object.
     */
    download(binary: IManagedObjectBinary): Promise<void>;
    /**
     * Loads the file to JavaScript memory.
     * Returns an observable that emits progression status object,
     * and after download is completed, blob property is populated with Blob result object.
     * Unsubscribing from the returned observable aborts the file fetch request.
     *
     * @param binary The binary managed object.
     */
    fetchFileWithProgress$(binary: IManagedObjectBinary): Observable<IFetchWithProgress>;
    uploadFileWithProgress$(file: Stream | Buffer | File | Blob): Observable<IFetchWithProgress>;
    private processResponse$;
    private isGenericType;
    static ɵfac: i0.ɵɵFactoryDeclaration<FilesService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<FilesService>;
}

/**
 * Returns a generic file icon name matching the extension of the given File object.
 * One of the following icon names may be returned: file-archive-o, file-audio-o,
 * document-with-code, file, file-excel-o, file-image-o, pdf-2, file-powerpoint-o,
 * file-text, file-video-o, file-word-o, file, or unknown.
 *
 * ```html
 * <div *ngFor="let file of droppedFiles">
 *	<i class="icon" [c8yIcon]="file | fileIcon"></i>
 * </div>
 * ```
 */
declare class GenericFileIconPipe implements PipeTransform {
    filesService: FilesService;
    constructor(filesService: FilesService);
    transform(file: File): string;
    getGenericType(file: File): GENERIC_FILE_TYPE | 'unknown';
    getIcon(genericType: GENERIC_FILE_TYPE | 'unknown'): string;
    private matchGenericType;
    static ɵfac: i0.ɵɵFactoryDeclaration<GenericFileIconPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<GenericFileIconPipe, "fileIcon", true>;
}

declare class StringifyObjectPipe implements PipeTransform {
    private c8yDatePipe;
    private readonly isoDateTimeRegex;
    constructor(c8yDatePipe: DatePipe);
    transform(value: any): string;
    private isDate;
    static ɵfac: i0.ɵɵFactoryDeclaration<StringifyObjectPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<StringifyObjectPipe, "stringifyObject", true>;
}

/**
 * Sets the application language during the app initialization.
 * @returns An app initializer that sets the language based on user preference or browser settings.
 */
declare function provideLanguageSelectorAppInitializer(): EnvironmentProviders;
/**
 * Loads all configured plugins on application startup.
 * @returns An app initializer that loads all plugin modules and sets the application state accordingly.
 */
declare function providePluginsLoaderServiceAppInitializer(): EnvironmentProviders;
/**
 * Loads the default application options during the app initialization.
 *
 * e.g. loads supportUrl, activateSupportUserAvailable, backend version
 * @returns An app initializer that loads the default application options.
 */
declare function provideDefaultOptionsAppInitializer(): EnvironmentProviders;
/**
 * Provides commonly used pipes. To be injected via dependency injection.
 * @returns An array of commonly used pipes.
 */
declare function provideCommonPipes(): (typeof BytesPipe | typeof DatePipe | typeof GetGroupIconPipe | typeof HumanizeAppNamePipe | typeof MapFunctionPipe | typeof ShouldShowMoPipe)[];
/**
 * Provides commonly used services and app initializers.
 * @returns An array of commonly used services and app initializers.
 */
declare function provideCommonServices(): (Provider | EnvironmentProviders)[];
/**
 * Commonly used directives, data access and translation. This module is the shared
 * module across all core components. It should be imported by default.
 *
 * @exports IconDirective A directive to set a c8y icon with [c8yIcon]="'rocket'".
 * @exports OutletDirective A directive which allows to set DOM or Angular templates (used for upgrade).
 * @exports I18nModule Translation module.
 * @exports NgCommonModule Angular common module.
 * @exports DataModule The data layer to allow DI with @c8y/client.
 * @exports HumanizeAppNamePipe Humanize an application name for display in e.g. the app switcher (e.g. `devicemanagement` becomes `Device Management`).
 * @exports HumanizePipe Humanize a string, e.g. `c8y_water_temperature` becomes `Water Temperature`.
 * @exports ShouldShowMoPipe Checks if passed managed object is device or group type.
 * @exports GetGroupIconPipe Gets proper group icon.
 * @exports ShortenUserNamePipe Allows a short name. E.g. `Foo Bar` gets `F. Bar`.
 * @exports UserNameInitialsPipe Allows the initials from the name. E.g. `Foo Bar` gets `FB`.
 * @exports ForOfDirective A forOf directive like ngFor but with load-more function.
 * @exports LoadMoreComponent A component to load more data from a certain data-source.
 * @exports ProgressBarComponent Displays either defined or undefined progress.
 * @exports DropdownDirectionDirective Determines if a dropdown opens to the bottom or to the top.
 * @exports TextareaAutoresizeDirective resizes a textarea height as the user inputs.
 * @exports OperationResultComponent displays an animated svg for success and error operations.
 */
declare class CommonModule {
    static providers(): (Provider | EnvironmentProviders)[];
    static forRoot(): ModuleWithProviders<CommonModule>;
    constructor();
    static ɵfac: i0.ɵɵFactoryDeclaration<CommonModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<CommonModule, never, [typeof i1.CommonModule, typeof I18nModule, typeof i3.TooltipModule, typeof i4.ScrollingModule, typeof AssetLinkPipe, typeof C8yComponentOutlet, typeof HumanizeAppNamePipe, typeof IconDirective, typeof DatePipe, typeof LoadingComponent, typeof EmptyStateComponent, typeof EmptyStateContextDirective, typeof BytesPipe, typeof UserNameInitialsPipe, typeof ShortenUserNamePipe, typeof HumanizePipe, typeof IfAllowedDirective, typeof NumberPipe, typeof OperationResultComponent, typeof MarkdownToHtmlPipe, typeof MoNamePipe, typeof OutletDirective, typeof ShouldShowMoPipe, typeof GetGroupIconPipe, typeof ForOfDirective, typeof LoadMoreComponent, typeof MapFunctionPipe, typeof ProgressBarComponent, typeof DropdownDirectionDirective, typeof TextareaAutoresizeDirective, typeof TabsetAriaDirective, typeof VirtualScrollerWrapperComponent, typeof VirtualScrollWindowDirective, typeof ShowIfFilterPipe, typeof SkipLinkDirective, typeof GenericFileIconPipe, typeof StringifyObjectPipe], [typeof EmptyStateComponent, typeof EmptyStateContextDirective, typeof IconDirective, typeof OutletDirective, typeof I18nModule, typeof i1.CommonModule, typeof HumanizeAppNamePipe, typeof HumanizePipe, typeof ShouldShowMoPipe, typeof GetGroupIconPipe, typeof IfAllowedDirective, typeof ShortenUserNamePipe, typeof UserNameInitialsPipe, typeof ForOfDirective, typeof LoadMoreComponent, typeof MapFunctionPipe, typeof ProgressBarComponent, typeof DatePipe, typeof NumberPipe, typeof LoadingComponent, typeof DropdownDirectionDirective, typeof TextareaAutoresizeDirective, typeof TabsetAriaDirective, typeof OperationResultComponent, typeof VirtualScrollerWrapperComponent, typeof VirtualScrollWindowDirective, typeof BytesPipe, typeof ShowIfFilterPipe, typeof SkipLinkDirective, typeof MarkdownToHtmlPipe, typeof MoNamePipe, typeof GenericFileIconPipe, typeof StringifyObjectPipe, typeof AssetLinkPipe, typeof C8yComponentOutlet]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<CommonModule>;
}

declare class DeviceService {
    static FRAGMENTS_FOR_NO_DEVICE: readonly ["c8y_Dashboard", "c8y_Report", "c8y_Kpi", "c8y_ExportConfiguration", "c8y_IsBinary", "c8y_NoDevice", "c8y_IsDeviceGroup", "c8y_IsDynamicGroup", "c8y_Group", "com_cumulocity_model_smartrest_SmartRestTemplate", "com_cumulocity_model_devicesimulator_SensorTemplate", "_attachments", "c8y_IsDeviceType", "c8y_objectmapping_ObjectMapping", "c8y_IsAssetType"];
    static TYPES_FOR_NO_DEVICE: readonly ["c8y_ConfigurationDump", "c8y_Firmware", "c8y_SmartRule", "c8y_Software", "impact_object_mapping", "c8y_UserPreference", "c8y_TenantPolicy", "c8y_PrivateSmartRule", "c8y_SmartRest2Template", "c8y_JsonSchema", "c8y_DeviceShellTemplate", "c8y_DemoStatus", "c8y_DataBroker", "c8y_Application_", "brandingVariables", "c8y_DeviceSimulator", "c8y_CertificateMetadata", "lwm2m_post_registration", "c8y_microservice_manifest_"];
    static DEVICE_FRAGMENT_TYPE: "c8y_IsDevice";
    static isAnyDevice(mo: IManagedObject): boolean;
    static hasFragmentOrTypeFromBlacklist(mo: IManagedObject): boolean;
    static hasTypeFromBlacklist(mo: IManagedObject): boolean;
    static hasFragmentFromBlacklist(mo: IManagedObject): boolean;
    static isRootDevice(mo: IManagedObject): boolean;
    static ɵfac: i0.ɵɵFactoryDeclaration<DeviceService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<DeviceService>;
}

/**
 * Service for retrieving ancestor paths in the Cumulocity asset hierarchy.
 *
 * This service traverses upward through parent relationships (assetParents, deviceParents,
 * additionParents) to find all possible paths from root ancestors down to a target asset.
 *
 * @example
 * Given this hierarchy:
 * ```
 * Root1 -> Building1 -> Floor1 -> Device
 * Root2 -> Building2 -> Floor1 -> Device
 * ```
 *
 * Calling `getAncestorPaths('Device')` returns:
 * ```
 * [
 *   [Root1, Building1, Floor1, Device],
 *   [Root2, Building2, Floor1, Device]
 * ]
 * ```
 */
declare class AssetHierarchyService {
    private inventory;
    private alertService;
    /**
     * Retrieves all ancestor paths from root nodes down to the specified asset.
     *
     * This method fetches the target asset and all its ancestors, then constructs
     * all possible paths from root ancestors (objects with no parents) down to the
     * target asset. Multiple paths may exist if the asset has multiple parent chains.
     *
     * @param assetId - The ID of the target asset
     * @returns A promise that resolves to an array of paths, where each path is an
     *          array of managed objects ordered from root to target asset.
     *          Returns an empty array if the asset is not found or an error occurs.
     */
    getAncestorPaths(assetId: string): Promise<IManagedObject[][]>;
    /**
     * Gets all parent IDs of a managed object.
     */
    private getParentIds;
    /**
     * Gets all child IDs of a managed object.
     */
    private getChildrenIds;
    /**
     * Recursively finds all paths from a root node to the target asset.
     * Returns an array of paths, where each path is an array of managed objects.
     */
    private findAllPathsToAsset;
    static ɵfac: i0.ɵɵFactoryDeclaration<AssetHierarchyService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<AssetHierarchyService>;
}

/**
 * Directive to manage focus trapping and keyboard navigation for ngx-bootstrap dropdowns with `container="body"`.
 *
 * ## Problem
 * When a dropdown is appended to the body using `container="body"`, the standard `cdkTrapFocus`
 * directive doesn't work because the dropdown content is outside the normal DOM hierarchy where
 * the directive is applied.
 *
 * ## Solution
 * This directive:
 * - Detects when a dropdown with `container="body"` opens
 * - Programmatically creates a CDK focus trap on the body-appended dropdown menu element
 * - Traps Tab/Shift+Tab navigation within the dropdown menu
 * - Automatically closes dropdown and restores focus to toggle button when user selects an item with Enter/Space
 * - Prevents ESC key from propagating to parent elements (e.g., modals, drawers) and restores focus on close
 * - Cleans up all listeners when the dropdown closes
 *
 * ## Usage
 * Simply apply this directive to the same element that has the `dropdown` directive:
 *
 * @example
 * ```html
 * <div dropdown container="body" c8yDropdownFocusTrap #myDropdown="bs-dropdown">
 *   <button dropdownToggle>Select option</button>
 *   <div *dropdownMenu class="dropdown-menu">
 *     <c8y-list-group role="list">
 *       <c8y-li tabindex="0" role="listitem">Option 1</c8y-li>
 *       <c8y-li tabindex="0" role="listitem">Option 2</c8y-li>
 *     </c8y-list-group>
 *   </div>
 * </div>
 * ```
 *
 * ## Features
 * - **Focus trapping**: Tab key navigation cycles through dropdown items
 * - **Automatic focus management**: Enter/Space automatically closes dropdown and returns focus to toggle button
 * - **ESC key isolation**: Pressing ESC closes only the dropdown, not parent modals/drawers, and restores focus
 * - **Form-friendly**: Skips automatic close for inputs, textareas, and selects within the dropdown
 * - **Automatic cleanup**: All listeners and focus trap removed when dropdown closes
 * - **Zero configuration**: Just add the directive, no manual focus management needed
 *
 * @see {@link https://material.angular.io/cdk/a11y/overview#focustrap|CDK FocusTrap}
 */
declare class DropdownFocusTrapDirective implements OnDestroy {
    private readonly dropdown;
    private readonly focusTrapFactory;
    private readonly document;
    private readonly elementRef;
    private dropdownMenuElement?;
    private focusTrap?;
    private toggleButton?;
    private shouldRestoreFocus;
    constructor();
    ngOnDestroy(): void;
    /**
     * Sets up the focus trap when the dropdown opens.
     * @private
     */
    private setupFocusTrap;
    private onDropdownHidden;
    private handleSelection;
    private handleEscape;
    /**
     * Cleans up the focus trap when the dropdown closes.
     * @private
     */
    private cleanupFocusTrap;
    static ɵfac: i0.ɵɵFactoryDeclaration<DropdownFocusTrapDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<DropdownFocusTrapDirective, "[c8yDropdownFocusTrap]", never, {}, {}, never, never, true, never>;
}

/**
 * Represents a single section in the icon panel
 */
interface IconPanelSection {
    /** Unique identifier for the section */
    id: string;
    /** Label text for the section */
    label: string;
    /** Icon name (e.g., 'c8y-device', 'c8y-connection') */
    icon: string;
    /** Whether the section should be displayed */
    visible: boolean;
    /** HTML content to display in the section */
    content: string;
    /** Custom CSS classes for the section container */
    containerClass?: string;
    /** Data-cy attribute for testing */
    dataCy?: string;
    /** Responsive grid classes (e.g., 'col-xs-12 col-md-6') */
    colClass?: string;
    /** Additional CSS classes for the icon */
    iconClass?: string;
}
/**
 * Icon Panel Component
 *
 * Displays information in a grid of bordered panels, each with an icon, label, and content.
 * Useful for showing structured metadata, device information, connection status, etc.
 *
 * @example
 * ```typescript
 * sections: IconPanelSection[] = [
 *   {
 *     id: 'device-info',
 *     label: 'Device Information',
 *     icon: 'c8y-device',
 *     visible: true,
 *     content: '<p>Device ID: THM-001</p><p>Type: Sensor</p>',
 *     colClass: 'col-xs-12 col-md-6'
 *   },
 *   {
 *     id: 'status',
 *     label: 'Status',
 *     icon: 'c8y-connection',
 *     visible: true,
 *     content: 'Connected',
 *     colClass: 'col-xs-12 col-md-6'
 *   }
 * ];
 * ```
 *
 * ```html
 * <c8y-icon-panel [sections]="sections"></c8y-icon-panel>
 * ```
 *
 * You can also project additional content:
 * ```html
 * <c8y-icon-panel [sections]="sections">
 *   <div class="col-xs-12">
 *     <p>Additional custom content here</p>
 *   </div>
 * </c8y-icon-panel>
 * ```
 */
declare class IconPanelComponent {
    /**
     * Array of sections to display in the panel
     */
    sections: IconPanelSection[];
    /**
     * Accessible label for the icon panel region.
     */
    ariaLabel: string;
    static ɵfac: i0.ɵɵFactoryDeclaration<IconPanelComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<IconPanelComponent, "c8y-icon-panel", never, { "sections": { "alias": "sections"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, {}, never, ["*"], true, never>;
}

/**
 * Realtime options for `ForOfDirective`.
 */
interface ForOfRealtimeOptions {
    /** An entity object or id to be used with a [[RealtimeService]] instance. */
    entityOrId?: IdReference;
    /** Whether to insert an item which passes `pipe` but is not in the list yet (e.g. it didn't pass `pipe` on creation, but now it does). */
    insertOnUpdate?: boolean;
    /** Whether to remove an item which doesn't pass `pipe` but is in the list already (e.g. it passed `pipe` on creation, but now it doesn't). */
    removeOnUpdate?: boolean;
}
type ForOfFilterPipe<T extends IIdentified = IIdentified> = UnaryFunction<Observable<T[]>, Observable<T[]>>;

declare class GeoService {
    private readonly C8Y_POSITION_FRAGMENT;
    getLatLong(mo: IEvent | IManagedObject): [number, number];
    static ɵfac: i0.ɵɵFactoryDeclaration<GeoService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<GeoService>;
}

type ManagedObjectTypeForConfig = 'c8y_Software' | 'c8y_Firmware' | 'c8y_ConfigurationDump' | 'c8y_ModbusDeviceType' | 'c8y_CANopenDeviceType' | 'c8y_LoraDeviceType' | 'c8y_SigfoxDeviceType' | 'c8y_DeviceShellTemplate' | 'c8y_Profile';
declare class GlobalConfigService {
    private inventory;
    protected cache: Promise<IResultList<IManagedObject | undefined>>;
    private fragmentTypeMapping;
    constructor(inventory: InventoryService);
    /**
     * Retrieves the global configuration for a specific fragment type.
     * @param fragmentType - The fragment type on which the managed object type corresponds.
     * @returns A promise that resolves in the first global configuration managed object.
     */
    getGlobalConfig(fragmentType: string): Promise<IManagedObject | undefined>;
    /**
     * Retrieves whether an object should include the c8y_Global fragment in its declaration.
     * If the fragment is set to false it should return false;
     * If the fragment is set to true  it should return true;
     * If no fragment is available  it should return true;
     * @param objectType - The type of managed object.
     * @returns A promise that resolves into a boolean value indicating whether the global parameter should be set.
     */
    getGlobalParam(objectType: ManagedObjectTypeForConfig): Promise<boolean>;
    static ɵfac: i0.ɵɵFactoryDeclaration<GlobalConfigService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<GlobalConfigService>;
}

declare enum GroupFragment {
    groupType = "c8y_DeviceGroup",
    subGroupType = "c8y_DeviceSubgroup",
    groupFragmentType = "c8y_IsDeviceGroup",
    dataBrokerSourceFragment = "c8y_BrokerSource",
    dynamicGroupType = "c8y_DynamicGroup",
    dynamicGroupFragment = "c8y_IsDynamicGroup",
    dynamicGroupColumnConfig = "c8y_UIDeviceFilterConfig",
    dynamicGroupQueryString = "c8y_DeviceQueryString"
}

declare const internalApps: {
    readonly administration: "Administration";
    readonly cockpit: "Cockpit";
    readonly devicemanagement: "Device Management";
    readonly 'digital-twin-manager': "Digital Twin Manager";
    readonly streaminganalytics: "Streaming Analytics";
    readonly 'ai-agents': "AI Agents";
    readonly 'ai-plugins': "AI Plugins";
};

/**
 * The mode for components using infinite scroll:
 *  - auto: Tries to automatically load more data;
 *  - show: Shows a load more button for the user to decide;
 *  - none: Doesn't perform any load more action;
 *  - hidden: Loads more data automatically but with no visible button for the user.
 */
type LoadMoreMode = 'auto' | 'show' | 'none' | 'hidden';

declare enum ManagedObjectType {
    DEVICE = "device",
    GROUP = "group"
}

/**
 * Decorator to memoize function results.
 * @param resolver Cache key resolver function, used by memoize from lodash.
 */
declare function memoize(resolver?: any): (target: any, fnName: any, descriptor: any) => void;

declare const NULL_VALUE_PLACEHOLDER = "--";
declare class RelativeTimePipe implements PipeTransform {
    private translateService;
    constructor(translateService: TranslateService$1);
    /**
     * Transforms the given input into a formatted time difference string.
     *
     * This method calculates the time difference between the current date and the input.
     * If the input is a `Date` object, the difference in milliseconds is calculated from the current date.
     * If the input is a number, it is treated as the difference in milliseconds.
     *
     * The method returns a string representing the time difference, optionally prefixed with
     * "in " for future dates or suffixed with " ago" for past dates, based on the `noPrefixOrSuffix` flag.
     *
     * @param input - The date or the time difference in milliseconds to be transformed.
     *                A positive number indicates a future time relative to now, and a negative number indicates a past time.
     * @param noPrefixOrSuffix - If `true`, the output will not include "in" or "ago" prefixes/suffixes.
     *                         If `false`, the output will include these based on whether the time is in the future or past.
     * @returns The formatted and translated time difference string.
     */
    transform(input: Date | number, noPrefixOrSuffix?: boolean): string;
    /**
     * Calculates a human-readable representation of a time difference.
     *
     * Time ranges are same as moment.js timeFromNow function counterpart:
     * https://momentjscom.readthedocs.io/en/latest/moment/04-displaying/02-fromnow/
     *
     * @param differenceMs - The time difference in milliseconds.
     *                       A positive number indicates a future time relative to now, and a negative number indicates a past time.
     * @param noPrefixOrSuffix - If `true`, the output will not include "in" or "ago" prefixes/suffixes.
     *                         If `false`, the output will include these based on whether the time is in the future or past.
     * @returns A string representing the time difference in a human-readable format.
     *                    The format depends on the duration of the difference:
     *                    - Less than 45 seconds: returns 'a few seconds'
     *                    - 45 to 89 seconds: returns 'a minute'
     *                    - 90 seconds to 44 minutes: returns the number of minutes
     *                    - 45 to 89 minutes: returns 'an hour'
     *                    - 90 minutes to 21 hours: returns the number of hours
     *                    - 22 to 35 hours: returns 'a day'
     *                    - 36 hours to 25 days: returns the number of days
     *                    - 26 to 45 days: returns 'a month'
     *                    - 45 to 319 days: returns the number of months
     *                    - 320 days to 1.5 years: returns 'a year'
     *                    - More than 1.5 years: returns the number of years
     */
    getHumanReadableTimeDiffString(differenceMs: number, noPrefixOrSuffix: boolean): string;
    private withinFewSeconds;
    private withinMinute;
    private withinMinutes;
    private withinHour;
    private withinHours;
    private withinDay;
    private withinDays;
    private withinMonth;
    private withinMonths;
    private withinYear;
    private withinYears;
    static ɵfac: i0.ɵɵFactoryDeclaration<RelativeTimePipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<RelativeTimePipe, "relativeTime", true>;
}

declare function retryWithDelay<T>(delayTime: number, count?: number): MonoTypeOperatorFunction<T>;

/**
 * Global namespace declaration to enhance type safety for extension keys and associated service types.
 * Extend the `ExtensionKeys` interface within this namespace to declare new extension keys and their service types.
 *
 * @example
 * ```typescript
 * // Extending the CumulocityServiceRegistry with a new service
 * declare global {
 *   namespace CumulocityServiceRegistry {
 *     interface ExtensionKeys {
 *       layersServiceKey: TestService;
 *     }
 *
 *     interface TestService {
 *       getLayers(): Promise<string[]>;
 *     }
 *   }
 * }
 * ```
 */
declare global {
    /**
     * Global namespace declaration to enhance type safety for extension keys and associated service types of the `ServiceRegistry`.
     */
    namespace CumulocityServiceRegistry {
        /**
         * Holds the association between extension keys and their corresponding service types.
         * Extend this interface to declare new extension keys and their service types.
         */
        interface ExtensionKeys extends SpecificExtensionKeys {
            [key: string]: unknown;
        }
        interface SpecificExtensionKeys {
            additionalDeviceStatusButtons: AdditionalDeviceStatusButtonProvider;
        }
        /**
         * Defines a provider for additional device status buttons.
         * TODO to be removed when DeviceStatusWidget is migrated to Angular
         */
        interface AdditionalDeviceStatusButtonProvider {
            /**
             * Determines whether the button should be shown for a given device.
             * @param device The device for which to determine button visibility.
             * @returns A boolean value indicating whether the button should be displayed.
             */
            canShowButton(device: IManagedObject): boolean;
            /**
             * Provides the properties necessary to render the button.
             * @returns An object containing the button's title, icon, label, click action and optionally a class.
             */
            getButtonInfo(): {
                title: string;
                icon: SupportedIconsSuggestions;
                label: string;
                class?: string;
                action: (device: IManagedObject) => void | Promise<void>;
            };
        }
    }
}
//# sourceMappingURL=service-registry.model.d.ts.map

/**
 * Registers a service using a specified extension key.
 * This function facilitates dynamic service registration, enabling services
 * to be retrieved and used throughout the application based on their extension key.
 *
 * @param extensionKey The unique identifier for the service, defined within the ExtensionKeys interface.
 * @param service The class type of the service to register.
 * @returns A provider configuration for Angular's dependency injection, allowing the service to be injected where needed.
 *
 *  * @example
 * ```typescript
 * hookService('layersServiceKey', TestService);
 * ```
 */
declare function hookService<T extends string = keyof CumulocityServiceRegistry.SpecificExtensionKeys>(extensionKey: T, service: Type<CumulocityServiceRegistry.ExtensionKeys[T]>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
/**
 * Service for managing and retrieving dynamically registered services within the application.
 * It leverages a map of InjectionTokens to associate services with unique extension keys.
 */
declare class ServiceRegistry {
    protected injectors: Injector[];
    constructor(rootInjector: Injector, pluginService: PluginsResolveService);
    /**
     * Retrieves instances of services registered under a specified extension key.
     *
     * @param key - The extension key associated with the desired service.
     * @returns An array of service instances registered under the given key.
     *
     * @example
     * ```typescript
     * // Retrieving instances of Service example
     * const layersServices = serviceRegistry.get('layersServiceKey');
     * layersServices.forEach(service => service.get().then(layer => console.log(layer)));
     * ```
     */
    get<T extends string = keyof CumulocityServiceRegistry.SpecificExtensionKeys, R = CumulocityServiceRegistry.ExtensionKeys[T]>(key: T): R[];
    /**
     * Allows to retrieve all registered extension keys.
     *
     * @returns An array of extension keys that have been registered.
     */
    getRegisteredExtensionKeys(): Array<keyof CumulocityServiceRegistry.ExtensionKeys>;
    static ɵfac: i0.ɵɵFactoryDeclaration<ServiceRegistry, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<ServiceRegistry>;
}

/**
 * Pipe that strips HTML tags from a string.
 *
 * Useful for creating plain text versions of HTML content,
 * such as for aria-labels or other accessibility attributes.
 *
 * @example
 * ```html
 * <div [attr.aria-label]="htmlContent | stripHtml">
 *   <div [innerHTML]="htmlContent"></div>
 * </div>
 * ```
 *
 * @example
 * ```typescript
 * const html = '<p>Hello <strong>world</strong></p>';
 * // Result: 'Hello world'
 * ```
 */
declare class StripHtmlPipe implements PipeTransform {
    /**
     * Strips HTML tags from the input string.
     *
     * @param value - The HTML string to process
     * @returns Plain text with HTML tags removed
     */
    transform(value: string): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<StripHtmlPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<StripHtmlPipe, "stripHtml", true>;
}

declare enum Status {
    SUCCESS = "success",
    WARNING = "warning",
    DANGER = "danger",
    INFO = "info"
}
type StatusType = Status | 'success' | 'warning' | 'danger' | 'info';
declare const statusIcons: {
    success: string;
    warning: string;
    danger: string;
    info: string;
};
declare const statusClasses: {
    success: string;
    warning: string;
    danger: string;
    info: string;
};
declare const statusAlert: {
    success: string;
    warning: string;
    danger: string;
    info: string;
};
declare const operationStatusIcons: {
    [OperationStatus.PENDING]: string;
    [OperationStatus.EXECUTING]: string;
    [OperationStatus.SUCCESSFUL]: string;
    [OperationStatus.FAILED]: string;
};
declare const operationStatusClasses: {
    [OperationStatus.PENDING]: string;
    [OperationStatus.EXECUTING]: string;
    [OperationStatus.SUCCESSFUL]: string;
    [OperationStatus.FAILED]: string;
};

type PasswordStrengthSettings = Required<Pick<ITenantLoginOption, 'enforceStrength' | 'greenMinLength' | 'strengthValidity'>>;
/** The helper UI service for tenant related methods built upon client services. */
declare class TenantUiService {
    private userService;
    private appStateService;
    private tenantLoginOption;
    private options;
    readonly MANAGEMENT = "management";
    readonly ROLE_TENANT_MANAGEMENT_READ: string;
    constructor(userService: UserService, appStateService: AppStateService, tenantLoginOption: TenantLoginOptionsService, options: OptionsService);
    /**
     * Returns current tenant
     */
    get currentTenant(): ICurrentTenant;
    /**
     * Checks whether current tenant is the management tenant.
     * @returns True if current tenant is the management tenant.
     */
    isManagementTenant(): Promise<boolean>;
    /**
     * Checks whether current tenant is an enterprise tenant.
     * An enterprise tenant is a tenant which has subscribed:
     * - `branding` microservice or `feature-branding` feature app,
     * - `sslmanagement` microservice,
     * - `feature-user-hierarchy` feature app,
     * - `feature-broker` feature app.
     *
     * See https://cumulocity.com/guides/users-guide/enterprise-edition/ for details about such tenants.
     *
     * @returns True, if current tenant is an enterprise tenant.
     */
    isEnterpriseTenant(): Promise<boolean>;
    /**
     * Checks whether the current user has read access to tenants, i.e.:
     * - the current tenant can create subtenants or it's the management tenant,
     * - the current user has ROLE_TENANT_MANAGEMENT_READ role.
     * @returns True, if the current user has read access to tenants.
     */
    canReadTenants(): boolean;
    /**
     * Returns current tenant preferred login mode.
     */
    getCurrentTenantPreferredLoginOption(): ITenantLoginOption;
    /**
     * Returns current user login mode.
     */
    getCurrentUserLoginMode(): TenantLoginOptionType;
    /**
     * Returns tenant login option which is preferred.
     *
     * @param loginOptions The list of all available tenant's login options.
     *
     * @returns Returns ITenantLoginOption.
     *
     * **Example**
     * ```typescript
     *
     *    (() => {
     *      const preferredLoginOption = tenantLoginOptionsService.getPreferredLoginOption(loginOptions);
     *   })();
     * ```
     */
    getPreferredLoginOption(loginOptions: ITenantLoginOption[]): ITenantLoginOption;
    /**
     * Returns Oauth2 login option if it can be used by UI.
     *
     * @param loginOptions The list of all available tenant's login options.
     *
     * @returns Returns ITenantLoginOption.
     *
     * **Example**
     * ```typescript
     *
     *    (() => {
     *      const oauth2 = tenantLoginOptionsService.getOauth2Option(loginOptions);
     *   })();
     * ```
     */
    getOauth2Option(loginOptions: ITenantLoginOption[]): ITenantLoginOption;
    /**
     * Callback which checks if login option is visible on login page.
     *
     * @param loginOption The tenant login option.
     *
     * **Example**
     * ```typescript
     *
     *    (() => {
     *      const loginOptionsVisibleOnLoginPage = loginOptions.filter(tenantLoginOptionsService.isVisibleOnLoginPage);
     *   })();
     * ```
     */
    isVisibleOnLoginPage(loginOption: ITenantLoginOption): boolean;
    /**
     * Callback which checks if login option type is 'OAUTH2_INTERNAL'.
     *
     * @param loginOption The tenant login option.
     *
     * **Example**
     * ```typescript
     *
     *    (() => {
     *      const oauth2InternalLoginOptions = loginOptions.filter(tenantLoginOptionsService.isOauthInternal);
     *   })();
     * ```
     */
    isOauthInternal(loginOption: ITenantLoginOption): boolean;
    /**
     * Callback which checks if login option type is 'BASIC'.
     *
     * @param loginOption The tenant login option.
     *
     * **Example**
     * ```typescript
     *
     *    (() => {
     *      const basicLoginOptions = loginOptions.filter(tenantLoginOptionsService.isBasic);
     *   })();
     * ```
     */
    isBasic(loginOption: ITenantLoginOption): boolean;
    /**
     * Callback which checks if login option type is 'OAUTH2' and grantType is 'AUTHORIZATION_CODE'.
     *
     * @param loginOption The tenant login option.
     *
     * **Example**
     * ```typescript
     *
     *    (() => {
     *      const oauth2LoginOptions = loginOptions.filter(tenantLoginOptionsService.OAUTH2);
     *   })();
     * ```
     */
    isOauth2(loginOption: ITenantLoginOption): boolean;
    /**
     * Checks if application of type MICROSERVICE is subscribed to the current tenant.
     * It checks the application references of the currentTenant from the application state.
     * No additional request.
     * @param identifier application name or contextPath
     */
    isMicroserviceSubscribedInCurrentTenant(identifier: string): boolean;
    /**
     * Gets all application of type MICROSERVICE subscribed to the current tenant.
     * It checks the application references of the currentTenant from the application state.
     * No additional request.
     */
    getSubscribedMicroservicesInCurrentTenant(): IApplication[];
    /**
     * Gets password constraints setting from loginOptions.
     * @returns Returns Promise<PasswordStrengthSettings> with password properties.
     */
    getPasswordStrengthSettings(): Promise<PasswordStrengthSettings>;
    private hasApp;
    private isManagement;
    static ɵfac: i0.ɵɵFactoryDeclaration<TenantUiService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<TenantUiService>;
}

/**
 * Decorator to throttle functions call.
 * @param wait throttle time.
 * @param options set triggers, eg on trailing edge or falling edge,
 * see lodash documentation for details
 */
declare function throttle(wait?: any, options?: any): (target: any, fnName: any, descriptor: any) => void;

interface UserPreference {
    key: string;
    value: any;
}

declare class UserPreferencesStorageLocal {
    private LOCAL_STORAGE_KEY;
    private store;
    constructor();
    get(key: any): Promise<any>;
    set(key: any, value: any): void;
    private saveJsonStore;
}

declare class UserPreferencesStorageInventory {
    private inventory;
    TYPE: string;
    constructor(inventory: InventoryService);
    get(key: any): Promise<any>;
    set(key: any, value: any): Promise<any>;
}

/**
 * An alert is a message show to the user.
 */
interface Alert {
    /**
     * The text to display.
     */
    text: string | TemplateRef<any>;
    /**
     * The type of the alert.
     */
    type: 'success' | 'warning' | 'danger' | 'info' | 'system';
    /**
     * Detailed information to display.
     */
    detailedData?: any;
    /**
     * Timeout to auto close
     */
    timeout?: number;
    /**
     * Allows to display alert's text as HTML.
     */
    allowHtml?: boolean;
    /**
     * Function to call if user clicks on the detail button.
     */
    onDetail?: () => void;
    /**
     * Function to call if user clicks on the close button.
     */
    onClose?: () => void;
}

type AlertType = 'success' | 'warning' | 'danger' | 'info' | 'system';
/**
 * A service which allows to display alerts.
 */
declare class AlertService extends StateService {
    /**
     * Returns all alerts.
     * @readonly
     */
    get state(): Alert[];
    /**
     * @ignore
     */
    state$: BehaviorSubject<Alert[]>;
    private MAX_ALERTS;
    private ALERT_TIMEOUT;
    /**
     * Adds a new alert to the current state.
     * @param alert The alert object to be added.
     */
    add(alert: Alert): void;
    /**
     * Adds a alert by text.
     * @param type The type of the alert.
     * @param txt The text to be displayed in the alert.
     * @param detailedData Optional detailed data for the alert.
     */
    addByText(type: AlertType, txt: string, detailedData?: string): void;
    /**
     * Returns all alerts.
     * @deprecated Use alertService.alerts instead.
     */
    list(): Alert[];
    /**
     * Remove an alert from the current state.
     * @param alert The alert object to be removed.
     */
    remove(alert: Alert): void;
    /**
     * Updates matching alert with provided values.
     * @param alert The alert to be updated.
     * @param fieldsToUpdate An object with the fields to update in the alert.
     */
    update(alert: Alert, fieldsToUpdate: Partial<Alert>): void;
    /**
     * Removes last danger alert.
     * It can be used e.g. in the case of a failed request which triggered an alert, to hide it from user.
     *
     * ```js
     *  try {
     *    // something that might throw a danger server msg
     *  } catch (ex) {
     *   this.alertService.removeLastDanger();
     *  }
     * ```
     */
    removeLastDanger(): void;
    /**
     * Shorthand for a save successful alert.
     * @param savedObject The name of the object which was saved.
     * @return A function that can be executed to show the msg.
     */
    saveSuccess(savedObject: string): () => void;
    /**
     * Shorthand for a create successful alert.
     * @param createdObject The name of the object which was created.
     * @return A function that can be executed to show the msg.
     */
    createSuccess(createdObject: string): () => void;
    /**
     * Clears all alerts.
     */
    clearAll(): void;
    /**
     * A shorthand to display a simple success message.
     * @param text The success text.
     * @param detailedData The text with additional information.
     */
    success(text: string, detailedData?: string): void;
    /**
     * A shorthand to display a simple danger message.
     * @param text The danger text.
     * @param detailedData The text with additional information.
     */
    danger(text: string, detailedData?: string): void;
    /**
     * A shorthand to display a simple info message.
     * @param text The info text.
     * @param detailedData The text with additional information.
     */
    info(text: string, detailedData?: string): void;
    /**
     * A shorthand to display a simple warning message.
     * @param text The warning text.
     * @param detailedData The text with additional information.
     */
    warning(text: string, detailedData?: string): void;
    /**
     * A shorthand to display a simple system message.
     * @param text The system message text.
     * @param detailedData The text with additional information.
     */
    system(text: string, detailedData?: string): void;
    /**
     * Creates alert from standard api errors.
     * Should be used for errors generated by @c8y/client services.
     * @param error The error from server.
     * @param type The type of alert.
     */
    addServerFailure(error: any, type?: AlertType): void;
    /**
     * Compares two alert objects. Alerts are same if text, type, detailed data and callbacks are same.
     * Callbacks are same if they refer to the same function.
     * @param alert1 First alert to compare.
     * @param alert2 Second alert to compare.
     */
    areSame(alert1: Alert, alert2: Alert): boolean;
    private changeAlerts;
    private addAlert;
    private hideAutomaticallyIfNeeded;
    private removeOldestIfMax;
    static ɵfac: i0.ɵɵFactoryDeclaration<AlertService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<AlertService>;
}

declare class UserPreferencesService {
    private user;
    private inventory;
    private appState;
    private alert;
    currentUser: Observable<IUser | ICurrentUser>;
    preferenceChanges$: Subject<UserPreference>;
    private storage;
    constructor(user: UserService, inventory: InventoryService, appState: AppStateService, alert: AlertService);
    /**
     * Returns an observable of a user preference with given key.
     * Emits its initial value first and then updated values when set by user.
     * @param key The storage key for searched value.
     * @returns An Observable of a user preference.
     */
    observe<T>(key: string): Observable<T>;
    /**
     * Get an Observable value for searched key for current user.
     * @param key The storage key for searched value.
     * @returns An Observable with the value of preference.
     */
    get(key: string): Observable<any>;
    /**
     * Sets a value in storage for current user.
     * @param key The storage key for the value to be set.
     * @param value The storage value to be set.
     * @returns A promise with saved value.
     */
    set(key: string, value: any): Promise<any>;
    /**
     * Get an Observable value of searched key for a specific user.
     * @param key The storage key for searched value.
     * @param user The user for whom the search is done.
     * @returns An Observable with the value of preference.
     *
     * @deprecated Uses deprecated inventory approach. Use get instead.
     */
    getForUser(key: string, user: IUser | ICurrentUser): Observable<any>;
    /**
     * Sets a value in storage for a specific user.
     * @param key The storage key for the value to be set.
     * @param value The storage value to be set.
     * @returns A promise with saved value.
     *
     * @deprecated Uses deprecated inventory approach. Use set instead.
     */
    setForUser(key: string, value: any, user: IUser | ICurrentUser): Promise<any>;
    /**
     * Get value of searched key for current user.
     * If preference is not found in user's customProperties, it will try to get it from inventory or local storage and
     * update user's customProperties with the value and return that value.
     * @param key The preference key for searched value.
     * @param user The user for whom the search is done.
     * @returns A Promise with the value of preference.
     */
    private getForCurrentUser;
    /**
     * Sets a value for current user.
     * @param key The preference key for the value to be set.
     * @param value The preference value to be set.
     */
    private setForCurrentUser;
    /**
     * Get a string of key concatenated with username.
     * Used by deprecated invetory storage approach and for leftovers in local storage.
     * It was used to store preferences for specific users and it as replacing "." with "__"
     * because of MongoDB restrictions.
     * @param key The storage key for searched value.
     * @param user The user for whom the search is done.
     * @returns A string of key concatenated with username.
     */
    private getTransformedRawKey;
    /**
     * Get a string of key concatenated with username.
     * Used by local storage.
     * @param key The storage key for searched value.
     * @param user The user for whom the search is done.
     * @returns A string of key concatenated with username.
     */
    private getRawKey;
    /**
     * Get a key for user preferences. Used current user customProperties.
     * @param key The storage key for searched value.
     * @returns A key for user preferences.
     */
    private getCustomPropertiesKey;
    /**
     * Gets a proper storage depending on the user roles.
     * @param user The user for whom the role check is done.
     * @returns A proper storage.
     */
    private getStorage;
    private getCurrentUserStorage;
    static ɵfac: i0.ɵɵFactoryDeclaration<UserPreferencesService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<UserPreferencesService>;
}

/**
 * Directive to listen for scroll events on a virtual scroll container.
 * Emits `scrolled` and `scrolledToTop` events.
 *
 * The directive listens for scroll events on a virtual scroll container.
 * - When the container is scrolled by at least 50 pixels (or a custom threshold), the `scrolled` event is emitted.
 * - When the container is scrolled to the top, the `scrolledToTop` event is emitted.
 *
 */
declare class VirtualScrollListenerDirective implements AfterViewInit {
    private el;
    private scrollDispatcher;
    private destroyRef;
    /**
     * Pixel threshold for emitting the scrolled event.
     */
    scrollThreshold: number;
    /**
     * Event emitted when the virtual scroll container is scrolled by at least 50 pixels.
     */
    scrolled: EventEmitter<void>;
    /**
     * Event emitted when the virtual scroll container is scrolled to the top.
     */
    scrolledToTop: EventEmitter<void>;
    private lastScrollTop;
    ngAfterViewInit(): void;
    private onScroll;
    static ɵfac: i0.ɵɵFactoryDeclaration<VirtualScrollListenerDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<VirtualScrollListenerDirective, "[c8yVirtualScrollListener]", never, { "scrollThreshold": { "alias": "scrollThreshold"; "required": false; }; }, { "scrolled": "scrolled"; "scrolledToTop": "scrolledToTop"; }, never, never, true, never>;
}

declare class ZipService {
    getEntries(zipFile: File): Observable<ZipEntry[]>;
    getData(entry: ZipEntry): Observable<Blob>;
    getJsonData(zipFile: File, fileEntryFilter: {
        filename: string;
    }): Observable<string>;
    createZip(files: {
        fileName: string;
        blob: Blob;
    }[]): Promise<Blob>;
    static ɵfac: i0.ɵɵFactoryDeclaration<ZipService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<ZipService>;
}
type ZipEntry = Entry;

declare const SupportedApps: {
    readonly devicemanagement: "devicemanagement-application-key";
    readonly cockpit: "cockpit-application-key";
    readonly administration: "administration-application-key";
    readonly smartrules: "smartrule-key";
};
type SupportedAppKey = (typeof SupportedApps)[keyof typeof SupportedApps];
/**
 * Service that provides methods to interact with other applications.
 * It allows retrieving a specific app by key, checking its availability, verifying if it is not the current application,
 * determining if a link to another app should be shown, and navigating to it.
 */
declare class InterAppService<T extends string = SupportedAppKey> {
    private stateService;
    private alertService;
    private translateService;
    /**
     * Retrieve application by its key as observable.
     * @param key {SupportedAppKey} - Application key.
     * @returns Observable of Application
     */
    getApp$(key: T): Observable<IApplication | undefined>;
    /**
     * Checks if current application is the same as the one that key is provided
     * @param key {SupportedAppKey} - Application key.
     * @returns Observable of boolean; true if current app matches provided key.
     */
    isCurrentApp$(key: T): Observable<boolean>;
    /**
     * Checks if other (other than current) application link should be displayed. It consists of two conditions:
     * - app that link leads to exists and is available for current user
     * - app link leads to app that is not current app
     * @param appKey {SupportedAppKey} - Application key that link leads to.
     * @returns Observable of boolean; only true when app that link leads to is available and app link leads to app that is not current app
     */
    shouldShowAppLink$(appKey: T): Observable<boolean>;
    /**
     * Navigates to app by provided app key
     * @param appKey {SupportedAppKey} - Application key that links leads to.
     * @param path {string} - Additional path in target application.
     */
    navigateToApp(appKey: T, path?: string): Promise<void>;
    static ɵfac: i0.ɵɵFactoryDeclaration<InterAppService<any>, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<InterAppService<any>>;
}

/**
 * Component to count down specific time interval, then emit when countdown ends.
 * Next countdown is started right after previous one.
 */
declare class CountdownIntervalComponent implements OnInit, OnDestroy {
    /**
     * Time in milliseconds to count down from.
     */
    set countdownInterval(value: number);
    get countdownInterval(): number;
    /**
     * Configuration object for the countdown interval component.
     */
    private _config;
    shouldShowPulseIcon: i0.Signal<boolean>;
    set config(value: {
        enforcePulseIcon?: boolean;
    });
    /**
     * Emits when countdown ends.
     */
    countdownEnded: EventEmitter<void>;
    runSpinner$: BehaviorSubject<boolean>;
    secondsUntilRefresh$: BehaviorSubject<string>;
    progressPercentage$: BehaviorSubject<number>;
    enableTransition$: BehaviorSubject<boolean>;
    private _countdownInterval;
    private destroy$;
    private readonly MINIMUM_INTERVAL;
    private readonly ONE_SECOND;
    private start$;
    private countdownSubscription;
    ngOnInit(): void;
    ngOnDestroy(): void;
    /**
     * Starts the countdown timer.
     */
    start(): void;
    /**
     * Stops the countdown timer.
     * @param stopAtZero - If true, stops the timer when it reaches zero. Otherwise, stops it at the current countdown interval.
     */
    stop(stopAtZero?: boolean): void;
    reset(): void;
    /**
     * Initializes the countdown timer.
     * Kicks off the timer logic and activates any associated UI elements.
     */
    private initializeCountdownInterval;
    /**
     * Creates an Observable stream that emits events when the document's visibility changes.
     * @returns An Observable emitting `null` whenever the visibility of the document changes.
     */
    private createDocumentHiddenEventStream;
    /**
     * Creates the main interval Observable for the countdown timer.
     * @param timerStart$ - A Subject to signal the start of the timer.
     * @param documentHiddenEvent$ - An Observable for document visibility changes.
     * @returns An Observable that orchestrates the timer logic.
     */
    private createIntervalStream;
    /**
     * Creates a timer Observable that emits every second.
     * @returns An Observable that emits a number every second, starting from 0.
     */
    private createTimer;
    /**
     * Updates the remaining time in the countdown.
     * @param value - The current timer value in seconds.
     */
    private updateRemainingTime;
    /**
     * Sets progress without transition to prevent animation glitches
     * @param value - The progress percentage to set
     */
    private setProgressWithoutTransition;
    /**
     * Subscribes to the interval Observable and sets up the event handlers for the countdown.
     * @param interval$ - The countdown interval Observable to subscribe to.
     */
    private subscribeToInterval;
    static ɵfac: i0.ɵɵFactoryDeclaration<CountdownIntervalComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<CountdownIntervalComponent, "c8y-countdown-interval", never, { "countdownInterval": { "alias": "countdownInterval"; "required": false; }; "config": { "alias": "config"; "required": false; }; }, { "countdownEnded": "countdownEnded"; }, never, never, true, never>;
}

declare class CountdownIntervalModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<CountdownIntervalModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<CountdownIntervalModule, never, [typeof i1.CommonModule, typeof CountdownIntervalComponent], [typeof CountdownIntervalComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<CountdownIntervalModule>;
}

interface CookieBannerSettings {
    cookieBannerTitle?: string;
    cookieBannerText: string;
    policyUrl?: string;
    policyVersion?: string;
    cookieBannerDisabled?: boolean;
}
interface CookiePreferences {
    required?: boolean | string;
    functional?: boolean | string;
    marketing?: boolean | string;
    policyVersion?: string;
}
interface Cookie {
    name: string;
    value: boolean;
    isReadonly?: boolean;
}

/**
 * This service is handling the cookie banner and cookie preferences related logic.
 */
declare class CookieBannerService {
    private options;
    readonly STORAGE_KEY: string;
    readonly COOKIE_BANNER = "cookieBanner";
    readonly PREVIEW_COOKIE_BANNER = "previewCookieBanner";
    readonly IS_PREVIEW = "preview";
    readonly COOKIE_PREFERENCES_CONFIG = "cookiePreferences";
    isCookieBannerShowed$: Subject<boolean>;
    cookieDescriptions: {
        required: "These cookies are required to enable core site functionality. They perform a task or operation without which a site's functionality would not be possible.";
        functional: "These cookies are used to support you during your first steps with the product, to deliver content tailored to your needs, and to collect usage statistics.";
        marketing: "These cookies are used to target advertising to a user.";
    };
    constructor(options: OptionsService);
    /**
     * Returns Cookie preferences configuration.
     * @returns {object} Return an object with cookie preferences configuration defined in application options.
     */
    getCookiePreferencesConfig(): CookiePreferences;
    /**
     * Returns Cookie banner configuration.
     * @returns {object} Return an object with cookie banner configuration defined in application options.
     */
    getCookieBannerSettings(): Partial<CookieBannerSettings>;
    /**
     * Converts the cookie preferences to boolean. Sets the cookie preferences configuration in local storage.
     * @param {object} cookiePreferences Object with cookie preferences configuration
     */
    setCookies(cookiePreferences: CookiePreferences, policyVersion?: string): void;
    /**
     * Verifies that cookie banner should be shown.
     * @returns {boolean} Returns if the cookie banner should be shown.
     */
    shouldShowCookieBanner(): boolean;
    /**
     * Gets the cookie preferences configuration from local storage.
     * @returns {object} Object with cookie preferences configuration.
     */
    getUserCookiePreferences(): CookiePreferences;
    /**
     * Verifies that cookie preferences configuration is defined in the application options.
     * @returns {boolean} Returns if the cookie preferences configuration is defined.
     */
    isConfigCookiePreferencesDefined(): boolean;
    /**
     * Verifies that functional cookies are enabled.
     * @returns {boolean} True when functional cookies are enabled.
     */
    isFunctionalCookieEnabled(): boolean;
    /**
     * Description of cookies.
     * @param {'required' | 'functional' | 'marketing'} cookieType Takes one of the following options: 'required', 'functional', 'marketing'.
     * @returns {string} The default cookie description, if not explicitly defined in application options.
     */
    getCookieDescription(cookieType: 'required' | 'functional' | 'marketing'): string;
    /**
     * Transforms cookie preferences configuration object to an array of cookie preferences objects. Each object in returned array contains cookie 'name', 'value' and 'isReadonly' property.
     * @param {object} cookiePreferences.
     * @returns {Array} Array shows if the cookie is Readonly.
     */
    transformCookiePreferencesToList(cookiePreferences: CookiePreferences): Cookie[];
    /**
     * Transforms an array of cookie preferences objects to cookie preferences configuration object.
     * @param {Array} cookiePreferencesList Array of cookie preferences.
     * @returns {object} An object with cookie preferences configuration.
     */
    transformCookiePreferencesListToCookiePreferences(cookiePreferencesList: Cookie[]): CookiePreferences;
    private isPreviewMode;
    static ɵfac: i0.ɵɵFactoryDeclaration<CookieBannerService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<CookieBannerService>;
}

/**
 * Marks a component that can emit product experience events.
 */
interface ProductExperienceEventSource {
    productExperienceEvent: ProductExperienceEvent;
}
/**
 * Defines the payload for a product experience event.
 */
interface ProductExperienceEvent {
    /**
     * Name of the event.
     */
    eventName: string;
    /**
     * Any other data that will be sent as payload.
     */
    data?: PxEventData;
}
/**
 * Suggets some common product experience event properties.
 */
interface PxEventData {
    /**
     * Description or an identifier of user interaction.
     */
    action?: string;
    /**
     * Component that triggered the event.
     */
    component?: string;
    /**
     * The URL that the action was triggered at.
     */
    url?: string;
    /**
     * The result from the user action, e.g. when 'Cancel'
     * when a user has cancelled a confirmation prompt.
     */
    result?: string;
    [key: string]: any;
}
/**
 * Use this token for components that can provide product experience events.
 */
declare const PRODUCT_EXPERIENCE_EVENT_SOURCE: InjectionToken<unknown>;

/**
 * @property user The user which is given to Gainsight.
 * @property tenant The tenant which is given to Gainsight.
 * @property instanceId Extracted domain part of an URL.
 * @property versionUI The UI version used.
 * @property versionBE The BE version used.
 */
interface IdentifyData {
    user: IUser;
    currentTenant: ICurrentTenant;
    instanceId: string;
    versionUI?: string;
    versionBE?: string;
}
/**
 * A service to manage the Gainsight integration. It allows to load the
 * tag and
 */
declare class GainsightService {
    private appState;
    private options;
    private cookieBannerService;
    private userPreferencesService;
    private translateService;
    private translateStore;
    /**
     * A subject that emits the tag function as soon as a new tag is set.
     */
    tagFunction$: BehaviorSubject<any>;
    trackingLoaded$: Subject<boolean>;
    /**
     * Gainsight is activated only when the cookie banner is present. If functional cookies are enabled, both personally identifiable information (PII) and required data are sent.
     * Otherwise, only the required data is transmitted during the identity step execution.
     */
    readonly USER_PREFERENCES_GAINSIGHT_KEY = "gainsightEnabled";
    /**
     * The name of the key remained unchanged, but applies to all engagements.
     */
    readonly USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY = "gainsightBotEnabled";
    readonly HIDE_GAINSIGHT_BOT_STYLE_ID = "hide-gs-bot";
    private readonly GAINSIGHT_URL;
    private readonly GAINSIGHT_GLOBAL_SCOPE;
    private readonly SCRIPT_EXECUTION_WAIT_TIME;
    private readonly OPTIONS_KEY_CATEGORY;
    private readonly OPTIONS_KEY_NAME;
    private isScriptLoaded;
    private gainsightKey;
    private cachedRevertedTranslations;
    private cachedLanguage;
    constructor(appState: AppStateService, options: OptionsService, cookieBannerService: CookieBannerService, userPreferencesService: UserPreferencesService, translateService: TranslateService$1, translateStore: TranslateStore);
    /**
     * Checks if the specified Gainsight preference is disabled in user preferences.
     * @param preferenceName - Name of the Gainsight preference.
     * @returns A promise that resolves to `true` if the preference is disabled, otherwise `false`.
     */
    isGainsightPreferenceDisabledInUserPreferences(preferenceName: string): Promise<boolean>;
    /**
     * Sets the state of the functional cookie.
     * @param value - A boolean value to indicate whether the functional cookie should be enabled (`true`) or disabled (`false`).
     */
    setFunctionalCookie(value: boolean): void;
    getGainsightKey(): Promise<string>;
    /**
     * Returns the tag global function which can be used to identify user
     * or add special events.
     */
    get tagFunction(): any;
    /**
     * Load the script tag and calls the identify function to start the tracking.
     * @param currentTenant The current tenant.
     * @param sendPiiData Flag for sending personally identifiable information (PII) during identification in Gainsight.
     */
    loadTag(currentTenant: ICurrentTenant, sendPiiData: boolean): Promise<void>;
    /**
     * Identifies the user/account at Gainsight.
     * @param sendPiiData Flag for sending personally identifiable information.
     * @param identifyData Object containing identification data.
     */
    identify(sendPiiData: boolean, identifyData: IdentifyData): void;
    /**
     * Triggers an event to be recorded by Gainsight PX.
     * This method calls the Gainsight PX's tracking mechanism to log a specific event
     * along with its associated properties.
     * @param eventName - Name of the event to be triggered.
     * @param props - Optional properties associated with the event.
     */
    triggerEvent(eventName: string, props?: PxEventData): void;
    translateToEnglish(textToTranslate: string): string;
    /**
     * Determines whether personally identifiable information (PII) should be sent while loading a tag.
     * The decision to activate Gainsight and send PII relies on whether the cookiePreferences option is defined in the application settings,
     * if the functional cookie is enabled, and if the user grants permission.
     */
    shouldSendPiiData(): Promise<boolean>;
    /**
     * Updates a specific user attribute in the Gainsight global scope.
     * This method interfaces with the Gainsight global object to set a user's specific attribute with a provided value.
     * @param name - Name of the user attribute to be updated.
     * @param value - Value to set for the specified user attribute.
     */
    updateUserAttribute(name: string, value: string | Date | number | boolean): void;
    /**
     * Determines if the current user has the capability to modify Gainsight PX settings.
     *
     * This method checks multiple conditions:
     * 1. Whether tracking has been disabled globally via application options.
     * 2. Whether Gainsight is disabled at the tenant level through custom properties.
     * 3. Whether a Gainsight key is available, either currently loaded or fetched asynchronously.
     * 4. Whether cookie preferences are defined and available for the user.
     *
     * @returns Promise that resolves to a boolean. True indicates the user can edit product experience settings, and false otherwise.
     */
    canEditProductExperienceSettings(): Promise<boolean>;
    hashGroupName(groupName: string): Promise<string>;
    /**
     * Sets the global context for Gainsight with the current application name.
     * The global context can be utilized by Gainsight for various purposes, such as segmenting users.
     */
    setGlobalContext(): void;
    transformUserRolesToStr(userRoles?: IIdentified[]): string;
    /**
     * Checks if Gainsight is disabled based on tenant custom properties.
     *
     * @param customProperties - The custom properties of the tenant.
     * @returns {boolean} - True if Gainsight is disabled, false otherwise.
     */
    isGainsightDisabledAtTenantCustomProperties(customProperties: ICustomProperties): boolean;
    /**
     * Determines if custom branding is enabled based on the presence of a brand logo.
     *
     * @returns {boolean} - True if custom branding is applied, false otherwise.
     */
    isCustomBranding(): boolean;
    /**
     * Determines if tracking is disabled based on the application options.
     * @returns `true` if tracking is disabled, otherwise `false`.
     */
    isTrackingDisabled(): boolean;
    private prepareEventName;
    private loadScriptTag;
    private getInstanceIdFromUrl;
    /**
     * Reverses the translation object.
     *
     * **Example**
     * { Add widget: "Widget hinzufügen" }
     *
     * will be changed to:
     *
     * { Widget hinzufügen: "Add widget" }
     *
     * @param currentLang Language whose translated values are to be placed in the object key.
     * @returns Returns an inverted object where the keys have been swapped with the values.
     */
    private getRevertedTranslations;
    /**Translates string back into English.
     * If the current application language is set to English, the string passed as an argument is returned.
     * @param textToTranslate string to translate.
     * @returns Returns the string translated into English.
     */
    private getEnTranslation;
    static ɵfac: i0.ɵɵFactoryDeclaration<GainsightService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<GainsightService>;
}

declare class ProductExperienceDirective {
    private component;
    private parentEventSource;
    private gainsightService;
    /**
     * A value that will be used as a custom event name.
     */
    actionName: string;
    /**
     * Data that will be used as event properties.
     */
    actionData: object;
    /**
     * If set to <code>true</code>, <code>actionName</code> and <code>actionData</code> will be
     * inherited from the parent component if it has the <code>c8yProductExperience</code> applied to it.
     * With <code>inherit</code> set to <code>true</code> the local <code>actionName</code> value is
     * ignored and overriden by the parent component's <code>actionName</code>. This allows for easy
     * re-use of core components (e.g. <code>&lt;c8y-li-action&gt;</code>) that would use the inherited
     * action name rather than their generic action name. Own <code>actionData</code> properties with
     * the same name take precedence to those inheritted from the parent component.
     */
    set _inherit(inherit: any);
    /**
     * If set to <code>true</code> own <code>actionData</code> properties would not override
     * <code>actionData</code> properties of the parent component. Instead, values will be
     * inherited from the parent component. It is only effective if <code>inherit</code>
     * is set to <code>true</code>.
     */
    set _suppressDataOverriding(suppressDataOverriding: any);
    private inherit;
    private suppressDataOverriding;
    constructor(component: ProductExperienceEventSource, parentEventSource: ProductExperienceEventSource, gainsightService: GainsightService);
    onClick(): void;
    ngOnInit(): void;
    private getAction;
    private mergeData;
    static ɵfac: i0.ɵɵFactoryDeclaration<ProductExperienceDirective, [{ optional: true; self: true; }, { optional: true; skipSelf: true; }, null]>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<ProductExperienceDirective, "[c8yProductExperience]", never, { "actionName": { "alias": "actionName"; "required": false; }; "actionData": { "alias": "actionData"; "required": false; }; "_inherit": { "alias": "inherit"; "required": false; }; "_suppressDataOverriding": { "alias": "suppressDataOverriding"; "required": false; }; }, {}, never, never, true, never>;
}

declare class UserEngagementsService {
    private document;
    private userPreferencesService;
    private gainsightService;
    readonly USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY = "gainsightBotEnabled";
    readonly userEngagementsEnabled$: BehaviorSubject<boolean>;
    readonly HIDE_GAINSIGHT_BOT_STYLE_ID = "hide-gs-bot";
    private readonly ENGAGEMENTS;
    constructor(document: Document, userPreferencesService: UserPreferencesService, gainsightService: GainsightService);
    /**
     * Handles user engagement settings based on various conditions.
     *
     * - Waits for the Gainsight tracking to be loaded.
     * - Retrieves the engagement settings.
     * - Updates the engagement settings based on the combined observations.
     * - Finally, toggles the Gainsight engagements based on the latest `userEngagementsEnabled$` value.
     */
    handleUserEngagements(): void;
    /**
     * Updates the user's preference for Gainsight Engagements.
     * @param {boolean} isEnabled - The new value for the user's engagement preference.
     */
    updateUserEngagementPreference(isEnabled: boolean): void;
    /**
     * Toggles the visibility of Gainsight Engagements based on the provided flag.
     *
     * @param isEnabled - A flag indicating whether Gainsight Engagements should be visible.
     */
    toggleGainsightEngagements(isEnabled: boolean): void;
    /**
     * Constructs an observable that emits an array of boolean values representing
     * the current engagement settings. The observable combines the latest values from:
     *
     * 1. User's preferences for Gainsight engagements.
     * 2. A flag indicating if PII data should be sent.
     * 3. A flag indicating if the platform uses custom branding.
     *
     * @returns An observable emitting an array of boolean values.
     */
    private getEngagementSettingsObservable;
    /**
     * Updates user engagement settings based on provided preferences and settings.
     *
     * Based on the received values, the method decides to:
     * 1. Disable user engagements if PII data should not be shared or certain branding/settings conditions are met.
     * 2. Update the user engagement preference if the user engagement bot setting is undefined.
     *
     * @param userEngagementBotSetting - The user's setting for the engagement bot.
     * @param shouldSendPiiData - Indicates whether PII data should be shared.
     * @param hasCustomBranding - Indicates if custom branding is applied.
     */
    private updateUserEngagementSettings;
    /**
     * Determines whether user engagements should be disabled due to PII data settings.
     *
     * If the `shouldSendPiiData` parameter is false, this indicates that the user engagements
     * should be disabled to prevent sharing personally identifiable information.
     *
     * @param {boolean} shouldSendPiiData - Indicates whether PII data is allowed to be sent.
     * @returns {boolean} Returns true if user engagements should be disabled, otherwise false.
     */
    private shouldDisableUserEngagementsDueToPIIData;
    /**
     * Determines if the user engagement bot setting is undefined.
     *
     * @param {boolean | undefined} userEngagementBotSetting - The setting value to check.
     * @returns {boolean} Returns `true` if the setting is undefined; otherwise, `false`.
     *
     * This scenario occurs when a user is new and hasn't modified the bot settings in the user details UI yet.
     */
    private isUserEngagementBotSettingUndefined;
    /**
     * Enables the visibility of Gainsight engagements.
     *
     * This method removes the CSS styles that hide the Gainsight engagements
     * and updates the relevant user attribute to mark the engagements as visible.
     */
    private showGainsightEngagements;
    /**
     * Hides the Gainsight engagements.
     *
     * This method applies CSS styles to hide the Gainsight engagements
     * and updates the relevant user attribute to mark the engagements as hidden.
     */
    private hideGainsightEngagements;
    /**
     * Removes the specified CSS style from the document.
     *
     * @param {string} styleId - The ID of the CSS style element to remove.
     */
    private removeHidingStyle;
    /**
     * Adds a new CSS style to the document.
     *
     * If the style with the specified ID already exists, the method will do nothing.
     * Otherwise, it creates a new `<style>` element with the given ID and content,
     * then appends it to the document head.
     *
     * @param {string} styleId - The ID to assign to the new style element.
     * @param {string} textContent - The CSS rules to be included in the style.
     */
    private addHidingStyle;
    static ɵfac: i0.ɵɵFactoryDeclaration<UserEngagementsService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<UserEngagementsService>;
}

/**
 * This module enables an tenant to activate the product experience
 * software [Gainsight](https://www.gainsight.com/product-experience/) to help
 * and track user actions.
 */
declare class ProductExperienceModule {
    private appState;
    private gainsightService;
    private cookieBannerService;
    private userEngagementsService;
    constructor(appState: AppStateService, gainsightService: GainsightService, cookieBannerService: CookieBannerService, userEngagementsService: UserEngagementsService);
    /**
     * Observes several factors to determine the state of user tracking and manages the visibility of Gainsight engagements.
     * It watches for changes in the current tenant, the state of the cookie banner, and user's preferences for Gainsight engagements.
     *
     * 1. If the cookie banner is being displayed, it returns without making any changes.
     * 2. If Gainsight is disabled at the tenant level via custom properties, it returns without making any changes.
     * 3. If the conditions are met for loading the Gainsight tag, it loads the tag.
     */
    toggleUserTrackingObservable(): void;
    /**
     * Determines if a tracking tag should be loaded based on cookie preferences.
     * @returns `true` if user cookie preferences exist, otherwise `false`.
     */
    shouldLoadTag(): boolean;
    static ɵfac: i0.ɵɵFactoryDeclaration<ProductExperienceModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<ProductExperienceModule, never, [typeof ProductExperienceDirective], [typeof ProductExperienceDirective]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<ProductExperienceModule>;
}

declare const WIDGET_TYPE_VALUES: {
    readonly ALARMS: "alarms";
    readonly DATA_POINTS_TABLE: "dataPointsTable";
    readonly ASSET_TABLE: "assetTable";
};
type WidgetType = (typeof WIDGET_TYPE_VALUES)[keyof typeof WIDGET_TYPE_VALUES];
/**
 * Abstract class representing an interval reload functionality.
 * This class provides methods and properties for managing an interval-based reload mechanism.
 */
declare abstract class IntervalBasedReload {
    protected gainsightService: GainsightService;
    abstract countdownIntervalComponent: CountdownIntervalComponent;
    /**
     * Holds the subscription to a countdown observable.
     */
    protected countdownSubscription: Subscription;
    /**
     * Indicates whether auto-refresh is enabled for the datapoints reload component that is set in widget config.
     */
    isAutoRefreshEnabled: boolean;
    /**
     * Indicates whether refreshing should be enabled or disabled.
     * It's 'true' when user is not allowed to view a measurement.
     */
    abstract isRefreshDisabled: boolean;
    /**
     * Current isLoading state. Based on it next countdown cycle is being started.
     */
    abstract isLoading: BehaviorSubject<boolean>;
    /**
     * Indicates whether the alarm list is being scrolled or not.
     */
    abstract isScrolling: boolean;
    /**
     * Current refresh interval set in a widget config.
     */
    abstract refreshInterval: number;
    /**
     * Indicates that a countdown cycle has ended.
     */
    abstract onCountdownEnded: EventEmitter<void>;
    /**
     * Indicates the current state of an interval refresh toggle button.
     */
    abstract isIntervalRefreshToggleOn: boolean;
    abstract toggleCountdownButtonTooltipText: string;
    /**
     * Indicates whether the countdown has been manually disabled by the user.
     */
    protected abstract manuallyDisabledCountdown: boolean;
    /**
     * Controls the visibility of the countdown timer component in the current component's UI.
     */
    protected abstract hideCountdown: boolean;
    /**
     * Stops the countdown and triggers a refresh action.
     * This function is responsible for halting the countdown interval component's operation.
     * After stopping the countdown, it emits an `onCountdownEnded` event.
     * This event is used to inform external components that the countdown has ended,
     * typically prompting them to reload or refresh their data.
     */
    autoRefreshList(): void;
    /**
     * Manages the countdown timer's visibility and state in response to user scrolling.
     *
     * This method toggles the countdown timer based on the user's scrolling behavior. It uses
     * the `disableCountdown` and `enableCountdown` methods for handling the countdown state.
     *
     * - If the user is scrolling down while the countdown is visible (`isScrolling` is true and
     *   `hideCountdown` is false), `disableCountdown` is called to stop and hide the countdown,
     *   and `isIntervalRefreshToggleOn` is set to false.
     *
     * - If the user has stopped scrolling, the countdown subscription is closed, and the countdown
     *   is hidden (`!isScrolling`, `countdownSubscription?.closed`, `hideCountdown`), `enableCountdown`
     *   is called to show and restart the countdown, and `isIntervalRefreshToggleOn` is set to true.
     */
    handleScrolling(): void;
    abstract reload(): void;
    /**
     * Wrapper method where it's name better describes a context where it was called.
     */
    abstract countdownEnded(): void;
    /**
     * Handles the toggle state of the countdown on button click.
     *
     * This method is triggered by a mouse event, typically a click on the countdown toggle button.
     * It toggles `isIntervalRefreshToggleOn` to reflect the current state of the countdown timer.
     *
     * - If `isIntervalRefreshToggleOn` is set to false, indicating that the countdown should be stopped,
     *   `disableCountdown` is called, and `manuallyDisabledCountdown` is set to true.
     *
     * - If `isIntervalRefreshToggleOn` is true and the countdown subscription is closed, indicating that
     *   the countdown can be started, `enableCountdown` is called, and `manuallyDisabledCountdown`
     *   is set to false.
     *
     * @param $event - The MouseEvent that triggered this method.
     * @param widgetType - The type of the widget that triggered the event
     */
    onToggleCountdownButtonState($event: MouseEvent, widgetType: WidgetType): void;
    /**
     * This function listens for changes in the `isLoading` observable, filtering out any truthy values.
     * Once a falsy value is detected (indicating that loading has finished), it attempts to start the countdown.
     *
     * IMPORTANT: If the widget's configuration (refreshInterval, check template) is not set prior to executing countdownIntervalComponent?.start,
     * the countdown interval will not start!
     *
     * @param injector - The injector used to provide necessary dependencies
     *                   within the `runInInjectionContext`.
     */
    startCountdown(): void;
    /**
     * Enables and starts the countdown timer.
     *
     * This method makes the countdown visible (`hideCountdown` is set to false) and then
     * starts the countdown process. It ensures the countdown timer is updated immediately
     * by triggering change detection with `cdRef.detectChanges()` before starting the countdown.
     * This method encapsulates the logic required to initiate the countdown timer.
     */
    abstract enableCountdown(): void;
    /**
     * Disables and hides the countdown timer.
     *
     * This method stops the ongoing countdown process by
     * stopping the `countdownIntervalComponent` if it exists. It then hides the countdown timer
     * by setting `hideCountdown` to true. This method encapsulates the logic required to halt and
     * conceal the countdown timer.
     */
    disableCountdown(): void;
    /**
     * Updates the countdown button tooltip text based on the state of the interval refresh toggle state.
     */
    protected abstract updateCountdownButtonTooltipText(): void;
    private triggerGainsightEvent;
    private determineComponentName;
}

declare global {
    namespace CumulocityServiceRegistry {
        interface SpecificExtensionKeys {
            notificationService: NotificationServiceProvider;
        }
        interface NotificationServiceProvider {
            /**
             * Observable that determines whether a notification should be displayed.
             * Emits `true` if a notification should be shown, otherwise `false`.
             */
            shouldShowNotification$: Observable<boolean>;
        }
    }
}
interface NotificationService {
    shouldShowNotification$: Observable<boolean>;
}

interface DynamicBulkRetrievalError {
    id: string;
    status: number;
    statusText: string;
}

/**
 * The content of `c8y-alert-details` component will be displayed as alert's details.
 * This component must be placed inside `c8y-alert` component.
 */
declare class AlertDetailsComponent {
    static ɵfac: i0.ɵɵFactoryDeclaration<AlertDetailsComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<AlertDetailsComponent, "c8y-alert-details", never, {}, {}, never, ["*"], true, never>;
}

/**
 * Checks for errors in responses of requests made with `@c8y/client` services
 * and displays them as alerts using `AlertService`.
 *
 * **Example**
 * ```typescript
 *    const devices = await alertOnError(inventoryService.list({...}));
 * ```
 *
 * @param result The result object from the `@c8y/client` service method
 * @returns The original response (success or failure) of the  `@c8y/client` service method invokation
 */
declare function alertOnError<T>(result: Promise<T>): Promise<T>;

declare abstract class AlertOutletBase {
    alertService: AlertService;
    /**
     * Currently displayed details of an alert. Only one alert’s details can be displayed at a time.
     */
    detailDisplayedAlert: any;
    constructor(alertService: AlertService);
    /**
     * Expands details part of particular alert, and collapses details for another alerts.
     * @param alert The alert which details should be expanded.
     */
    showDetails(alert: Alert): void;
    /**
     * Returns true if alert has extra detailedData or defines custom onDetail method.
     */
    hasDetails(alert: Alert): any;
    /**
     * Collapses alert's details.
     */
    closeDetails(): void;
    /**
     * Returns true if details part of alert is expanded.
     */
    isDetailsShow(alert: Alert): boolean;
    /**
     * @ignore
     */
    isTemplateRef(value: any): value is TemplateRef<any>;
    /**
     * @ignore
     */
    template(content: any): any;
    private setDetailsContent;
}

declare class AlertOutletComponent extends AlertOutletBase {
    private position;
    alertService: AlertService;
    /**
     * @ignore
     */
    isStatic: boolean;
    /**
     * The array of current alerts.
     */
    get alerts(): BehaviorSubject<Alert[]>;
    /**
     * @ignore
     */
    constructor(position: string, alertService: AlertService);
    /**
     * Returns a CSS class for an alert depending on its type to style the corresponding alert component.
     */
    getClass(alert: Alert): string;
    /**
     * Executes alert’s onClose method, if provided, and closes the alert.
     * @param alert The alert which will be closed.
     */
    close(alert: Alert): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<AlertOutletComponent, [{ attribute: "position"; }, null]>;
    static ɵcmp: i0.ɵɵComponentDeclaration<AlertOutletComponent, "c8y-alert-outlet", never, {}, {}, never, never, true, never>;
}

/**
 * The content of `c8y-alert-text` component will be displayed as alert's text.
 * This component must be placed inside `c8y-alert` component.
 */
declare class AlertTextComponent {
    static ɵfac: i0.ɵɵFactoryDeclaration<AlertTextComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<AlertTextComponent, "c8y-alert-text", never, {}, {}, never, ["*"], true, never>;
}

/**
 * Alert component allows creating alert with complex view.
 */
declare class AlertComponent implements OnDestroy, Alert {
    alertService: AlertService;
    /**
     * The type of the alert.
     */
    type: 'success' | 'warning' | 'danger' | 'info' | 'system';
    /**
     * Function to call if user clicks on the detail button.
     */
    onDetail: () => void;
    /**
     * Function to call if user clicks on the close button.
     */
    onClose: () => void;
    /**
     * Detailed information to display.
     */
    detailedData: any;
    /**
     * The text templateRef to display message.
     */
    text: any;
    /**
     * Content of AlertDetailsComponent is displayed as alertDetails.
     */
    containDetailsComponent: AlertDetailsComponent;
    /**
     * @ignore
     */
    private viewInitTimeout;
    /**
     * @ignore
     */
    constructor(alertService: AlertService);
    /**
     * AlertComponent adds new alert to collection stored in alertService after view init.
     */
    ngAfterViewInit(): void;
    /**
     * AlertComponent removes alert from collection stored in alertService on destroy component.
     */
    ngOnDestroy(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<AlertComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<AlertComponent, "c8y-alert", never, { "type": { "alias": "type"; "required": false; }; "onDetail": { "alias": "onDetail"; "required": false; }; "onClose": { "alias": "onClose"; "required": false; }; }, {}, ["containDetailsComponent"], ["c8y-alert-text", "*", "c8y-alert-details"], true, never>;
}

/**
 * Alert module is used for displaying status messages to the user e.g. danger, success, warning and info alerts.
 */
declare class AlertModule {
    static alert: AlertService;
    constructor(alert: AlertService);
    static ɵfac: i0.ɵɵFactoryDeclaration<AlertModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<AlertModule, never, [typeof CommonModule, typeof AlertOutletComponent, typeof AlertComponent, typeof AlertDetailsComponent, typeof AlertTextComponent], [typeof AlertOutletComponent, typeof AlertComponent, typeof AlertDetailsComponent, typeof AlertTextComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<AlertModule>;
}

/**
 * An alert that is shown in the context of a dynamic component (e.g. a widget).
 */
declare class DynamicComponentAlert<T = any> implements Alert {
    text: string | TemplateRef<any>;
    type: AlertType;
    detailedData: any;
    timeout: number;
    allowHtml: boolean;
    onDetail: () => void;
    onClose: () => void;
    /**
     * Partial data that resolver couldn't provide, for example object with event id, but without it's' details.
     */
    unresolvedData: Partial<T>;
    retrievalError?: DynamicBulkRetrievalError;
    /**
     * Optional dismiss strategy for this alert. When set, the aggregator will use this strategy
     * for the alert's type group when adding this alert.
     */
    dismissStrategy?: DismissAlertStrategy;
    constructor(alert: Alert & Partial<DynamicComponentAlert<T>>);
}
declare enum DismissAlertStrategy {
    /**
     * Alerts are shown and user is not able to dismiss alerts.
     */
    NONE = "none",
    /**
     * User is able to dismiss alerts. It's still possible to add new alerts which will be displayed.
     */
    TEMPORARY = "temporary",
    /**
     * User is able to dismiss alerts. If alerts group dismissStrategy property is set to TEMPORARY_OR_PERMANENT,
     * its 'userDismissalChoice' property can be set to REMIND_ALLOWED (to allow adding alerts to group later)
     * or REMIND_DISALLOWED (to prevent adding alerts to group).
     */
    TEMPORARY_OR_PERMANENT = "temporary_or_permanent"
}
/**
 * Alerts data for one specific alert type.
 */
interface AlertGroupData {
    alerts: DynamicComponentAlert[];
    alertDismissal: AlertDismissalData;
}
type AlertDismissalData = {
    dismissStrategy: DismissAlertStrategy.NONE;
    userDismissalChoice?: never;
} | {
    dismissStrategy: DismissAlertStrategy.TEMPORARY;
    userDismissalChoice?: 'REMIND_ALLOWED';
} | {
    dismissStrategy: DismissAlertStrategy.TEMPORARY_OR_PERMANENT;
    userDismissalChoice?: 'REMIND_ALLOWED' | 'REMIND_DISALLOWED';
};
declare const ResolverServerError: {
    403: "Forbidden`403 server error`";
    404: "Not found`404 server error`";
    500: "Internal server error`50X server error`";
    503: "Internal server error`50X server error`";
};

declare class DatapointSyncService {
    private readonly translateService;
    getManagedObjectIds(datapoints: any[]): string[];
    assignUpdatedValues(oldDatapoints: any[], currentManagedObjects: IManagedObject[], errors: DynamicBulkRetrievalError[]): Array<any | DynamicComponentAlert>;
    private assignUpdatedValuesToSingleDatapoint;
    private buildRetrievalAlert;
    static ɵfac: i0.ɵɵFactoryDeclaration<DatapointSyncService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<DatapointSyncService>;
}

declare class MOChunkLoaderService {
    protected inventory: InventoryService;
    constructor(inventory: InventoryService);
    processInChunks<T>(ids: string[], chunkSize: number, loadChunkFn: (ids: string[]) => Promise<{
        managedObjects: T[];
        errors: any[];
    }>): Promise<{
        results: T[];
        errors: any[];
    }>;
    loadAChunkOfManagedObjectsBase(uniqIds: string[], inventory: InventoryService, pageSize: number, getStatusDetails: (id: string) => Promise<DynamicBulkRetrievalError>, queryFilter?: object): Promise<{
        managedObjects: IManagedObject[];
        errors: DynamicBulkRetrievalError[];
    }>;
    getStatusDetails(moId: string): Promise<any>;
    static ɵfac: i0.ɵɵFactoryDeclaration<MOChunkLoaderService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<MOChunkLoaderService>;
}

declare class FeatureCacheService {
    private featureService;
    private appState;
    private refreshTrigger;
    private features$;
    constructor(featureService: FeatureService, appState: AppStateService);
    /**
     * Needed for the angularJS implmentation to show/hide some old features.
     * Returns a promise
     */
    getFeatureStatePromise(key: string): Promise<boolean>;
    /**
     *
     * @param key - The feature key to check
     * @returns true if the feature key exists in the list of features and it is no GA
     */
    featureExists(key: string): Observable<boolean>;
    getFeatureState(key: string): Observable<boolean>;
    resetFeatureState(): void;
    private loadFeatures;
    static ɵfac: i0.ɵɵFactoryDeclaration<FeatureCacheService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<FeatureCacheService>;
}

declare class AppSwitcherService {
    protected ui: AppStateService;
    protected featureToggles: FeatureCacheService;
    /**
     * Apps of the currently logged in user.
     */
    appsOfCurrentUser$: Observable<Array<IApplication>>;
    /**
     * Available cloud apps of the currently logged in user to be displayed in app switcher.
     */
    oneCloudApps$: Observable<Array<IApplication>>;
    /**
     * Available none cloud apps of the currently logged in user to be displayed in app switcher.
     */
    apps$: Observable<Array<IApplication>>;
    finishedLoading$: Observable<boolean>;
    protected readonly visibleApplicationTypes: string[];
    constructor(ui: AppStateService, featureToggles: FeatureCacheService);
    protected filterVisible(apps: IApplication[]): Promise<IApplication[]>;
    protected isPackage(app: IApplication): boolean;
    protected isCloudApp(app: IApplication): boolean;
    protected filterDuplicates(apps: IApplication[], tenant: ICurrentTenant): IApplication[];
    protected orderApps(apps: IApplication[]): IApplication[];
    static ɵfac: i0.ɵɵFactoryDeclaration<AppSwitcherService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<AppSwitcherService>;
}

declare class AppSwitcherInlineComponent {
    switcherService: AppSwitcherService;
    constructor(switcherService: AppSwitcherService);
    static ɵfac: i0.ɵɵFactoryDeclaration<AppSwitcherInlineComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<AppSwitcherInlineComponent, "c8y-app-switcher-inline", never, {}, {}, never, never, true, never>;
}

declare class AppIconComponent implements OnInit, OnChanges {
    private options;
    /** Application context path. */
    contextPath: string;
    /** Application name. */
    name: string;
    /** Application managed object. */
    app: IApplication;
    model: {
        appIcon: string;
        configIcon: string;
        showIcon: boolean;
        iconClass: string[];
        appNameAbbr: string;
        iconStyle: {};
    };
    private c8yAppIconsList;
    private white;
    private defaultIconStyle;
    private faIconMatch;
    private c8yMatch;
    private dltC8yMatch;
    constructor(options: OptionsService);
    ngOnInit(): void;
    ngOnChanges(): void;
    private emptyModel;
    private isC8y;
    private isFaIcon;
    private isDltC8y;
    private loadSetup;
    private iconFromAppDefinition;
    private iconUrlFromAppDefinition;
    private getPropertyFromAppOrOptions;
    private findStaticIcon;
    private mapFontAwesomeToDelightIcons;
    static ɵfac: i0.ɵɵFactoryDeclaration<AppIconComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<AppIconComponent, "c8y-app-icon", never, { "contextPath": { "alias": "contextPath"; "required": false; }; "name": { "alias": "name"; "required": false; }; "app": { "alias": "app"; "required": false; }; }, {}, never, never, true, never>;
}

declare class AppHrefPipe implements PipeTransform {
    private applications;
    private readonly dynamicOptionsUrlKey;
    constructor(applications: ApplicationService);
    transform(app: IApplication, addDynamicOptionsUrlIfSet?: boolean): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<AppHrefPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<AppHrefPipe, "appHref", true>;
}

declare class IsActiveAppPipe implements PipeTransform {
    private ui;
    constructor(ui: AppStateService);
    transform(app: IApplication): Observable<boolean>;
    static ɵfac: i0.ɵɵFactoryDeclaration<IsActiveAppPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<IsActiveAppPipe, "isActiveApp", true>;
}

declare class ApplicationModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<ApplicationModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<ApplicationModule, never, [typeof CommonModule, typeof i5.BsDropdownModule, typeof i1$1.A11yModule, typeof ProductExperienceModule, typeof AppIconComponent, typeof AppSwitcherComponent, typeof AppSwitcherInlineComponent, typeof AppHrefPipe, typeof IsActiveAppPipe], [typeof AppIconComponent, typeof AppSwitcherComponent, typeof AppSwitcherInlineComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<ApplicationModule>;
}

/**
 * An action bar item is a action in scope of a
 * current route of the application.
 */
type ActionBarItem = ActionBarItemWithTemplate | ActionBarItemWithComponent;
interface ActionBarItemBase {
    /**
     * Ordering of the actions (high number first)
     */
    priority?: number;
    /**
     * The placement of the item. `more` is a dropdown
     * on the right side.
     */
    placement: 'left' | 'right' | 'more';
    /**
     * The injector to use. If not set, the default root injector will be used.
     */
    injector?: Injector;
    /**
     * Identifying this action bar item belongs to a certain group and should only be shown once.
     */
    groupId?: string;
    /**
     * If action bar items has the same groupId, only one is displayed.
     * Action bar item with the same groupId that has highest inGroupPriority is displayed.
     */
    inGroupPriority?: number;
}
interface ActionBarItemWithTemplate extends ActionBarItemBase {
    /**
     * Angular template used for Content Projection.
     * @deprecated This is used for backwards compatibility with angularjs and allows
     * to content project DOM nodes and template refs. Use component instead.
     */
    template: any;
    component?: never;
}
interface ActionBarItemWithComponent extends ActionBarItemBase {
    /**
     * A component that should be rendered as the ActionBarItem.
     * Note: As a ActionBarItem is rendered in a <li> it is good practice
     * to remove the wrapper node to not run into CSS issues. You
     * can do so by defining the selector as a li: `li[customExtension]`
     * (see: https://stackoverflow.com/a/56887630/923270 or
     * https://stackoverflow.com/a/38716164/923270)
     */
    component: Type<any> | TemplateRef<any>;
    template?: never;
}
/**
 * Factory to implement if used in a hook for Multi Provider extension.
 */
type ActionBarFactory = ExtensionFactory<ActionBarItem>;

/**
 * An extension HOOK can use either a pure value:
 * ```typescript
 *  { provide: HOOK_X, useValue: { ...hookValue }, multi: true }
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  { provide: HOOK_X, useValue: [{ ...hookValues }], multi: true }
 * ```
 *
 * Or an ExtensionFactory which allows to define a get() function. This function
 * gets called on each navigation with the current route and can return values
 * async (observable or promise).
 * ```typescript
 *  { provide: HOOK_X, useFactory: { get: (route) => doSomethingAsync(route) }, multi: true }
 * ```
 */
type ActionBarExtension = ActionBarItem | ActionBarItem[] | ExtensionFactory<ActionBarItem>;
/**
 * A hook to add ActionBarItems using the multi provider extension concept.
 * Consider using the `hookActionBar` function instead.
 *
 * ```typescript
 * providers: [
 *   {
 *     provide: HOOK_ACTION_BAR,
 *     useValue: [{ template: SomeComponent, priority: 10, placement: 'left' } as ActionBarItem],
 *     multi: true
 *   }
 * ]
 * ```
 * @deprecated Consider using the `hookActionBar` function instead.
 */
declare const HOOK_ACTION_BAR: InjectionToken<ActionBarExtension>;
/**
 * A hook to add ActionBarItems using the multi provider extension concept.
 *
 * You can either provide a single `ActionBarItem` as parameter:
 * ```typescript
 *  hookActionBar(...)
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  hookActionBar([...])
 * ```
 *
 * Or you provide an Service that implements `ExtensionFactory<ActionBarItem>`
 * ```typescript
 *  export class MyActionBarFactory implements ExtensionFactory<ActionBarItem> {...}
 *  ...
 *  hookActionBar(MyActionBarFactory)
 * ```
 * A typed alternative to `HOOK_ACTION_BAR`.
 * @param items The `ActionBarItem`'s or `ExtensionFactory` to be provided.
 * @returns An `Provider` to be provided in your module.
 */
declare function hookActionBar(items: GenericHookType<ActionBarItem>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
/**
 * A service which defines action-bar items via the multi provider concept.
 *
 * ```typescript
 * // preferred way, multi provider concept:
 * providers: [
 *   {
 *     provide: HOOK_ACTION_BAR,
 *     useValue: [{ template: SomeComponent, priority: 10, placement: 'left' } as ActionBarItem],
 *     multi: true
 *   }
 * ]
 *
 * // use services:
 * this.actionBarService.add({ template: SomeComponent, priority: 10, placement: 'left' });
 * ```
 */
declare class ActionBarService extends ExtensionPointForPlugins<ActionBarItem> {
    private router;
    /**
     * @ignore
     */
    constructor(rootInjector: Injector, router: Router, plugins: PluginsResolveService);
    /**
     * Returns the current state.
     * @readonly
     * @returns The current set of actions.
     */
    get state(): Set<ActionBarItem>;
    /**
     * Adds a new item to the action bar in the header and emits a state change.
     * @param item The item to add.
     */
    add(item: ActionBarItem): void;
    /**
     * Removes an action bar item from the header and emits a state change.
     * @param item The item to remove.
     */
    remove(item: ActionBarItem): void;
    protected setupItemsObservable(): Observable<ActionBarItem[]>;
    protected pickItemFromGroup(groupedItems: ActionBarItem[]): ActionBarItem;
    static ɵfac: i0.ɵɵFactoryDeclaration<ActionBarService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<ActionBarService>;
}

/**
 * A <c8y-action-bar-item> can be added with content projection.
 * It allows to show items in three positions (left, right
 * or more).
 *
 * ```html
 * <c8y-action-bar-item [placement]="'right'">
 *   <button class="btn btn-link" (click)="addRandom()"><i c8yIcon="plus-circle"></i> Add random</button>
 * </c8y-action-bar-item>
 * ```
 */
declare class ActionBarItemComponent implements ActionBarItemWithComponent {
    private actionBarService;
    /**
     * Where the item should be shown. Use "more" to place
     * it in a dropdown on the right.
     */
    placement: 'left' | 'right' | 'more';
    /**
     * Priority for sorting the list. Higher priority means
     * an earlier position in the list.
     */
    priority: number;
    /**
     * Adds additional classes to the item.
     */
    itemClass: string;
    /**
     * Allows to define a different injector.
     */
    injector: Injector;
    /**
     * If a group id is set, the action bar with the same group id is only rendered once.
     */
    groupId: any;
    /**
     * If action bar items has the same groupId, only one is displayed.
     * Action bar item with the same groupId that has highest inGroupPriority is displayed.
     */
    inGroupPriority: any;
    /**
     * @ignore
     */
    component: Type<any> | TemplateRef<any>;
    private viewInitTimeout;
    /**
     * @ignore
     */
    constructor(actionBarService: ActionBarService, _injector: EnvironmentInjector);
    /**
     * @ignore
     */
    ngAfterViewInit(): void;
    /**
     * @ignore
     */
    ngOnDestroy(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<ActionBarItemComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ActionBarItemComponent, "c8y-action-bar-item", never, { "placement": { "alias": "placement"; "required": false; }; "priority": { "alias": "priority"; "required": false; }; "itemClass": { "alias": "itemClass"; "required": false; }; "injector": { "alias": "injector"; "required": false; }; "groupId": { "alias": "groupId"; "required": false; }; "inGroupPriority": { "alias": "inGroupPriority"; "required": false; }; }, {}, never, ["*"], true, never>;
}

/**
 * This component is used as the outlet to show the action bars.
 * In a c8ycli app it is by default placed on the bootstrap component.
 */
declare class ActionBarComponent implements OnInit, OnDestroy {
    private gainsightService;
    /**
     * Identifies if the navigator is opened. If yes, the action-bar
     * needs to move to the right.
     */
    navigatorOpen: boolean;
    /**
     * Identifies if the current view has tabs. If yes, the action bar needs
     * to move down.
     */
    hasTabs: boolean;
    /**
     * Identifies if the current view has a header element.
     */
    hasHeader: boolean;
    /**
     * Identifies if the tabs are aligned horizontally. If yes, the tabs don't
     * need to move to the left.
     */
    isTabsHorizontal: boolean;
    /**
     * Identifies if in a mobile view the toolbar is expanded or not.
     */
    isPageToolbarExpanded: boolean;
    /**
     * Adds the default `c8y-ui-action-bar` class.
     */
    uiActionBar: boolean;
    /**
     * The current items to display in the ActionBar.
     */
    items$: Observable<ActionBarItem[]>;
    /**
     * Provides observable for right action items.
     */
    right$: Observable<ActionBarItem[]>;
    /**
     * Provides observable for left action items.
     */
    left$: Observable<ActionBarItem[]>;
    /**
     * Provides observable for more action items.
     */
    more$: Observable<ActionBarItem[]>;
    /**
     * Returns true if no items are present and hides the action bar.
     */
    hidden$: Observable<boolean>;
    /**
     * Binds hidden property to this component's native element
     */
    hidden: boolean;
    private destroy$;
    constructor(gainsightService: GainsightService);
    mouseDown(event: HTMLElement): void;
    ngOnInit(): void;
    ngOnDestroy(): void;
    private byPriority;
    static ɵfac: i0.ɵɵFactoryDeclaration<ActionBarComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ActionBarComponent, "c8y-action-bar", never, { "navigatorOpen": { "alias": "navigatorOpen"; "required": false; }; "hasTabs": { "alias": "hasTabs"; "required": false; }; "hasHeader": { "alias": "hasHeader"; "required": false; }; "isTabsHorizontal": { "alias": "isTabsHorizontal"; "required": false; }; "items$": { "alias": "items$"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * An action bar can be added with content projection or multi provider
 * extension. It allows to show them in three positions (left, right
 * or more). The actions placed here are always local actions to the
 * current route like "add device" or "lock dashboard".
 *
 * ```html
 * <c8y-action-bar-item [placement]="'right'">
 *   <button class="btn btn-link" (click)="addRandom()"><i c8yIcon="plus-circle"></i> Add random</button>
 * </c8y-action-bar-item>
 * ```
 * @exports ActionBarComponent The outlet component
 * @exports ActionBarItemComponent The items to add with cp.
 */
declare class ActionBarModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<ActionBarModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<ActionBarModule, never, [typeof i5.BsDropdownModule, typeof CommonModule, typeof i2.CollapseModule, typeof i1$2.RouterModule, typeof ActionBarItemComponent, typeof ActionBarComponent], [typeof ActionBarComponent, typeof ActionBarItemComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<ActionBarModule>;
}

/**
 * An action is a global operation which you can
 * add to the plus sign in the upper right corner
 * or any custom component added to the header.
 */
type Action = ActionWithLabelAndFunction | ActionWithTemplate | ActionWithComponent;
interface ActionBase {
    /**
     * Ordering of the actions (high number first) (optional)
     */
    priority?: number;
    /**
     * Is that action disabled.
     */
    disabled?: boolean;
    /**
     * The injector to use. If not set, the default root injector will be used.
     */
    injector?: Injector;
}
interface ActionWithLabelAndFunction extends ActionBase {
    /**
     * The label of the action, [[ActionWithLabelAndFunction]] actions are combined in a "add"-button dropdown.
     */
    label: string;
    /**
     * Which action to trigger on click
     */
    action: (...args: any[]) => void;
    /**
     * The icon to show on this action (optional)
     */
    icon?: SupportedIconsSuggestions;
    template?: never;
    component?: never;
}
interface ActionWithTemplate extends ActionBase {
    /**
     * A template that should be rendered as the action. [[ActionWithTemplate]] actions
     * are combined in a "add"-button dropdown.
     * Note: As a Action is rendered in a <li> it is good practice
     * to remove the wrapper node to not run into CSS issues. You
     * can do so by defining the selector as a li: `li[customExtension]`
     * (see: https://stackoverflow.com/a/56887630/923270 or
     * https://stackoverflow.com/a/38716164/923270)
     */
    template: any;
    /**
     * The icon to show on this action (optional)
     */
    icon?: SupportedIconsSuggestions;
    label?: never;
    action?: never;
    component?: never;
}
interface ActionWithComponent extends ActionBase {
    /**
     * A component that should be rendered as the action. This component would be shown
     * directly in the header bar.
     */
    component: Type<any>;
    template?: never;
    label?: never;
    action?: never;
    icon?: never;
}
/**
 * Factory to implement if used in a hook for Multi Provider extension.
 */
type ActionFactory = ExtensionFactory<Action>;

/**
 * An extension HOOK can use either a pure value:
 * ```typescript
 *  { provide: HOOK_X, useValue: { ...hookValue }, multi: true }
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  { provide: HOOK_X, useValue: [{ ...hookValues }], multi: true }
 * ```
 *
 * Or an ExtensionFactory which allows to define a get() function. This function
 * gets called on each navigation with the current route and can return values
 * async (observable or promise).
 * ```typescript
 *  { provide: HOOK_X, useFactory: { get: (route) => doSomethingAsync(route) }, multi: true }
 * ```
 */
type ActionExtension = Action | Action[] | ExtensionFactory<Action>;
/**
 * A hook to add an action using the multi-provider extension concept.
 * @deprecated Consider using the `hookAction` function instead.
 */
declare const HOOK_ACTION: InjectionToken<unknown>;
/**
 * A hook to add an action using the multi-provider extension concept.
 *
 * You can either provide a single `Action` as parameter:
 * ```typescript
 *  hookAction(...)
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  hookAction([...])
 * ```
 *
 * Or you provide an Service that implements `ExtensionFactory<Action>`
 * ```typescript
 *  export class MyActionFactory implements ExtensionFactory<Action> {...}
 *  ...
 *  hookAction(MyActionFactory)
 * ```
 * A typed alternative to `HOOK_ACTION`.
 * @param actions The `Action`'s or `ExtensionFactory` to be provided.
 * @returns An `Provider` to be provided in your module.
 */
declare function hookAction(actions: GenericHookType<Action>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
/**
 * A service which defines global actions.
 */
declare class ActionService extends ExtensionPointForPlugins<Action> {
    private router;
    constructor(rootInjector: Injector, router: Router, plugins: PluginsResolveService);
    /**
     * Returns the current state.
     * @readonly
     * @returns The current set of actions.
     */
    get state(): Set<Action>;
    /**
     * Adds a new item to the actions in the header and emits a state change.
     * @param item The item to add.
     */
    add(item: Action): void;
    /**
     * Removes an action from the header and emits a state change.
     * @param item The item to remove.
     */
    remove(item: Action): void;
    protected setupItemsObservable(): Observable<Action[]>;
    static ɵfac: i0.ɵɵFactoryDeclaration<ActionService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<ActionService>;
}

/**
 * This component is used as the outlet to show the action list.
 * In a c8ycli app it is by default placed on the header component near app-switcher.
 */
declare class ActionOutletComponent {
    /**
     * Identifies if in a mobile view the toolbar is expanded or not.
     */
    isPageToolbarExpanded: boolean;
    /**
     * The current items to display in the action dropdown.
     */
    set items(value: Action[]);
    get items(): Action[];
    private items$;
    /**
     * Returns the items that are displayed in the "add"-dropdown ordered by priority.
     */
    templatesAndLabels$: Observable<Action[]>;
    /**
     * Returns the items that are displayed at the top navigation.
     */
    components$: Observable<Action[]>;
    /**
     * Invokes action after an action is clicked.
     */
    invoke(action: any): void;
    private byPriority;
    static ɵfac: i0.ɵɵFactoryDeclaration<ActionOutletComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ActionOutletComponent, "c8y-action-outlet", never, { "items": { "alias": "items"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * A <c8y-action> can be added with content projection.
 *
 * ```html
 * <c8y-action>
 *   <button class="btn" (click)="myAction()">My action</button>
 * </c8y-action>
 * ```
 */
declare class ActionComponent implements ActionWithTemplate {
    private actionService;
    /**
     * Is this action disabled.
     */
    disabled: boolean;
    /**
     * The priority of this action (the higher the number, the higher the action will be displayed; optional)
     */
    priority: number;
    /**
     * The icon to show on this action
     */
    icon: SupportedIconsSuggestions;
    template: any;
    injector: Injector;
    private viewInitTimeout;
    constructor(actionService: ActionService, _injector: EnvironmentInjector);
    /**
     * After page view is initialized, component adds itself to global action list.
     */
    ngAfterViewInit(): void;
    /**
     * Action is removed from global action list, if component is not used anymore.
     */
    ngOnDestroy(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<ActionComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ActionComponent, "c8y-action", never, { "disabled": { "alias": "disabled"; "required": false; }; "priority": { "alias": "priority"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "injector": { "alias": "injector"; "required": false; }; }, {}, never, ["*"], true, never>;
}

/**
 * The angular module definition for actions.
 * @exports ActionComponent
 * @exports ActionOutletComponent
 */
declare class ActionModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<ActionModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<ActionModule, never, [typeof CommonModule, typeof i5.BsDropdownModule, typeof i1$2.RouterModule, typeof ActionOutletComponent, typeof ActionComponent], [typeof ActionOutletComponent, typeof ActionComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<ActionModule>;
}

interface Header {
    /**
     * Controls whether the browser page title is updated.
     * When set to false, the page title will not be updated.
     * Defaults to true.
     */
    pageTitleUpdate?: boolean;
    title?: any;
    nav?: {
        open: boolean;
    };
    rightDrawer?: {
        open: boolean;
    };
}

type DrawerItem = RightDrawerItem | LeftDrawerItem;
type DrawerPositions = 'left' | 'right';
interface BaseDrawerItem {
    component: Type<any>;
    priority: number;
    position: DrawerPositions;
    injector?: Injector;
    id?: string;
}
interface RightDrawerItem extends BaseDrawerItem {
    position: 'right';
}
interface LeftDrawerItem extends BaseDrawerItem {
    position: 'left';
    /**
     * The drawer will only be rendered in case there is at least one required drawer item.
     * By setting this attribute to true, you will mark this item as optional.
     * It will only be rendered if there is another item available for this drawer which is not optional.
     */
    noneRequired?: boolean;
}

/**
 * You can either provide a single `DrawerItem` as parameter:
 * ```typescript
 *  hookDrawer(...)
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  hookDrawer([...])
 * ```
 *
 * Or you provide a Service that implements `ExtensionFactory<DrawerItem>`
 * ```typescript
 *  export class MyDrawerFactory implements ExtensionFactory<DrawerItem> {...}
 *  ...
 *  hookDrawer(MyDrawerFactory)
 * ```
 * A typed alternative to `HOOK_DRAWER`.
 * @param drawer The `DrawerItem`'s or `ExtensionFactory` to be provided.
 * @returns An `Provider` to be provided in your module.
 */
declare function hookDrawer(drawer: GenericHookType<DrawerItem>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
declare class DrawerService extends ExtensionPointForPlugins<DrawerItem> {
    private router;
    constructor(rootInjector: Injector, router: Router, pluginService: PluginsResolveService);
    /**
     * Returns the current state.
     * @readonly
     * @returns The current set of actions.
     */
    get state(): Set<DrawerItem>;
    getDrawersForPosition$(position: 'right' | 'left'): Observable<DrawerItem[]>;
    /**
     * Adds a new node to the navigator.
     * @param {DrawerItem} node Navigator node to add.
     */
    add(node: DrawerItem): void;
    /**
     * Removes a node from the navigator.
     * @param {DrawerItem} node Navigator node to remove.
     */
    remove(node: DrawerItem): void;
    protected setupItemsObservable(): Observable<DrawerItem[]>;
    static ɵfac: i0.ɵɵFactoryDeclaration<DrawerService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<DrawerService>;
}

/**
 * A service which defines header functions.
 */
declare class HeaderService extends StateService {
    private options;
    private humanizeAppName;
    private drawerService;
    private serviceRegistry;
    headerOpen: boolean;
    header$: Observable<Header>;
    navigatorOpen$: Observable<boolean>;
    rightDrawerOpen$: Observable<boolean>;
    canToggleNavigator$: Observable<boolean>;
    showNotification$: Observable<boolean>;
    hideHeader: boolean;
    state$: BehaviorSubject<Header>;
    title: {
        elementRef?: HTMLTitleElement;
        titleSuffix: string;
        titlePrefix: string;
    } | undefined;
    readonly DELAY_TO_AVOID_FLICKERING_ON_ASYNC_NODES = 1000;
    constructor(options: OptionsService, humanizeAppName: HumanizeAppNamePipe, drawerService: DrawerService, serviceRegistry: ServiceRegistry);
    get state(): Header;
    get navigatorHiddenOnStartup(): boolean;
    get largeWidth(): boolean;
    get shouldToggle(): boolean;
    /**
     * Toggles the main header menu in mobile view.
     */
    toggle(): void;
    /**
     * Toggles the navigator open status.
     */
    toggleNavigator(): void;
    /**
     * Force to close the navigator.
     */
    closeNavigator(): void;
    /**
     * Toggles the right drawer open status.
     */
    toggleRightDrawer(): void;
    /**
     * Force to close the right drawer.
     */
    closeRightDrawer(): void;
    /**
     * Configures navigation options.
     * @param config Object with the properties:
     * - open: Boolean
     */
    configNavigator(config?: Partial<Header['nav']>): void;
    /**
     * Change the application title.
     * @param newTitle The new title of the application.
     */
    changeTitle(newTitle?: unknown, pageTitleUpdate?: boolean): void;
    /**
     * Change the page title.
     * @param newTitle The new title of the page.
     */
    changePageTitle(newTitle?: string): void;
    /**
     * This methods checks if the navigator toggles on startup
     * or if an item is added to the navigator node.
     * Delay of 300ms is intended for animation purpose.
     */
    verifyIfNavOpen(): void;
    shouldShowBreadcrumbs(): boolean;
    private isGlobalTitleValid;
    static ɵfac: i0.ɵɵFactoryDeclaration<HeaderService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<HeaderService>;
}

interface PopoverConfirmButtons {
    /**
     * The label of the button
     */
    label: string;
    /**
     * Which action to perform.
     */
    action: () => Promise<any>;
    /**
     * The status class attached to the button.
     */
    status?: StatusType | 'primary' | 'default';
}
/**
 * A component to show a popover right next to the
 * user action. Add this component where the confirm modal
 * should be shown and toggle isOpen to display it. You
 * can use `await isShow()` to wait for a result on the
 * click action.
 */
declare class PopoverConfirmComponent {
    popover: PopoverDirective;
    buttons: PopoverConfirmButtons[];
    message: string;
    title: string;
    isOpen: boolean;
    containerClass: string;
    placement: string;
    outsideClick: boolean;
    adaptivePosition: boolean;
    container: string;
    click: (action: () => Promise<any>) => void;
    /**
     * Show the popover. Wait until an action is performed on it.
     */
    show(buttons?: PopoverConfirmButtons[]): Promise<any>;
    buttonStatus(status: any): string;
    handleOutsideClick(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<PopoverConfirmComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<PopoverConfirmComponent, "c8y-popover-confirm", never, { "buttons": { "alias": "buttons"; "required": false; }; "message": { "alias": "message"; "required": false; }; "title": { "alias": "title"; "required": false; }; "isOpen": { "alias": "isOpen"; "required": false; }; "containerClass": { "alias": "containerClass"; "required": false; }; "placement": { "alias": "placement"; "required": false; }; "outsideClick": { "alias": "outsideClick"; "required": false; }; "adaptivePosition": { "alias": "adaptivePosition"; "required": false; }; "container": { "alias": "container"; "required": false; }; }, {}, never, ["*"], true, never>;
}

interface NavigatorNodeData {
    /**
     * Navigator node name.
     * @deprecated
     */
    name?: string;
    /**
     * Label to be displayed in the navigator node.
     */
    label?: string;
    /**
     * Position of the node in the navigator.
     */
    priority?: number;
    /**
     * The path to which the UI will be redirected after clicking navigator node.
     */
    path?: string;
    /**
     * Navigator node icon.
     */
    icon?: SupportedIconsSuggestions;
    /**
     * Navigator node icon when expanded.
     */
    iconOpen?: string;
    /**
     * Navigator node parent node.
     */
    parent?: NavigatorNodeData | string;
    /**
     * Check if a duplicate node is present and ignore it.
     */
    preventDuplicates?: boolean;
    /**
     * Should this asset node show devices or not.
     */
    hideDevices?: boolean;
    /**
     * Id to identify specific feature node.
     */
    featureId?: string;
    /**
     * Custom component to use.
     */
    component?: Type<any>;
    /**
     * Whether to pass `label` through `translate` pipe when being displayed.
     */
    translateLabel?: boolean;
    [key: string]: any;
}

/**
 * Interface that determines the available click options.
 * @ignore
 */
interface ClickOptions {
    /**
     * Indicates that the source of the event is a click on the node icon.
     */
    icon?: boolean;
    /**
     * Indicates that the source of the event is a click on the node expander.
     */
    expander?: boolean;
    /**
     * Indicates that the navigator node is expanded/collapsed.
     */
    open?: boolean;
    /**
     * Creates a new group node which will contain all unassigned devices.
     */
    showUnassignedDevices?: boolean;
    /**
     * DOM event.
     */
    $event?: any;
}
/**
 * Base navigator node. Represents a single entry in the navigator menu.
 * Is considered to be the basic building block of the navigator.
 */
declare class NavigatorNode {
    static NAME: string;
    /**
     * Navigator node icon.
     */
    icon: SupportedIconsSuggestions;
    /**
     * Navigator node icon when expanded.
     */
    iconOpen: string;
    /**
     * Custom icon template.
     */
    iconTemplate?: TemplateRef<any>;
    /**
     * Custom icon component.
     */
    iconComponent?: Type<any>;
    /**
     * Navigator node children (subentries).
     */
    children: NavigatorNode[];
    /**
     * Label to be displayed in the navigator node.
     */
    label: string;
    /**
     * Whether to pass `label` through `translate` pipe when being displayed.
     */
    translateLabel: boolean;
    /**
     * The path to which the UI will be redirected after clicking the navigator node.
     */
    path: string;
    /**
     * Navigator node parent nodes.
     */
    parents: NavigatorNode[];
    /**
     * Loading state indicator.
     */
    loading?: boolean;
    /**
     * Used to load the providers for the components. If not provided, default injector us used.
     */
    injector?: Injector;
    /**
     * Custom component to use.
     */
    component?: Type<any>;
    /**
     * Indicates whether the navigator node should be active based on matching the node path and the URL path.
     * To match the URL exactly, set this option to true.
     *
     * routerLinkExact set to true:
     * When the URL path is set to /a/b/c and the node path to /a/b then the node will not be set active.
     *
     * routerLinkExact set to false:
     * When the URL path is set to /a/b/c and the node path to /a/b then the node will be set active.
     */
    routerLinkExact: boolean;
    /**
     * Indicates that the navigator node is expanded/collapsed.
     */
    open: boolean;
    /**
     * Indicates that the navigator node is visible/hidden.
     */
    hidden: boolean;
    /**
     * Indicates that the navigator node is draggable.
     */
    draggable: boolean;
    /**
     * Indicates that the navigator node is droppable.
     */
    droppable: boolean;
    /**
     * Indicates that the navigator node is dragged.
     */
    dragged: boolean;
    /**
     * Indicates that currently something is dragged over the node.
     */
    draggedHover: boolean;
    /**
     * Confirmation popover displayed at the end of the process of moving the navigator menu item.
     */
    confirm: PopoverConfirmComponent;
    /**
     * The breadcrumb of the node, displaying the "path", but supports multiple levels.
     * e.g. (Groups > Level 1 > Level 2)
     */
    breadcrumb?: string;
    /**
     * Id to identify specific feature node.
     */
    featureId?: string;
    /**
     * A callback function that will be called when the node needs to be refreshed.
     */
    refreshCallback?: () => void;
    private _priority;
    private expandDragTimeout;
    /**
     * Returns information whether a navigator node has children.
     * @readonly
     */
    get hasChildren(): boolean;
    /**
     * Returns the ID of the navigator node.
     * @readonly
     */
    get id(): string;
    /**
     * Returns the priority value of the navigator node.
     * @readonly
     */
    get priority(): number;
    /**
     * Sets the priority value of the navigator node.
     *
     * @param {number} priority Priority value.
     */
    set priority(priority: number);
    constructor(data?: NavigatorNodeData);
    /**
     * Adds a child navigator node to the node.
     *
     * @param {NavigatorNode} node Child node.
     */
    add(node: NavigatorNode): void;
    /**
     * Removes the child navigator node from the node.
     *
     * @param {NavigatorNode} node Child node.
     */
    remove(node: NavigatorNode): void;
    /**
     * Updates the navigator node.
     *
     * @param {NavigatorNodeData} data Data to be updated.
     */
    update(data?: NavigatorNodeData): void;
    /**
     *
     * Returns a child navigator node based on the predicate.
     *
     * ```ts
     * // The function will compare the labels to the string and return a matching result.
     * // The capitalization of the characters does not matter (case insensitive).
     * const predicate = 'group1';
     * const childNode = parentNode.find(predicate);
     * // Check: [lodash matches](https://lodash.com/docs/4.17.15#matches)
     * const predicate = { label: 'group2' };
     * const childNode = parentNode.find(predicate);
     * ```
     *
     * @param predicate Filter criteria.
     * @param findBy NavigatorNode field name to compare.
     *
     */
    find(predicate: any, findBy?: keyof Pick<NavigatorNode, 'label' | 'featureId'>): any;
    /**
     * Removes children nodes.
     */
    empty(): void;
    /**
     * @ignore
     */
    click(_options?: ClickOptions): void;
    /**
     * This event is fired when an element is dropped on a valid drop target.
     * @param $event DOM event.
     */
    drop($event: any): void;
    /**
     * This event is fired when the user starts dragging an element.
     * @param $event DOM event.
     */
    dragStart($event: any): void;
    /**
     * This event is fired when a drag operation has ended.
     * @param $event DOM event.
     */
    dragEnd($event: any): void;
    /**
     * Returns information whether the navigator node is droppable.
     * @readonly
     */
    get canDrop(): boolean;
    /**
     * Returns information whether navigation is possible.
     * @readonly
     */
    get canNavigate(): boolean;
    /**
     * This event is fired when a dragged element enters a valid drop target.
     * @param $event DOM event.
     */
    dragEnter($event: any): void;
    /**
     * This event is fired when a dragged element leaves a valid drop target.
     * @param $event DOM event.
     */
    dragLeave($event: any): void;
    /**
     * Expands the navigator node if it is collapsed.
     */
    expand(): void;
    /**
     * Performs a callback function recursively on each of the navigator node's children down the hierarchy.
     *
     * ```ts
     * const expandChild = (childNode) => childNode.expand();
     * parentNode.traverse(expandChild);
     * ```
     *
     * @param callback Function to be called.
     */
    traverse(callback: any): void;
    /**
     * @ignore
     */
    destroy(): void;
    /**
     * Counts the amount of children nodes.
     */
    protected countChildren(): number;
    /**
     * Identifies itself.
     */
    protected toString(): string;
    protected hasChildDevices(): boolean;
    /**
     * Updates the navigator node by sorting its children and also checking their visibility.
     */
    protected updateChildren(): void;
    /**
     * Sorts the children of the navigator node, by priority and name (ASC).
     * The higher the priority, the higher the position in the hierarchy.
     * For the same priority values, the alphabetical order will take precedence.
     */
    protected sort(): void;
    /**
     * Checks if the navigator node should be hidden based on the visibility of its child nodes.
     */
    protected updateHidden(): void;
}

/**
 * An extension HOOK can use either a pure value:
 * ```typescript
 *  { provide: HOOK_X, useValue: { ...hookValue }, multi: true }
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  { provide: HOOK_X, useValue: [{ ...hookValues }], multi: true }
 * ```
 *
 * Or an ExtensionFactory which allows to define a get() function. This function
 * gets called on each navigation with the current route and can return values
 * async (observable or promise).
 * ```typescript
 *  { provide: HOOK_X, useFactory: { get: (route) => doSomethingAsync(route) }, multi: true }
 * ```
 */
type NavigatorExtension = NavigatorNode | NavigatorNode[] | ExtensionFactory<NavigatorNode>;
/**
 * A hook to use for Multi Provider extension.
 * @deprecated Consider using the `hookNavigator` function instead.
 */
declare const HOOK_NAVIGATOR_NODES: InjectionToken<NavigatorExtension[]>;
/**
 * You can either provide a single `NavigatorNode` or `NavigatorNodeData` as parameter:
 * ```typescript
 *  hookNavigator(...)
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  hookNavigator([...])
 * ```
 *
 * Or you provide an Service that implements `ExtensionFactory<NavigatorNode | NavigatorNodeData>`
 * ```typescript
 *  export class MyNavigatorFactory implements ExtensionFactory<NavigatorNode | NavigatorNodeData> {...}
 *  ...
 *  hookNavigator(MyNavigatorFactory)
 * ```
 * A typed alternative to `HOOK_NAVIGATOR_NODES`.
 * @param nodes The `NavigatorNode`'s, `NavigatorNodeData`'s or `ExtensionFactory` to be provided.
 * @returns An `Provider` to be provided in your module.
 */
declare function hookNavigator(nodes: GenericHookType<NavigatorNode | NavigatorNodeData>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
/**
 * A service which defines the navigator.
 */
declare class NavigatorService extends ExtensionPointForPlugins<NavigatorNode> {
    private router;
    /**
     * Indicates whether the menu entry associated with the given URL should be expanded.
     */
    firstUrl: boolean;
    hasItemsInNavigator$: Observable<boolean>;
    constructor(rootInjector: Injector, router: Router, plugins: PluginsResolveService);
    /**
     * Returns the current state.
     * @readonly
     * @returns The current set of actions.
     */
    get state(): Set<NavigatorNode>;
    /**
     * Adds a new node to the navigator.
     * @param {NavigatorNode} node Navigator node to add.
     */
    add(node: NavigatorNode): void;
    /**
     * Removes a node from the navigator.
     * @param {NavigatorNode} node Navigator node to remove.
     */
    remove(node: NavigatorNode): void;
    protected setupItemsObservable(): Observable<NavigatorNode[]>;
    /**
     * This will redirect on the inital navigation to '#/' to
     * the first node with a path and the highest priority.
     */
    private redirectToFirstNode;
    private getFirstNodeWithPath;
    static ɵfac: i0.ɵɵFactoryDeclaration<NavigatorService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<NavigatorService>;
}

interface StepperButtonsVisibility {
    cancel?: boolean;
    back?: boolean;
    next?: boolean;
    custom?: boolean;
}
/**
 * Steps of a stepper component.
 *
 * ```ts
 * providers: [{
 *   provide: HOOK_STEPPER,
 *   useValue: {
 *      id: Steppers.SETUP,
 *      label: 'Register devices',
 *      component: YourRegisterDeviceForm,
 *      priority: -1000
 *   },
 *   multi: true
 * }]
 */
interface Step {
    /**
     * The id of the stepper outlet where the step should be attached to.
     */
    stepperId: string;
    /**
     * The label to display.
     */
    label?: string;
    /**
     * The component to render. You can inject the C8yStepper to manage steps or use the
     * existing NgForm to validate the content of the form before the user can go on.
     *
     * ```js
     * viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]
     * ```
     */
    component: Type<any>;
    /**
     * The injector to use. If not set, default injector will be used.
     */
    injector?: Injector;
    /**
     * High priority will show the step sooner, low priority will show the step later. All
     * hooked step are ordered first by priority then by name.
     */
    priority?: number;
    /**
     * Marks the step as required to complete the stepper.
     */
    required?: boolean;
    [key: string]: any;
}
/**
 * Can be used to mark a step as completed and adds the current index to the step.
 */
type IndexedStep = Step & {
    index: number;
    completed: boolean;
    state?: StepState;
};
/**
 * Default steppers used in the platform. Use this too hook into
 * certain steps.
 *
 * ```ts
 * providers: [{
 *   provide: HOOK_STEPPER,
 *   useValue: {
 *      id: Steppers.SETUP,
 *      label: 'Register devices',
 *      component: YourRegisterDeviceForm,
 *      priority: -1000
 *   },
 *   multi: true
 * }]
 * ```
 */
declare enum Steppers {
    /**
     * Use this stepperId to hook a component into the application
     * setup step.
     */
    SETUP = "setup"
}

/**
 * An extension HOOK can use either a pure value:
 * ```typescript
 *  { provide: HOOK_X, useValue: { ...hookValue }, multi: true }
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  { provide: HOOK_X, useValue: [{ ...hookValues }], multi: true }
 * ```
 *
 * Or an ExtensionFactory which allows to define a get() function. This function
 * gets called on each navigation with the current route and can return values
 * async (observable or promise).
 * ```typescript
 *  { provide: HOOK_X, useFactory: { get: (route) => doSomethingAsync(route) }, multi: true }
 * ```
 */
type StepperExtension = Step | Step[] | ExtensionFactory<Step>;
/**
 * A hook to use for Multi Provider extension.
 * @deprecated Consider using the `hookStepper` function instead.
 */
declare const HOOK_STEPPER: InjectionToken<StepperExtension[]>;
/**
 * You can either provide a single `Step` as parameter:
 * ```typescript
 *  hookStepper(...)
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  hookStepper([...])
 * ```
 *
 * Or you provide an Service that implements `ExtensionFactory<Step>`
 * ```typescript
 *  export class MyStepFactory implements ExtensionFactory<Step> {...}
 *  ...
 *  hookStepper(MyStepFactory)
 * ```
 * A typed alternative to `HOOK_STEPPER`.
 * @param step The `Step`'s or `ExtensionFactory` to be provided.
 * @returns An `Provider` to be provided in your module.
 */
declare function hookStepper(step: GenericHookType<Step>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
/**
 * A service which defines the steps in a stepper component.
 * A stepper hook needs an certain outlet which has an matching id
 * to display the steps.
 */
declare class StepperService extends ExtensionPointForPlugins<Step> {
    private router;
    private translateService;
    constructor(rootInjector: Injector, router: Router, translateService: TranslateService$1, plugins: PluginsResolveService);
    sortSteps(steps: Step[]): Step[];
    /**
     * Returns the current state.
     * @readonly
     * @returns The current set of actions.
     */
    get state(): Set<Step>;
    /**
     * Adds a new item to tabs and emits state change
     * @param item The item to add.
     */
    add(item: Step): void;
    /**
     * Removes a step and emits a state change.
     * @param item The item to remove.
     */
    remove(item: Step): void;
    /**
     * Returns the component by it's asssigned stepper id as an observable.
     * @param id The id of the stepper to hook into.
     */
    getById$(id: any): Observable<Step[]>;
    protected setupItemsObservable(): Observable<Step[]>;
    static ɵfac: i0.ɵɵFactoryDeclaration<StepperService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<StepperService>;
}

declare class SetupService {
    private stepperService;
    private permissions;
    private options;
    ui: AppStateService;
    private pluginsResolve;
    /**
     * Indicates if the applications needs to show a setup wizard.
     */
    isSetupNeeded$: Observable<boolean>;
    private skipSetup$;
    /**
     * @ignore only DI and initialization
     */
    constructor(stepperService: StepperService, permissions: Permissions, options: OptionsService, ui: AppStateService, pluginsResolve: PluginsResolveService);
    skipSetup(): void;
    private setupRequired;
    private needsSetup;
    private excludeSetupFinishStep;
    private hasRequiredSteps;
    private hasPermission;
    private getNotCompletedSetupSteps;
    static ɵfac: i0.ɵɵFactoryDeclaration<SetupService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<SetupService>;
}

/**
 * An tab allows to switch routes
 * on a page or provide an additional component.
 *
 * If used for switching route, the router link
 * can be provided as string or any[], as supported
 * in the routerLink directive.
 */
type Tab<T = string | any[]> = TabWithTemplate<T> | TabWithComponent;
/**
 * Type alias for tab orientation.
 */
type TabOrientation = 'horizontal' | 'vertical';
interface TabBase {
    /**
     * Ordering of the tabs (high number first) (optional)
     */
    priority?: number;
    /**
     * Alignment for tabs (optional)
     */
    orientation?: TabOrientation;
    /**
     * Hide tab (optional)
     */
    hide?: boolean;
    /**
     * Id to identify specific feature tab.
     */
    featureId?: string;
    /**
     * The injector to use. If not set, the default root injector will be used.
     */
    injector?: Injector;
    /**
     * If there is just a single tab for a route the tab will not be show.
     * If you set this flag to true the tab is still going to be shown even if it is the only one.
     */
    showAlways?: boolean;
    /**
     * Name of the tab outlet which the tabs will use. E.g. can be used to display inline tabs.
     */
    tabsOutlet?: string;
    /**
     * Additional icon provided to indicate special kind of tabs. E.g. typed dashboards.
     */
    badge?: string;
    /**
     * Additional description which can be added to the tab.
     */
    tooltipText?: string;
}
interface TabWithTemplate<T = string> extends TabBase {
    /**
     * The angular route path to navigate to on click.
     */
    path?: T;
    /**
     * The label to show for that tab.
     */
    label?: string;
    /**
     * The title to show for that tab (optional, if not set the label will be used as title).
     */
    title?: string;
    /**
     * If `true`, the `label` will be displayed without being passed through the `translate` pipe.
     */
    skipLabelTranslation?: boolean;
    /**
     * The icon to show on this tab (optional)
     */
    icon?: SupportedIconsSuggestions;
    /**
     * Event emitter to handle the selection of the tab.
     */
    onSelect?: EventEmitter<void>;
    /**
     * Additional template to replace the label (note the label will still be used as title and on mobile devices)
     */
    template?: TemplateRef<any>;
    component?: never;
}
interface TabWithComponent extends TabBase {
    template?: never;
    icon?: never;
    path?: never;
    label?: never;
    skipLabelTranslation?: never;
    /**
     * Angular component (can be used to add any component inside the list item of the tabs)
     *
     * Note: The component must handle it responsive mobile view itself.
     * Note: As a Tab is rendered in a <li> it is good practice
     * to remove the wrapper node to not run into CSS issues. You
     * can do so by defining the selector as a li: `li[customExtension]`
     * (see: https://stackoverflow.com/a/56887630/923270 or
     * https://stackoverflow.com/a/38716164/923270)
     */
    component: Type<any>;
}
/**
 * Factory to implement if used in a hook for Multi Provider extension.
 */
type TabFactory = ExtensionFactory<Tab>;

/**
 * An extension HOOK can use either a pure value:
 * ```typescript
 *  { provide: HOOK_X, useValue: { ...hookValue }, multi: true }
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  { provide: HOOK_X, useValue: [{ ...hookValues }], multi: true }
 * ```
 *
 * Or an ExtensionFactory which allows to define a get() function. This function
 * gets called on each navigation with the current route and can return values
 * async (observable or promise).
 * ```typescript
 *  { provide: HOOK_X, useFactory: { get: (route) => doSomethingAsync(route) }, multi: true }
 * ```
 */
type TabExtension = Tab | Tab[] | ExtensionFactory<Tab>;
/**
 * A hook to use for Multi Provider extension.
 * @deprecated Consider using the `hookTab` function instead.
 */
declare const HOOK_TABS: InjectionToken<TabExtension[]>;
/**
 * You can either provide a single `Tab` as parameter:
 * ```typescript
 *  hookTab(...)
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  hookTab([...])
 * ```
 *
 * Or you provide an Service that implements `ExtensionFactory<Tab>`
 * ```typescript
 *  export class MyTabFactory implements ExtensionFactory<Tab> {...}
 *  ...
 *  hookTab(MyTabFactory)
 * ```
 * A typed alternative to `HOOK_TABS`.
 * @param tabs The `Tab`'s or `ExtensionFactory` to be provided.
 * @returns An `Provider` to be provided in your module.
 */
declare function hookTab(tabs: GenericHookType<Tab>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
/**
 * A service which defines the used tabs.
 */
declare class TabsService extends ExtensionPointForPlugins<Tab> {
    private router;
    private translateService;
    private options;
    items$: Observable<Tab[]>;
    orientation$: Observable<'vertical' | 'horizontal'>;
    constructor(rootInjector: Injector, router: Router, translateService: TranslateService$1, options: OptionsService, plugins: PluginsResolveService);
    prepareTabs(tabs: any): any[];
    sortTabs(tabs: any): any[];
    /**
     * Returns the current state.
     * @readonly
     * @returns The current set of actions.
     */
    get state(): Set<Tab>;
    /**
     * Adds a new item to tabs and emits state change
     * @param item The item to add.
     */
    add(item: Tab): void;
    /**
     * Removes a tab and emits a state change.
     * @param item The item to remove.
     */
    remove(item: Tab): void;
    get firstTab$(): Observable<Tab>;
    /**
     * Checks if at least one of the tabs is available.
     * @param tabLabels The array of tab labels to check.
     * @returns Returns true if at least one of the tabs is available.
     */
    areAvailable(tabLabels: string[]): boolean;
    protected setupItemsObservable(): Observable<Tab[]>;
    private sort;
    static ɵfac: i0.ɵɵFactoryDeclaration<TabsService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<TabsService>;
}

declare class SimplifiedAuthService {
    protected alert: AlertService;
    protected basicAuth: BasicAuth;
    protected cookieAuth: CookieAuth;
    protected realtime: Realtime;
    protected ui: AppStateService;
    protected client: FetchClient;
    protected location: LocationStrategy;
    /**
     * Logs the user out
     * @param reload If set to false, the page will not reload
     */
    logout(reload?: boolean): Promise<void>;
    /**
     * Resets the stored auth-data
     */
    reset(): Promise<[void, _c8y_client.IFetchResponse, any]>;
    protected cleanLocalStorage(): void;
    protected cleanSessionStorage(): void;
    protected redirect(url: string): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<SimplifiedAuthService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<SimplifiedAuthService>;
}

declare class BootstrapComponent implements OnDestroy {
    tabs: TabsService;
    ui: AppStateService;
    navigator: NavigatorService;
    actionBar: ActionBarService;
    headerService: HeaderService;
    private options;
    setupService: SetupService;
    authService: SimplifiedAuthService;
    navigatorOpen$: Observable<boolean>;
    noAppsMargin$: Observable<boolean>;
    tabsOrientation: string;
    showPoweredBy: boolean;
    showMainView$: Observable<boolean>;
    private destroy$;
    constructor(tabs: TabsService, ui: AppStateService, navigator: NavigatorService, actionBar: ActionBarService, headerService: HeaderService, options: OptionsService, setupService: SetupService, authService: SimplifiedAuthService);
    ngOnDestroy(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<BootstrapComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<BootstrapComponent, "c8y-bootstrap", never, {}, {}, never, ["#c8y-legacy-view"], true, never>;
}

interface MessageLike {
    name: string;
    text: string;
}

declare class MessageDirective implements MessageLike {
    name: string;
    text: string;
    static ɵfac: i0.ɵɵFactoryDeclaration<MessageDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<MessageDirective, "c8y-message", never, { "name": { "alias": "name"; "required": false; }; "text": { "alias": "text"; "required": false; }; }, {}, never, never, true, never>;
}

declare class MessagesComponent {
    private translateService;
    show: object;
    defaults: object;
    helpMessage: string;
    additionalMessages: QueryList<MessageLike> | MessageLike[] | null;
    customMessages: QueryList<MessageDirective>;
    messages: any[];
    messageMap: any;
    constructor(translateService: TranslateService$1);
    ngAfterContentInit(): void;
    changeVisibility(show: object): void;
    ngOnChanges(changes?: SimpleChanges): void;
    private rebuildMessageMap;
    private toMessage;
    static ɵfac: i0.ɵɵFactoryDeclaration<MessagesComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<MessagesComponent, "c8y-messages", never, { "show": { "alias": "show"; "required": false; }; "defaults": { "alias": "defaults"; "required": false; }; "helpMessage": { "alias": "helpMessage"; "required": false; }; "additionalMessages": { "alias": "additionalMessages"; "required": false; }; }, {}, ["customMessages"], ["*"], true, never>;
}

/**
 * A form group helps to validate an input of a form element.
 *
 * ```html
 *  <c8y-form-group [hasWarning]="user.email.length === 0">
 *   <label translate for="userEmail">Email</label>
 *   <input
 *     id="userEmail"
 *     class="form-control"
 *     type="email"
 *     name="email"
 *     [maxlength]="254"
 *     autocomplete="off"
 *     placeholder="{{'e.g. joe.doe@exmpl.com' | translate}}"
 *     [(ngModel)]="user.email"
 *     email
 *     required
 *   >
 *   <c8y-messages>
 *     <c8y-message *ngIf="user.email.length === 0" translate></c8y-message>
 *     <c8y-message name="required" text="The E-Mail is SUPER required"></c8y-message>
 *   </c8y-messages>
 *  </c8y-form-group>
 * ```
 *
 * @param status The current status could be error, warning or success.
 * @param hasError Set this to true to display a error.
 * @param hasWarning Set this to true to display a warning.
 * @param hasSuccess Set this to true to display a success.
 * @param novalidation Set this to true to disable automatic validation by this component.
 */
declare class FormGroupComponent implements AfterContentInit, DoCheck, OnDestroy {
    hasError: boolean;
    hasWarning: boolean;
    hasSuccess: boolean;
    novalidation: boolean;
    status: string;
    get error(): boolean;
    get warning(): boolean;
    get success(): boolean;
    customErrorMessage: MessagesComponent;
    model: NgModel;
    formControlName: FormControlName;
    errors: ValidationErrors;
    private control;
    private controlTouched$;
    private readonly VALIDATION_DEBOUNCE_MS;
    private destroyed$;
    ngAfterContentInit(): void;
    initNgModel(): void;
    initFormControl(): void;
    observeControl(control: FormControl | NgModel): void;
    updateErrors(control: FormControl | NgModel): void;
    ngDoCheck(): void;
    ngOnDestroy(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<FormGroupComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<FormGroupComponent, "c8y-form-group", never, { "hasError": { "alias": "hasError"; "required": false; }; "hasWarning": { "alias": "hasWarning"; "required": false; }; "hasSuccess": { "alias": "hasSuccess"; "required": false; }; "novalidation": { "alias": "novalidation"; "required": false; }; "status": { "alias": "status"; "required": false; }; }, {}, ["customErrorMessage", "model", "formControlName"], ["*"], true, never>;
}

declare class PhoneValidationDirective implements Validator {
    validate(control: AbstractControl): ValidationErrors | null;
    static ɵfac: i0.ɵɵFactoryDeclaration<PhoneValidationDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<PhoneValidationDirective, "[c8yPhoneValidation]", never, {}, {}, never, never, true, never>;
}
declare function validateInternationalPhoneNumber(): ValidatorFn;

declare class DefaultValidationDirective implements Validator {
    c8yDefaultValidation: string;
    validate(control: AbstractControl): {
        [key: string]: any;
    } | null;
    static ɵfac: i0.ɵɵFactoryDeclaration<DefaultValidationDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<DefaultValidationDirective, "[c8yDefaultValidation]", never, { "c8yDefaultValidation": { "alias": "c8yDefaultValidation"; "required": false; }; }, {}, never, never, true, never>;
}

declare class MinValidationDirective implements Validator {
    min: string | number;
    validate(control: AbstractControl): {
        [key: string]: any;
    } | null;
    static ɵfac: i0.ɵɵFactoryDeclaration<MinValidationDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<MinValidationDirective, "[min]", never, { "min": { "alias": "min"; "required": false; }; }, {}, never, never, true, never>;
}

declare class MaxValidationDirective implements Validator {
    max: string | number;
    validate(control: AbstractControl): {
        [key: string]: any;
    } | null;
    static ɵfac: i0.ɵɵFactoryDeclaration<MaxValidationDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<MaxValidationDirective, "[max]", never, { "max": { "alias": "max"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * Inline editable input field that displays a value as plain text and switches
 * to an edit mode with save and cancel actions.
 *
 * Use this component when a value should be editable in place without navigating
 * away from the current view. Supports small and large size variants and
 * announces state changes to screen readers via an `aria-live` region.
 *
 * Implements `ControlValueAccessor` so it can be used with `ngModel`,
 * `formControl`, or `formControlName`. The value is propagated to the form
 * control only when the user confirms an edit (save), not on every keystroke.
 *
 * Supports synchronous and asynchronous validators via the `validators` and
 * `asyncValidators` inputs. Validation errors are shown while the user is
 * editing; saving is blocked when the typed value is invalid or a validator
 * is pending.
 *
 * Custom error messages can be projected as `<c8y-message>` children:
 *
 * ```html
 * <c8y-input-group-editable
 *   [ngModel]="name"
 *   (ngModelChange)="saveName($event)"
 *   [validators]="[myValidator]"
 *   ariaLabel="Name"
 * >
 *   <c8y-message name="myError" text="Value is invalid."></c8y-message>
 * </c8y-input-group-editable>
 * ```
 */
declare class InputGroupEditableComponent implements ControlValueAccessor, OnInit, AfterContentInit, OnDestroy {
    /** Accessible label applied via `aria-label` to both the `role="group"` container and the inner `<input>`, required for accessibility. */
    readonly ariaLabel: i0.InputSignal<string>;
    /** The `name` attribute forwarded to the underlying `<input>` element. */
    readonly name: i0.InputSignal<string>;
    /** Controls the size of the input group. Use `'sm'` for small or `'lg'` for large. Defaults to standard size. */
    readonly size: i0.InputSignal<"" | "sm" | "lg">;
    /** Placeholder text shown inside the input when the value is empty. */
    readonly placeholder: i0.InputSignal<string>;
    /** Synchronous validators evaluated against the live typed value. */
    readonly validators: i0.InputSignal<ValidatorFn | ValidatorFn[]>;
    /** Asynchronous validators evaluated against the live typed value. */
    readonly asyncValidators: i0.InputSignal<AsyncValidatorFn | AsyncValidatorFn[]>;
    /** Emitted when the user confirms an edit. Provides the new string value. */
    readonly save: i0.OutputEmitterRef<string>;
    /** Emitted when the user cancels an edit via the cancel button or the Escape key. */
    readonly cancel: i0.OutputEmitterRef<void>;
    /** Message broadcast to the aria-live region after save or cancel ('Saved' / 'Cancelled'). */
    protected liveMessage: string;
    /** Custom `<c8y-message>` elements projected by the consumer. */
    protected readonly customErrorMessages: QueryList<MessageDirective>;
    /** Validation errors to display; non-null only while the user is actively editing and the value is invalid. */
    protected errors: ValidationErrors | null;
    /** Internal form control used to run sync and async validators against the live typed value. */
    protected readonly internalControl: FormControl<string>;
    private committedValue;
    private onChange;
    private onTouched;
    private statusSub;
    private outerValidator;
    private outerAsyncValidator;
    private readonly cdr;
    private readonly injector;
    private announceTimeout;
    constructor();
    /** Whether the save action should be blocked. */
    get isSaveDisabled(): boolean;
    writeValue(value: string): void;
    registerOnChange(fn: (value: string) => void): void;
    registerOnTouched(fn: () => void): void;
    setDisabledState(isDisabled: boolean): void;
    ngOnInit(): void;
    ngAfterContentInit(): void;
    ngOnDestroy(): void;
    private syncInternalValidators;
    protected onSave(inputEl: HTMLInputElement): void;
    protected onCancel(): void;
    protected onEscape(inputEl: HTMLInputElement): void;
    private announce;
    static ɵfac: i0.ɵɵFactoryDeclaration<InputGroupEditableComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<InputGroupEditableComponent, "c8y-input-group-editable", never, { "ariaLabel": { "alias": "ariaLabel"; "required": true; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "validators": { "alias": "validators"; "required": false; "isSignal": true; }; "asyncValidators": { "alias": "asyncValidators"; "required": false; "isSignal": true; }; }, { "save": "save"; "cancel": "cancel"; }, ["customErrorMessages"], never, true, never>;
}

declare class InputGroupListComponent {
    plus: boolean;
    minus: boolean;
    index: number;
    onRemove: EventEmitter<number>;
    onAdd: EventEmitter<number>;
    add(): void;
    remove(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<InputGroupListComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<InputGroupListComponent, "c8y-input-group-list", never, { "plus": { "alias": "plus"; "required": false; }; "minus": { "alias": "minus"; "required": false; }; "index": { "alias": "index"; "required": false; }; }, { "onRemove": "onRemove"; "onAdd": "onAdd"; }, never, ["*"], true, never>;
}

declare class InputGroupListContainerDirective implements AfterContentInit {
    listProjections: QueryList<InputGroupListComponent>;
    ngAfterContentInit(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<InputGroupListContainerDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<InputGroupListContainerDirective, "[c8yInputGroupListContainer]", never, {}, {}, ["listProjections"], never, true, never>;
}

declare class JsonValidationPrettifierDirective implements OnInit, OnDestroy {
    invalidJSON: EventEmitter<string>;
    private abstractCtrl;
    private message;
    private debounceTimeInMs;
    private subscription;
    constructor(ngCtrl: NgControl);
    ngOnInit(): void;
    ngOnDestroy(): void;
    validateInputAndPrettify(value: any): void;
    private setErrorAndValidationMessage;
    private clearValidationMessage;
    static ɵfac: i0.ɵɵFactoryDeclaration<JsonValidationPrettifierDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<JsonValidationPrettifierDirective, "textarea[prettyValidJson]", never, {}, { "invalidJSON": "invalidJSON"; }, never, never, true, never>;
}

declare class TextAreaRowHeightDirective {
    private elem;
    private renderer;
    rows: number;
    heightPerRow: string;
    private minHeightPerRow;
    constructor(elem: ElementRef, renderer: Renderer2);
    ngAfterViewInit(): void;
    private setHeight;
    static ɵfac: i0.ɵɵFactoryDeclaration<TextAreaRowHeightDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<TextAreaRowHeightDirective, "textarea[heightPerRow]", never, { "rows": { "alias": "rows"; "required": false; }; "heightPerRow": { "alias": "heightPerRow"; "required": false; }; }, {}, never, never, true, never>;
}

declare class RequiredInputPlaceholderDirective implements AfterViewChecked {
    private el;
    private renderer;
    private translationService;
    private ngControl;
    private shouldSkipRequiredHint;
    private placeholder;
    private req;
    constructor(el: ElementRef, renderer: Renderer2, translationService: TranslateService$1, ngControl: NgControl);
    ngAfterViewChecked(): void;
    private getTextForPlaceholder;
    private updatePlaceholder;
    static ɵfac: i0.ɵɵFactoryDeclaration<RequiredInputPlaceholderDirective, [null, null, null, { optional: true; }]>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<RequiredInputPlaceholderDirective, "input[required], input[formControlName]", never, {}, {}, never, never, true, never>;
}

declare class IpRangeInputListComponent {
    set data(list: {
        ip: string;
        cidr: number;
    }[]);
    get data(): {
        ip: string;
        cidr: number;
    }[];
    ipRangeList: Array<{
        ip: string;
        cidr: number;
    }>;
    add(): void;
    remove(index: any): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<IpRangeInputListComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<IpRangeInputListComponent, "c8y-ip-range-input-list", never, { "data": { "alias": "data"; "required": false; }; }, {}, never, never, true, never>;
}

declare class FilterInputComponent implements OnInit, OnDestroy {
    icon: SupportedIconsSuggestions;
    onSearch: EventEmitter<string>;
    filterChange$: Subject<KeyboardEvent>;
    filterTerm: string;
    searchLabel: "search";
    closeLabel: "close";
    private readonly CARRIAGE_RETURN_KEY;
    private readonly CARRIAGE_RETURN_CODE;
    private readonly CARRIAGE_ESCAPE_CODE;
    private readonly AUTO_SEARCH_DEBOUNCE;
    ngOnInit(): void;
    reset(): void;
    ngOnDestroy(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<FilterInputComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<FilterInputComponent, "c8y-filter", never, { "icon": { "alias": "icon"; "required": false; }; "filterTerm": { "alias": "filterTerm"; "required": false; }; }, { "onSearch": "onSearch"; }, never, never, true, never>;
}

/**
 * A directive that adds the `emails` validator to controls marked with the
 * `emails` attribute. The directive is provided with the `NG_VALIDATORS` multi-provider list.
 *
 * ```html
 * <input type="text" name="emails" ngModel emails>
 * <input type="text" name="emails" ngModel emails="true">
 * <input type="text" name="emails" ngModel [emails]="true">
 * ```
 */
declare class EmailsValidatorDirective implements Validator {
    private _enabled;
    private _onChange?;
    private separator;
    /**
     * Tracks changes to the emails attribute bound to this directive.
     */
    set emails(value: boolean | string);
    /**
     * Method that validates whether email addresses are valid.
     * Returns the validation result if enabled, otherwise null.
     */
    validate(control: AbstractControl): ValidationErrors | null;
    /**
     * Registers a callback function to call when the validator inputs change.
     */
    registerOnValidatorChange(fn: () => void): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<EmailsValidatorDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<EmailsValidatorDirective, "[emails][formControlName],[emails][formControl],[emails][ngModel]", never, { "emails": { "alias": "emails"; "required": false; }; }, {}, never, never, true, never>;
}

declare class RangeDirective {
    elementRef: ElementRef;
    constructor(elementRef: ElementRef);
    static ɵfac: i0.ɵɵFactoryDeclaration<RangeDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<RangeDirective, "input[type=\"range\"]", never, {}, {}, never, never, true, never>;
}

/**
 * A component to render a range slider in Cumulocity UI. You need to wrap the default range
 * input in this component, then use one of the four available options for the value display mode:
 * `pop`, `start`, `end`, and `inline`
 *
 * ```html
 * <c8y-range valueDisplayMode="inline">
 *   <input id="range" type="range" min="0" max="100000" value="0" step="1">
 * </c8y-range>
 * ```
 */
declare class RangeComponent implements OnDestroy, ControlValueAccessor {
    /**
     * Value display mode, available options: `pop`, `start`, `end`, and `inline` (fallback)
     */
    valueDisplayMode: 'pop' | 'inline' | 'end' | 'start';
    /**
     * The range input
     */
    range: RangeDirective;
    /**
     * The range value slider
     */
    rangeValue: TemplateRef<unknown>;
    /**
     * The current value.
     */
    value: number;
    /**
     * The current position of the tooltip from left
     */
    left: string;
    /**
     * @ignore
     */
    onChange: (value: number) => void;
    /**
     * @ignore
     */
    onTouched: () => void;
    /**
     * @ignore
     * @param obj The value to update
     */
    writeValue(obj: () => void): void;
    /**
     * @ignore
     * @param fn The function to register for changes
     */
    registerOnChange(fn: () => void): void;
    /**
     * @ignore
     * @param fn The function to register for changes
     */
    registerOnTouched(fn: () => void): void;
    /**
     * @ignore
     */
    ngAfterContentInit(): void;
    /**
     * @ignore
     */
    ngOnDestroy(): void;
    /**
     * @ignore
     */
    updateValue(): void;
    /**
     * Updates the position of the slider
     */
    updatePosition(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<RangeComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<RangeComponent, "c8y-range", never, { "valueDisplayMode": { "alias": "valueDisplayMode"; "required": false; }; }, {}, ["range", "rangeValue"], ["*"], true, never>;
}

declare function simpleJsonPathValidator(control: AbstractControl): ValidationErrors | null;
declare class SimpleJsonPathValidatorDirective implements Validator {
    validate(control: AbstractControl<any, any>): ValidationErrors | null;
    static ɵfac: i0.ɵɵFactoryDeclaration<SimpleJsonPathValidatorDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<SimpleJsonPathValidatorDirective, "[simpleJsonPath]", never, {}, {}, never, never, true, never>;
}

declare function uniqueInCollectionByPathValidator(collection: Iterable<object>, path: string, comparator?: (val1: any, val2: any) => boolean): ValidatorFn;
declare class UniqueInCollectionByPathValidationDirective implements Validator {
    collection: Iterable<object>;
    path: string;
    comparator: (val1: any, val2: any) => boolean;
    validate(control: AbstractControl): ValidationErrors | null;
    static ɵfac: i0.ɵɵFactoryDeclaration<UniqueInCollectionByPathValidationDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<UniqueInCollectionByPathValidationDirective, "[uniqueByPath]", never, { "collection": { "alias": "collection"; "required": false; }; "path": { "alias": "path"; "required": false; }; "comparator": { "alias": "comparator"; "required": false; }; }, {}, never, never, true, never>;
}

declare const ARRAY_VALIDATION_PREFIX = "INNER_ARRAY_ERROR_";
type ArrayValidationErrors = {
    [key: string]: ArrayValidationErrorValue;
};
type ArrayValidationErrorValue = {
    isArrayError: true;
    originalKey: string;
    entries: Array<{
        index: number;
        errorData: unknown;
    }>;
};
/**
 * This method can alter how validators work. It can be used in cases where there is need to validate FormControl
 * that as value, takes array of elements. This allows to reuse validators, that works for such elements.
 * For example if  Validators.minLength(3) is used on control that takes string as value, validator will return error
 * if string is less than 3 characters. If same is done on array of strings, validator will return error if array
 * has less than 3 elements.
 *
 * validateArrayElements(Validators.minLength(3)) method makes it possible to check every member of array if it has minimum 3 characters.
 * If there are elements that raise error, it will be possible to extract these errors using item index.
 *
 * As a example, this can be used for custom form elements, which manipulates array of elements,
 * and there is need to display corresponding error messages for every array member that is displayed, while still using
 * Angular's Validation approach.
 *
 * Errors that are generated by this helper are prefixed with 'INNER_ARRAY_ERROR_'. Reason for this is to prevent overwriting normal validation
 * errors that could have same key
 *
 * @Example
 *
 * let control = new FormControl(['1234', '123456', '123', [Validators.minLength(5), validateArrayElements(Validators.minLength(5))] ])
 *
 * this FormControl has validation errors:
 *
 * {
 *   "INNER_ARRAY_ERROR_minlength": {
 *      isArrayError: true,
 *      originalKey: "minlength",
 *      entries: [
 *        {
 *          index: 0,
 *          errorData: {
 *            requiredLength: 5,
 *            actualLength: 4
 *          }
 *        },
 *        {
 *          index: 2,
 *          errorData: {
 *            requiredLength: 5,
 *            actualLength: 3
 *          }
 *        },
 *      ]
 *    },
 *   "minlength": {
 *     requiredLength: 5,
 *     actualLength: 3
 *   }
 * }
 *
 * @param validator A standard Angular synchronous validator function.
 */
declare function validateArrayElements(validator: ValidatorFn): ValidatorFn;
/**
 * Async version of validateArrayElements.
 *
 * Note that Angular by design doesn't execute async validators if synchronous validators returns any error.
 * @param validator A standard Angular asynchronous validator function.
 */
declare function asyncValidateArrayElements(validator: AsyncValidatorFn): AsyncValidatorFn;

/**
 * This pipe should be used in pair with validateArrayElements function - it allows to distribute
 * errors for each position in array, from the object prepared by validateArrayElements.
 *
 * ```ts
 * errors = {
 *  "INNER_ARRAY_ERROR_minlength": {
 *    isArrayError: true,
 *    originalKey: "minlength",
 *    entries: [
 *      {
 *        index: 0,
 *        errorData: {
 *        requiredLength: 5,
 *        actualLength: 4
 *        }
 *      },
 *      {
 *        index: 2,
 *        errorData: {
 *          requiredLength: 5,
 *          actualLength: 3
 *        }
 *      },
 *    ]
 *  },
 *  "minlength": {
 *    requiredLength: 5,
 *    actualLength: 3
 *  }
 * }
 * ```
 *
 * ```html
 * <small *ngFor="let error of errors | extractArrayValidationErrors:index | keyvalue">
 *  {{ error.key | humanizeValidationMessage | translate: error.value }}
 * </small>
 * ```
 *
 * Above code renders only these error messages that are generated by Array entries.
 *
 */
declare class ExtractArrayValidationErrorsPipe implements PipeTransform {
    transform(validationErrors: ArrayValidationErrors | ValidationErrors | null, index: number): ValidationErrors | null;
    static ɵfac: i0.ɵɵFactoryDeclaration<ExtractArrayValidationErrorsPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<ExtractArrayValidationErrorsPipe, "extractArrayValidationErrors", true>;
}

/**
 * This pipe should be used in case when there might be generic Array validators, that could populate error object
 * with errors that are directly related to array elements. Such errors should be handled separately, but there still
 * might be errors that applies to whole array. This allows to filter out entry-specific messages from error object.
 *
 * ```ts
 * errors = {
 *  "INNER_ARRAY_ERROR_minlength": {
 *    isArrayError: true,
 *    originalKey: "minlength",
 *    entries: [
 *    {
 *      index: 0,
 *      errorData: {
 *        requiredLength: 5,
 *        actualLength: 4
 *      }
 *    },
 *    {
 *      index: 2,
 *      errorData: {
 *        requiredLength: 5,
 *        actualLength: 3
 *      }
 *    },
 *    ]
 *  },
 *  "minlength": {
 *    requiredLength: 5,
 *    actualLength: 3
 *  }
 * }
 * ```
 *
 * ```html
 * <small *ngFor="let error of errors | filterNonArrayValidationErrors | keyvalue">
 *  {{error.key | humanizeValidationMessage | translate: error.value}}
 * </small>
 * ```
 *
 * Above code renders only these error messages that are not generated by Array entries.
 *
 */
declare class FilterNonArrayValidationErrorsPipe implements PipeTransform {
    transform(validationErrors: ArrayValidationErrors | ValidationErrors): ValidationErrors | null;
    static ɵfac: i0.ɵɵFactoryDeclaration<FilterNonArrayValidationErrorsPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<FilterNonArrayValidationErrorsPipe, "filterNonArrayValidationErrors", true>;
}

/**
 * This pipe is responsible for transforming validation error key to actual translatable that
 * are defined in ValidationPattern class.
 *
 * ```html
 * <c8y-message>
 *  {{ 'minLength' | humanizeValidationMessage }}
 * </c8y-message>
 * ```
 *
 * Above code renders corresponding validation message for minLength:
 * "Should have at least {{ requiredLength }} characters"
 *
 * It is possible to chain translate pipe:
 *
 * ```ts
 * const errorData = { requiredLength: 5, actualLength: 1};
 * ```
 *
 * ```html
 * <div>
 *  {{ 'minLength' | humanizeValidationMessage | translate: errorData  }}
 * </div>
 * ```
 *
 * should render: "Should have at least 5 characters"
 *
 * It is also possible to provide custom translation message. For example:
 *
 * ```ts
 * const errorData = { requiredLength: 5, actualLength: 1 };
 * const customMessages = {
 *   minLength: gettext("File name should have at least {{ requiredLength }} characters")
 * };
 * ```
 *
 * ```html
 * <div>
 *  {{ 'minLength' | humanizeValidationMessage:customMessages | translate: errorData }}
 * </div>
 * ```
 *
 * should render:
 * "File name should have at least 5 characters"
 */
declare class HumanizeValidationMessagePipe implements PipeTransform {
    transform(errorName: string, customMessages?: {
        [key: string]: string;
    }): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<HumanizeValidationMessagePipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<HumanizeValidationMessagePipe, "humanizeValidationMessage", true>;
}

/**
 * @exports FormGroupComponent A component that allows to group an input and can display warnings and errors.
 * @exports PhoneValidationDirective Allows to validate international phone numbers.
 * @exports NewsletterDirective Allows to subscribe to the newsletter.
 * @exports DefaultValidationDirective Allows to validate some predefined patterns.
 * @exports MessageDirective A directive that allows to define messages.
 * @exports MessagesComponent Allows to display error messages.
 * @exports RangeComponent A component that allows to display a styled range slider.
 */
declare class FormsModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<FormsModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<FormsModule, never, [typeof CommonModule, typeof i2$1.FormsModule, typeof i2$1.ReactiveFormsModule, typeof i3$1.PopoverModule, typeof i3.TooltipModule, typeof FormGroupComponent, typeof MessageDirective, typeof MessagesComponent, typeof PhoneValidationDirective, typeof DefaultValidationDirective, typeof MinValidationDirective, typeof MaxValidationDirective, typeof InputGroupEditableComponent, typeof InputGroupListComponent, typeof InputGroupListContainerDirective, typeof JsonValidationPrettifierDirective, typeof TextAreaRowHeightDirective, typeof RequiredInputPlaceholderDirective, typeof IpRangeInputListComponent, typeof FilterInputComponent, typeof EmailsValidatorDirective, typeof RangeDirective, typeof RangeComponent, typeof SimpleJsonPathValidatorDirective, typeof UniqueInCollectionByPathValidationDirective, typeof ExtractArrayValidationErrorsPipe, typeof FilterNonArrayValidationErrorsPipe, typeof HumanizeValidationMessagePipe], [typeof PhoneValidationDirective, typeof DefaultValidationDirective, typeof MinValidationDirective, typeof MaxValidationDirective, typeof i2$1.FormsModule, typeof FormGroupComponent, typeof MessageDirective, typeof MessagesComponent, typeof InputGroupEditableComponent, typeof InputGroupListComponent, typeof InputGroupListContainerDirective, typeof JsonValidationPrettifierDirective, typeof TextAreaRowHeightDirective, typeof RequiredInputPlaceholderDirective, typeof IpRangeInputListComponent, typeof FilterInputComponent, typeof EmailsValidatorDirective, typeof RangeDirective, typeof RangeComponent, typeof SimpleJsonPathValidatorDirective, typeof UniqueInCollectionByPathValidationDirective, typeof ExtractArrayValidationErrorsPipe, typeof FilterNonArrayValidationErrorsPipe, typeof HumanizeValidationMessagePipe]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<FormsModule>;
}

interface ISelectModalObject {
    groupId: string | number;
    body: ISelectModalBodyPart[];
    options: ISelectModalOption[];
    additionalInformation?: ISelectModalBodyPart;
}
interface ISelectModalOption {
    body: ISelectModalBodyPart[];
    obj: IIdentified;
    selected?: boolean;
    template?: TemplateRef<any>;
}
interface ISelectModalBodyPart {
    value: string;
    class?: string;
}
/**
 * Use event to trigger an update on a select modal entry.
 */
interface IUpdateItemEvent<T> {
    /** Object refering to the item that is to be updated */
    object: ISelectModalObject;
    /** Allows to define a template that will be rendered next to the item option label. */
    template?: TemplateRef<T>;
    /**
     * A function to call whenever an item is updated.
     * Allows to read or modify the object attached to the updated item,
     * e.g. to set a flag on the object.
     */
    mapper?: (obj: IIdentified) => IIdentified;
}
interface ModalLabels {
    ok?: string;
    cancel?: string;
}
declare enum ModalSelectionMode {
    SINGLE = "single",
    MULTI = "multi"
}

/**
 * Defines options to be displayed in the confirm dialog.
 */
interface ConfirmOptions {
    [key: string]: ConfirmOption;
}
interface ConfirmOption {
    text: string;
    checked?: boolean;
    showIf?: boolean | (() => boolean | Promise<boolean> | Observable<boolean>);
    /**
     * Will disable the current option when an option with the given key is selected.
     */
    disabledByKey?: string;
}
declare class ConfirmModalComponent implements OnInit, OnDestroy {
    private modal;
    result: Promise<boolean | {
        confirmed: boolean;
        confirmOptions: {
            [key: string]: boolean;
        };
    }>;
    dismiss: () => void;
    close: () => void;
    title: string;
    body: string | SafeHtml;
    confirmOptions: ConfirmOptions;
    status: StatusType;
    requireCodeVerification?: boolean;
    set labels(labels: ModalLabels);
    get labels(): ModalLabels;
    code: string;
    confirmString: string;
    private _labels;
    constructor(modal: BsModalRef);
    ngOnInit(): void;
    get classIcon(): string;
    get classAlert(): string;
    ngOnDestroy(): void;
    isHtml(str: string | SafeHtml): boolean;
    canConfirmWithCode(): boolean;
    get isOkButtonDisabled(): boolean;
    private generateRandomCode;
    static ɵfac: i0.ɵɵFactoryDeclaration<ConfirmModalComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ConfirmModalComponent, "c8y-confirm-modal", never, { "title": { "alias": "title"; "required": false; }; "body": { "alias": "body"; "required": false; }; "confirmOptions": { "alias": "confirmOptions"; "required": false; }; "status": { "alias": "status"; "required": false; }; "requireCodeVerification": { "alias": "requireCodeVerification"; "required": false; }; "labels": { "alias": "labels"; "required": false; }; }, {}, never, ["*"], true, never>;
}

/**
 * C8Y component for creating modals.
 *
 * Creating custom modal:
 * ```typescript
 *  import { Component } from "@angular/core";
 *  import { Subject } from 'rxjs';
 *
 * @Component({
 *  selector: "my-modal",
 *  template: `
 *    <c8y-modal title="CustomTitle"
 *      (onClose)="onClose($event)"
 *      (onDismiss)="onDismiss($event)"
 *      [labels]="labels"
 *      [disabled]="true" <- will disable ok button
 *      >
 *        <span>I am body of modal</span>
 *        <span>For simple string use body="string"</span>
 *    </c8y-modal>`
 * })
 *
 * export class MyModalComponent {
 *
 *  closeSubject: Subject<boolean> = new Subject();
 *  labels : ModalLabels = {ok: "customOK", cancel: "customCancel"};
 *
 *  onDismiss(event){
 *    this.closeSubject.next(false);
 *  }
 *
 *  onClose(event) {
 *    this.closeSubject.next(true);
 *  }
 * }
 * ```
 *
 * Showing modal:
 * ```typescript
 * import { BsModalService } from "ngx-bootstrap/modal";
 *
 * constructor(
 *  public bsModalService: BsModalService,
 * ) {}
 *
 * showModal() {
 *  const modalRef = this.bsModalService.show(MyModalComponent);
 *  modalRef.content.closeSubject.subscribe(result => {
 *    console.log('results:', result);
 *  });
 * }
 * ```
 */
declare class ModalComponent {
    private modal;
    /**
     * Emits 'true' when 'cancel' button is clicked.
     */
    onDismiss: EventEmitter<boolean>;
    /**
     * Emits 'true' when 'ok' button is clicked.
     */
    onClose: EventEmitter<boolean>;
    /**
     * Indicates if the 'ok' (confirmation) button is disabled.
     */
    disabled: boolean;
    /**
     * Callback function which is called right after 'ok' button is clicked, before 'onClose' emits.
     */
    close: () => void;
    /**
     * Callback function which is called right after 'cancel' button is clicked, before 'onDismiss' emits.
     */
    dismiss: () => void;
    /**
     * Title of modal.
     */
    title: string;
    /**
     * Modal body.
     */
    body: string;
    /**
     * Indicates if modal should use custom footer provided with content projection (or no footer at all).
     * If false, default footer with 'cancel' and 'ok' buttons will be displayed.
     */
    customFooter: boolean;
    /**
     * CSS classes for modal header.
     */
    headerClasses: string;
    /**
     * Custom labels for 'cancel' and 'ok' buttons.
     */
    set labels({ ok, cancel }: ModalLabels);
    get labels(): ModalLabels;
    private _labels;
    constructor(modal: BsModalRef);
    /**
     * Hides modal or calls 'dismiss' input callback, then emits 'onDismiss' output.
     * Method is called when 'cancel' button is clicked, but can be also triggered by accessing 'ModalComponent' instance.
     */
    _dismiss(): void;
    /**
     * Hides modal or calls 'close' input callback, then emits 'onClose' output.
     * Method is called when 'ok' button is clicked, but can be also triggered by accessing 'ModalComponent' instance.
     */
    _close(): void;
    /**
     * 'Enter' keyboard button handler. Calls '_dismiss' or '_close' method when only one corresponding button exists.
     * @param _event Enter keydown event
     */
    onEnterKeyDown(_event: KeyboardEvent): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<ModalComponent, [{ optional: true; }]>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ModalComponent, "c8y-modal", never, { "disabled": { "alias": "disabled"; "required": false; }; "close": { "alias": "close"; "required": false; }; "dismiss": { "alias": "dismiss"; "required": false; }; "title": { "alias": "title"; "required": false; }; "body": { "alias": "body"; "required": false; }; "customFooter": { "alias": "customFooter"; "required": false; }; "headerClasses": { "alias": "headerClasses"; "required": false; }; "labels": { "alias": "labels"; "required": false; }; }, { "onDismiss": "onDismiss"; "onClose": "onClose"; }, never, ["[c8y-modal-title]", "*", "[c8y-modal-footer-custom]", "[c8y-modal-footer]"], true, never>;
}

/**
 * The angular module definition for modal.
 * @exports ConfirmModalComponent
 * @exports ModalComponent
 * @exports PopoverConfirmComponent
 */
declare class ModalModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<ModalModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<ModalModule, never, [typeof i1$3.ModalModule, typeof CommonModule, typeof i3$1.PopoverModule, typeof ConfirmModalComponent, typeof ModalComponent, typeof PopoverConfirmComponent], [typeof ConfirmModalComponent, typeof ModalComponent, typeof PopoverConfirmComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<ModalModule>;
}

declare class TotpChallengeComponent {
    private users;
    private alert;
    /**
     * Calls the verify endpoint if set to true (default true)
     */
    verify: boolean;
    /**
     * Emits the token on success.
     */
    onSuccess: EventEmitter<any>;
    /**
     * Emits if set up two-factor authentication is canceled.
     */
    totpUnconfirmedEmitter: EventEmitter<any>;
    loading: boolean;
    hasError: boolean;
    isModal: boolean;
    model: {
        token: string;
    };
    private modal;
    constructor(users: UserService, alert: AlertService);
    verifyCode(): Promise<void>;
    cancel(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<TotpChallengeComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<TotpChallengeComponent, "c8y-totp-challenge", never, { "verify": { "alias": "verify"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "hasError": { "alias": "hasError"; "required": false; }; "isModal": { "alias": "isModal"; "required": false; }; }, { "onSuccess": "onSuccess"; "totpUnconfirmedEmitter": "totpUnconfirmedEmitter"; }, never, never, true, never>;
}

declare class PasswordConfirm implements Validator {
    passwordConfirm: string;
    constructor(passwordConfirm: string);
    validate(abControl: AbstractControl): {
        [key: string]: any;
    };
    static ɵfac: i0.ɵɵFactoryDeclaration<PasswordConfirm, [{ attribute: "passwordConfirm"; }]>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<PasswordConfirm, "[passwordConfirm]", never, {}, {}, never, never, true, never>;
}

interface PasswordStrengthColor {
    colorName: string;
    color: string;
    description: string;
    passwordStrength: PasswordStrength;
}
interface NewPassword {
    password: string;
    color?: string;
    passwordStrength: PasswordStrength;
}

declare class PasswordService {
    private modalService;
    private DEFAULT_PASSWORD_MIN_LENGTH;
    private GREEN;
    private YELLOW;
    private RED;
    constructor(modalService: BsModalService);
    confirmPassword(): Observable<boolean>;
    /**
     * Returns an observable with the password provided by user:
     * - `string` when user provided a value
     * - `null` when user cancelled the modal
     */
    currentPassword(): Observable<string | null>;
    hasLowerCase(password: string): boolean;
    hasUpperCase(password: string): boolean;
    hasNumbers(password: string): boolean;
    hasSpecialChars(password: string): boolean;
    getStrengthColor(password: string): PasswordStrengthColor;
    getDefaultPasswordMinLength(): number;
    static ɵfac: i0.ɵɵFactoryDeclaration<PasswordService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<PasswordService>;
}

/**
 * @deprecated: [MTM-56403] Password strength indicator removed from UI in favor of the enhanced password strength check list.
 */
declare class PasswordStrengthComponent {
    private passwordStrengthCheckerService;
    set password(password: string);
    strength: EventEmitter<any>;
    model: any;
    constructor(passwordStrengthCheckerService: PasswordService);
    static ɵfac: i0.ɵɵFactoryDeclaration<PasswordStrengthComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<PasswordStrengthComponent, "c8y-password-strength", never, { "password": { "alias": "password"; "required": false; }; }, { "strength": "strength"; }, never, never, true, never>;
}

declare class PasswordStrengthService {
    private ui;
    GREEN_MIN_LENGTH_DEFAULT: number;
    private passwordStrengthSetting;
    constructor(ui: AppStateService);
    /**
     * Gets the minimal number of characters that a password should have to be considered a "green" strong one.
     * @return The min length for password or default value.
     */
    getGreenMinLength(): Promise<number>;
    /**
     * Checks if password strength is enforced for system
     * by retrieving value of `enforceStrength` property from loginOptions response
     * @param refresh boolean used to refresh the app state where result of loginOptions response is stored.
     * If false, it takes value from memory,
     * if true, it refresh the app state value and then retrives data.
     * @return boolean value, true if enforced, false otherwise.
     */
    getEnforcePasswordStrength(refresh?: any): Promise<boolean>;
    /**
     * Checks if password strength is enforced for particular tenant
     * by retrieving value of `strengthValidity` property from loginOptions response
     * @param refresh boolean used to refresh the app state where result of loginOptions response is stored.
     * If false, it takes value from memory,
     * if true, it refresh the app state value and then retrives data.
     * @return boolean value, true if enforced, false otherwise.
     */
    getPasswordStrengthValidity(refresh?: boolean): Promise<boolean>;
    /**
     * Function determines if enforced strength checks should be enabled for current tenant
     * based on properties retrieved from loginOptions
     * @param options object containing specific options:
     *    - {refresh: true} - refreshes values of app state and returns fresh values as result of call
     * @return boolean value, true if strength is enforced for tenant, false otherwise.
     */
    getPasswordStrengthEnforced(options?: {
        refresh: true;
    }): Promise<boolean>;
    private getBasicAuthLoginOption;
    static ɵfac: i0.ɵɵFactoryDeclaration<PasswordStrengthService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<PasswordStrengthService>;
}

declare class PasswordCheckListComponent implements OnInit, OnChanges {
    private passwordStrength;
    private passwordService;
    strengthEnforced: boolean;
    password: string;
    /**
     * Optional override for the green minimum length from tenant login options.
     * When provided, this value is used instead of fetching from PasswordStrengthService.
     * Useful for downgraded AngularJS usage where the value comes from an interceptable HTTP call.
     */
    greenMinLength?: number;
    onRequirementsFulfilled: EventEmitter<boolean>;
    minGreenLength: number;
    recommendedMinLength: number;
    recommendedMinLengthCheck: {
        label: string;
        check: (password: string) => boolean;
        icon: string;
        contextualColor: string;
        textColor: string;
    };
    enhancedStrengthCheckList: ({
        label: "Include lowercase characters (for example, abcdef)";
        check: (password: string) => boolean;
        icon: string;
        contextualColor: string;
        textColor: string;
    } | {
        label: "Include uppercase characters (for example, ABCDEF)";
        check: (password: string) => boolean;
        icon: string;
        contextualColor: string;
        textColor: string;
    } | {
        label: "Include numbers (for example, 123456)";
        check: (password: string) => boolean;
        icon: string;
        contextualColor: string;
        textColor: string;
    } | {
        label: "Include symbols (for example, !@#$%^)";
        check: (password: string) => boolean;
        icon: string;
        contextualColor: string;
        textColor: string;
    })[];
    basicChecklist: {
        label: "Must have at least {{length}} characters";
        check: (password: string) => boolean;
        icon: string;
        contextualColor: string;
        textColor: string;
    }[];
    combinedChecklist: any[];
    private defaultMinLength;
    constructor(passwordStrength: PasswordStrengthService, passwordService: PasswordService);
    ngOnInit(): Promise<void>;
    ngOnChanges(changes: SimpleChanges): void;
    get translateParams(): {
        length: number;
        recommendedLength: number;
    };
    checkRequirement(requirement: any, password: any): any;
    onPasswordChange(password: unknown): void;
    isPasswordValid(): boolean;
    private updateMinGreenLength;
    static ɵfac: i0.ɵɵFactoryDeclaration<PasswordCheckListComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<PasswordCheckListComponent, "c8y-password-check-list", never, { "strengthEnforced": { "alias": "strengthEnforced"; "required": false; }; "password": { "alias": "password"; "required": false; }; "greenMinLength": { "alias": "greenMinLength"; "required": false; }; }, { "onRequirementsFulfilled": "onRequirementsFulfilled"; }, never, never, true, never>;
}

type PasswordErrorKey = 'password' | 'passwordSimple';
type PasswordValidationResult = {
    valid: true;
    errorKey: null;
} | {
    valid: false;
    errorKey: PasswordErrorKey;
};
/**
 * Shared password validation service for Angular and AngularJS.
 *
 * Validation logic:
 * - Invalid characters → error with full message (allowed symbols)
 * - Too long (>32) → error
 * - Too short when NOT enforced → simple error (length only)
 * - Too short when enforced → valid (checklist handles it)
 */
declare class PasswordValidationService {
    readonly DEFAULT_MIN_LENGTH = 8;
    readonly MAX_LENGTH = 32;
    readonly ALLOWED_SYMBOLS = "`~!@#$%^&*()_|+-=?;:'\",.<>{}[]\\/";
    readonly VALID_CHARS_PATTERN: RegExp;
    /**
     * @param password The password to validate.
     * @param strengthEnforced Whether password strength enforcement is enabled.
     * @param minGreenLength Minimum length to be considered strong/green.
     *   When strength is enforced, this is the green minimum from tenant settings.
     *   Defaults to DEFAULT_MIN_LENGTH.
     */
    validate(password: string, strengthEnforced: boolean, minGreenLength?: number): PasswordValidationResult;
    hasValidCharsOnly(password: string): boolean;
    static ɵfac: i0.ɵɵFactoryDeclaration<PasswordValidationService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<PasswordValidationService>;
}

declare class NewPasswordComponent implements OnChanges, OnInit {
    private passwordStrength;
    private passwordValidation;
    private cdRef;
    elementRef: ElementRef;
    password: EventEmitter<object | NewPassword>;
    showChangePasswordButton: boolean;
    requireStrongPassword: boolean;
    model: any;
    changePassword: boolean;
    passwordEnforced: boolean;
    minlength: number;
    requirementsFulfilled: boolean;
    private readonly DEFAULT_MIN_LENGTH;
    /**
     * Returns effective min length for validation:
     * - When enforceStrength=true: use greenMinLength (or default 8)
     * - When enforceStrength=false: always use default 8
     */
    get effectiveMinLength(): number;
    newPasswordModel: NgModel;
    set _newPasswordModel(ngModel: NgModel);
    constructor(passwordStrength: PasswordStrengthService, passwordValidation: PasswordValidationService, cdRef: ChangeDetectorRef, elementRef: ElementRef);
    passwordChecklistValidator: ValidatorFn;
    ngOnInit(): Promise<void>;
    ngOnChanges(changes: SimpleChanges): Promise<void>;
    newPasswordChanged(): void;
    updateValidity(requirementsFulfilled: boolean): void;
    loadPasswordStrengthSettings(): Promise<void>;
    toggleChangePassword(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<NewPasswordComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<NewPasswordComponent, "c8y-new-password", never, { "showChangePasswordButton": { "alias": "showChangePasswordButton"; "required": false; }; "requireStrongPassword": { "alias": "requireStrongPassword"; "required": false; }; }, { "password": "password"; }, never, never, true, never>;
}

declare class PasswordConfirmModalComponent {
    user: UserService;
    ui: AppStateService;
    private client;
    private alert;
    passwordConfirmedEmitter: EventEmitter<boolean>;
    loading: boolean;
    password: string;
    private modal;
    constructor(user: UserService, ui: AppStateService, client: FetchClient, alert: AlertService);
    passwordConfirm(): Promise<void>;
    cancel(): void;
    createNewClient(auth: BasicAuth, baseUrl: string): Client;
    private emitSuccessAndClose;
    static ɵfac: i0.ɵɵFactoryDeclaration<PasswordConfirmModalComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<PasswordConfirmModalComponent, "c8y-password-confirm-modal", never, {}, { "passwordConfirmedEmitter": "passwordConfirmedEmitter"; }, never, never, true, never>;
}

declare class CurrentPasswordModalComponent {
    private modal;
    currentPasswordEmitter: EventEmitter<string>;
    password: string;
    constructor(modal: BsModalRef);
    passwordConfirm(): void;
    cancel(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<CurrentPasswordModalComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<CurrentPasswordModalComponent, "c8y-current-password-modal", never, {}, { "currentPasswordEmitter": "currentPasswordEmitter"; }, never, never, true, never>;
}

declare class TotpSetupComponent implements OnInit {
    private user;
    private alert;
    totpSecret: ITotp;
    get qrCodeImage(): string;
    get secret(): string;
    get qrData(): string;
    constructor(user: UserService, alert: AlertService);
    ngOnInit(): Promise<void>;
    static ɵfac: i0.ɵɵFactoryDeclaration<TotpSetupComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<TotpSetupComponent, "c8y-totp-setup", never, {}, {}, never, never, true, never>;
}

/**
 * The component is used to display a password control that includes the functionality of hiding and showing the input value.
 */
declare class PasswordInputComponent implements ControlValueAccessor {
    /**
     * Id of input
     */
    id?: string;
    /**
     * Value for autocomplete attribute of input
     */
    autocomplete?: string;
    /**
     * shows large input when true (default: true)
     */
    large?: boolean;
    value: string;
    disabled: boolean;
    type: string;
    onChange: (value: any) => void;
    onTouched: () => void;
    writeValue(value: any): void;
    registerOnChange(fn: any): void;
    registerOnTouched(fn: any): void;
    setDisabledState?(isDisabled: boolean): void;
    onInput($event: any): void;
    onFocusOut(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<PasswordInputComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<PasswordInputComponent, "c8y-password-input", never, { "id": { "alias": "id"; "required": false; }; "autocomplete": { "alias": "autocomplete"; "required": false; }; "large": { "alias": "large"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * The angular module definition for new password.
 * @exports PasswordStrengthComponent
 * @exports PasswordCheckListComponent
 * @exports PasswordConfirm
 * @exports NewPasswordComponent
 * @exports PasswordConfirmModalComponent
 */
declare class AuthenticationModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<AuthenticationModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<AuthenticationModule, never, [typeof FormsModule, typeof i3.TooltipModule, typeof CommonModule, typeof ModalModule, typeof i5$1.QRCodeComponent, typeof TotpChallengeComponent, typeof PasswordConfirm, typeof PasswordStrengthComponent, typeof PasswordCheckListComponent, typeof NewPasswordComponent, typeof PasswordConfirmModalComponent, typeof CurrentPasswordModalComponent, typeof TotpSetupComponent, typeof PasswordInputComponent], [typeof TotpChallengeComponent, typeof PasswordStrengthComponent, typeof PasswordCheckListComponent, typeof PasswordConfirm, typeof NewPasswordComponent, typeof PasswordConfirmModalComponent, typeof CurrentPasswordModalComponent, typeof TotpSetupComponent, typeof PasswordInputComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<AuthenticationModule>;
}

declare class ClipboardModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<ClipboardModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<ClipboardModule, never, [typeof AlertModule], never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<ClipboardModule>;
}

declare class UserDetailsDrawerComponent {
    appState: AppStateService;
    headerService: HeaderService;
    constructor(appState: AppStateService, headerService: HeaderService);
    close(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<UserDetailsDrawerComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<UserDetailsDrawerComponent, "c8y-user-details-drawer", never, {}, {}, never, never, true, never>;
}

declare class UserRolesListPipe implements PipeTransform {
    private translateService;
    constructor(translateService: TranslateService$1);
    transform(user: IUser, translate?: boolean): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<UserRolesListPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<UserRolesListPipe, "userRolesList", true>;
}

declare class UserDetailsDrawerModule {
    static providers(): (i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider)[];
    static ɵfac: i0.ɵɵFactoryDeclaration<UserDetailsDrawerModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<UserDetailsDrawerModule, never, [typeof CommonModule, typeof UserDetailsDrawerComponent, typeof UserRolesListPipe], never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<UserDetailsDrawerModule>;
}

interface UserMenuItem {
    label?: string;
    template?: any;
    icon?: SupportedIconsSuggestions;
    priority: number;
    link?: string;
    target?: string;
    click: any;
}

/**
 * You can either provide a single `UserMenuItem` as parameter:
 * ```typescript
 * hookUserMenu(...)
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 * hookUserMenu([...])
 * ```
 *
 * Or you provide a Service that implements `ExtensionFactory<UserMenuItem>`
 * ```typescript
 * export class MyUserMenuFactory implements ExtensionFactory<UserMenuItem> {...}
 * ...
 * hookUserMenu(MyUserMenuFactory)
 * ```
 * @param userMenu The `UserMenuItem`'s or `ExtensionFactory` to be provided.
 * @param options The options to use for the hook.
 * @returns A `Provider` to be provided in your module.
 */
declare function hookUserMenu(userMenu: GenericHookType<UserMenuItem>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
declare class UserMenuService extends ExtensionPointForPlugins<UserMenuItem> {
    private router;
    constructor(rootInjector: Injector, router: Router, pluginService: PluginsResolveService);
    /**
     * Returns the current state.
     * @readonly
     * @returns The current set of actions.
     */
    get state(): Set<UserMenuItem>;
    /**
     * Adds a new item to the search in the header.
     * @param item The item to add.
     */
    add(item: UserMenuItem): void;
    /**
     * Removes an search from the header.
     * @param item The item to remove.
     */
    remove(item: UserMenuItem): void;
    /**
     * Sets the items observable.
     * @returns The items observable.
     */
    protected setupItemsObservable(): Observable<UserMenuItem[]>;
    static ɵfac: i0.ɵɵFactoryDeclaration<UserMenuService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<UserMenuService>;
}

declare class TitleOutletComponent {
    private headerService;
    private element;
    private zone;
    title: any;
    pageTitleUpdate: boolean;
    constructor(headerService: HeaderService, element: ElementRef, zone: NgZone);
    static ɵfac: i0.ɵɵFactoryDeclaration<TitleOutletComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<TitleOutletComponent, "c8y-title-outlet", never, {}, {}, never, never, true, never>;
}

declare class TitleComponent implements AfterViewInit, OnDestroy {
    private headerService;
    /** Whether to update the browser's page title with the content of the title. */
    pageTitleUpdate: boolean;
    /** The title template to be displayed in the header. */
    template: any;
    private viewInitTimeout;
    constructor(headerService: HeaderService);
    ngAfterViewInit(): void;
    ngOnDestroy(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<TitleComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<TitleComponent, "c8y-title", never, { "pageTitleUpdate": { "alias": "pageTitleUpdate"; "required": false; }; }, {}, never, ["*"], true, never>;
}

/**
 * A crumb of the breadcrumb.
 */
type BreadcrumbItem = BreadcrumbItemWithComponent | BreadcrumbItemWithLabel;
interface BreadcrumbItemBase {
    /**
     * The icon to show on this BreadCrumb item.
     * The icon will only be displayed if it is the first crumb. (optional)
     */
    icon?: SupportedIconsSuggestions;
    /**
     * Should it be translated or not.
     * @todo verify if needed.
     * @deprecated Only needed in upgrade case.
     */
    translate?: boolean;
}
interface BreadcrumbItemWithLabel extends BreadcrumbItemBase {
    /**
     * The label to show for that crumb.
     */
    label: string;
    /**
     * The angular route path to navigate to on click.
     */
    path: string;
    template?: never;
    component?: never;
}
interface BreadcrumbItemWithTemplate extends BreadcrumbItemBase {
    /**
     * Angular template used for Content Projection (optional)
     */
    template: TemplateRef<any>;
    label?: never;
    path?: never;
    component?: never;
}
interface BreadcrumbItemWithComponent extends BreadcrumbItemBase {
    /**
     * A component to use as a BreadcrumbItem.
     * Note: As a BreadcrumbItem is rendered in a <li> it is good practice
     * to remove the wrapper node to not run into CSS issues. You
     * can do so by defining the selector as a li: `li[customExtension]`
     * (see: https://stackoverflow.com/a/56887630/923270 or
     * https://stackoverflow.com/a/38716164/923270)
     */
    component: Type<any>;
    /**
     * The injector to use. If not set, the default root injector will be used.
     */
    injector?: Injector;
    label?: never;
    path?: never;
    template?: never;
}
/**
 * One Page can have multiple Breadcrumb paths components.
 * E.g. A device which is in multiple folders.
 */
interface Breadcrumb {
    /**
     * The crumbs.
     */
    items: BreadcrumbItem[];
    /**
     * The injector to use. If not set, the default root injector will be used.
     */
    injector?: Injector;
    /**
     * The breadcrumbs with the highest priority will be shown first.
     */
    priority?: number;
    /**
     * Force initial dropdown open state if there are multiple paths.
     */
    forceDropdownOpen?: boolean;
}
/**
 * Factory to implement if used in a hook for Multi Provider extension.
 */
type BreadcrumbFactory = ExtensionFactory<Breadcrumb>;

/**
 * An extension HOOK can use either a pure value:
 * ```typescript
 *  { provide: HOOK_X, useValue: { ...hookValue }, multi: true }
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  { provide: HOOK_X, useValue: [{ ...hookValues }], multi: true }
 * ```
 *
 * Or an ExtensionFactory which allows to define a get() function. This function
 * gets called on each navigation with the current route and can return values
 * async (observable or promise).
 * ```typescript
 *  { provide: HOOK_X, useFactory: { get: (route) => doSomethingAsync(route) }, multi: true }
 * ```
 */
type BreadcrumbExtension = Breadcrumb | Breadcrumb[] | ExtensionFactory<Breadcrumb>;
/**
 * @deprecated Consider using the `hookBreadcrumb` function instead.
 */
declare const HOOK_BREADCRUMB: InjectionToken<unknown>;
/**
 * You can either provide a single `Breadcrumb` as parameter:
 * ```typescript
 *  hookBreadcrumb(...)
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  hookBreadcrumb([...])
 * ```
 *
 * Or you provide an Service that implements `ExtensionFactory<Breadcrumb>`
 * ```typescript
 *  export class MyBreadcrumbFactory implements ExtensionFactory<Breadcrumb> {...}
 *  ...
 *  hookBreadcrumb(MyBreadcrumbFactory)
 * ```
 * A typed alternative to `HOOK_BREADCRUMB`.
 * @param breadcrumb The `Breadcrumb`'s or `ExtensionFactory` to be provided.
 * @returns An `Provider` to be provided in your module.
 */
declare function hookBreadcrumb(breadcrumb: GenericHookType<Breadcrumb>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
declare class BreadcrumbService extends ExtensionPointForPlugins<Breadcrumb> {
    private router;
    private preferredPath;
    constructor(rootInjector: Injector, router: Router, plugins: PluginsResolveService);
    get state(): Set<Breadcrumb>;
    /**
     * Adds a new item to the action bar in the header.
     * @param item The item to add.
     */
    add(item: Breadcrumb): void;
    /**
     * Removes an action bar item from the header.
     * @param item The item to remove.
     */
    remove(item: Breadcrumb): void;
    /**
     * Sets the crumb that contains that path to the top.
     * @param path The path to prefer.
     */
    selectPreferredByPath(path: string): void;
    sortByPreferredPath(breadcrumbs: Breadcrumb[]): Breadcrumb[];
    protected setupItemsObservable(): Observable<Breadcrumb[]>;
    static ɵfac: i0.ɵɵFactoryDeclaration<BreadcrumbService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<BreadcrumbService>;
}

/**
 * An extension HOOK can use either a pure value:
 * ```typescript
 *  { provide: HOOK_X, useValue: { ...hookValue }, multi: true }
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  { provide: HOOK_X, useValue: [{ ...hookValues }], multi: true }
 * ```
 *
 * Or an ExtensionFactory which allows to define a get() function. This function
 * gets called on each navigation with the current route and can return values
 * async (observable or promise).
 * ```typescript
 *  { provide: HOOK_X, useFactory: { get: (route) => doSomethingAsync(route) }, multi: true }
 * ```
 */
type DocLinkExtension = DocLink | DocLink[] | ExtensionFactory<DocLink>;
declare const HOOK_DOCS: InjectionToken<DocLinkExtension[]>;
/**
 * You can either provide a single `DocLink` as parameter:
 * ```typescript
 *  hookOptions(...)
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  hookOptions([...])
 * ```
 *
 * Or you provide an Service that implements `ExtensionFactory<DocLink>`
 * ```typescript
 *  @Injectable({ providedIn: 'root' })
 *  export class MyDocLinkFactory implements ExtensionFactory<DocLink> {...}
 *  ...
 *  hookOptions(MyDocLinkFactory)
 * ```
 * A typed alternative to `HOOK_DOCS`.
 * @param doc The `DocLink`'s or `ExtensionFactory` to be provided.
 * @returns An `Provider` to be provided in your module.
 */
declare function hookDocs(doc: GenericHookType<DocLink>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
/**
 * A link on the right drawer.
 */
type DocLink = DocLinkWithComponent | DocLinkWithLabel;
interface DocLinkBasic {
    /**
     * Doc is shown under Help & Support. Quicklink is displayed bigger and shown at the top.
     */
    type: 'doc' | 'quicklink';
    /**
     * Used for ordering the links.
     */
    priority?: number;
    /**
     * Specifies the target of the link.
     * - If null, the link opens in the same tab.
     * - If '_blank', the link opens in a new tab.
     */
    target?: string;
}
interface DocLinkWithComponent extends DocLinkBasic {
    /**
     * A component to render.
     */
    component: Type<any>;
    /**
     * A injector to use. If none is set the default root one is used.
     */
    injector?: Injector;
    icon?: never;
    iconSrc?: never;
    label?: never;
    url?: never;
    /**
     @deprecated pass a `url` instead
     */
    click?: never;
}
interface DocLinkWithLabel extends DocLinkBasic {
    /**
     * The (css) icon to display.
     */
    icon: SupportedIconsSuggestions;
    /**
     * An alternative image-path as icon.
     */
    iconSrc?: string;
    /**
     * A label to display.
     */
    label: string;
    /**
     * A url where the link naviagates to.
     */
    url: string;
    /**
     * A handler which is called if the DocLink is clicked.
     * @deprecated pass a `url` instead
     */
    click?: any;
    component?: never;
    injector?: never;
}

declare class DocsService extends ExtensionPointWithoutStateForPlugins<DocLink> {
    private options;
    private app;
    private router;
    /**
     * Default documentation URL.
     */
    readonly DEFAULT_DOCS_BASE_URL = "https://cumulocity.com";
    constructor(options: OptionsService, app: AppStateService, rootInjector: Injector, router: Router, plugins: PluginsResolveService);
    getBaseUrl(uiVersion?: string | {
        ngx: string;
    }): string;
    /**
     * Takes a URL and replaces all `{{ version }}` placeholders with the relevant docs version
     * (the version is derived from the app state or from the provided parameter).
     * @param url Any URL that contains `{{ version }}` placeholders.
     * @param uiVersion A version string or object, defaults to the app state version.
     * @returns The URL with replaced `{{ version }}` placeholders.
     */
    getUrlWithDocsVersion(url: string, uiVersion?: string | {
        ngx: string;
    }): string;
    get templateStr(): string;
    getUserGuideLink(link: any): any;
    list(): Promise<DocLink[]>;
    get(): DocLink[];
    getItemsFromHookDocs(): DocLink[];
    protected setupItemsObservable(): Observable<DocLink[]>;
    private getLink;
    private prefixWithSlash;
    /**
     * Returns the most relevant version of documentation for the given version of UI.
     * For maintenance versions, it's the first version in the line, e.g. 1017.0.123 -> 10.17.0.
     * For develop versions, it's the next minor one, e.g. 1017.123.0-SNAPSHOT -> 10.18.0.
     *
     * @param uiVersion The version of UI.
     * @private
     */
    private getDocsVersionForUiVersion;
    static ɵfac: i0.ɵɵFactoryDeclaration<DocsService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<DocsService>;
}

/**
 * The search is an icon that appears on the upper right corner
 * and opens a template or a search bar on click on it.
 * @deprecated Please don't use the search factory. It will be refactored soon.
 */
interface Search {
    /**
     * The name of the search
     * @deprecated Needed for upgrade only.
     */
    name?: string;
    /**
     * The icon for the search. Defaults to the search icon. (optional)
     */
    icon?: SupportedIconsSuggestions;
    /**
     * Ordering of the actions (high number first) (optional)
     */
    priority?: number;
    /**
     * Angular template used for Content Projection (optional)
     */
    template?: any;
    /**
     * The default search term. Defaults to an empty string (optional=)
     */
    term?: string;
    /**
     * Used to load the providers for the components. If not provided, default injector us used.
     */
    injector?: Injector;
    /**
     * A function triggers if the user performance a search.
     * @param term The term used by the user.
     */
    onSearch(term: any): any;
}
/**
 * Factory to implement if used in a hook for Multi Provider extension.
 */
type SearchFactory = ExtensionFactory<Search>;
/**
 * Feature key for wildcard search.
 */
declare const WILDCARD_SEARCH_FEATURE_KEY = "ui.search.wildcard";

/**
 * A hook to use for Multi Provider extension.
 * Consider using the `hookSearch` function instead.
 * @deprecated Please don't use the search factory. It will be refactored soon.
 */
declare const HOOK_SEARCH: InjectionToken<unknown>;
/**
 * You can either provide a single `Search` as parameter:
 * ```typescript
 *  hookSearch(...)
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  hookSearch([...])
 * ```
 *
 * Or you provide an Service that implements `ExtensionFactory<Search>`
 * ```typescript
 *  export class MySearchFactory implements ExtensionFactory<Search> {...}
 *  ...
 *  hookSearch(MySearchFactory)
 * ```
 * A typed alternative to `HOOK_SEARCH`.
 * @param search The `Search`'s or `ExtensionFactory` to be provided.
 * @returns An `Provider` to be provided in your module.
 * @deprecated Please don't use the search factory. It will be refactored soon.
 */
declare function hookSearch(search: GenericHookType<Search>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
declare enum SearchFilters {
    ONLY_DEVICES = "onlyDevices",
    ONLY_GROUPS_AND_ASSETS = "onlyGroupsAndAssets",
    ALL_FILTERS = "allFilters",
    CURRENT_HIERARCHY = "currentHierarchy"
}
/**
 * A service which defines the search function.
 */
declare class SearchService extends ExtensionPointForPlugins<Search> {
    private router;
    constructor(rootInjector: Injector, router: Router, plugins: PluginsResolveService);
    /**
     * Returns the current state.
     * @readonly
     * @returns The current set of actions.
     */
    get state(): Set<Search>;
    /**
     * Adds a new item to the search in the header.
     * @param item The item to add.
     */
    add(item: Search): void;
    /**
     * Removes an search from the header.
     * @param item The item to remove.
     */
    remove(item: Search): void;
    protected setupItemsObservable(): Observable<Search[]>;
    static ɵfac: i0.ɵɵFactoryDeclaration<SearchService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<SearchService>;
}

declare class HeaderBarComponent implements AfterViewInit {
    headerService: HeaderService;
    actionService: ActionService;
    breadcrumbService: BreadcrumbService;
    searchService: SearchService;
    appState: AppStateService;
    userMenuService: UserMenuService;
    docs: DocsService;
    apiService: ApiService;
    canToggle$: Observable<boolean>;
    appState$: Observable<any>;
    app$: Observable<IApplication>;
    headerOpen: boolean;
    loadingClass$: Observable<{
        active: boolean;
    }>;
    showNotification$: Observable<boolean>;
    /**
     * Can be set to show an header bar with only
     * title, app-switcher and user-menu
     */
    simple: boolean;
    constructor(headerService: HeaderService, actionService: ActionService, breadcrumbService: BreadcrumbService, searchService: SearchService, appState: AppStateService, userMenuService: UserMenuService, docs: DocsService, apiService: ApiService);
    ngAfterViewInit(): void;
    toggleDrawer(): void;
    closeDrawer(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<HeaderBarComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<HeaderBarComponent, "c8y-header-bar", never, { "simple": { "alias": "simple"; "required": false; }; }, {}, never, never, true, never>;
}

declare class UserMenuOutletComponent {
    ui: AppStateService;
    private bsModalService;
    private authService;
    private userMenu;
    private headerService;
    items$: Observable<UserMenuItem[]>;
    open$: Observable<boolean>;
    constructor(ui: AppStateService, bsModalService: BsModalService, authService: SimplifiedAuthService, userMenu: UserMenuService, headerService: HeaderService);
    editUser(): Promise<void>;
    logout(): Promise<void>;
    static ɵfac: i0.ɵɵFactoryDeclaration<UserMenuOutletComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<UserMenuOutletComponent, "c8y-user-menu-outlet", never, {}, {}, never, never, true, never>;
}

/**
 * A service to manage the language of the application.
 */
declare class TranslateService {
    private ngxTranslate;
    private ui;
    private options;
    private pluginsResolveService;
    private document;
    private bsLocaleService;
    static SAVE_LANGUAGE_KEY: string;
    static defaultLang(): string;
    langsDetail: Languages;
    langs: string[];
    private DEFAULT_SEPARATOR;
    constructor(ngxTranslate: TranslateService$1, ui: AppStateService, options: OptionsService, pluginsResolveService: PluginsResolveService, document: Document, bsLocaleService: BsLocaleService);
    /**
     * Switches the app to given locale (incl. Angular, Bootstrap, translations).
     * @param localeCode The locale code. Supported formats:
     * - two-letter codes for language only, for example: `en`, `de`
     * - four-letter codes for language and country, separated with underscore or dash, for example: `zh_CN`, `zh_cn`, `zh-CN`, `zh-cn`
     */
    switchToLanguage(localeCode: string): Promise<void>;
    loadLocalesWithFallback(moduleLang: string, fallbackLang?: string): Promise<void>;
    loadLocales(moduleLang: string): Promise<void>;
    setLanguage(lang: string): Promise<void>;
    /**
     * Finds the first supported language
     */
    firstSupportedLanguage(): string;
    /**
     * Converts a iso language code to a PO language code (e.g. de-de gets de_de).
     * @param lang The iso language code.
     */
    convertToLanguageCodePO(lang: string): string;
    /**
     * Returns the language in the native language.
     * @param lang The language two-letter code.
     * @return The native name.
     */
    getNativeLanguage(lang: string): string;
    saveInLocalStorage(lang: string): void;
    getSupported(localeCode: string): undefined | string;
    /**
     * Gets the language from the query parameter.
     * @return The language two-letter code.
     */
    queryStringLang(): string;
    private getAllTranslateServiceInstances;
    private performForAllTranslateServiceInstances;
    private parseLocaleCode;
    /**
     * Gets the language from local storage.
     * @return The language two-letter code.
     */
    private localStorageLang;
    /**
     * Determines which language is set in the browser.
     * @return The languages the browser supports as string array.
     */
    private browserLangs;
    private getQueryParameter;
    /**
     * Sets locale for ngx-bootstrap.
     * @param lang A two-letter language code.
     * @private
     */
    private setBsLocale;
    static ɵfac: i0.ɵɵFactoryDeclaration<TranslateService, [null, null, null, null, null, { optional: true; }]>;
    static ɵprov: i0.ɵɵInjectableDeclaration<TranslateService>;
}

interface User extends IUser {
    phone: string;
    sendPasswordResetEmail: boolean;
    newsletter?: boolean;
}
declare class UserEditComponent implements OnInit {
    state: AppStateService;
    translate: TranslateService;
    private bsModalService;
    private alert;
    private userService;
    private tenantLoginOptionsService;
    private tenantService;
    loading: boolean;
    set user(u: User);
    get user(): User;
    showProductExperienceOptions: boolean;
    isUsageTrackingEnabled: boolean;
    isUserEngagementPreferenceEnabled: boolean;
    focusOnNewPassword: boolean;
    onUser: EventEmitter<User>;
    onUsageTrackingChange: EventEmitter<boolean>;
    onUserEngagementPreferenceChange: EventEmitter<boolean>;
    onCancel: EventEmitter<void>;
    newPasswordComponent: i0.Signal<NewPasswordComponent>;
    userHasActiveTotp: boolean;
    userCanSetupTotp: boolean;
    isPhoneRequired: boolean;
    userIsExternal: boolean;
    isTfaEnabled: boolean;
    private _user;
    constructor(state: AppStateService, translate: TranslateService, bsModalService: BsModalService, alert: AlertService, userService: UserService, tenantLoginOptionsService: TenantLoginOptionsService, tenantService: TenantService);
    ngOnInit(): Promise<void>;
    setupTotp(): void;
    cancel(): void;
    save(): Promise<void>;
    onNewPasswordChanged(newPassword: NewPassword): void;
    private initializeTotpSettings;
    private canUserSetupTotp;
    static ɵfac: i0.ɵɵFactoryDeclaration<UserEditComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<UserEditComponent, "c8y-user-edit", never, { "loading": { "alias": "loading"; "required": false; }; "user": { "alias": "user"; "required": false; }; "showProductExperienceOptions": { "alias": "showProductExperienceOptions"; "required": false; }; "isUsageTrackingEnabled": { "alias": "isUsageTrackingEnabled"; "required": false; }; "isUserEngagementPreferenceEnabled": { "alias": "isUserEngagementPreferenceEnabled"; "required": false; }; "focusOnNewPassword": { "alias": "focusOnNewPassword"; "required": false; }; }, { "onUser": "onUser"; "onUsageTrackingChange": "onUsageTrackingChange"; "onUserEngagementPreferenceChange": "onUserEngagementPreferenceChange"; "onCancel": "onCancel"; }, never, never, true, never>;
}

/**
 * Service to show a modal.
 */
declare class ModalService {
    private modalService;
    private gainsightService;
    constructor(modalService: BsModalService, gainsightService: GainsightService);
    /**
     * Shows a quick confirm message modal.
     * @param title The title of that modal.
     * @param body The text body to display.
     * @param status The status.
     * @param labels The labels to use. Default: { ok: 'Confirm', cancel: 'Cancel'}
     * @param confirmOptions Selection options to display as checkbox list.
     * @param productExperienceEvent Additional data to attach to custom product experience events.
     * @param requireCodeVerification Whether to require user to retype a random code for confirmation.
     */
    confirm(title: string, body: string, status?: StatusType, labels?: ConfirmModalComponent['labels'], confirmOptions?: ConfirmOptions, productExperienceEvent?: ProductExperienceEvent, requireCodeVerification?: boolean): Promise<boolean | {
        confirmed: boolean;
        confirmOptions: {
            [key: string]: boolean;
        };
    }>;
    /**
     * Shows a quick acknowledge message modal.
     * @param title The title of that modal.
     * @param body The text body to display.
     * @param status The status.
     * @param acknowledgeLabel The label to use.
     * @param productExperienceEvent Additional data to attach to custom product experience events.
     */
    acknowledge(title: string, body: string, status?: StatusType, acknowledgeLabel?: string, productExperienceEvent?: ProductExperienceEvent): Promise<boolean | {
        confirmed: boolean;
        confirmOptions: {
            [key: string]: boolean;
        };
    }>;
    /**
     * Shows a quick logout confirmation modal.
     * @param body The text body to display. Default: 'You will be logged out to apply your changes. Do you want to proceed?'
     * @param status The status.
     * @param labels The labels to use. Default: { ok: 'Confirm and log out', cancel: 'Cancel' }
     */
    confirmLogout(body?: string, status?: StatusType, labels?: any): Promise<boolean | {
        confirmed: boolean;
        confirmOptions: {
            [key: string]: boolean;
        };
    }>;
    private triggerEvent;
    static ɵfac: i0.ɵɵFactoryDeclaration<ModalService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<ModalService>;
}

declare class UserEditModalComponent implements OnInit {
    modal: BsModalRef;
    user: UserService;
    ui: AppStateService;
    private auth;
    private client;
    private alert;
    private userPreferences;
    private c8yModalService;
    private gainsightService;
    private cookieBannerService;
    private passwordService;
    private userEngagementsService;
    currentUser: IUser;
    changedLang: string;
    loading: boolean;
    showProductExperienceOptions: boolean;
    currentUsageTrackingState: boolean;
    currentUserEngagementPreferenceInitialState: boolean;
    usageTrackingState: boolean;
    userEngagementPreferenceNewState: boolean;
    passwordChange: boolean;
    constructor(modal: BsModalRef, user: UserService, ui: AppStateService, auth: BasicAuth, client: FetchClient, alert: AlertService, userPreferences: UserPreferencesService, c8yModalService: ModalService, gainsightService: GainsightService, cookieBannerService: CookieBannerService, passwordService: PasswordService, userEngagementsService: UserEngagementsService);
    ngOnInit(): Promise<void>;
    /**
     * Initializes product experience options for the user.
     *
     * This function performs the following operations:
     * - Determines if the user has the permission to edit product experience options.
     * - If the user has the permission and functional cookies are enabled:
     *   - Checks whether personalized product experience tracking is active.
     *   - Checks whether in-product information and communication is active.
     */
    setInitialProductExperienceOptions(): Promise<void>;
    onDismiss(): Promise<void>;
    onUsageTrackingChange(isEnabled: boolean): void;
    onUserEngagementPreferenceChange(isEnabled: boolean): void;
    updateAndClose(user: any): Promise<void>;
    gainsightTrackingAppReload(): Promise<void>;
    private updateProductExperienceOptions;
    /**
     * Updates the user engagement preference if it has changed from the initial state.
     * Calls the user engagements service to update the preference.
     *
     * The update only occurs if the current preference differs from the new state.
     */
    private updateUserEngagementsPreference;
    /**
     * Asynchronously updates the tracking option for user preferences.
     * If the current usage tracking state differs from the new state,
     * it updates the Gainsight preferences and sets a functional cookie
     * before triggering a reload of the application.
     */
    private updateTrackingOption;
    private updateUserInAppState;
    private updateCredentials;
    static ɵfac: i0.ɵɵFactoryDeclaration<UserEditModalComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<UserEditModalComponent, "c8y-user-edit-modal", never, {}, {}, never, never, true, never>;
}

declare class UserMenuItemComponent implements UserMenuItem {
    private userService;
    private headerService;
    icon: SupportedIconsSuggestions;
    label: string;
    link: string;
    target: string;
    priority: number;
    dataCy: string;
    open$: Observable<boolean>;
    template: any;
    click: EventEmitter<UserMenuItem>;
    private viewInitTimeout;
    constructor(userService: UserMenuService, headerService: HeaderService);
    ngAfterViewInit(): void;
    ngOnDestroy(): void;
    onClick(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<UserMenuItemComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<UserMenuItemComponent, "c8y-user-menu-item", never, { "icon": { "alias": "icon"; "required": false; }; "label": { "alias": "label"; "required": false; }; "link": { "alias": "link"; "required": false; }; "target": { "alias": "target"; "required": false; }; "priority": { "alias": "priority"; "required": false; }; "dataCy": { "alias": "dataCy"; "required": false; }; }, { "click": "click"; }, never, ["*", "*"], true, never>;
}

declare class UserTotpSetupComponent {
    private user;
    private modalService;
    private modal;
    private authService;
    constructor(user: UserService, modalService: ModalService, modal: BsModalRef, authService: SimplifiedAuthService);
    totpSetupVerified(): Promise<void>;
    close(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<UserTotpSetupComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<UserTotpSetupComponent, "c8y-user-totp-setup", never, {}, {}, never, never, true, never>;
}

declare class UserTotpRevokeComponent {
    private users;
    private alert;
    user: IUser;
    revokeEmitter: EventEmitter<void>;
    constructor(users: UserService, alert: AlertService);
    revoke(): Promise<void>;
    static ɵfac: i0.ɵɵFactoryDeclaration<UserTotpRevokeComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<UserTotpRevokeComponent, "c8y-user-totp-revoke", never, { "user": { "alias": "user"; "required": false; }; }, { "revokeEmitter": "revoke"; }, never, never, true, never>;
}

/**
 * The angular module definition for the user menu.
 * @exports UserMenuComponent
 * @exports UserMenuItemComponent
 * @exports UserEditComponent
 * @exports UserEditModalComponent
 */
declare class UserModule {
    static providers(): (i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider)[];
    static ɵfac: i0.ɵɵFactoryDeclaration<UserModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<UserModule, never, [typeof i1$1.A11yModule, typeof FormsModule, typeof CommonModule, typeof ModalModule, typeof i5.BsDropdownModule, typeof AuthenticationModule, typeof AlertModule, typeof i1$2.RouterModule, typeof i3.TooltipModule, typeof i3$1.PopoverModule, typeof ClipboardModule, typeof UserDetailsDrawerModule, typeof UserMenuOutletComponent, typeof UserEditComponent, typeof UserEditModalComponent, typeof UserMenuItemComponent, typeof UserTotpSetupComponent, typeof UserTotpRevokeComponent], [typeof UserMenuOutletComponent, typeof UserMenuItemComponent, typeof UserEditComponent, typeof UserEditModalComponent, typeof UserTotpSetupComponent, typeof UserTotpRevokeComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<UserModule>;
}

/**
 * Actions are functions that can be executed on the
 * current list item. They are displayed next to the
 * item and can be grouped in a dropdown.
 *
 * ```html
 * <c8y-li>
 *   <c8y-li-action (click)="deleteDevice(device.id)" icon="times">
 *     Delete
 *   </c8y-li-action>
 *   <c8y-li-action (click)="(false)" icon="rocket">
 *     Launch to space
 *   </c8y-li-action>
 * </c8y-li>
 * ```
 */
declare class ListItemActionComponent implements ProductExperienceEventSource {
    private gainsightService;
    /**
     * @ignore
     */
    template: any;
    /**
     * The label to display (you can alternatively use
     * content projection to display the label).
     */
    label: string;
    /**
     * The name of the icon to use.
     */
    icon: SupportedIconsSuggestions;
    /**
     * Defines if the action is disabled or not.
     */
    disabled: boolean;
    /**
     * An EventEmitter to determine what to do if the
     * action is triggered.
     */
    click: EventEmitter<void>;
    /**
     * The product experience event to be triggered
     * when the action is clicked.
     */
    productExperienceEvent: ProductExperienceEvent;
    constructor(gainsightService: GainsightService);
    /**
     * @ignore
     */
    onClick(event: HTMLElement): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<ListItemActionComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ListItemActionComponent, "c8y-list-item-action, c8y-li-action", never, { "label": { "alias": "label"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "click": "click"; }, never, ["*"], true, never>;
}

/**
 * Display collapsed content on a list item. Can be
 * used for more detailed information. Use it with
 * content projection.
 *
 * ```html
 * <c8y-li>
 *   <c8y-collapsed>
 *     <strong>I am only visible if extended</strong>
 *   </c8y-collapsed>
 * </c8y-li>
 * ```
 */
declare class ListItemCollapseComponent {
    /**
     * The way how to toggle collapse state.
     * button (default) - additional button for toggle collapse state
     * row - toggling collapse state by clicking to entire row.
     */
    collapseWay: 'button' | 'row';
    static ɵfac: i0.ɵɵFactoryDeclaration<ListItemCollapseComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ListItemCollapseComponent, "c8y-list-item-collapse, c8y-li-collapse", never, { "collapseWay": { "alias": "collapseWay"; "required": false; }; }, {}, never, ["*"], true, never>;
}

/**
 * The footer can be used with either content projection
 * or a simple string as an input.
 *
 * ```html
 * <c8y-li>
 *   Content
 *   <c8y-li-footer>I am a footer</c8y-li-footer>
 * </c8y-li>
 * ```
 */
declare class ListItemFooterComponent {
    /**
     * A simple string that can be used instead
     * of content projection.
     */
    footer: string;
    static ɵfac: i0.ɵɵFactoryDeclaration<ListItemFooterComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ListItemFooterComponent, "c8y-list-item-footer, c8y-li-footer", never, { "footer": { "alias": "footer"; "required": false; }; }, {}, never, ["*"], true, never>;
}

/**
 * A list item is a representation of an item inside a list and
 * can be used to compose different styles in a list (mainly in a
 * <c8y-group-list>-component but also in others like the
 * <c8y-typeahead>-component):
 *  - a list with a footer
 *  - a list with one or multiple actions
 *  - an icon
 *  - a checkbox or radio input
 *
 * The item can be composed via content projection. The following
 * example shows a radio list with an icon, two actions
 * and a footer:
 * ```html
 * <c8y-list-group>
 *   <c8y-li
 *     *c8yFor="
 *       let device of devices;
 *       let i = index;
 *     "
 *   >
 *     <c8y-li-radio (onSelect)="updateSelected($event, device)"></c8y-li-radio>
 *     <c8y-li-icon [icon]="'rocket'"></c8y-li-icon>
 *     {{ i + 1 }}. {{ device.name || '-' }}
 *     <c8y-li-footer>
 *       Device id: <a [routerLink]="['/device', device.id]">{{ device.id }}</a>
 *     </c8y-li-footer>
 *     <c8y-li-action (click)="deleteDevice(device.id)" icon="times">
 *       Delete
 *     </c8y-li-action>
 *     <c8y-li-action (click)="(false)" icon="rocket">
 *       Launch to space
 *     </c8y-li-action>
 *   </c8y-li>
 * </c8y-list-group>
 * ```
 */
declare class ListItemComponent {
    element: ElementRef;
    /**
     * If set to true, the class "active" is added which
     * indicates that the current row is active.
     */
    active: boolean;
    /**
     * If set to true, the class "highlighted" is added which
     * indicates that the current row is highlighted.
     */
    highlighted: boolean;
    /**
     * If set to true, the class "c8y-list__item--empty-actions" is added which adds
     * additional padding to compensate for the "actions" column in other list items.
     */
    emptyActions: boolean;
    /**
     * If set to true, the item will be displayed in a dense style.
     */
    dense: boolean;
    /**
     * Indicates if the current list item is collapsed. You can trigger the collapsing from
     * any element event by toggling this value.
     *
     * ```html
     * <c8y-li #li (click)="li.collapsed = !li.collapsed">
     *  Toggle
     *  <c8y-li-collapse>
     *    I can be toggled by clicking on the row.
     *  </c8y-li-collapse
     * </c8y-li>
     * ```
     */
    collapsed: boolean;
    /**
     * Indicates if the current list item is selectable.
     */
    selectable: boolean;
    /**
     * An event emitter which is triggered when the user collapses the content
     * via the chevron on the right.
     */
    collapsedChange: EventEmitter<boolean>;
    /**
     * A [[ListItemFooterComponent]] element which can be used to show a footer.
     * ```html
     * <c8y-li>
     *  I am the main content
     *  <c8y-li-footer>
     *    I am the footer content
     *  </c8y-li-footer>
     * </c8y-li>
     * ```
     */
    itemFooter: ListItemFooterComponent;
    /**
     * [[ListItemActionComponent]] elements which can be used to show an action.
     * An action is displayed on the right in the dropdown and usually consists of an
     * icon and a label.
     * ```html
     * <c8y-li>
     *  I am the main content
     *  <c8y-li-action (click)="launchToSpace(device.id)" icon="rocket">
     *    Launch
     *  </c8y-li-action>
     *  <c8y-li-action (click)="deleteDevice(device.id)" icon="times">
     *    Delete
     *  </c8y-li-action>
     * </c8y-li>
     * ```
     */
    itemActions: QueryList<ListItemActionComponent>;
    /**
     * [[ListItemCollapseComponent]] elements which can be used to show detail views.
     * ```html
     * <c8y-li>
     *  I am the main content
     *  <c8y-li-collapse>
     *    I am detailed content
     *  </c8y-li-collapse>
     * </c8y-li>
     * ```
     */
    itemCollapse: ListItemCollapseComponent;
    /**
     * @ignore
     */
    showFooter: boolean;
    /**
     * @ignore
     */
    showActions: boolean;
    /**
     * @ignore
     */
    showCollapse: boolean;
    /**
     * @ignore
     */
    actions: ListItemActionComponent[];
    private pulse$;
    private destroy$;
    private readonly ACTION_ITEM_HEIGHT;
    /**
     * @ignore
     */
    constructor(element: ElementRef);
    /**
     * @ignore
     */
    ngOnInit(): void;
    /**
     * @ignore
     */
    ngAfterContentChecked(): void;
    /**
     * @ignore
     */
    ngOnDestroy(): void;
    /**
     * Toggles the collapse state and emits this state as
     * collapsedChange output as boolean.
     * @param $event Pass optional an event to stop propagation.
     */
    toggleCollapsed($event?: Event): void;
    /**
     * Toggles the collapse state in case the `collapseWay` is set to `row` and emits this state as
     * collapsedChange output as boolean.
     */
    rowToggleCollapsed(): void;
    /**
     * Highlights the list-item. This method should be used to show the
     * user that something within this item was changed.
     */
    pulse(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<ListItemComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ListItemComponent, "c8y-list-item, c8y-li", never, { "active": { "alias": "active"; "required": false; }; "highlighted": { "alias": "highlighted"; "required": false; }; "emptyActions": { "alias": "emptyActions"; "required": false; }; "dense": { "alias": "dense"; "required": false; }; "collapsed": { "alias": "collapsed"; "required": false; }; "selectable": { "alias": "selectable"; "required": false; }; }, { "collapsedChange": "collapsedChange"; }, ["itemFooter", "itemCollapse", "itemActions"], ["c8y-list-item-drag-handle, c8y-li-drag-handle", "c8y-list-item-radio, c8y-li-radio", "c8y-list-item-checkbox, c8y-li-checkbox", "c8y-list-item-icon, c8y-li-icon", "c8y-list-item-body, c8y-li-body", "*", "c8y-list-item-footer, c8y-li-footer", "c8y-list-item-action, c8y-li-action", "c8y-list-item-action, c8y-li-action", "c8y-list-item-collapse, c8y-li-collapse"], true, never>;
}

/**
 * Allows to display a timeline. Should be used with
 * content projection.
 *
 * ```html
 * <c8y-list-group>
 *   <c8y-li-timeline>
 *     24.April 2020
 *     <c8y-li>
 *       Hello
 *     </c8y-li>
 *   </c8y-li-timeline>
 * </c8y-list-group>
 * ```
 */
declare class ListItemTimelineComponent {
    listItemComponent: ListItemComponent;
    get expanded(): boolean;
    static ɵfac: i0.ɵɵFactoryDeclaration<ListItemTimelineComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ListItemTimelineComponent, "c8y-list-item-timeline, c8y-li-timeline", never, {}, {}, ["listItemComponent"], ["*", "c8y-li, c8y-list-item"], true, never>;
}

/**
 * List groups are flexible and powerful components for displaying
 * both simple lists of elements and complex ones with custom content.
 *
 * ```html
 * <c8y-list-group>
 *   <c8y-li>
 *     Plain <strong>Text</strong>
 *   </c8y-li>
 *   <c8y-li>
 *     <c8y-li-icon [icon]="'rocket'"></c8y-li-icon>
 *     Icon
 *   </c8y-li>
 *   <c8y-li>
 *     <c8y-li-radio></c8y-li-radio>
 *     Radio
 *   </c8y-li>
 *   <c8y-li>
 *     <c8y-li-checkbox></c8y-li-checkbox>
 *     Checkbox
 *   </c8y-li>
 *   <c8y-li>
 *     Content
 *     <c8y-li-footer>
 *       Footer
 *     </c8y-li-footer>
 *   </c8y-li>
 *   <c8y-li>
 *     Content
 *     <c8y-li-action icon="rocket">
 *       Launch
 *     </c8y-li-action>
 *   </c8y-li>
 *   <c8y-li>
 *     Content
 *     <c8y-li-collapse>
 *       Collapsed content
 *     </c8y-li-collapse>
 *   </c8y-li>
 * </c8y-list-group>
 * ```
 */
declare class ListGroupComponent {
    /**
     * @ignore
     */
    timeline: boolean;
    /**
     * Displays the current list as a timeline. Best used
     * with content projection.
     *
     * ```html
     * <c8y-list-group>
     *   <c8y-li-timeline>
     *     24.April 2020
     *     <c8y-li>
     *       Hello
     *     </c8y-li>
     *   </c8y-li-timeline>
     * </c8y-list-group>
     * ```
     */
    timelineComponent: ListItemTimelineComponent;
    /**
     * @ignore
     */
    ngAfterContentChecked(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<ListGroupComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ListGroupComponent, "c8y-list-group", never, {}, {}, ["timelineComponent"], ["*"], true, never>;
}

/**
 * An icon to display on a list item. Use it with content projection.
 *
 * ```html
 * <c8y-li>
 *   <c8y-li-icon="rocket"></c8y-li-icon>
 * </c8y-li>
 * ```
 */
declare class ListItemIconComponent {
    /**
     * The icon name passed to the `c8yIcon` directive.
     */
    icon: SupportedIconsSuggestions;
    /**
     * A status to change the color of the icon.
     */
    status?: 'statusOk' | 'statusUnknown' | 'statusAlert' | 'statusNok' | 'status critical' | 'status warning' | 'status minor' | 'status major';
    static ɵfac: i0.ɵɵFactoryDeclaration<ListItemIconComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ListItemIconComponent, "c8y-list-item-icon, c8y-li-icon", never, { "icon": { "alias": "icon"; "required": false; }; "status": { "alias": "status"; "required": false; }; }, {}, never, ["*"], true, never>;
}

/**
 * The li-body component can be used to define the body.
 * Usually it doesn't need to be used, as it is the default
 * content projected to a <c8y-li>.
 */
declare class ListItemBodyComponent {
    /**
     * An optional string content.
     */
    body: string;
    static ɵfac: i0.ɵɵFactoryDeclaration<ListItemBodyComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ListItemBodyComponent, "c8y-list-item-body, c8y-li-body", never, { "body": { "alias": "body"; "required": false; }; }, {}, never, ["*"], true, never>;
}

/**
 * A component to display checkboxes in a c8y-li. Use it with content projection. It
 * can be used standalone or with an ngModel.
 *
 * ```html
 * <c8y-li>
 *   <c8y-li-checkbox></c8y-li-checkbox>
 * </c8y-li>
 * ```
 */
declare class ListItemCheckboxComponent extends CheckboxControlValueAccessor {
    private renderer;
    private elementRef;
    /**
     * Indicates if the checkbox is selected.
     */
    selected: boolean;
    /**
     * Sets the checkbox into the indeterminate state.
     */
    indeterminate?: boolean;
    /**
     * Indicates if the checkbox is disabled.
     */
    disabled: boolean;
    /**
     * An event emitted as soon as the checkbox is selected.
     */
    onSelect: EventEmitter<boolean>;
    /**
     * Allows to display the chceckbox as a switch
     */
    displayAsSwitch: boolean;
    constructor(renderer: Renderer2, elementRef: ElementRef);
    /**
     * @ignore
     */
    ngOnChanges(changes: SimpleChanges): void;
    /**
     * Selects the checkbox.
     * @param value The value to pass.
     */
    select(value: any): void;
    writeValue(value: boolean): void;
    setDisabledState(isDisabled: boolean): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<ListItemCheckboxComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ListItemCheckboxComponent, "c8y-list-item-checkbox, c8y-li-checkbox", never, { "selected": { "alias": "selected"; "required": false; }; "indeterminate": { "alias": "indeterminate"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "displayAsSwitch": { "alias": "displayAsSwitch"; "required": false; }; }, { "onSelect": "onSelect"; }, never, ["*"], true, never>;
}

/**
 * A component to display a radio button in a c8y-li. Use it with content projection. It
 * can be used standalone or with an ngModel.
 *
 * ```html
 * <c8y-li>
 *   <c8y-li-radio></c8y-li-radio>
 * </c8y-li>
 * ```
 */
declare class ListItemRadioComponent implements ControlValueAccessor {
    /**
     * @ignore
     */
    radio: ElementRef;
    /**
     * Indicates if the radio is selected.
     */
    selected: boolean;
    /**
     * The name of the radio (use different names for different radio groups).
     */
    name: string;
    /**
     * Indicates if the radio is disabled.
     */
    disabled: boolean;
    /**
     * An event emitted as soon as the radio is selected.
     */
    onSelect: EventEmitter<boolean>;
    /**
     * The current value.
     */
    value: any;
    /**
     * @ignore
     */
    model: any;
    /**
     * @ignore
     */
    onChange: (value: any) => void;
    /**
     * @ignore
     */
    onTouched: () => void;
    /**
     * Resets the native radio element.
     */
    reset(): void;
    /**
     * @ignore
     */
    ngOnChanges(changes: SimpleChanges): void;
    /**
     * Triggered when the radio is changed.
     * @param checked Should it be checked or not?
     */
    change(checked: any): void;
    /**
     * Registers an onChange event.
     */
    registerOnChange(fn: any): void;
    /**
     * Registers an onTouch event.
     */
    registerOnTouched(fn: any): void;
    /**
     * @ignore
     */
    writeValue(value: boolean): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<ListItemRadioComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ListItemRadioComponent, "c8y-list-item-radio, c8y-li-radio", never, { "selected": { "alias": "selected"; "required": false; }; "name": { "alias": "name"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, { "onSelect": "onSelect"; }, never, ["*"], true, never>;
}

declare class ListItemDragHandleComponent {
    static ɵfac: i0.ɵɵFactoryDeclaration<ListItemDragHandleComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ListItemDragHandleComponent, "c8y-list-item-drag-handle, c8y-li-drag-handle", never, {}, {}, never, ["*"], true, never>;
}

/**
 * The list-group module allows you to compose different styles
 * of lists used in Cumulocity IoT. They can consist of plain
 * text, actions, icons and more.
 *
 * ```html
 * <c8y-list-group>
 *   <c8y-li>Item 1<c8y-li>
 *   <c8y-li>Item 2<c8y-li>
 * </c8y-list-group>
 * ```
 */
declare class ListGroupModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<ListGroupModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<ListGroupModule, never, [typeof CommonModule, typeof i2.CollapseModule, typeof i5.BsDropdownModule, typeof i1$1.A11yModule, typeof ListGroupComponent, typeof ListItemComponent, typeof ListItemIconComponent, typeof ListItemBodyComponent, typeof ListItemFooterComponent, typeof ListItemActionComponent, typeof ListItemCollapseComponent, typeof ListItemCheckboxComponent, typeof ListItemRadioComponent, typeof ListItemTimelineComponent, typeof ListItemDragHandleComponent], [typeof ListGroupComponent, typeof ListItemComponent, typeof ListItemIconComponent, typeof ListItemBodyComponent, typeof ListItemFooterComponent, typeof ListItemActionComponent, typeof ListItemCollapseComponent, typeof ListItemCheckboxComponent, typeof ListItemRadioComponent, typeof ListItemTimelineComponent, typeof ListItemDragHandleComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<ListGroupModule>;
}

declare class SelectItemDirective {
    templateRef: TemplateRef<SelectItemDirective>;
    value: string;
    label: string;
    constructor(templateRef: TemplateRef<SelectItemDirective>);
    static ɵfac: i0.ɵɵFactoryDeclaration<SelectItemDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<SelectItemDirective, "[c8ySelectItem]", never, { "value": { "alias": "c8ySelectItem"; "required": false; }; "label": { "alias": "c8ySelectItemLabel"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * This service provides keyboard navigation for dropdowns.
 *
 * It allows to navigate over the items in the dropdown using the keyboard
 * or search for them. For this to correctly work, the service needs to provided
 * as component provider in the component. Additionally the `ListItemComponent`
 * needs to be used in the dropdown items. Also each item needs to have a
 * span[data-search-label] element to search for the item.
 */
declare class SelectKeyboardService {
    private readonly KEYCODE_UP;
    private readonly KEYCODE_DOWN;
    private readonly KEYCODE_TAB;
    private readonly KEYCODE_ENTER;
    private readonly KEYCODE_ESC;
    private readonly KEYCODE_SPACE;
    private destroyed$;
    /**
     * Conifguration options for the keyboard service.
     */
    options: {
        /**
         * If true, the input will be cleared when the user selects an item.
         */
        emptyInput: boolean;
        /**
         * Search on key event.
         */
        keyboardSearch: boolean;
        /**
         * Space key event is used to select.
         */
        spaceSelect: boolean;
        /**
         * Highlights the first element, if no match was found by startWith search.
         */
        noMatchHighlightFirst: boolean;
    };
    /**
     * Registers the keyboard event listener for the dropdown.
     *
     * @param input The input element to search for items.
     * @param list A QueryList of all the [ListItemComponent] on which can be searched
     * @param dropdown The dropdown itself as [BsDropdownDirective].
     * @returns A Observable<number> where number is the index of the selected [ListItemComponent]
     */
    register$(input: HTMLInputElement, list: QueryList<ListItemComponent>, dropdown: BsDropdownDirective): Observable<number>;
    ngOnDestroy(): void;
    /**
     * Unregister the keyboard event listner.
     */
    unregister(): void;
    /**
     * Returns true if the keyboard event is fired by a selection event (Enter, Down, Tab, Up, Space)
     * @returns true if the event is a selection event.
     */
    isSelectionEvent(event: KeyboardEvent): boolean;
    private handleKeyboard;
    private handleInputBoxSearch;
    private handleArrowKeySelection;
    private handleCancel;
    private selectNextItemOnKeyboardMove;
    private highlightItem;
    static ɵfac: i0.ɵɵFactoryDeclaration<SelectKeyboardService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<SelectKeyboardService>;
}

type SelectableItem<T = string> = {
    label: string;
    value: T;
};
type SelectableItemTemplate = SelectableItem & {
    template?: TemplateRef<SelectItemDirective>;
};
interface Item {
    name: string;
    _selected?: boolean;
    [key: string]: any;
}
type selectedFunction = (item: Item) => boolean;
type selectedLabelFunction = (items: Item[]) => string;

declare class SelectedItemsDirective {
    templateRef: TemplateRef<unknown>;
    selectedItems: SelectableItem[];
    constructor(templateRef: TemplateRef<unknown>);
    static ɵfac: i0.ɵɵFactoryDeclaration<SelectedItemsDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<SelectedItemsDirective, "[c8ySelectedItems]", never, {}, {}, never, never, true, never>;
}

declare class SelectComponent implements AfterContentInit, OnInit, OnChanges, OnDestroy, AfterViewInit, ControlValueAccessor, Validator {
    private selectKeyboardService;
    private translateService;
    /**
     * Placeholder text to be displayed in the select.
     */
    placeholder: string;
    /**
     * Items to be displayed in the select.
     * Can be an array of strings or an array of objects with `label` and `value` properties.
     *
     * @example
     * ```html
     * <c8y-select [items]="[{ label: 'Item 1', value: 'item1' }, { label: 'Item 2', value: 'item2' }]"></c8y-select>
     * ```
     *
     * @example
     * ```html
     * <c8y-select [items]="['Item 1', 'Item 2', 'Item 3']"></c8y-select>
     * ```
     *
     * For more complex scenarios, you can use content-projection:
     *
     * @example
     * ```html
     * <c8y-select>
     *    <i [c8yIcon]="'rocket'" class="text-16" *c8ySelectItem="'rocket'; label: 'Rocket'"></i>
     *    <i [c8yIcon]="'car'" class="text-16" *c8ySelectItem="'car'; label: 'Car'"></i>
     * </c8y-select>
     * ```
     */
    set items(value: string[] | SelectableItem[] | SelectableItemTemplate[]);
    /**
     * The items to be displayed in the select.
     */
    get items(): SelectableItemTemplate[];
    /**
     * The selected item.
     */
    set selected(value: string | SelectableItem | Array<string | SelectableItem>);
    /**
     * Returns the selected item.
     */
    get selected(): SelectableItem[];
    /**
     * The container to put the dropdown to. Defaults to body.
     */
    container: '' | 'body';
    /**
     * If set to true, the user can select multiple items.
     */
    multi: boolean;
    /**
     * If enabled, an item can be selected with the space key.
     */
    canSelectWithSpace: boolean;
    /**
     * If set to true, the select is disabled.
     */
    disabled: boolean;
    /**
     * Defines, if the dropdown should close automatically after user interaction.
     */
    autoClose: boolean;
    /**
     * Defines if the dropdown should stay open when the user clicks inside the select.
     * If set to true, the dropdown will only close when the user clicks outside the select.
     */
    insideClick: boolean;
    /**
     * Marks the select as required.
     */
    required: boolean;
    /**
     * Allows the user to clear the selection.
     */
    canDeselect: boolean;
    /**
     * The name used for this select.
     */
    name: string;
    /**
     * The icon to be displayed in the select.
     */
    icon: string;
    /**
     * If set to true, the items will be filtered based on the user input
     * in the search field. if false, only the right item will be highlighted.
     */
    filterItems: boolean;
    /**
     * Emits if a item is selected.
     */
    onSelect: EventEmitter<SelectableItem>;
    /**
     * Emits if a item was deselected.
     */
    onDeselect: EventEmitter<SelectableItem>;
    /**
     * Emits when the select icon is clicked.
     */
    onIconClick: EventEmitter<{
        icon: string;
        $event: MouseEvent;
    }>;
    /**
     * Indicates if the search input has focus.
     */
    searchHasFocus: boolean;
    /**
     * The selectable items when content projection is used.
     * @ignore
     */
    projectedSelectableItems: QueryList<SelectItemDirective>;
    /**
     * The selected items when content projection is used.
     * @ignore
     */
    projectedSelectedItems: SelectedItemsDirective;
    private searchControl;
    private dropdown;
    private list;
    /**
     * A item which is preselected. It is used when a user types in the search input to give a visual typeahead feedback.
     */
    get preselectedItem(): SelectableItem;
    displayPlaceholder: string;
    /**
     * The internal select element.
     * @ignore
     */
    private _selected;
    /**
     * The internal pre-select element. It is used when a user types in the search input to give a visual typeahead feedback.
     * @ignore
     */
    private _preselectedItem;
    /**
     * The internal items element.
     * @ignore
     */
    private _items;
    private destroy$;
    private onChange;
    private onTouched;
    /**
     * @ignore
     * @param selectKeyboardService The service to handle keyboard navigation.
     */
    constructor(selectKeyboardService: SelectKeyboardService, translateService: TranslateService$1);
    /**
     * @ignore
     */
    ngOnInit(): void;
    /**
     * @ignore
     */
    ngAfterContentInit(): void;
    /**
     * @ignore
     */
    ngAfterViewInit(): void;
    /**
     * @ignore
     */
    ngOnChanges(changes: SimpleChanges): void;
    /**
     * @ignore
     */
    ngOnDestroy(): void;
    /**
     * Selects an item. In the multi mode, it will toggle the selection of the item.
     * @param item The item to select.
     */
    select(item: SelectableItem): void;
    /**
     * Deselects an item.
     * @param item The item to deselect.
     */
    deselect(item: SelectableItem): void;
    /**
     * Deselects all items
     */
    deselectAll(): void;
    /**
     * Closes the dropdown.
     */
    close(): void;
    /**
     * Opens the dropdown.
     */
    open(): void;
    /**
     * @ignore
     * @param value The value to write.
     */
    writeValue(value: SelectableItem | SelectableItem[]): void;
    /**
     * @ignore
     * @param fn The function to register for onChange.
     */
    registerOnChange(fn: (items: SelectableItem | SelectableItem[]) => void): void;
    /**
     * @ignore
     * @param fn The function to register for onTouched.
     */
    registerOnTouched(fn: () => void): void;
    /**
     * @ignore
     * @param isDisabled Should disable or not
     */
    setDisabledState(isDisabled: boolean): void;
    /**
     * @ignore
     */
    doBlur(): void;
    /**
     * @ignore
     */
    doFocus(): void;
    /**
     * @ignore
     */
    validate(control: AbstractControl): ValidationErrors;
    /**
     * Triggered if the dropdown was shown.
     * @ignore
     */
    onShown(): void;
    /**
     * Triggered if the dropdown was hidden.
     * @ignore
     */
    onHidden(): void;
    private emitChangeEvent;
    /** Computes translated placeholder, appending a "(required)" hint when required. */
    private updateDisplayPlaceholder;
    static ɵfac: i0.ɵɵFactoryDeclaration<SelectComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<SelectComponent, "c8y-select", never, { "placeholder": { "alias": "placeholder"; "required": false; }; "items": { "alias": "items"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "container": { "alias": "container"; "required": false; }; "multi": { "alias": "multi"; "required": false; }; "canSelectWithSpace": { "alias": "canSelectWithSpace"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "autoClose": { "alias": "autoClose"; "required": false; }; "insideClick": { "alias": "insideClick"; "required": false; }; "required": { "alias": "required"; "required": false; }; "canDeselect": { "alias": "canDeselect"; "required": false; }; "name": { "alias": "name"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "filterItems": { "alias": "filterItems"; "required": false; }; }, { "onSelect": "onSelect"; "onDeselect": "onDeselect"; "onIconClick": "onIconClick"; }, ["projectedSelectedItems", "projectedSelectableItems"], ["div"], true, never>;
}

declare class SelectLegacyComponent implements OnChanges, OnInit {
    placeholder: string;
    selectedLabel: string | selectedLabelFunction;
    applyLabel: string;
    items: Item[];
    set selected(value: Item[] | selectedFunction);
    get selected(): Item[] | selectedFunction;
    updateItems: EventEmitter<boolean>;
    disableApplyOnNoSelection: boolean;
    addDropdownContainerToBody: boolean;
    onChange: EventEmitter<Item[]>;
    dropdown: BsDropdownDirective;
    liChildren: any;
    textFilter: string;
    labelText: string;
    isOpen: boolean;
    filteredItems: Item[];
    searchFilter: any;
    readonly sizeToShowFilter: number;
    labelsForSelectAll: any;
    showAllLabel: boolean;
    itemsSelected: Set<Item>;
    private stopClicks;
    private propertyValueTransformService;
    private translateService;
    private _selected;
    preventClick(evt: any): void;
    isOpenChange(isOpen: boolean): void;
    outterSelected(item: Item): any;
    isSelected(item: Item): boolean;
    isAllItemsSelected(): boolean;
    isAllFilteredSelected(): boolean;
    isNoItemSelected(): boolean;
    applyChanges(): void;
    selectAll(checked: boolean): void;
    ngOnInit(): void;
    onChangeItem(checked: boolean, item: Item): void;
    deselectItem(item: Item): void;
    updateFiltered(term: string): void;
    getSelectAllToggleStatus(): {
        label: any;
        checked: boolean;
        indeterminate: boolean;
    };
    ngOnChanges(changes: SimpleChanges): void;
    ngOnDestroy(): void;
    private updateLabel;
    private updateSelected;
    private isAllSelected;
    private getLabel;
    static ɵfac: i0.ɵɵFactoryDeclaration<SelectLegacyComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<SelectLegacyComponent, "c8y-select-legacy", never, { "placeholder": { "alias": "placeholder"; "required": false; }; "selectedLabel": { "alias": "selectedLabel"; "required": false; }; "applyLabel": { "alias": "applyLabel"; "required": false; }; "items": { "alias": "items"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "updateItems": { "alias": "updateItems"; "required": false; }; "disableApplyOnNoSelection": { "alias": "disableApplyOnNoSelection"; "required": false; }; "addDropdownContainerToBody": { "alias": "addDropdownContainerToBody"; "required": false; }; }, { "onChange": "onChange"; }, ["liChildren"], ["c8y-li"], true, never>;
}

declare class TypeaheadComponent implements ControlValueAccessor, Validator, AfterViewInit {
    private selectKeyboardService;
    searchControl: ElementRef;
    searchControlModel: any;
    dropdown: BsDropdownDirective;
    list: QueryList<ListItemComponent>;
    required: boolean;
    maxlength: string | number;
    disabled: boolean;
    allowFreeEntries: boolean;
    placeholder: string;
    displayProperty: string;
    icon: string;
    name: string;
    autoClose: boolean;
    hideNew: boolean;
    container: '' | 'body';
    selected: IIdentified;
    title: string;
    highlightFirstItem: boolean;
    onSearch: EventEmitter<string>;
    onIconClick: EventEmitter<{
        icon: string;
        $event: MouseEvent;
    }>;
    private onChange;
    private onTouched;
    private readonly destroyed$;
    constructor(selectKeyboardService: SelectKeyboardService);
    writeValue(value: any): void;
    registerOnChange(fn: any): void;
    registerOnTouched(fn: any): void;
    setDisabledState(isDisabled: boolean): void;
    doBlur(): void;
    getDisplayProperty(): any;
    onShown(): void;
    /**
     * Resets the input field - clear value and clean field to be pristine and untouched.
     */
    reset(): void;
    ngOnDestroy(): void;
    ngAfterViewInit(): void;
    validate(_ctrl: AbstractControl): {
        [key: string]: any;
    };
    static ɵfac: i0.ɵɵFactoryDeclaration<TypeaheadComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<TypeaheadComponent, "c8y-typeahead", never, { "required": { "alias": "required"; "required": false; }; "maxlength": { "alias": "maxlength"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "allowFreeEntries": { "alias": "allowFreeEntries"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "displayProperty": { "alias": "displayProperty"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "name": { "alias": "name"; "required": false; }; "autoClose": { "alias": "autoClose"; "required": false; }; "hideNew": { "alias": "hideNew"; "required": false; }; "container": { "alias": "container"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "title": { "alias": "title"; "required": false; }; "highlightFirstItem": { "alias": "highlightFirstItem"; "required": false; }; }, { "onSearch": "onSearch"; "onIconClick": "onIconClick"; }, ["list"], ["div, c8y-li, c8y-list-item, button, a"], true, never>;
}

declare class SelectedItemsComponent {
    static ɵfac: i0.ɵɵFactoryDeclaration<SelectedItemsComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<SelectedItemsComponent, "c8y-selected-items", never, {}, {}, never, ["*"], true, never>;
}

/**
 * The angular module definition for a select.
 * @exports SelectComponent
 */
declare class SelectModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<SelectModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<SelectModule, never, [typeof i5.BsDropdownModule, typeof CommonModule, typeof ListGroupModule, typeof FormsModule, typeof NameTransformPipe, typeof SelectComponent, typeof SelectLegacyComponent, typeof TypeaheadComponent, typeof SelectedItemsComponent, typeof SelectItemDirective, typeof SelectedItemsDirective], [typeof SelectComponent, typeof SelectLegacyComponent, typeof TypeaheadComponent, typeof SelectedItemsComponent, typeof SelectItemDirective, typeof SelectedItemsDirective]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<SelectModule>;
}

declare class DeviceStatusComponent implements AfterContentInit, OnChanges {
    private translateService;
    set node(value: any);
    /**
     * Max width of the svg icon in pixels.
     */
    size: number;
    private _mo;
    private requiredAvailability;
    private availabilityStatus;
    private pushStatus;
    private sendStatus;
    constructor(translateService: TranslateService$1);
    get(): any;
    ngOnChanges(): void;
    ngAfterContentInit(): void;
    setStatusProperites(): void;
    status(): any;
    getMaintenanceStatus(): {
        sendStatus: boolean;
        pushStatus: boolean;
        maintenanceStatus: {
            icon: string;
            class: string;
            tooltip: "Device is under maintenance";
        };
    };
    private getSendPushStatus;
    private getSendStatusTooltip;
    private getPushStatusTooltip;
    static ɵfac: i0.ɵɵFactoryDeclaration<DeviceStatusComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<DeviceStatusComponent, "device-status, c8y-device-status", never, { "node": { "alias": "mo"; "required": false; }; "size": { "alias": "size"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * The angular module definition for a device-status.
 * @exports DeviceStatusComponent
 */
declare class DeviceStatusModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<DeviceStatusModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<DeviceStatusModule, never, [typeof CommonModule, typeof i3.TooltipModule, typeof DeviceStatusComponent], [typeof DeviceStatusComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<DeviceStatusModule>;
}

declare class SearchOutletComponent {
    private alertService;
    search: Search[];
    constructor(alertService: AlertService);
    getByPriority(): Search[];
    private byPriority;
    static ɵfac: i0.ɵɵFactoryDeclaration<SearchOutletComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<SearchOutletComponent, "c8y-search-outlet", never, { "search": { "alias": "search"; "required": false; }; }, {}, never, never, true, never>;
}

declare class SearchComponent implements Search {
    private searchService;
    name: string;
    icon: string;
    priority: number;
    template: any;
    search: EventEmitter<Search>;
    term: string;
    private viewInitTimeout;
    constructor(searchService: SearchService);
    onSearch(): void;
    ngAfterViewInit(): void;
    ngOnDestroy(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<SearchComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<SearchComponent, "c8y-search", never, { "name": { "alias": "name"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "priority": { "alias": "priority"; "required": false; }; "term": { "alias": "term"; "required": false; }; }, { "search": "search"; }, never, ["*"], true, never>;
}

declare class HighlightComponent {
    container: ElementRef;
    pattern: string;
    text: string;
    elementClass: string;
    shouldTrimPattern: boolean;
    highlightedText: string;
    ngOnChanges(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<HighlightComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<HighlightComponent, "c8y-highlight", never, { "pattern": { "alias": "pattern"; "required": false; }; "text": { "alias": "text"; "required": false; }; "elementClass": { "alias": "elementClass"; "required": false; }; "shouldTrimPattern": { "alias": "shouldTrimPattern"; "required": false; }; }, {}, never, never, true, never>;
}

declare class SearchResultEmptyComponent {
    private readonly NO_RESULT_FOUND;
    private msg;
    set _message(msg: string);
    get message(): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<SearchResultEmptyComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<SearchResultEmptyComponent, "c8y-search-result-empty", never, { "_message": { "alias": "message"; "required": false; }; }, {}, never, never, true, never>;
}

/** Describes the interface of the data grid. */
interface DataGrid {
    /** The list of columns. */
    columns: Column[];
    /** The list of items. */
    rows: Row[];
    /** Pagination object. */
    pagination: Pagination;
    /** A callback function to fetch server data. */
    serverSideDataCallback: ServerSideDataCallback;
    /** Whether items are selectable. */
    selectable: boolean;
    /** The name of the primary key property. */
    selectionPrimaryKey: string;
    /** Data grid display options. */
    displayOptions: DisplayOptions;
    /** Individual action controls. */
    actionControls: ActionControl[];
    /** Bulk action controls. */
    bulkActionControls: BulkActionControl[];
    /** Header action controls. */
    headerActionControls?: HeaderActionControl[];
}
/** Describes a data grid column. */
interface Column {
    /** The name for the column. */
    name: string | SpecialColumnName;
    /** The column's header (if not given, `name` is used by default). */
    header?: string;
    /** The path in a row item to read the cell value from. */
    path?: string;
    /** Whether the column is displayed. */
    visible?: boolean;
    /** Whether the column can be moved to another position. */
    positionFixed?: boolean;
    /** Marks a user configured custom column */
    custom?: boolean;
    /** Whether the column can be resized. */
    resizable?: boolean;
    /** Optional type of data in the column (used to set data-type attribute, e.g. for additional styling). */
    dataType?: ColumnDataType;
    /** The column's size, e.g. "40 px". */
    gridTrackSize?: string;
    /** Additional CSS classes for the header cell. */
    headerCSSClassName?: string | string[];
    /** Additional CSS classes for data cells. */
    cellCSSClassName?: string | string[];
    /** Whether to translate the column's value (applies, if the default cell renderer component is used). */
    translate?: boolean;
    /** Whether the column is sortable. */
    sortable?: boolean;
    /** Whether the sort order is ascending, descending or not specified. */
    sortOrder?: SortOrder;
    sortingConfig?: ColumnSortingConfig;
    /** Whether the column is filterable. */
    filterable?: boolean;
    /** The string to search for or a function for client-side filtering. */
    filterPredicate?: string | FilterPredicateFunction;
    /** Custom filtering form renderer can set any value here and it can be used to build a query to the server. */
    externalFilterQuery?: any;
    filteringConfig?: FormlyColumnFilteringConfig;
    /** Custom data cell renderer component. Inject `CellRendererContext` to get access to data value, item and column object. */
    cellRendererComponent?: Type<any>;
    /** Custom header cell renderer component. Inject `CellRendererContext` to get access to header value and column object. */
    headerCellRendererComponent?: Type<any>;
    /** Custom filtering form renderer component. Inject `FilteringFormRendererContext` to get access to column object and methods: applyFilter, resetFilter. */
    filteringFormRendererComponent?: Type<any>;
}
/** Describes a column configuration. */
interface ColumnConfig {
    /** The name for the column. */
    name?: string;
    /** Whether the column is displayed. */
    visible?: boolean;
    /** Whether the sort order is ascending, descending or not specified. */
    sortOrder?: SortOrder;
    /** The settings of filter in a column. */
    filter?: Filter;
}
/** Custom column type. Either declared by an explicit path (legacy)
 *  or with the asset property library of DTM
 * */
type CustomColumnType = 'legacy' | 'property' | 'default';
/** Describes a custom column configuration. */
interface CustomColumnConfig extends ColumnConfig {
    /** JSON path to the managed object property to be displayed */
    path: string;
    /** Column header title */
    header: string;
    /** Flag to identify custom columns */
    custom: boolean;
    /** Column type of the custom column*/
    type: CustomColumnType;
}
/** Describes the settings of filter in a column. */
interface Filter {
    /** Custom filtering form renderer can set any value here and it can be used to build a query to the server. */
    externalFilterQuery?: any;
    /** An optional property that holds a string to search for. */
    filterPredicate?: string | FilterPredicateFunction;
}
type AssetColumnOperationType = 'maintenance' | 'operation';
interface AssetTableExtendedColumn extends Column {
    /** Configuration for displaying an icon in the cell. */
    iconConfig?: Array<IconConfigItem>;
    /** Whether the column is a link. */
    isLink?: boolean;
    /** The property to be executed as command */
    command?: object | string;
    /** Whether the column is an operation. */
    isOperation?: boolean;
    /** The operation type of the operation column */
    operationType?: AssetColumnOperationType;
    /** Configuration for computed column */
    computedConfig?: ComputedConfig;
    /** Whether to show both icon and value in the cell */
    showIconAndValue?: boolean;
    /** The type of the column */
    type?: string;
    /**
     * origin needed to identify if the column comes from selectedProperties or operationColumns for the asset table
     */
    __origin?: string;
    /** The unique identifier for the column used when ordering */
    __id?: string;
}
/** Configuration for computed column */
interface ComputedConfig {
    dp: Array<any>;
    resultType: number;
    __propertyName?: string;
}
/** Comparison type for icon display in the cell. */
interface IconConfigComparison {
    label: string;
    value: string;
    sign: string;
}
/** Configuration for icon display in the cell. */
interface IconConfigItem {
    comparison: IconConfigComparison;
    color: string;
    icon: string;
    value: string;
}
/** Describes an object with data grid configuration. */
interface GridConfig {
    /** The configuration objects for all the columns. */
    columns: ColumnConfig[];
    /** Pagination object. */
    pagination: Pagination;
}
/**  */
declare const enum SpecialColumnName {
    /** Column with checkbox. */
    Checkbox = "checkbox",
    /** Column with radio button. */
    RadioButton = "radio-button",
    /** Column with row actions. */
    Actions = "actions"
}
/**  */
declare const enum ColumnDataType {
    /** Column with icon. */
    Icon = "icon",
    /** Numeric column. */
    Numeric = "numeric",
    /** Column with short text. */
    TextShort = "text-short",
    /** Column with long text. */
    TextLong = "text-long"
}
/** Classes for column data record. */
declare const enum ColumnDataRecordClassName {
    /** An icon. */
    Icon = "data-record-icon",
    /** A header. */
    Header = "data-record-header",
    /** Default - empty. */
    Default = ""
}
declare const minColumnGridTrackSize = 80;
/** Maps column types to relative widths. */
declare const ratiosByColumnTypes: {
    /** The width ration for icon column type. */
    icon: number;
    /** The width ration for numeric column type. */
    numeric: number;
    /** The width ration for short text column type. */
    'text-short': number;
    /** The width ration for long text column type. */
    'text-long': number;
};
/** Sorting order: ascending, descending, or not specified. */
type SortOrder = 'asc' | 'desc' | '';
/**
 * A filter predicate function.
 * @param item The current item to be checked.
 * @param path The property path configured in the current column.
 * @returns The boolean value indicating whether the item matches a condition or not.
 */
type FilterPredicateFunction = (item: object, path: string) => boolean;
/** Filtering actions. */
declare enum FilteringActionType {
    /** Action invoked when filter settings are to be applied. */
    ApplyFilter = "APPLY_FILTER",
    /** Action invoked when filter settings are to be cleared. */
    ResetFilter = "RESET_FILTER"
}
interface FormlyColumnFilteringConfig {
    /** Defines a FieldConfig configuration for Formly.  */
    fields?: FormlyFieldConfig[];
    /** Defines a JSON schema for filtering config model. Can be used instead of `fields` */
    schema?: object;
    /** Defines a model that will be applied to rendered form. */
    model?: object;
    /** Defines FormGroup instance */
    formGroup?: FormGroup;
    /**
     * Transforms a filtering config model to an array of partial filter chip objects.
     * @param model An object with defined structure (e.g. by schema).
     * @returns An array of partial filter chip objects, each containing at least `displayValue` and the actual `value` to be updated.
     * Optionally, other properties from `FilterChip` are allowed, for example, a custom `remove` callback to be executed when a chip is being removed.
     */
    generateChips?: (model: any) => PartialFilterChipGenerationType[];
    /**
     * Transforms a filtering config model (e.g. coming from schema form component) to a query object.
     * However, using schema form component is not necessary.
     * Model can be defined arbitrarily but must converted to a valid query object.
     * @param model An object with defined structure (e.g. by schema).
     * @returns A query object to be used to generate a query string (QueryUtils).
     */
    getFilter: (model: any) => any;
}
interface ColumnSortingConfig {
    pathSortingConfigs: PathSortingConfig[];
}
interface PathSortingConfig {
    path: string;
    sortOrderModifier?: SortOrderModifier;
}
declare const enum SortOrderModifier {
    Keep = 0,
    Invert = 1
}
/** Describes an item in the row. */
interface Row {
    /** The unique identifier of the item. */
    id: string;
    /** If the row has child nodes in a tree grid */
    hasChildren?: boolean;
    /**  The parent row in case of a tree grid */
    parentRow?: Row;
    /** Pagination stats for child elements */
    childrenStats?: DataSourceStats;
    /** Pagination settings for loading child rows */
    pagination?: Pagination;
    /** Any item property. */
    [key: string]: any;
}
/** Describes a pagination object. */
interface Pagination {
    /** The number of the current page. */
    currentPage?: number;
    /** The number of the next page. */
    nextPage?: number;
    /** The number of items on a single page. */
    pageSize: number;
}
/**
 * A callback function to fetch server data.
 * @param dataSourceModifier The current data source modifier.
 * @returns Returns the result from server.
 */
type ServerSideDataCallback = (dataSourceModifier: DataSourceModifier) => ServerSideDataResult | Promise<ServerSideDataResult> | Observable<ServerSideDataResult>;
/** Describes a data source modifier for requesting server data. */
interface DataSourceModifier {
    /** The list of columns. */
    columns: Column[];
    /** Text to search. */
    searchText: string;
    /** Pagination object. */
    pagination: Pagination;
    /** Selection info object. */
    selection: {
        /** Whether the selection is enabled. */
        enabled: boolean;
        /** The name of the primary key. */
        primaryKey: string;
    };
    /** The parent row in case of a tree grid */
    parentRow?: Row;
}
/** Describes a result from server with data and additional statistics. */
type ServerSideDataResult = IResultList<object> & {
    /** The real grand total number of items (the whole dataset). */
    size: number;
    /** The number of items after filtering applied to the whole dataset (subset). */
    filteredSize: number;
    /** The list of ids of all filtered items (subset). */
    filteredDataIds?: string[];
    /** The row to which the results has to be assigned as child rows */
    parentRow?: Row;
};
/** Describes an object with data source statistics. */
interface DataSourceStats {
    /** The real grand total number of items (the whole dataset). */
    size: number;
    /** The number of items after filtering applied to the whole dataset (subset). */
    filteredSize: number;
    /** The number of the current page. */
    currentPage: number;
    /** The number of the next page. */
    nextPage?: number;
    /** The number of items currently shown in the list view, a.k.a. current page (what the user sees on screen). */
    currentPageSize: number;
    /** The number of items on the first page.  */
    firstPageSize: number;
}
/** Describes data grid display options. */
interface DisplayOptions {
    /** Show or hide zebra-striping in the table */
    striped: boolean;
    /** Show or hide each cell border */
    bordered: boolean;
    /** Show or hide the grid header */
    gridHeader: boolean;
    /** Show or hide filter label in the grid header */
    filter: boolean;
    /** Enable to display a background color on hover */
    hover: boolean;
    /** Show or hide the loading indicator */
    showLoadingIndicator?: boolean;
    /** Show or hide the footer (pagination bar) */
    footer?: boolean;
}
/** Describes a data grid action control for individual item. */
interface ActionControl {
    /** The type of the action, predefined or custom. */
    type: BuiltInActionType | string;
    /** The label for the action button. */
    text?: string;
    /** The icon for the action button. */
    icon?: SupportedIconsSuggestions;
    /** The icon classes for the action button icon. */
    iconClasses?: string;
    /** Action icon will be visible on hover only */
    showOnHover?: boolean;
    /**
     * A callback function.
     * @param item The item to perform the action on.
     * @param reload The function to call, if you want to reload the grid.
     */
    callback: ((item: Row, reload: () => void) => void) | Function;
    /**
     * Determines if the action should be shown for given item (if not defined, the action will be shown always).
     * @param item The item for which the action is supposed to be performed.
     */
    showIf?: ((item: Row & string[]) => boolean | Promise<boolean> | Observable<boolean>) | Function;
    /**
     * Defines the order in which action controls appear. Higher value means earlier position.
     * Controls without priority are handled with priority = 0. If you want to place an action after
     * an action without priority, negative numbers can be used.
     */
    priority?: number;
    [key: string]: any;
}
/** Describes a data grid action control for multiple items. */
interface BulkActionControl extends ActionControl {
    /**
     * A callback function.
     * @param selectedItemIds The list of ids of the selected items.
     * @param reload The function to call, if you want to reload the grid.
     */
    callback(selectedItemIds: string[], reload: () => void): void;
    /**
     * Determines if the action should be shown for given selected items (if not defined, the action will be shown always).
     * @param selectedItemIds The list of ids of the selected items for which the action is supposed to be performed.
     */
    showIf?(selectedItemIds: string[]): boolean;
}
/** Describes a data grid action control for the header. */
interface HeaderActionControl extends ActionControl {
    /**
     * Custom template can be provided. If no template is provided,
     * the default headerActionControl template is used.
     */
    template?: TemplateRef<any>;
    /**
     * A callback function.
     */
    callback(): void;
    /**
     * Determines if the action should be shown.
     */
    showIf?(): boolean;
}
/** Predefined types of actions. */
declare enum BuiltInActionType {
    /** Edit built-in action. */
    Edit = "EDIT",
    /** Delete built-in action. */
    Delete = "DELETE",
    /** Export built-in action. */
    Export = "EXPORT"
}
/**
 * Allows to attach action controls to specified grids.
 */
interface ActionControlHook {
    /**
     * The action control(s) that will be attached to the grid.
     */
    actionControls: ActionControl | ActionControl[];
    /**
     * A functions that determines to which grid(s) the action control(s) will be attached.
     * Not providing a function results in the actions control(s) not being attached to any grid.
     */
    matchesGrid: (route: ActivatedRoute, context?: GridConfigContext) => boolean | Promise<boolean> | Observable<boolean>;
}
/**
 * Factory to implement in order to add action controls from an extension.
 */
type ActionControlFactory = ExtensionFactory<ActionControlHook>;
/**
 * Defines an interface for a filter chip object, which represents a filter applied to a column.
 */
interface FilterChip {
    /**
     * The actual value that the chip will hold.
     * It can be just a string or a more complex object like
     * {id: 123, name: Test, value: test}.
     */
    value: any;
    /**
     * The value that the chip will display in the dropdown.
     */
    displayValue: string;
    /**
     * Optional label that will be displayed if filter chips are separated into multiple groups.
     */
    label?: string;
    /** An optional property that holds the path to the chip value in the externalFilterQuery. */
    path?: string[];
    /**
     * An optional property that holds the form value taken from the column configuration.
     */
    externalFilterQuery?: any;
    /**
     * An optional property that holds the formly filtering configuration for the column that this filter is applied to.
     */
    filteringConfig?: FormlyColumnFilteringConfig;
    /** An optional property that holds a string to search for. */
    filterPredicate?: string;
    /**
     * The name of the column that this filter is applied to.
     */
    columnName: string | SpecialColumnName;
    /**
     * An optional function to remove this filter from the column.
     * If not provided will set default removal function that will reduce the external query by removing the object that is resolved by the path set in the FilterChip.
     * @returns An object defined by the `FilterChip` type, including the `columnName` and  updated `externalFilterQuery` or 'filterPredicate' properties.
     * The returned object may also include additional properties defined by the `FilterChip` type as partials.
     */
    remove?: () => PartialFilterChipRemovalType;
}
/**
 * Represents a partial filter chip with either 'columnName' and 'externalFilterQuery' or 'columnName' and 'filterPredicate'.
 * @typedef {Object} PartialFilterChipRemovalType
 * @property {string} columnName - The column name for the filter chip.
 * @property {any} [externalFilterQuery] - The external filter query for the chip used for complex filters.
 * @property {any} [filterPredicate] - The filtering predicate for the chip used for simple filters with client-side filtering.
 * @property {...FilterChip} [optionalProperties] - Optional properties from the FilterChip type.
 */
type PartialFilterChipRemovalType = (Required<Pick<FilterChip, 'columnName' | 'externalFilterQuery'>> | Required<Pick<FilterChip, 'columnName' | 'filterPredicate'>>) & Partial<FilterChip>;
/**
 * Represents a partial filter chip with required properties 'displayValue' and 'value'.
 * @typedef {Object} PartialFilterChipGenerationType
 * @property {string} displayValue - The display value for the filter chip.
 * @property {any} value - The value for the filter chip.
 * @property {...FilterChip} [optionalProperties] - Optional properties from the FilterChip type.
 */
type PartialFilterChipGenerationType = Required<Pick<FilterChip, 'displayValue' | 'value'>> & Partial<FilterChip>;
/**
 * Defines an interface for a mapper function that maps a `FormlyFieldConfig` to a `FilterChip`.
 */
interface FilterMapper {
    /**
     * The type or types of the `FormlyFieldConfig` that this mapper applies to.
     */
    fieldType: string[] | string;
    /**
     * Maps a `FormlyFieldConfig` and a `FilterChip` to an `Observable` of a `FilterChip`.
     *
     * This function extends the provided `FilterChip` object with additional properties based on the information in the `FormlyFieldConfig`.
     * The mapping process depends on the specific implementation of the `FilterMapper`.
     *
     * @param field - The `FormlyFieldConfig` to map.
     * @param filter - The `FilterChip` to map.
     * @returns An `Observable` that emits the mapped `FilterChip`.
     * If undefined is returned an error is thrown and the chip is not visualized.
     *
     * ```typescript
     * // Example implementation of `map` function in a `FilterMapper`
     * map(field: FormlyFieldConfig, filter: FilterChip): Observable<FilterChip> {
     *   if (this.fieldType.includes(field.type.toString())) {
     *     return toObservable(field.templateOptions.options).pipe(
     *       map(options => {
     *         const object = options.find(option => option.value === get(filter.externalFilterQuery, filter.path));
     *         return {
     *           ...filter,
     *           value: object,
     *           displayValue: object?.label
     *         };
     *       })
     *     );
     *   }
     * }
     * ```
     */
    map: (field: FormlyFieldConfig, filter: FilterChip) => Observable<FilterChip>;
}

/**
 * Injection token used to provide a configuration strategy service for data-grid component.
 */
declare const DATA_GRID_CONFIGURATION_STRATEGY: InjectionToken<DataGridConfigurationStrategy>;
/**
 * Injection token used to provide a context information needed by any
 * configuration strategy service to retrieve/store configuration data.
 * Use this token if your context data is static.
 */
declare const DATA_GRID_CONFIGURATION_CONTEXT: InjectionToken<GridConfigContext>;
/**
 * Injection token used to provide a context information provider needed by
 * any configuration strategy service to retrieve/store configuration data.
 * Use this token is your context data is dynamic.
 */
declare const DATA_GRID_CONFIGURATION_CONTEXT_PROVIDER: InjectionToken<GridConfigContextProvider>;
/**
 * Interface for strategy services implementing storage of data-grid configuration data.
 */
interface DataGridConfigurationStrategy {
    /**
     * A method to retrive configuration data.
     * @param context Any data needed for the configuration data to be uniquely identified and retrieved.
     */
    getConfig$(context?: GridConfigContext): Observable<GridConfig>;
    /**
     * A method to persist configuration data.
     * @param config Configuration data to persist.
     * @param context Any data needed for the configuration data to be uniquely identified and retrieved.
     */
    saveConfig$(config: GridConfig, context?: GridConfigContext): Observable<GridConfig>;
    /**
     * Allows to retrieve the context provided for the given configuration strategy.
     */
    getContext(): GridConfigContext;
    /**
     * Tells if strategy has been already provided with context or context provider.
     */
    isContextKnown(): boolean;
}
/**
 * Used to provide context data needed for retrieval/storing of grid configuration data.
 */
interface GridConfigContext {
    [key: string]: any;
    /**
     * Provides a way to exclude given parts of the data grid configuration from being persisted.
     * This allows to e.g. provide a grid where column configuration (order, visibility, soritng, custom columns)
     * will be persisted, but filters on columns will be reset next time the grid is used.
     */
    configFilter?: GridConfigFilter;
}
/**
 * Defines the various types of configuration options for data grid component.
 */
type GridConfigPart = 'filter' | 'sort' | 'customColumns' | 'order' | 'visibility';
/**
 * Defines the various options to define if a given part from the data grid configuration
 * will be omited when configuration is persisted.
 * A truthy or missing value means that the given configuration part will be persisted.
 * A falsy value means that the configuration part will not be persisted.
 */
type GridConfigFilter = {
    [K in GridConfigPart]?: boolean | Promise<boolean> | Observable<boolean> | (() => boolean | Promise<boolean> | Observable<boolean>);
};
/**
 * Defines the various types of configuration change events the data grid component can emit.
 */
type GridEventType = 'filter' | 'sort' | 'pagination' | 'addCustomColumn' | 'removeCustomColumn' | 'reorderColumn' | 'changeColumnVisibility';
/**
 * Marks classes able to provide grid configuration context data.
 */
interface GridConfigContextProvider {
    getGridConfigContext(): GridConfigContext;
}

/**
 * Implements common functionality for grid configuration strategies.
 */
declare abstract class AbstractConfigurationStrategy implements DataGridConfigurationStrategy {
    protected context: GridConfigContext;
    protected contextProvider: GridConfigContextProvider;
    constructor(context: GridConfigContext, contextProvider: GridConfigContextProvider);
    abstract getConfig$(context?: GridConfigContext): Observable<GridConfig>;
    abstract saveConfig$(config: GridConfig, context?: GridConfigContext): Observable<GridConfig>;
    getContext(): GridConfigContext;
    isContextKnown(): boolean;
    protected retrieveContext<T extends GridConfigContext>(context?: T): T;
}

/**
 * You can either provide a single `ActionControlHook` as parameter:
 * ```typescript
 *  hookDataGridActionControls(...)
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  hookDataGridActionControls([...])
 * ```
 *
 * Or you provide a service that implements `ActionControlFactory`
 * ```typescript
 *  export class MyActionControlsFactory implements ActionControlFactory {...}
 *  ...
 *  hookDataGridActionControls(MyActionControlsFactory)
 * ```
 * @param config The `ActionControlHook`'s or `ExtensionFactory` to be provided.
 * @returns An `Provider` to be provided in your module.
 */
declare function hookDataGridActionControls(action: GenericHookType<ActionControlHook>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
/**
 * A service which defines device grid action options.
 */
declare class ActionControlsExtensionService extends ExtensionPointWithoutStateForPlugins<ActionControlHook> {
    private router;
    constructor(rootInjector: Injector, plugins: PluginsResolveService, router: Router);
    protected setupItemsObservable(): Observable<ActionControlHook[]>;
    static ɵfac: i0.ɵɵFactoryDeclaration<ActionControlsExtensionService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<ActionControlsExtensionService>;
}

declare class BaseColumn implements Column {
    name: string;
    path?: string;
    header?: string;
    dataType?: ColumnDataType;
    visible?: boolean;
    positionFixed?: boolean;
    resizable?: boolean;
    gridTrackSize?: string;
    headerCSSClassName?: string | string[];
    headerCellRendererComponent?: Type<any>;
    cellCSSClassName?: string | string[];
    cellRendererComponent?: Type<any>;
    sortable?: boolean;
    sortingConfig?: ColumnSortingConfig;
    sortOrder?: SortOrder;
    filterable?: boolean;
    filteringConfig?: FormlyColumnFilteringConfig;
    filteringFormRendererComponent?: Type<any>;
    filterPredicate?: string | FilterPredicateFunction;
    externalFilterQuery?: string | object;
    constructor(config?: ColumnConfig);
    /**
     * Gets a label template to be used in the schema-form's `type: 'template'` form item.
     * @param label The label to be displayed.
     * @param options Additional options:
     *   - `showWildcardTooltip`: `boolean` - appends a tooltip explaining wildcard usage
     * @returns The string with the template.
     */
    getLabelTemplate(label: string, options?: {
        showWildcardTooltip?: boolean;
    }): string;
}

declare class C8yJSONSchema extends FormlyJsonschema {
    toFieldConfig(schema: JSONSchema7, options?: any): FormlyFieldConfig;
    private c8yOptions;
    static ɵfac: i0.ɵɵFactoryDeclaration<C8yJSONSchema, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<C8yJSONSchema>;
}

interface FilteringFormRendererSpec {
    renderer: TemplateRef<FilteringFormRendererContext> | Type<any>;
    context: FilteringFormRendererContext;
}
declare class FilteringFormRendererContext {
    property: Column;
    applyFilter: (filteringModifier: FilteringModifier) => void;
    resetFilter: () => void;
}
interface FilteringModifier {
    filterPredicate?: string | FilterPredicateFunction;
    externalFilterQuery?: string | object;
}
declare class FilteringFormRendererDefDirective {
    template: TemplateRef<any>;
    constructor(template: TemplateRef<any>);
    static ɵfac: i0.ɵɵFactoryDeclaration<FilteringFormRendererDefDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<FilteringFormRendererDefDirective, "[c8yFilteringFormRendererDef]", never, {}, {}, never, never, true, never>;
}

declare class BaseFilteringFormRendererComponent implements OnInit {
    context: FilteringFormRendererContext;
    jsonschema: C8yJSONSchema;
    schema: any;
    form: FormGroup;
    model: any;
    options: any;
    fields: FormlyFieldConfig[];
    constructor(context: FilteringFormRendererContext, jsonschema: C8yJSONSchema);
    onEnterKeyUp(event: KeyboardEvent): void;
    onEscapeKeyDown(event: KeyboardEvent): void;
    ngOnInit(): void;
    applyFilter(): void;
    resetFilter(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<BaseFilteringFormRendererComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<BaseFilteringFormRendererComponent, "c8y-base-filtering-form-renderer", never, {}, {}, never, never, true, never>;
}

interface CellRendererDef {
    template: TemplateRef<any>;
}
interface CellRendererSpec {
    renderer: TemplateRef<CellRendererContext> | Type<any>;
    context: CellRendererContext;
}
declare class CellRendererContext {
    value: any;
    item?: any;
    property: AssetTableExtendedColumn;
}
declare class CellRendererDefDirective implements CellRendererDef {
    template: TemplateRef<any>;
    constructor(template: TemplateRef<any>);
    static ɵfac: i0.ɵɵFactoryDeclaration<CellRendererDefDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<CellRendererDefDirective, "[c8yCellRendererDef]", never, {}, {}, never, never, true, never>;
}
declare class HeaderCellRendererDefDirective implements CellRendererDef {
    template: TemplateRef<any>;
    constructor(template: TemplateRef<any>);
    static ɵfac: i0.ɵɵFactoryDeclaration<HeaderCellRendererDefDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<HeaderCellRendererDefDirective, "[c8yHeaderCellRendererDef]", never, {}, {}, never, never, true, never>;
}

declare class CellRendererComponent implements OnChanges, DoCheck {
    private injector;
    private cd;
    spec: CellRendererSpec;
    set _spec(spec: CellRendererSpec);
    prevSpec: CellRendererSpec;
    rendererType: 'TEMPLATE' | 'COMPONENT';
    rendererInjector: Injector;
    constructor(injector: Injector, cd: ChangeDetectorRef);
    ngOnChanges(): void;
    ngDoCheck(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<CellRendererComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<CellRendererComponent, "c8y-cell-renderer", never, { "_spec": { "alias": "spec"; "required": false; }; }, {}, never, never, true, never>;
}

declare class ColumnDirective {
    name: string;
    cellRendererDef: CellRendererDefDirective;
    headerCellRendererDef: HeaderCellRendererDefDirective;
    filteringFormRendererDef: FilteringFormRendererDefDirective;
    static ɵfac: i0.ɵɵFactoryDeclaration<ColumnDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<ColumnDirective, "c8y-column", never, { "name": { "alias": "name"; "required": false; }; }, {}, ["cellRendererDef", "headerCellRendererDef", "filteringFormRendererDef"], never, true, never>;
}

declare class CustomColumn extends BaseColumn {
    type: CustomColumnType;
    constructor(initialColumnConfig?: CustomColumnConfig);
}

declare class FilteringFormRendererComponent implements OnChanges {
    private injector;
    private cd;
    spec: FilteringFormRendererSpec;
    set _spec(spec: FilteringFormRendererSpec);
    rendererType: 'TEMPLATE' | 'COMPONENT';
    rendererInjector: Injector;
    defaultRendererFilterText: string;
    constructor(injector: Injector, cd: ChangeDetectorRef);
    ngOnChanges(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<FilteringFormRendererComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<FilteringFormRendererComponent, "c8y-filtering-form-renderer", never, { "_spec": { "alias": "spec"; "required": false; }; }, {}, never, never, true, never>;
}

declare class DataGridService {
    protected userPreferencesService: UserPreferencesService;
    protected DEFAULT_PAGE_SIZE: number;
    protected queriesUtil: QueriesUtil;
    constructor(userPreferencesService: UserPreferencesService);
    clearConfig(key: string): void;
    getConfig$(key: string): Observable<GridConfig>;
    saveConfig$(config: GridConfig, key: string): Observable<GridConfig>;
    getUserConfiguredColumns$(columns: Column[] | Observable<Column[]>, storageKey?: string): Observable<Column[]>;
    getQueryObj(columns: Column[], defaultFilter?: {}): any;
    applyConfigToColumns(config: GridConfig, columns: Column[], storageKey?: string): Column[];
    private extendQueryByColumn;
    static ɵfac: i0.ɵɵFactoryDeclaration<DataGridService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<DataGridService>;
}

declare class ExpandableRowDirective {
    template: TemplateRef<unknown>;
    elementRef: ElementRef;
    viewContainer: ViewContainerRef;
    constructor(template: TemplateRef<unknown>, elementRef: ElementRef, viewContainer: ViewContainerRef);
    static ɵfac: i0.ɵɵFactoryDeclaration<ExpandableRowDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<ExpandableRowDirective, "[c8yExpandableRow]", never, {}, {}, never, never, true, never>;
}

declare class GridDataSource implements DataSource<object> {
    loading$: Observable<boolean>;
    data$: Observable<object[]>;
    stats$: Observable<DataSourceStats>;
    selection$: Observable<any>;
    resultList$: Observable<IResultList<object>>;
    nodesLoading$: Observable<Row[]>;
    set childNodesProperty(name: string);
    private loadingSubject;
    private dataSourceSubject;
    private dataStatsSubject;
    private dataSelectionSubject;
    private resultListSubject;
    private nodesLoadingSubject;
    private childNodesPropertyName;
    constructor();
    connect(_collectionViewer: CollectionViewer): Observable<object[]>;
    disconnect(_collectionViewer: CollectionViewer): void;
    loadData({ rows, columns, pagination, searchText, serverSideDataCallback, selectable, selectionPrimaryKey, infiniteScroll, reload, parentRow }: {
        rows: any;
        columns: any;
        pagination: any;
        searchText: any;
        serverSideDataCallback: any;
        selectable: any;
        selectionPrimaryKey: any;
        infiniteScroll: any;
        reload?: boolean;
        parentRow?: any;
    }): void;
    collapseNode(row: Row): void;
    resolveValue(x: any, path: any): any;
    resolveFunction(x: any): any;
    normalizeNil(x: any): any;
    private getLevel;
    private emitLoadingStart;
    private emitLoadingEnd;
    private doClientSideFiltering;
    private doClientSideSearch;
    private doClientSideSorting;
    private doClientSidePagination;
    private createRegexSearch;
    private isParent;
}

declare class DataGridComponent implements DataGrid, OnChanges, AfterViewInit, ProductExperienceEventSource {
    configurationStrategy: DataGridConfigurationStrategy;
    private dataGridService;
    private sanitizer;
    private gainsightService;
    private alertService;
    private actionControlsService;
    private route;
    /** The title for the data grid, it's displayed in the grid's header. */
    title: string;
    /** The label for load more button. */
    loadMoreItemsLabel: string;
    /** The label for loading indicator. */
    loadingItemsLabel: string;
    /** Determines whether text search input is shown in the grid's header. */
    showSearch: boolean;
    /** Takes an event emitter. When an event is emitted, the grid will be reloaded. */
    refresh: EventEmitter<void>;
    /** Determines whether the grid is in a loading state. To be used in client side data scenarios where data is assigned using `rows` input. */
    loading: boolean;
    columns: Column[];
    /** The list of columns to be displayed in the grid. */
    _columns: Column[];
    dataSource: GridDataSource;
    rows: Row[];
    /** The list of rows to be displayed in the grid (used for client side data). */
    set _rows(rows: Row[]);
    filteringLabelsParams: {
        filteredItemsCount: number;
        allItemsCount: number;
    };
    pagination: Pagination;
    paginationLabelParams: {
        pageFirstItemIdx: number;
        pageLastItemIdx: number;
        itemsTotal: number;
    };
    lastClickedRow: Row;
    readonly possiblePageSizes: number[];
    readonly minPossiblePageSize: number;
    /** Pagination settings, e.g. allows for setting current page or page size. */
    set _pagination(pagination: Pagination);
    /** Child node pagination settings, e.g. allows for setting page size of loaded child node pages. */
    childNodePagination: Pagination;
    infiniteScroll: LoadMoreMode;
    /** Sets load more mode. */
    set _infiniteScroll(infiniteScroll: LoadMoreMode);
    serverSideDataCallback: ServerSideDataCallback;
    /**
     * Sets a callback function which will be invoked whenever data needs to be loaded from server.
     * The function should take [[DataSourceModifier]] and return [[ServerSideDataResult]].
     */
    set _serverSideDataCallback(serverSideDataCallback: ServerSideDataCallback);
    selectable: boolean;
    /** Determines whether items can be selected by clicking a checkbox in the first column. */
    set _selectable(selectable: boolean);
    singleSelection: boolean;
    /** Restricts selection to a single row only. Selection column displays radio button instead of checkboxes */
    set _singleSelection(singleSelection: boolean);
    selectionPrimaryKey: string;
    /** Determines which item's property will be used to distinguish selection status. */
    set _selectionPrimaryKey(selectionPrimaryKey: string);
    displayOptions: DisplayOptions;
    /** Sets display options. */
    set _displayOptions(displayOptions: Partial<DisplayOptions>);
    actionControls: ActionControl[];
    /** Sets action controls (actions available for individual items). */
    set _actionControls(actionControls: ActionControl[]);
    bulkActionControls: BulkActionControl[];
    /** Sets bulk action controls (actions available for items selected by user). */
    set _bulkActionControls(bulkActionControls: BulkActionControl[]);
    headerActionControls: HeaderActionControl[];
    /** Sets header action controls (actions available from data grid header). */
    set _headerActionControls(headerActionControls: HeaderActionControl[]);
    /** Sets initial search text. */
    searchText: string;
    /** Determines if custom columns button will be enabled. */
    configureColumnsEnabled: boolean;
    /** Shows the warning for the sub-assets counter */
    showCounterWarning: boolean;
    /**
     * Sets the class name used for active rows (last clicked).
     * Set empty string to disable appending active class to grid rows.
     */
    activeClassName: string;
    /** Determines if the rows of the data grid will be expandable.
     * Possible values:
     * - `NONE` - no expandable rows (default value)
     * - `SYNC` - additional column with expand button is displayed and expandable rows are expanding synchronously when button is clicked
     * - `ASYNC` - additional column with expand button is displayed and expandable rows are expanding asynchronously when button is clicked
     */
    expandableRows: 'NONE' | 'SYNC' | 'ASYNC';
    /**
     * Determines if the data grid is a tree grid.
     * If set to true, an additional column with expand/collapse button is displayed for rows with child nodes.
     */
    treeGrid: boolean;
    /** Determines if the Reload button will be hidden. */
    hideReload: boolean;
    /**
     * In a client side data fed tree-grid, this input determines the name of the
     * property holding the child nodes of the current node.
     * Default value is `childNodes`.
     */
    set childNodesProperty(childNodesProperty: string);
    /**
     * In a tree-grid, this input determines the name of the property that will be used as a label
     * to refer to the parent node its pagination row.
     */
    parentNodeLabelProperty: string;
    /** Emits an event when mouse is over a row. */
    rowMouseOver: EventEmitter<object>;
    /** Emits an event when mouse leaves a row. */
    rowMouseLeave: EventEmitter<object>;
    /** Emits an event when a row is clicked. */
    rowClick: EventEmitter<object>;
    /** Emits an event when grid's configuration is changed. */
    onConfigChange: EventEmitter<GridConfig>;
    /** Emits an event before the filter is applied. */
    onBeforeFilter: EventEmitter<object>;
    /** Emits an event before the search is performed. */
    onBeforeSearch: EventEmitter<string>;
    /** Emits an event when a filter is applied in a column. */
    onFilter: EventEmitter<{
        columnName?: string;
        dropdown?: BsDropdownDirective;
        filteringModifier?: Filter;
    }>;
    /** Emits an event when items selection changes. The array contains keys of selected items (key property is defined by `selectionPrimaryKey`). */
    itemsSelect: EventEmitter<string[]>;
    /** Emits an event when reload button is clicked. */
    onReload: EventEmitter<void>;
    /** Emits an event when a custom column is added */
    onAddCustomColumn: EventEmitter<CustomColumnConfig>;
    /** Emits an event when a custom column is removed */
    onRemoveCustomColumn: EventEmitter<Column>;
    /** Emits an event after the column filter has been reset */
    onColumnFilterReset: EventEmitter<Column>;
    /** Emits an event when column sorting has been changed */
    onSort: EventEmitter<GridConfig>;
    /** Emits an event when page size has been changed */
    onPageSizeChange: EventEmitter<GridConfig>;
    /** Emits an event when column order has been changed */
    onColumnReordered: EventEmitter<GridConfig>;
    /** Emits an event when column order has been changed */
    onColumnVisibilityChange: EventEmitter<GridConfig>;
    columnRenderers: QueryList<ColumnDirective>;
    expandableRow: ExpandableRowDirective;
    scrollContainer: ElementRef;
    infiniteScrollContainer: ViewContainerRef;
    emptyState: EmptyStateContextDirective;
    loadMoreComponent: LoadMoreComponent;
    columnNames: any[];
    styles: {
        tableCursor: string;
        gridTemplateColumns: any;
        gridInfiniteScrollColumn: any;
    };
    searchText$: EventEmitter<string>;
    filteringApplied: boolean;
    columnsWithFiltersApplied: Column[];
    totalPagesCount$: BehaviorSubject<number>;
    hidePagination$: Observable<boolean>;
    selectedItemIds: string[];
    currentPageSelectionState: {
        allSelected: boolean;
        allDeselected: boolean;
    };
    builtInActionType: {
        Edit: BuiltInActionType;
        Delete: BuiltInActionType;
        Export: BuiltInActionType;
    };
    isConfigContextKnown: boolean;
    emptyStateContext$: Observable<DataSourceStats>;
    /**
     * A map of rows which have been expanded.
     */
    expandedRows: Map<Row, {
        visible$: Subject<boolean> | BehaviorSubject<boolean>;
    }>;
    /** Product experience constants declarations */
    productExperienceEvent: ProductExperienceEvent;
    PX_ACTIONS: {
        APPLY_FILTER: string;
        RESET_FILTER: string;
        REMOVE_FILTER: string;
        CLEAR_FILTER: string;
        CUSTOM_ACTION: string;
        ADD_CUSTOM_COLUMN: string;
        REMOVE_CUSTOM_COLUMN: string;
        REORDER_COLUMNS: string;
        CHANGE_VISIBILITY: string;
        CHANGE_SORTING_ORDER: string;
        CHANGE_PAGINATION: string;
        SELECT_ALL_ITEMS: string;
        BULK_DELETE: string;
        BULK_EXPORT: string;
        BULK_CUSTOM_ACTION: string;
        BULK_CANCEL: string;
        SELECT_ITEM: string;
        EDIT_ITEM: string;
        DELETE_ITEM: string;
        EXPORT_ITEM: string;
        CUSTOM_ACTION_ITEM: string;
        RELOAD: string;
        SEARCH: string;
        CLEAR_SEARCH: string;
    };
    readonly sortColumnTitle: "Sort column \"{{ name }}\"";
    resizeHandleMouseDown$: EventEmitter<{
        event: MouseEvent;
        targetColumnName: string;
    }>;
    resizeHandleContainerMouseMove$: EventEmitter<MouseEvent>;
    windowMouseUp$: Observable<MouseEvent>;
    filtersHelpPopoverHtml: string;
    canRetrieveAssetProperties: Promise<boolean>;
    currentRemoveCustomColumnPopover?: PopoverDirective;
    private customColumnService;
    private headerBeingResized;
    private thRefs;
    private thEls;
    tableRef: CdkTable<any>;
    private recreateLoadMoreComponent;
    private columnsInitialized;
    private defaultColumns;
    private reloadConfiguration$;
    private actionControlsInput$;
    private unsubscribe$;
    private manualSearch$;
    private lastManualSearchValue;
    private readonly SEARCH_DEBOUNCE_TIME;
    /**
     * Event emitter, taking boolean values used for loading data grid data with debounce.
     * Default value is set to false. Set to true if data grid is using infinite scroll and page should be reloaded.
     * This is used to avoid having multiple this.loadData() function calls.
     */
    private triggerLoadData;
    constructor(configurationStrategy: DataGridConfigurationStrategy, dataGridService: DataGridService, sanitizer: DomSanitizer, gainsightService: GainsightService, alertService: AlertService, actionControlsService: ActionControlsExtensionService, route: ActivatedRoute);
    ngOnInit(): void;
    setExpandableRowVisible(row: Row, success: boolean): void;
    ngOnChanges(event: any): void;
    ngAfterViewInit(): void;
    ngOnDestroy(): void;
    expand(row: Row): BehaviorSubject<boolean> | Subject<boolean>;
    collapse(row: Row): void;
    expandNode(row: Row): void;
    collapseNode(row: Row): void;
    isDataRow: (idx: number, row: Row) => boolean;
    isRowExpanded: (_: any, row: Row) => boolean;
    isPaginationRow: (_: any, row: Row) => boolean;
    setColumns(config: GridConfig): void;
    setPageSize(config: GridConfig): void;
    openCustomColumn(): Promise<void>;
    confirmRemoveColumn(column: Column): void;
    removeFilter(filter: Partial<FilterChip>): Promise<void>;
    trackByName(index: any, item: any): any;
    resolveCellValue(row: any, path: any): any;
    changeSortOrder(columnName: any): void;
    updateSorting(columnNames: string[], sortOrder: SortOrder): void;
    applyFilter(columnName: any, dropdown: any, filteringModifier: any): void;
    resetFilter(columnName: any, dropdown: any): void;
    clearFilters(reload?: boolean): void;
    updateFiltering(columnNames: string[], action: {
        type: FilteringActionType;
        payload?: {
            filteringModifier: FilteringModifier;
        };
    }, reload?: boolean): void;
    updateFilteringApplied(): void;
    isColumnFilteringApplied(column: Column): boolean;
    updatePagination({ itemsPerPage, page }: {
        itemsPerPage: any;
        page: any;
    }): void;
    updateChildPagination({ itemsPerPage, page }: {
        itemsPerPage: any;
        page: any;
    }, { parentRow }: {
        parentRow: any;
    }): void;
    clickReload(): void;
    reload(redirect?: boolean): void;
    loadNextPage(): Promise<IResultList<object>>;
    getCellRendererSpec({ value, row, columnName }: {
        value: any;
        row: any;
        columnName: any;
    }): CellRendererSpec;
    getHeaderCellRendererSpec({ value, columnName }: {
        value: any;
        columnName: any;
    }): CellRendererSpec;
    getFilteringFormRendererSpec({ column, dropdown }: {
        column: any;
        dropdown: any;
    }): FilteringFormRendererSpec;
    setAllItemsSelected(selected: any): void;
    setAllItemsInCurrentPageSelected(selected: any): void;
    setItemsSelected(items: any, selected: any): void;
    changeSelectedItem(item: any): void;
    cancel(): void;
    isItemSelected(item: any): boolean;
    onColumnDrop({ previousIndex, currentIndex }: {
        previousIndex: any;
        currentIndex: any;
    }): void;
    updateGridColumnsSize(): void;
    updateThEls(): void;
    isDropDownPlacedRight(column: Column): boolean;
    emitConfigChange(eventType?: GridEventType): void;
    triggerEvent(eventData: any): void;
    handleClick(row: Row): void;
    performSearch(searchText: string): void;
    private setupSearchObservables;
    private onResetFilterAction;
    private mapColumnToConfig;
    private loadData;
    private updateColumns;
    private addOrRemoveCellPaddingClass;
    private checkIfAnyValuesExist;
    private withColumnDefaults;
    private updateColumnNames;
    private setupResizeHandle;
    private clearMouseHighlights;
    private _getCellRendererSpec;
    private getColumnRenderer;
    private updateFilteringLabelsParams;
    private updatePaginationLabelParams;
    private updatePaginationWhenNoDevicesLastPage;
    private createLoadMoreComponent;
    private scrollToTop;
    private processAndPersistConfigChange;
    private trimFilterConfigPipe;
    private trimSortConfigPipe;
    private trimCustomColumnConfigPipe;
    private ignoreColumnOrderPipe;
    private ignoreColumnVisibilityPipe;
    private checkEventPipe;
    private resolveConfigFilter;
    private safelyInvokeMatcher;
    static ɵfac: i0.ɵɵFactoryDeclaration<DataGridComponent, [{ optional: true; }, null, null, null, null, null, null]>;
    static ɵcmp: i0.ɵɵComponentDeclaration<DataGridComponent, "c8y-data-grid", never, { "title": { "alias": "title"; "required": false; }; "loadMoreItemsLabel": { "alias": "loadMoreItemsLabel"; "required": false; }; "loadingItemsLabel": { "alias": "loadingItemsLabel"; "required": false; }; "showSearch": { "alias": "showSearch"; "required": false; }; "refresh": { "alias": "refresh"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "_columns": { "alias": "columns"; "required": false; }; "_rows": { "alias": "rows"; "required": false; }; "_pagination": { "alias": "pagination"; "required": false; }; "childNodePagination": { "alias": "childNodePagination"; "required": false; }; "_infiniteScroll": { "alias": "infiniteScroll"; "required": false; }; "_serverSideDataCallback": { "alias": "serverSideDataCallback"; "required": false; }; "_selectable": { "alias": "selectable"; "required": false; }; "_singleSelection": { "alias": "singleSelection"; "required": false; }; "_selectionPrimaryKey": { "alias": "selectionPrimaryKey"; "required": false; }; "_displayOptions": { "alias": "displayOptions"; "required": false; }; "_actionControls": { "alias": "actionControls"; "required": false; }; "_bulkActionControls": { "alias": "bulkActionControls"; "required": false; }; "_headerActionControls": { "alias": "headerActionControls"; "required": false; }; "searchText": { "alias": "searchText"; "required": false; }; "configureColumnsEnabled": { "alias": "configureColumnsEnabled"; "required": false; }; "showCounterWarning": { "alias": "showCounterWarning"; "required": false; }; "activeClassName": { "alias": "activeClassName"; "required": false; }; "expandableRows": { "alias": "expandableRows"; "required": false; }; "treeGrid": { "alias": "treeGrid"; "required": false; }; "hideReload": { "alias": "hideReload"; "required": false; }; "childNodesProperty": { "alias": "childNodesProperty"; "required": false; }; "parentNodeLabelProperty": { "alias": "parentNodeLabelProperty"; "required": false; }; }, { "rowMouseOver": "rowMouseOver"; "rowMouseLeave": "rowMouseLeave"; "rowClick": "rowClick"; "onConfigChange": "onConfigChange"; "onBeforeFilter": "onBeforeFilter"; "onBeforeSearch": "onBeforeSearch"; "onFilter": "onFilter"; "itemsSelect": "itemsSelect"; "onReload": "onReload"; "onAddCustomColumn": "onAddCustomColumn"; "onRemoveCustomColumn": "onRemoveCustomColumn"; "onColumnFilterReset": "onColumnFilterReset"; "onSort": "onSort"; "onPageSizeChange": "onPageSizeChange"; "onColumnReordered": "onColumnReordered"; "onColumnVisibilityChange": "onColumnVisibilityChange"; }, ["expandableRow", "emptyState", "columnRenderers"], ["c8y-ui-empty-state, .c8y-empty-state"], true, never>;
}

declare class TreeNodeCellRendererComponent {
    context: CellRendererContext;
    dataGridComponent: DataGridComponent;
    readonly collapse: "Collapse";
    readonly expand: "Expand";
    isExpanded: i0.WritableSignal<boolean>;
    loading: i0.WritableSignal<boolean>;
    level: any;
    btnClass: i0.Signal<{
        [x: string]: boolean;
        active: boolean;
    }>;
    constructor(context: CellRendererContext, dataGridComponent: DataGridComponent);
    toggleExpand(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<TreeNodeCellRendererComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<TreeNodeCellRendererComponent, "c8y-tree-node-cell-renderer", never, {}, {}, never, never, true, never>;
}

declare class TreeNodeColumn implements Column {
    name: string;
    path?: string;
    header?: string;
    dataType?: ColumnDataType;
    visible?: boolean;
    positionFixed?: boolean;
    gridTrackSize?: string;
    headerCSSClassName?: string | string[];
    headerCellRendererComponent?: Type<unknown>;
    cellCSSClassName?: string | string[];
    cellRendererComponent?: Type<unknown>;
    sortable?: boolean;
    sortOrder?: SortOrder;
    filterable?: boolean;
    filteringFormRendererComponent?: Type<unknown>;
    filterPredicate?: string | FilterPredicateFunction;
    externalFilterQuery?: string | object;
    constructor();
}

declare class TreeNodeHeaderCellRendererComponent {
    static ɵfac: i0.ɵɵFactoryDeclaration<TreeNodeHeaderCellRendererComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<TreeNodeHeaderCellRendererComponent, "c8y-tree-node-header-cell-renderer", never, {}, {}, never, never, true, never>;
}

declare class ConfigureCustomColumnComponent {
    fb: FormBuilder;
    modalRef: BsModalRef;
    readonly SIMPLE_JSON_PATH_REGEX: RegExp;
    form: NgForm;
    onAddCustomColumn: EventEmitter<CustomColumnConfig>;
    formGroup: FormGroup;
    columns: Column[];
    uniqueHeaderMsg: "The column header name is too similar to \"{{ value }}\".";
    constructor(fb: FormBuilder, modalRef: BsModalRef);
    comparator(val1: any, val2: any): boolean;
    addColumn(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<ConfigureCustomColumnComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ConfigureCustomColumnComponent, "c8y-configure-custom-column", never, {}, { "onAddCustomColumn": "onAddCustomColumn"; }, never, never, true, never>;
}

declare class DynamicFormsI18nModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<DynamicFormsI18nModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<DynamicFormsI18nModule, never, [typeof i6.FormlyModule, typeof C8yTranslateModule], never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<DynamicFormsI18nModule>;
}

declare class ValidationModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<ValidationModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<ValidationModule, never, [typeof C8yTranslateModule, typeof i6.FormlyModule], never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<ValidationModule>;
}

/**
 * A drop-zone which is a file selector allowing users to select file(s) from their file system, either natively or by drag and drop.
 *
 * ```html
 *  <div>
 *    <c8y-drop-area
 *      (dropped)="uploadFile($event)"
 *      [icon]="'upload'"
 *      [accept]="'.zip,.7z,video'">
 *    </c8y-drop-area>
 *  </div>
 * ```
 */
declare class DropAreaComponent implements OnInit, ControlValueAccessor {
    private cd;
    private filesService;
    private translate;
    private bytes;
    private ref;
    formControl: AbstractControl<any, any>;
    title: "Upload file";
    message: "Drop file here";
    icon: string;
    loadingMessage: "Uploading…";
    forceHideList: boolean;
    /** Affects displaying both the drop zone and the list of dropped files. */
    alwaysShow: boolean;
    clickToOpen: boolean;
    loading: boolean;
    /**
     * Current progress of the upload as a percentage. If not given a spinner will be displayed.
     */
    progress: number;
    dropped: EventEmitter<DroppedFile[]>;
    maxAllowedFiles: number;
    files: FileList;
    maxFileSizeInMegaBytes: number;
    /** Specifies a filter for what file types the user can pick from the file input dialog box.
     *
     * Specify file types by extensions:
     * ```html
     *  [accept]="'.zip,.7z'"
     * ```
     *
     * Specify file types by extensions and generic types [GENERIC_FILE_TYPE]{@link GENERIC_FILE_TYPE}:
     * ```html
     *  [accept]="'.pdf,archive'"
     * ```
     *
     * Specify file types by generic types [GENERIC_FILE_TYPE]{@link GENERIC_FILE_TYPE}:
     * ```html
     *  [accept]="'archive,video'"
     * ```
     */
    accept: string;
    isOver: boolean;
    errors: boolean;
    errorMessage: string;
    filesNameString: string;
    acceptedExts: string[];
    hasDropAreaSmallClass: boolean;
    disabled: boolean;
    area: ElementRef;
    zone: ElementRef;
    picker: ElementRef;
    constructor(cd: ChangeDetectorRef, filesService: FilesService, translate: TranslateService$1, bytes: BytesPipe, ref: ElementRef);
    onkeyup(event: KeyboardEvent): void;
    ngOnInit(): void;
    ngAfterViewChecked(): void;
    /**
     * Toggles the style of the drop zone element when a file is dragged over the component.
     */
    toggle(): void;
    /**
     * Shows computer browser with files to drop into drop-area zone.
     */
    showPicker($event?: any): void;
    /**
     * Triggered when file is on over drop area, but not dropped.
     */
    onOver(): void;
    /**
     * Triggered when file is dropped.
     */
    onPick($event: any): void;
    /**
     * Handle file when it is dropped into drop-area.
     */
    onDrop($event: any): void;
    /**
     * Checks condition what should be displayed: drop-area zone or list of dropped files.
     */
    shouldShowFilesList(): boolean;
    /**
     * Triggered when file is picked over web application.
     */
    stopDragging(): void;
    /**
     * Delete files already dropped files.
     */
    onDelete(): void;
    onChange: (value: any) => void;
    onTouched: () => void;
    writeValue(value: any): void;
    registerOnChange(fn: any): void;
    registerOnTouched(fn: any): void;
    setDisabledState(isDisabled: boolean): void;
    private onFilesSelected;
    private onFileInvalidNameLength;
    private onFileInvalidType;
    private onFileInvalidSize;
    private convertMegaBytesToBytes;
    private getFilesNamesAsString;
    private isFilesArrayEmpty;
    private isTooManyFiles;
    private isFilesAnObjectOrArray;
    private hasEmptyFiles;
    private isAnyFileEmpty;
    private clearErrors;
    private preventDefault;
    private compose;
    private read;
    private onLoad;
    static ɵfac: i0.ɵɵFactoryDeclaration<DropAreaComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<DropAreaComponent, "c8y-drop-area", never, { "formControl": { "alias": "formControl"; "required": false; }; "title": { "alias": "title"; "required": false; }; "message": { "alias": "message"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "loadingMessage": { "alias": "loadingMessage"; "required": false; }; "forceHideList": { "alias": "forceHideList"; "required": false; }; "alwaysShow": { "alias": "alwaysShow"; "required": false; }; "clickToOpen": { "alias": "clickToOpen"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "progress": { "alias": "progress"; "required": false; }; "maxAllowedFiles": { "alias": "maxAllowedFiles"; "required": false; }; "files": { "alias": "files"; "required": false; }; "maxFileSizeInMegaBytes": { "alias": "maxFileSizeInMegaBytes"; "required": false; }; "accept": { "alias": "accept"; "required": false; }; }, { "dropped": "dropped"; }, never, ["*"], true, never>;
}
interface DroppedFile {
    file: File;
    readAsText(): any;
    readAsArrayBuffer(): any;
    readAsBinaryString(): any;
    readAsDataURL(): any;
    readAsJson(): any;
}

/**
 * The angular module definition for a drop-area.
 * @exports DropAreaComponent
 */
declare class DropAreaModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<DropAreaModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<DropAreaModule, never, [typeof DropAreaComponent], [typeof DropAreaComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<DropAreaModule>;
}

declare class TimePickerComponent implements ControlValueAccessor, OnDestroy {
    private cdRef;
    hours: string;
    minutes: string;
    lastValidHours: string;
    lastValidMinutes: string;
    minDate: string;
    maxDate: string;
    placeholder: string;
    dayForward: EventEmitter<any>;
    dayBackward: EventEmitter<any>;
    disabled: boolean;
    date: Date;
    onChange: (value: {
        hour: number;
        minute: number;
    }) => void;
    onTouched: () => void;
    private touched;
    private destroy$;
    private simulatedWheelUpEvent;
    private simulatedWheelDownEvent;
    constructor(cdRef: ChangeDetectorRef);
    parseValue(target: any, lastValid: any, limit: any): void;
    initializeMinutes(): void;
    initializeHours(): void;
    handleHourScroll(ev: any): void;
    handleMinuteScroll(ev: any): void;
    emitValue(): void;
    ngOnDestroy(): void;
    /**
     * Control Value Accessor - If form value changes by external factor, update date property and internal form with new value.
     */
    writeValue(value: {
        hour: number;
        minute: number;
    }): void;
    registerOnChange(fn: any): void;
    registerOnTouched(onTouched: any): void;
    markAsTouched(): void;
    setDisabledState(disabled: boolean): void;
    private hasValue;
    static ɵfac: i0.ɵɵFactoryDeclaration<TimePickerComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<TimePickerComponent, "c8y-time-picker", never, { "minDate": { "alias": "minDate"; "required": false; }; "maxDate": { "alias": "maxDate"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; }, { "dayForward": "dayForward"; "dayBackward": "dayBackward"; }, never, never, true, never>;
}

/**
 * The angular module definition for a time picker - it provides FormControl that handles time.
 */
declare class TimePickerModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<TimePickerModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<TimePickerModule, never, [typeof FormsModule, typeof i1.CommonModule, typeof i2$1.FormsModule, typeof i2$1.ReactiveFormsModule, typeof i4$1.BsDatepickerModule, typeof CommonModule, typeof TimePickerComponent], [typeof TimePickerComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<TimePickerModule>;
}

interface PickedDates {
    dateTo?: Date;
    dateFrom?: Date;
}

declare class DatePickerComponent implements OnInit {
    onDateSelected: EventEmitter<PickedDates>;
    placeholder: "Filter by date…";
    dateInputFormat: string;
    dateFrom: string;
    dateTo: string;
    fgDatePicker: FormGroup;
    private dateFormatService;
    ngOnInit(): void;
    filter(): void;
    clearFilter(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<DatePickerComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<DatePickerComponent, "c8y-date-picker", never, { "placeholder": { "alias": "placeholder"; "required": false; }; "dateInputFormat": { "alias": "dateInputFormat"; "required": false; }; }, { "onDateSelected": "onDateSelected"; }, never, never, true, never>;
}

/**
 * The angular module definition for a date picker - it allows you to pick either one date or a range of two.
 * @exports DatePickerComponent
 */
declare class DatePickerModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<DatePickerModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<DatePickerModule, never, [typeof FormsModule, typeof i1.CommonModule, typeof i2$1.FormsModule, typeof i1$1.A11yModule, typeof i2$1.ReactiveFormsModule, typeof i5.BsDropdownModule, typeof i4$1.BsDatepickerModule, typeof CommonModule, typeof DatePickerComponent], [typeof DatePickerComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<DatePickerModule>;
}

interface DateAndTimeOptions {
    showSpinners?: boolean;
    showMeridian?: boolean;
    showMinutes?: boolean;
    showSeconds?: boolean;
}
type DateType = 'DateAndTime' | 'Date' | 'DateRange' | 'SingleDateRequired' | 'Time';
declare class DateTimePickerComponent implements ControlValueAccessor, Validator, OnInit, AfterViewInit, OnDestroy {
    private cd;
    private dateFormatService;
    /**
     * The minimum date that can be selected in the date-time picker.
     * This property is used to restrict the selection of dates before this value.
     */
    minDate: Date;
    set _minDate(value: string);
    /**
     * The maximum date that can be selected in the date-time picker.
     * This property is used to restrict the selection of dates beyond this value.
     */
    maxDate: Date;
    set _maxDate(value: string);
    placeholder: string;
    /**
     * The format in which the date input should be displayed.
     * E.g. 'dd/MM/yyyy' or 'MM/dd/yyyy'.
     * This format is used to parse and display the date in the input field.
     */
    dateInputFormat: string;
    /**
     * If true, the datepicker will adapt its position based on available space.
     * This is useful for responsive designs where the datepicker should not overflow the viewport.
     */
    adaptivePosition: boolean;
    /**
     * Specifies the size of the date-time picker.
     */
    size: string;
    /**
     * Specifies the type of date input.
     *
     * @param DateAndTime - Display both date and time.
     * @param Date - Display only the date without the time.
     * @param DateRange - Specify a range of dates.
     * @param SingleDateRequired - Require the selection of a single date.
     * @param Time - Display only the time without the date.
     *
     * @defaultValue 'DateAndTime'
     */
    dateType: DateType;
    config: DateAndTimeOptions;
    onDateSelected: EventEmitter<PickedDates>;
    date: Date;
    time: Date | null;
    form: FormGroup;
    defaultPlaceholder: "Select a date…";
    datepicker: BsDatepickerDirective;
    private previousValue;
    private previousTimePickerValues;
    private destroy$;
    constructor(cd: ChangeDetectorRef, dateFormatService: DateFormatService);
    datepickerShown({ _element }: {
        _element: ElementRef;
    }): void;
    onChange: (value: string) => void;
    onTouched: () => void;
    ngOnInit(): void;
    ngOnDestroy(): void;
    ngAfterViewInit(): void;
    onTimeChange(time: Date): void;
    get dateControl(): FormControl;
    /**
     * Control Value Accessor - If form value changes by external factor, update date property and internal form with new value.
     */
    writeValue(value: string): void;
    registerOnChange(fn: any): void;
    registerOnTouched(onTouched: any): void;
    setDisabledState(disabled: boolean): void;
    validate(_control: AbstractControl): ValidationErrors | null;
    previousDay(): void;
    nextDay(): void;
    hide(): void;
    handleMouseWheel(event: WheelEvent): void;
    /**
     * If internal form changes its value, then combine date and time into one Date and pass its ISO string value to onChange method
     * @param dateTime
     * @private
     */
    private setDatetime;
    private verifyDate;
    private isInputCleared;
    static ɵfac: i0.ɵɵFactoryDeclaration<DateTimePickerComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<DateTimePickerComponent, "c8y-date-time-picker", never, { "_minDate": { "alias": "minDate"; "required": false; }; "_maxDate": { "alias": "maxDate"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "dateInputFormat": { "alias": "dateInputFormat"; "required": false; }; "adaptivePosition": { "alias": "adaptivePosition"; "required": false; }; "size": { "alias": "size"; "required": false; }; "dateType": { "alias": "dateType"; "required": false; }; "config": { "alias": "config"; "required": false; }; }, { "onDateSelected": "onDateSelected"; }, never, never, true, never>;
}

declare class CloseDatePickerDirective {
    private el;
    protected destroy$: Subject<void>;
    closeDatepicker: BsDatepickerDirective;
    constructor(el: ElementRef);
    ngOnInit(): void;
    ngOnDestroy(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<CloseDatePickerDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<CloseDatePickerDirective, "[closeDatepicker]", never, { "closeDatepicker": { "alias": "closeDatepicker"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * The angular module definition for a date-time picker - it provides FormControl that handles date and time.
 * @exports DateTimePickerComponent
 */
declare class DateTimePickerModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<DateTimePickerModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<DateTimePickerModule, never, [typeof FormsModule, typeof i1.CommonModule, typeof i2$1.FormsModule, typeof i2$1.ReactiveFormsModule, typeof i4$1.BsDatepickerModule, typeof i5$2.TimepickerModule, typeof CommonModule, typeof TimePickerModule, typeof DatePickerModule, typeof DateTimePickerComponent, typeof CloseDatePickerDirective], [typeof DateTimePickerComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<DateTimePickerModule>;
}

declare class ArrayTypeComponent extends FieldArrayType implements OnInit {
    fieldArrayProps: FormlyFieldProps;
    add(): void;
    remove(i: number): void;
    ngOnInit(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<ArrayTypeComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ArrayTypeComponent, "c8y-array-type", never, {}, {}, never, never, true, never>;
}

declare class FieldCheckbox extends FieldType {
    defaultOptions: {
        templateOptions: {
            indeterminate: boolean;
            formCheck: string;
        };
    };
    static ɵfac: i0.ɵɵFactoryDeclaration<FieldCheckbox, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<FieldCheckbox, "c8y-field-checkbox", never, {}, {}, never, never, true, never>;
}

declare class WrapperFormField extends FieldWrapper implements OnInit {
    maxHelpBlockLength: number;
    showDescriptionAsPopup: boolean;
    smallFormGroup: boolean;
    ngOnInit(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<WrapperFormField, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<WrapperFormField, "c8y-wrapper-form-field", never, {}, {}, never, never, true, never>;
}

declare class FieldFile extends FieldType implements OnInit {
    readonly dropAreaInputs: string[];
    dropArea: DropAreaComponent;
    ngOnInit(): void;
    droppedEvent(files: DroppedFile[]): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<FieldFile, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<FieldFile, "c8y-field-file", never, {}, {}, never, never, true, never>;
}

declare class FieldInput extends FieldType {
    get type(): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<FieldInput, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<FieldInput, "c8y-field-input", never, {}, {}, never, never, true, never>;
}

declare class FieldRadio extends FieldType {
    defaultOptions: {
        templateOptions: {
            options: any[];
            formCheck: string;
        };
    };
    static ɵfac: i0.ɵɵFactoryDeclaration<FieldRadio, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<FieldRadio, "c8y-field-radio", never, {}, {}, never, never, true, never>;
}

declare class ObjectTypeComponent extends FieldType {
    static ɵfac: i0.ɵɵFactoryDeclaration<ObjectTypeComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ObjectTypeComponent, "c8y-object-type", never, {}, {}, never, never, true, never>;
}

declare class FieldDate extends FieldType {
    dateInputFormat: string;
    private dateFormatService;
    ngOnInit(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<FieldDate, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<FieldDate, "c8y-field-date", never, {}, {}, never, never, true, never>;
}

declare class FieldDateTime extends FieldType {
    static ɵfac: i0.ɵɵFactoryDeclaration<FieldDateTime, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<FieldDateTime, "c8y-field-date-time", never, {}, {}, never, never, true, never>;
}

declare class TypeaheadTypeComponent extends FieldType implements OnInit {
    private cdRef;
    private translateService;
    filterPipe: ForOfFilterPipe;
    pattern: string;
    selected: IIdentified;
    labelProp: string;
    match: boolean;
    placeholder$: rxjs.Observable<any>;
    defaultPlaceholder$: rxjs.Observable<any>;
    private valueProps;
    private excludeLabelProp;
    constructor(cdRef: ChangeDetectorRef, translateService: TranslateService$1);
    ngOnInit(): void;
    selectOption(opt: any): void;
    setPipe(filterStr: string): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<TypeaheadTypeComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<TypeaheadTypeComponent, "c8y-typeahead-type", never, {}, {}, never, never, true, never>;
}

declare class SelectTypeComponent extends FieldType implements OnInit {
    private translateService;
    labelProp: string;
    valueProp: string;
    properties: FormlyFieldProps & {
        [additionalProperties: string]: unknown;
    };
    placeholder$: rxjs.Observable<any>;
    defaultPlaceholder$: rxjs.Observable<any>;
    options$: rxjs.Observable<any[]>;
    constructor(translateService: TranslateService$1);
    ngOnInit(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<SelectTypeComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<SelectTypeComponent, "c8y-select-type", never, {}, {}, never, never, true, never>;
}

declare class FieldTextArea extends FieldType implements OnInit {
    defaultOptions: {
        props: {
            rows: number;
            cols: number;
        };
    };
    private translate;
    ngOnInit(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<FieldTextArea, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<FieldTextArea, "c8y-field-textarea", never, {}, {}, never, never, true, never>;
}

declare const wrapperLegendFieldConfig: () => EnvironmentProviders;
declare class LegendFieldWrapper extends FieldWrapper {
    static ɵfac: i0.ɵɵFactoryDeclaration<LegendFieldWrapper, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<LegendFieldWrapper, "c8y-legend-wrapper", never, {}, {}, never, never, true, never>;
}

interface AddonsProps extends FormlyFieldProps {
    addonRight?: {
        onClick?: (field: FormlyFieldConfig, event?: Event) => void;
        class?: string;
        text?: string;
    };
    addonLeft?: {
        onClick?: (field: FormlyFieldConfig, event?: Event) => void;
        class?: string;
        text?: string;
    };
}
declare class C8yWrapperAddons extends FieldWrapper<FieldTypeConfig<AddonsProps>> {
    private hostContainerRef?;
    set content(templateRef: TemplateRef<unknown>);
    constructor(hostContainerRef?: ViewContainerRef);
    addonRightClick($event: Event): void;
    addonLeftClick($event: Event): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<C8yWrapperAddons, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<C8yWrapperAddons, "c8y-wrapper-addons", never, {}, {}, never, never, true, never>;
}

/**
 * Injects custom template to field config, so it can be rendered inside form-field-wrapper along an input.
 */
declare class C8yArrayTypeInjectTemplatePipe implements PipeTransform {
    transform(field: FormlyFieldConfig, customTemplateRef: TemplateRef<any>): FormlyFieldConfig;
    static ɵfac: i0.ɵɵFactoryDeclaration<C8yArrayTypeInjectTemplatePipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<C8yArrayTypeInjectTemplatePipe, "c8yArrayTypeInjectTemplate", true>;
}

/**
 * This module declares field type components for dynamic forms that match C8Y styleguide.
 *
 * @dynamic
 */
declare class DynamicFormsUIThemeModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<DynamicFormsUIThemeModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<DynamicFormsUIThemeModule, never, [typeof i1.CommonModule, typeof CommonModule, typeof i3$1.PopoverModule, typeof i3.TooltipModule, typeof i2$1.ReactiveFormsModule, typeof C8yTranslateModule, typeof DropAreaModule, typeof FormsModule, typeof i6.FormlyModule, typeof i10.FormlySelectModule, typeof DateTimePickerModule, typeof SelectModule, typeof ListGroupModule, typeof CoreSearchModule, typeof i4$1.BsDatepickerModule, typeof i16.TextFieldModule, typeof ArrayTypeComponent, typeof FieldCheckbox, typeof WrapperFormField, typeof FieldFile, typeof FieldInput, typeof FieldRadio, typeof ObjectTypeComponent, typeof FieldDate, typeof FieldDateTime, typeof TypeaheadTypeComponent, typeof SelectTypeComponent, typeof FieldTextArea, typeof LegendFieldWrapper, typeof C8yWrapperAddons, typeof C8yArrayTypeInjectTemplatePipe], never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<DynamicFormsUIThemeModule>;
}

declare class DynamicFormsModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<DynamicFormsModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<DynamicFormsModule, never, [typeof i1.CommonModule, typeof i2$1.ReactiveFormsModule, typeof DynamicFormsI18nModule, typeof ValidationModule, typeof DynamicFormsUIThemeModule, typeof i6.FormlyModule], [typeof i6.FormlyModule, typeof i2$1.ReactiveFormsModule]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<DynamicFormsModule>;
}

/**
 * An extension HOOK can use either a pure value:
 * ```typescript
 *  { provide: HOOK_X, useValue: { ...hookValue }, multi: true }
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  { provide: HOOK_X, useValue: [{ ...hookValues }], multi: true }
 * ```
 *
 *  * Or a class to register:
 * ```typescript
 *  { provide: HOOK_X, useExisting: BooleanFilterMapper, multi: true }
 * ```
 *
 * Or an ExtensionFactory {@link ExtensionFactory}:
 * ```typescript
 *  { provide: HOOK_X, useFactory: (route) => doSomethingAsync(route), multi: true }
 * ```
 */
type FilterMapperExtension = FilterMapper | FilterMapper[] | ExtensionFactory<FilterMapper>;
/**
 * You can either provide a single `FilterMapper` as parameter:
 * ```typescript
 *  hookFilterMapper(...)
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  hookFilterMapper([...])
 * ```
 *
 * Or you provide an Service that implements `FilterMapper`
 * ```typescript
 *  export class MyFilterMapper implements FilterMapper {...}
 *  ...
 *  hookFilterMapper(MyFilterMapper)
 * ```
 * A typed alternative to using `HOOK_FILTER_MAPPER`.
 * @param mapper A filter mapper, e.g. `BooleanFilterMapper`, or `ExtensionFactory` to be provided.
 * @param options If this is a multi provider or not (defaults to true) and provider type definition (defaults to ClassProvider) - `HookOptions`.
 * @returns An `Provider` to be provided in your module.
 */
declare function hookFilterMapper(mapper: HookValueType<FilterMapper>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
declare class FilterMapperFactory {
    map: object;
    constructor(fieldMappers: Array<FilterMapper>);
    get(type: string | Type<FieldType>): FilterMapper;
    static ɵfac: i0.ɵɵFactoryDeclaration<FilterMapperFactory, [{ optional: true; }]>;
    static ɵprov: i0.ɵɵInjectableDeclaration<FilterMapperFactory>;
}

declare class FilterMapperService {
    private alert;
    private jsonschema;
    private filterMapperFactory;
    constructor(alert: AlertService, jsonschema: C8yJSONSchema, filterMapperFactory: FilterMapperFactory);
    getMappedFilterValues(filter: FilterChip): Observable<FilterChip[]>;
    mapFieldsToFilter(filterChip: FilterChip, formlyFields: FormlyFieldConfig[], path?: string[], result?: Observable<FilterChip[]>): Observable<FilterChip[]>;
    processField(filterChip: FilterChip, field: FormlyFieldConfig, path: string[], resultChips: FilterChip[]): Observable<FilterChip[]>;
    getChipFromFactory(resultChips: FilterChip[], field: FormlyFieldConfig, filterChip: FilterChip): Observable<FilterChip[]>;
    removeChip(chip: any): PartialFilterChipRemovalType;
    static ɵfac: i0.ɵɵFactoryDeclaration<FilterMapperService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<FilterMapperService>;
}

declare class FilterMapperPipe implements PipeTransform {
    private filterMapperService;
    constructor(filterMapperService: FilterMapperService);
    transform(column: Column): Observable<FilterChip[]>;
    static ɵfac: i0.ɵɵFactoryDeclaration<FilterMapperPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<FilterMapperPipe, "mapToFilterChips", true>;
}

declare class GroupedFilterChips implements PipeTransform {
    transform(chips: FilterChip[]): {
        label: string | undefined;
        chips: FilterChip[];
    }[];
    static ɵfac: i0.ɵɵFactoryDeclaration<GroupedFilterChips, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<GroupedFilterChips, "groupedFilterChips", true>;
}

declare class FilterMapperModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<FilterMapperModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<FilterMapperModule, never, [typeof FilterMapperPipe, typeof GroupedFilterChips], [typeof FilterMapperPipe, typeof GroupedFilterChips]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<FilterMapperModule>;
}

declare class VisibleControlsPipe implements PipeTransform {
    transform(actionControls: ActionControl[], arg?: Row & string[]): Observable<ActionControl[]>;
    private sortByPriority;
    static ɵfac: i0.ɵɵFactoryDeclaration<VisibleControlsPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<VisibleControlsPipe, "visibleControls", true>;
}

declare class ExpandableCellRendererComponent {
    context: CellRendererContext;
    dataGridComponent: DataGridComponent;
    private cd;
    readonly collapse: "Collapse";
    readonly expand: "Expand";
    isExpanded: boolean;
    loading: boolean;
    destroyRef: DestroyRef;
    constructor(context: CellRendererContext, dataGridComponent: DataGridComponent, // forwardRef is needed because of circular dependency
    cd: ChangeDetectorRef);
    toggleExpand(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<ExpandableCellRendererComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ExpandableCellRendererComponent, "c8y-expandable-cell-renderer", never, {}, {}, never, never, true, never>;
}

declare class ExpandableHeaderCellRendererComponent {
    static ɵfac: i0.ɵɵFactoryDeclaration<ExpandableHeaderCellRendererComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ExpandableHeaderCellRendererComponent, "c8y-expandable-header-cell-renderer", never, {}, {}, never, never, true, never>;
}

declare class DataGridModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<DataGridModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<DataGridModule, never, [typeof i1.CommonModule, typeof i2$2.CdkTableModule, typeof i3$2.DragDropModule, typeof i2$1.FormsModule, typeof i2$1.ReactiveFormsModule, typeof DynamicFormsModule, typeof CommonModule, typeof FormsModule, typeof ModalModule, typeof i5.BsDropdownModule, typeof i3$1.PopoverModule, typeof i3.TooltipModule, typeof i12.PaginationModule, typeof ProductExperienceModule, typeof i1$1.A11yModule, typeof FilterMapperModule, typeof CellRendererDefDirective, typeof HeaderCellRendererDefDirective, typeof BaseFilteringFormRendererComponent, typeof CellRendererComponent, typeof FilteringFormRendererDefDirective, typeof FilteringFormRendererComponent, typeof ColumnDirective, typeof DataGridComponent, typeof VisibleControlsPipe, typeof ConfigureCustomColumnComponent, typeof ExpandableRowDirective, typeof ExpandableCellRendererComponent, typeof ExpandableHeaderCellRendererComponent], [typeof CellRendererDefDirective, typeof HeaderCellRendererDefDirective, typeof FilteringFormRendererDefDirective, typeof BaseFilteringFormRendererComponent, typeof ColumnDirective, typeof DataGridComponent, typeof VisibleControlsPipe, typeof ExpandableRowDirective]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<DataGridModule>;
}

declare class BooleanFilterMapper implements FilterMapper {
    fieldType: string[];
    map(field: FormlyFieldConfig, filter: FilterChip): Observable<FilterChip>;
    static ɵfac: i0.ɵɵFactoryDeclaration<BooleanFilterMapper, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<BooleanFilterMapper>;
}
declare class RadioFilterMapper implements FilterMapper {
    fieldType: string[];
    map(field: FormlyFieldConfig, filter: FilterChip): Observable<{
        value: any;
        displayValue: any;
        label?: string;
        path?: string[];
        externalFilterQuery?: any;
        filteringConfig?: FormlyColumnFilteringConfig;
        filterPredicate?: string;
        columnName: string | SpecialColumnName;
        remove?: () => PartialFilterChipRemovalType;
    }>;
    static ɵfac: i0.ɵɵFactoryDeclaration<RadioFilterMapper, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<RadioFilterMapper>;
}
declare class TypeaheadFilterMapper implements FilterMapper {
    fieldType: string;
    map(field: FormlyFieldConfig, filter: FilterChip): Observable<{
        value: any;
        displayValue: any;
        label?: string;
        path?: string[];
        externalFilterQuery?: any;
        filteringConfig?: FormlyColumnFilteringConfig;
        filterPredicate?: string;
        columnName: string | SpecialColumnName;
        remove?: () => PartialFilterChipRemovalType;
    }>;
    static ɵfac: i0.ɵɵFactoryDeclaration<TypeaheadFilterMapper, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<TypeaheadFilterMapper>;
}
declare class DateFilterMapper implements FilterMapper {
    private datePipe;
    fieldType: string[];
    constructor(datePipe: DatePipe);
    map(field: FormlyFieldConfig, filter: FilterChip): Observable<{
        label: string;
        displayValue: any;
        value: any;
        path?: string[];
        externalFilterQuery?: any;
        filteringConfig?: FormlyColumnFilteringConfig;
        filterPredicate?: string;
        columnName: string | SpecialColumnName;
        remove?: () => PartialFilterChipRemovalType;
    }>;
    static ɵfac: i0.ɵɵFactoryDeclaration<DateFilterMapper, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<DateFilterMapper>;
}
declare class SelectFilterMapper implements FilterMapper {
    fieldType: string;
    map(field: FormlyFieldConfig, filter: FilterChip): Observable<{
        value: any;
        displayValue: any;
        label?: string;
        path?: string[];
        externalFilterQuery?: any;
        filteringConfig?: FormlyColumnFilteringConfig;
        filterPredicate?: string;
        columnName: string | SpecialColumnName;
        remove?: () => PartialFilterChipRemovalType;
    }>;
    static ɵfac: i0.ɵɵFactoryDeclaration<SelectFilterMapper, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<SelectFilterMapper>;
}
declare class StringFilterMapper implements FilterMapper {
    fieldType: string[];
    map(field: FormlyFieldConfig, filter: FilterChip): Observable<FilterChip>;
    static ɵfac: i0.ɵɵFactoryDeclaration<StringFilterMapper, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<StringFilterMapper>;
}

interface LegacyColumnConfig {
    key: string;
    headerName: string;
    active: boolean;
    custom: boolean;
    fragmentPath: string;
}
interface LegacyColumnFilterConfig {
    [key: string]: {
        filtering: object;
        sorting: {
            order: number;
        };
    };
}
declare class LegacyGridConfigMapperService {
    private userPreferencesService;
    private dataGridService;
    static deviceGridLegacyKeyToName: {
        status: string;
        name: string;
        model: string;
        serialNumber: string;
        group: string;
        registrationDate: string;
        systemId: string;
        imei: string;
        alarms: string;
    };
    constructor(userPreferencesService: UserPreferencesService, dataGridService: DataGridService);
    getMappedGridConfig(context: GridConfigContext): Observable<GridConfig>;
    mapLegacyToDeviceGridConfig(legacyConfig: LegacyColumnConfig[], legacyFilterConfig: LegacyColumnFilterConfig, defaultColumns?: Column[]): GridConfig;
    getConfigColumns(legacyConfig: LegacyColumnConfig[], legacyFilterConfig: LegacyColumnFilterConfig, defaultColumns: Column[]): any;
    mergeLegacyConfigs(columnConfig: any, filterConfig: any): any;
    mapLegacyColumnConfig(legacy: any): CustomColumnConfig;
    migrateSortOrder(sorting: any): "" | "asc" | "desc";
    static ɵfac: i0.ɵɵFactoryDeclaration<LegacyGridConfigMapperService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<LegacyGridConfigMapperService>;
}

declare const PX_EVENT_NAME = "dataGrid";
declare const PX_ACTIONS: {
    APPLY_FILTER: string;
    RESET_FILTER: string;
    REMOVE_FILTER: string;
    CLEAR_FILTER: string;
    CUSTOM_ACTION: string;
    ADD_CUSTOM_COLUMN: string;
    REMOVE_CUSTOM_COLUMN: string;
    REORDER_COLUMNS: string;
    CHANGE_VISIBILITY: string;
    CHANGE_SORTING_ORDER: string;
    CHANGE_PAGINATION: string;
    SELECT_ALL_ITEMS: string;
    BULK_DELETE: string;
    BULK_EXPORT: string;
    BULK_CUSTOM_ACTION: string;
    BULK_CANCEL: string;
    SELECT_ITEM: string;
    EDIT_ITEM: string;
    DELETE_ITEM: string;
    EXPORT_ITEM: string;
    CUSTOM_ACTION_ITEM: string;
    RELOAD: string;
    SEARCH: string;
    CLEAR_SEARCH: string;
};

interface UserPreferencesGridConfigContext extends GridConfigContext {
    key: string;
    legacyConfigKey?: string;
    legacyFilterKey?: string;
    defaultColumns?: Column[];
}
/**
 * Stores data grid configuration in form of user preferences.
 */
declare class UserPreferencesConfigurationStrategy extends AbstractConfigurationStrategy {
    protected userPreferencesService: UserPreferencesService;
    protected context: UserPreferencesGridConfigContext;
    protected contextProvider: GridConfigContextProvider;
    protected legacyGridMapperService: LegacyGridConfigMapperService;
    constructor(userPreferencesService: UserPreferencesService, context: UserPreferencesGridConfigContext, contextProvider: GridConfigContextProvider, legacyGridMapperService: LegacyGridConfigMapperService);
    getConfig$(context?: UserPreferencesGridConfigContext): Observable<GridConfig>;
    saveConfig$(config: GridConfig, context?: UserPreferencesGridConfigContext): Observable<GridConfig>;
    static ɵfac: i0.ɵɵFactoryDeclaration<UserPreferencesConfigurationStrategy, [null, { optional: true; }, { optional: true; }, null]>;
    static ɵprov: i0.ɵɵInjectableDeclaration<UserPreferencesConfigurationStrategy>;
}

declare class InventorySearchService {
    protected DEFAULT_PAGE_SIZE: number;
    private inventoryService;
    private featureCacheService;
    private queriesUtil;
    isWildcardSearchEnabled(): Promise<boolean>;
    /**
     * Returns the full-text search results.
     *
     * @param term The search term.
     * @param pagination The currently used pagination.
     */
    search(term: string, pagination?: Pagination): Promise<_c8y_client.IResultList<IManagedObject>>;
    /**
     * Returns group search results by name.
     *
     * @param term The search term - name of group.
     * @param pagination The currently used pagination.
     */
    searchGroups(term: string, pagination?: Pagination): Promise<_c8y_client.IResultList<IManagedObject>>;
    /**
     * Will return only valid group assets and filter out
     * none useful inventories (e.g. c8y_JsonSchema).
     * @param data All managed objects that should be filtered.
     */
    filterOnlyGroups(data: IManagedObject[]): IManagedObject[];
    private getGroupsSearchFilterQuery;
    private getDefaultSearchQuery;
    static ɵfac: i0.ɵɵFactoryDeclaration<InventorySearchService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<InventorySearchService>;
}

declare class SearchInputComponent {
    private router;
    private inventory;
    private inventorySearchService;
    private cd;
    mode: 'search' | 'select' | 'wildcardsearch';
    /**
     * Unlocks the ability to place a custom template under the search input.
     */
    enableCustomTemplatePlaceholder: boolean;
    /**
     * A custom placeholder in the search bar.
     */
    customPlaceholder: string;
    /**
     * Event, which is used to set a new external term. Passing null will re-execute the query to BE.
     * This allows new filters to be applied to the currently selected term.
     */
    externalTerm: EventEmitter<string>;
    /**
     * A custom query setter used to override the standard query. In order to obtain data.
     */
    set customDataQuery(query: UnaryFunction<string, Observable<IResultList<IManagedObject>>>);
    container: '' | 'body';
    groupsOnly: boolean;
    filter: EventEmitter<string>;
    search: EventEmitter<string>;
    reset: EventEmitter<IManagedObject>;
    onClick: EventEmitter<IManagedObject>;
    onOpenToggle: EventEmitter<boolean>;
    deviceType: typeof ManagedObjectType;
    term: string;
    defaultPlaceholder: "Search for groups or assets…";
    selected: any;
    customQuery: (text: string) => Observable<IResultList<IManagedObject>>;
    results$: Observable<IResultList<IManagedObject>>;
    recentSearchResults: IManagedObject[];
    recentlyRegisteredResults$: Observable<IResultList<IManagedObject>>;
    isLoading: boolean;
    noMatch: boolean;
    readonly RESET_TEXT: "Clear search results";
    readonly SEARCH_TEXT: "Search";
    private readonly RECENT_SEARCH_STORAGE_KEY;
    private readonly MAX_RECENT_SEARCH_RESULTS;
    private readonly DEFAULT_FILTER;
    private readonly KEYCODE_ENTER;
    private readonly KEYCODE_ESC;
    private onDestroy$;
    private typeahead;
    private dropdown;
    constructor(router: Router, inventory: InventoryService, inventorySearchService: InventorySearchService, cd: ChangeDetectorRef);
    ngOnInit(): Promise<void>;
    onKeydownHandler(event: KeyboardEvent): void;
    onOpenChange(isOpen: boolean): void;
    open(event: Event, mo: IManagedObject, term?: any): void;
    onReset(status: {
        icon: string;
        $event: MouseEvent;
    }): void;
    keyDown(event: KeyboardEvent): void;
    onSearch(search: string): void;
    onFilter(search: string): void;
    onOpenAssetTable(): void;
    ngOnDestroy(): void;
    private hideDropdown;
    private subscribeOnSearch;
    private mergeRequest;
    private handleQuery;
    private onLoadingDone;
    private onTypingStarted;
    static ɵfac: i0.ɵɵFactoryDeclaration<SearchInputComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<SearchInputComponent, "c8y-search-input", never, { "mode": { "alias": "mode"; "required": false; }; "enableCustomTemplatePlaceholder": { "alias": "enableCustomTemplatePlaceholder"; "required": false; }; "customPlaceholder": { "alias": "customPlaceholder"; "required": false; }; "externalTerm": { "alias": "externalTerm"; "required": false; }; "customDataQuery": { "alias": "customDataQuery"; "required": false; }; "container": { "alias": "container"; "required": false; }; "groupsOnly": { "alias": "groupsOnly"; "required": false; }; }, { "filter": "filter"; "search": "search"; "reset": "reset"; "onClick": "onClick"; "onOpenToggle": "onOpenToggle"; }, never, ["*"], true, never>;
}

/**
 * The angular module definition for the search.
 * @exports SearchComponent
 * @exports SearchOutletComponent
 * @exports HighlightComponent A component to highlight search results.
 */
declare class CoreSearchModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<CoreSearchModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<CoreSearchModule, never, [typeof i1$1.A11yModule, typeof i2$1.FormsModule, typeof i5.BsDropdownModule, typeof CommonModule, typeof SelectModule, typeof ListGroupModule, typeof DeviceStatusModule, typeof i1$2.RouterModule, typeof SearchOutletComponent, typeof SearchComponent, typeof HighlightComponent, typeof SearchResultEmptyComponent, typeof SearchInputComponent], [typeof SearchOutletComponent, typeof SearchComponent, typeof HighlightComponent, typeof SearchResultEmptyComponent, typeof SearchInputComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<CoreSearchModule>;
}

declare class BreadcrumbComponent implements Breadcrumb {
    private breadcrumbService;
    items: BreadcrumbItem[];
    private contentChildItems;
    private viewInitTimeout;
    constructor(breadcrumbService: BreadcrumbService);
    ngAfterViewInit(): void;
    ngOnDestroy(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<BreadcrumbComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<BreadcrumbComponent, "c8y-breadcrumb", never, {}, {}, ["contentChildItems"], ["*"], true, never>;
}

declare class BreadcrumbItemComponent {
    /**
     * Icon to display in the breadcrumb item.
     */
    icon: SupportedIconsSuggestions;
    /**
     * Determines if the label should be translated. Set to true to enable translation.
     * Translation occurs if translated text is available.
     */
    translate: boolean;
    /**
     * The label text of the breadcrumb item. This is displayed to the user.
     */
    label: string;
    /**
     * The navigation path that the breadcrumb item links to.
     */
    path: string;
    injector: Injector;
    template: any;
    constructor(_injector: EnvironmentInjector);
    static ɵfac: i0.ɵɵFactoryDeclaration<BreadcrumbItemComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<BreadcrumbItemComponent, "c8y-breadcrumb-item", never, { "icon": { "alias": "icon"; "required": false; }; "translate": { "alias": "translate"; "required": false; }; "label": { "alias": "label"; "required": false; }; "path": { "alias": "path"; "required": false; }; "injector": { "alias": "injector"; "required": false; }; }, {}, never, ["*"], true, never>;
}

declare class BreadcrumbOutletComponent {
    showAll: boolean;
    breadcrumbs: Breadcrumb[];
    dropdownOpen: boolean;
    readonly GROUP_ICON = "c8y-group";
    /**
     * For upgrade only. Old angularjs routes start with hash, new ones not.
     */
    normalizePath(path: any): any;
    ngOnChanges(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<BreadcrumbOutletComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<BreadcrumbOutletComponent, "c8y-breadcrumb-outlet", never, { "breadcrumbs": { "alias": "breadcrumbs"; "required": false; }; "dropdownOpen": { "alias": "dropdownOpen"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * The angular module definition for breadcrumbs.
 * @exports {@link BreadcrumbComponent}
 * @exports {@link BreadcrumbItemComponent}
 * @exports {@link BreadcrumbOutletComponent}
 */
declare class BreadcrumbModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<BreadcrumbModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<BreadcrumbModule, never, [typeof i1$2.RouterModule, typeof CommonModule, typeof i3.TooltipModule, typeof BreadcrumbComponent, typeof BreadcrumbItemComponent, typeof BreadcrumbOutletComponent], [typeof BreadcrumbComponent, typeof BreadcrumbItemComponent, typeof BreadcrumbOutletComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<BreadcrumbModule>;
}

/**
 * The component shows all nodes that have been added to the navigator.
 * In addition, it allows you to add a header and a footer to the navigator.
 *
 * ```html
 * <c8y-navigator-outlet>
 *   <header class="navigator-slot-top"></header>
 *   <footer class="navigator-slot-bottom"></footer>
 * </c8y-navigator-outlet>
 * ```
 */
declare class NavigatorOutletComponent {
    private headerService;
    private navigatorNodes;
    /**
     * Navigator nodes list.
     */
    nodes$: Observable<NavigatorNode[]>;
    constructor(headerService: HeaderService, navigatorNodes: NavigatorService);
    /**
     * Closes the navigator menu after clicking an item in the menu, in case of insufficient screen width.
     */
    collapseNavigator(from: 'icon' | 'expander' | 'link'): void;
    /**
     * @ignore
     */
    trackByPathOrLabel(index: any, node: any): any;
    static ɵfac: i0.ɵɵFactoryDeclaration<NavigatorOutletComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<NavigatorOutletComponent, "c8y-navigator-outlet, c8y-ui-navigator", never, {}, {}, never, never, true, never>;
}

declare const enum ClickEventSource {
    ICON = "icon",
    EXPANDER = "expander",
    LINK = "link"
}
/**
 * Navigator node renderer.
 */
declare class NavigatorNodeComponent implements AfterViewInit, OnChanges, OnDestroy {
    private router;
    private breadcrumbService;
    /**
     * @ignore
     */
    iconSlot: ViewContainerRef;
    /**
     * Navigator node.
     */
    node: NavigatorNode;
    /**
     * Determines whether the navigator node is a root node (top node in the hierarchy).
     */
    isRoot: boolean;
    /**
     * Event emitter responsible for broadcasting one of the following events: "icon", "expander" or "link" as string value.
     *
     * The type of event depends on where you click on the navigator node:
     * * clicking the icon will broadcast the event "icon",
     * * clicking the expander will broadcast the event "expander",
     * * clicking the label will broadcast the event "link".
     */
    nodeClick: EventEmitter<string>;
    /**
     * @ignore
     */
    confirm: PopoverConfirmComponent;
    private viewInitTimeout;
    /**
     * A subject that is triggered as soon as the navigator node is initialized.
     */
    nodeInit$: Subject<void>;
    /**
     * A observable which emits, as soon as the active state of the node changes.
     */
    isActive$: rxjs.Observable<boolean>;
    constructor(router: Router, breadcrumbService: BreadcrumbService);
    ngOnChanges(changes: SimpleChanges): void;
    /**
     * @ignore
     */
    ngAfterViewInit(): void;
    /**
     * Returns the expander title.
     */
    get expandTitle(): "Expand" | "Collapse";
    /**
     * Click event handler.
     *
     * @param {string} from Source of the click event.
     * @param event DOM event.
     */
    click(from?: 'icon' | 'expander' | 'link', $event?: MouseEvent): void;
    /**
     * Expands or collapses the navigator node and its children recursively.
     *
     * @param {boolean} open Open or close the node.
     * @param {ClickOptions} forNode Click options.
     */
    expandCollapse(open: any, forNode?: ClickOptions): void;
    /**
     * @ignore
     */
    ngOnDestroy(): void;
    /**
     * Expands the parent nodes recursively.
     * @param nodes The nodes that should be tried to get opened.
     * @param clickOption The click options to perform on the parent nodes.
     */
    expandRecursiveParent(nodes: NavigatorNode[], clickOption?: ClickOptions): void;
    private handleExpandCollapse;
    private updateIcon;
    private updateIconComponent;
    private updateIconTemplate;
    static ɵfac: i0.ɵɵFactoryDeclaration<NavigatorNodeComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<NavigatorNodeComponent, "c8y-navigator-node", never, { "node": { "alias": "node"; "required": false; }; "isRoot": { "alias": "isRoot"; "required": false; }; }, { "nodeClick": "nodeClick"; }, never, never, true, never>;
}

/**
 * Navigator node icon component.
 */
declare class NavigatorIconComponent {
    /**
     * Navigator node.
     */
    node: NavigatorNode;
    /**
     * Returns the navigator node icon.
     * If the icon is not defined, it returns the default icon (cog).
     */
    get icon(): _c8y_ngx_components_dist_icon_selector_icons.SupportedIconsSuggestions;
    /**
     * Returns the navigator icon CSS class.
     */
    get iconClass(): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<NavigatorIconComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<NavigatorIconComponent, "c8y-navigator-icon", never, { "node": { "alias": "node"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * The angular module definition for the navigator.
 * @exports NavigatorOutletComponent
 * @exports NavigatorNodeComponent
 */
declare class NavigatorModule {
    static providers(): (i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider)[];
    static ɵfac: i0.ɵɵFactoryDeclaration<NavigatorModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<NavigatorModule, never, [typeof i1$2.RouterModule, typeof i2.CollapseModule, typeof CommonModule, typeof ModalModule, typeof NavigatorOutletComponent, typeof NavigatorNodeComponent, typeof NavigatorIconComponent], [typeof NavigatorOutletComponent, typeof NavigatorNodeComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<NavigatorModule>;
}

/**
 * An extension HOOK can use either a pure value:
 * ```typescript
 *  { provide: HOOK_X, useValue: { ...hookValue }, multi: true }
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  { provide: HOOK_X, useValue: [{ ...hookValues }], multi: true }
 * ```
 *
 * Or an ExtensionFactory which allows to define a get() function. This function
 * gets called on each navigation with the current route and can return values
 * async (observable or promise).
 * ```typescript
 *  { provide: HOOK_X, useFactory: { get: (route) => doSomethingAsync(route) }, multi: true }
 * ```
 * @deprecated Consider using the `hookVersion` function instead.
 */
declare const HOOK_VERSION: InjectionToken<Version[]>;
declare const VERSION_MODULE_CONFIG: InjectionToken<VersionModuleConfig>;
/**
 * You can either provide a single `Version` as parameter:
 * ```typescript
 *  hookVersion(...)
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  hookVersion([...])
 * ```
 *
 * Or you provide an Service that implements `ExtensionFactory<Version>`
 * ```typescript
 *  export class MyVersionFactory implements ExtensionFactory<Version> {...}
 *  ...
 *  hookVersion(MyVersionFactory)
 * ```
 * A typed alternative to `HOOK_VERSION`.
 * @param versions The `Version`'s or `ExtensionFactory` to be provided.
 * @returns An `Provider` to be provided in your module.
 */
declare function hookVersion(versions: GenericHookType<Version>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
interface Version extends CleanedVersion {
    /** Influences the order of the version within the list of versions */
    priority?: number;
    /** Will hide the version in the whole UI (only included in download platform information) */
    hidden?: boolean;
}
interface CleanedVersion {
    /** Label of the version */
    label: string;
    /** The version */
    version: string;
    /**
     * Type of the version.
     * The JSON that can be copied to the clipboard will group the versions by type.
     * Types could e.g. be `MICROSERVICE` and `HOSTED` for apps
     */
    type: ApplicationType | string;
    /**
     * Allows to provide any custom properties.
     * These will be part of the JSON structure that will be copied to clipboard.
     */
    custom?: {
        [key: string]: any;
    };
}
interface VersionModuleConfig {
    /** Will disable the `WebSDKVersionFactory` in case it is set to true */
    disableWebSDKVersionFactory?: boolean;
    /** Will disable the `WebSDKPluginVersionFactory` in case it is set to true */
    disableWebSDKPluginVersionFactory?: boolean;
    /** Will disable the `BackendVersionFactory` in case it is set to true */
    disableBackendVersionFactory?: boolean;
}

declare class PluginsModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<PluginsModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<PluginsModule, never, never, never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<PluginsModule>;
}

declare class ClipboardService {
    private alertService;
    constructor(alertService: AlertService);
    writeText(text: string, messages?: {
        success?: string;
        error?: string;
    }): Promise<void>;
    readText(messages?: {
        success?: string;
        error?: string;
    }): Promise<string>;
    static ɵfac: i0.ɵɵFactoryDeclaration<ClipboardService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<ClipboardService>;
}

declare class VersionService extends ExtensionPointForPlugins<Version> {
    items$: Observable<Version[]>;
    nonHiddenItems$: Observable<Version[]>;
    constructor(rootInjector: Injector, pluginService: PluginsResolveService);
    get state(): Set<Version>;
    add(version: Version): void;
    remove(version: Version): void;
    cleanUpVersions(versions: Version[]): CleanedVersion[];
    protected setupItemsObservable(): Observable<Version[]>;
    static ɵfac: i0.ɵɵFactoryDeclaration<VersionService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<VersionService>;
}

declare class PlatformDetailsService {
    private version;
    private appState;
    private apps;
    constructor(version: VersionService, appState: AppStateService, apps: ApplicationService);
    getPlatformDetailsObject(): Promise<{
        time: string;
        tenantId: string;
        tenantSelfLink: string;
        tenantDomainName: string;
        parentTenantId: string;
        url: string;
        userId: string;
        userPermissions: {
            user: string[];
            groups: {
                id: string;
                name: string;
                permissions: string[];
            }[];
        };
        applicationId: string | number;
        applicationKey: string;
        versions: {
            [key: string]: CleanedVersion[];
        };
    }>;
    protected getVersions(): Promise<CleanedVersion[]>;
    protected getMicroserviceVersions(userId: string): Promise<CleanedVersion[]>;
    protected getUserPermissions(user: ICurrentUser | null): {
        user: string[];
        groups: {
            id: string;
            name: string;
            permissions: string[];
        }[];
    };
    protected getDirectPermissionsOfUser(user: ICurrentUser): string[];
    protected getPermissionsOfAssignedGroups(user: ICurrentUser): {
        id: string;
        name: string;
        permissions: string[];
    }[];
    static ɵfac: i0.ɵɵFactoryDeclaration<PlatformDetailsService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<PlatformDetailsService>;
}

declare class VersionListComponent {
    private version;
    private appState;
    private clipboardService;
    private modalService;
    private platformDetails;
    private headerService;
    open$: Observable<boolean>;
    versionsToDirectlyDisplay$: Observable<Version[]>;
    currentTenantId$: Observable<string>;
    constructor(version: VersionService, appState: AppStateService, clipboardService: ClipboardService, modalService: BsModalService, platformDetails: PlatformDetailsService, headerService: HeaderService);
    downloadPlatformDetails(): Promise<void>;
    copyIt(text: string): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<VersionListComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<VersionListComponent, "c8y-version-list", never, {}, {}, never, never, true, never>;
}

declare class VersionModule {
    static providers(): (i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider)[];
    static config(config?: VersionModuleConfig): ModuleWithProviders<VersionModule>;
    static ɵfac: i0.ɵɵFactoryDeclaration<VersionModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<VersionModule, never, [typeof CommonModule, typeof PluginsModule, typeof ClipboardModule, typeof VersionListComponent], [typeof VersionListComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<VersionModule>;
}

declare class DrawerOutletComponent implements OnChanges {
    private drawerService;
    position: DrawerPositions;
    open: boolean;
    drawerItems$: Observable<DrawerItem[]>;
    isLeft$: Observable<boolean>;
    private drawerPosition$;
    constructor(drawerService: DrawerService);
    ngOnChanges(changes: SimpleChanges): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<DrawerOutletComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<DrawerOutletComponent, "c8y-drawer-outlet", never, { "position": { "alias": "position"; "required": false; }; "open": { "alias": "open"; "required": false; }; }, {}, never, never, true, never>;
}

declare class DrawerModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<DrawerModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<DrawerModule, never, [typeof i1$1.A11yModule, typeof CommonModule, typeof DrawerOutletComponent], [typeof DrawerOutletComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<DrawerModule>;
}

type ThemeOptions = 'light' | 'dark';
type ThemePreferenceOptions = ThemeOptions | 'system';
declare class ThemeSwitcherService {
    private options;
    darkThemeClass: string;
    darkThemeAvailable$: Observable<boolean>;
    userSelectedThemePreference$: Observable<ThemePreferenceOptions>;
    currentlyAppliedTheme$: Observable<ThemeOptions>;
    disableThemeSelection$: Observable<boolean>;
    themeOptions: [{
        readonly label: "Light";
        readonly value: "light";
        readonly icon: "sun";
    }, {
        readonly label: "Dark";
        readonly value: "dark";
        readonly icon: "moon";
    }, {
        readonly label: "System";
        readonly value: "system";
        readonly icon: "imac-settings";
    }];
    private _userSelectedThemePreference$;
    private _temporaryThemePreference$;
    constructor(options: OptionsService);
    getCurrentThemePreference(): 'light' | 'dark' | 'system';
    getUsersSystemPreferenceForTheme$(): Observable<"light" | "dark">;
    changeUserPreference(preference: 'light' | 'dark' | 'system'): void;
    temporaryChangeTheme(preference: 'light' | 'dark'): void;
    resetTemporaryTheme(): void;
    applyTheme(preference: 'light' | 'dark' | 'system'): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<ThemeSwitcherService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<ThemeSwitcherService>;
}

declare class UiSettingsComponent implements OnInit, OnDestroy {
    private translate;
    private state;
    private ui;
    private userPreferences;
    private c8yModalService;
    private headerService;
    themeSwitcher: ThemeSwitcherService;
    open$: Observable<boolean>;
    currentLang: string;
    languages: {
        lang: string;
        nativeLanguage: string;
    }[];
    private destroyed$;
    constructor(translate: TranslateService, state: AppStateService, ui: AppStateService, userPreferences: UserPreferencesService, c8yModalService: ModalService, headerService: HeaderService, themeSwitcher: ThemeSwitcherService);
    ngOnInit(): void;
    ngOnDestroy(): void;
    onLanguageChange(changedLang: string): Promise<void>;
    persistLanguage(lang: string): Promise<boolean>;
    static ɵfac: i0.ɵɵFactoryDeclaration<UiSettingsComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<UiSettingsComponent, "c8y-ui-settings", never, {}, {}, never, never, true, never>;
}

declare class UiSettingsModule {
    static providers(): (i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider)[];
    static ɵfac: i0.ɵɵFactoryDeclaration<UiSettingsModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<UiSettingsModule, never, [typeof CommonModule, typeof i2$1.FormsModule, typeof UiSettingsComponent], [typeof UiSettingsComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<UiSettingsModule>;
}

/**
 * The angular module definition for the header of the application.
 * @exports HeaderBarComponent
 * @exports TitleComponent
 * @exports TitleOutletComponent
 * @exports AppIconComponent
 * @exports AppSwitcherComponent
 */
declare class HeaderModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<HeaderModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<HeaderModule, never, [typeof ApplicationModule, typeof i1$1.A11yModule, typeof UserModule, typeof CoreSearchModule, typeof CommonModule, typeof ActionModule, typeof BreadcrumbModule, typeof NavigatorModule, typeof VersionModule, typeof i3.TooltipModule, typeof i2.CollapseModule, typeof ProductExperienceModule, typeof DrawerModule, typeof UiSettingsModule, typeof TitleComponent, typeof HeaderBarComponent, typeof TitleOutletComponent], [typeof HeaderBarComponent, typeof TitleComponent, typeof TitleOutletComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<HeaderModule>;
}

/**
 * Register this component on the parent route of a view with multiple tabs where the first tab
 * is displayed only conditionally.
 *
 * Given the following routes leading to a single view with multiple tabs:<br>
 * /yourpath/tab-a -> Tab A<br>
 * /yourpath/tab-b -> Tab B<br>
 * /yourpath/tab-c -> Tab C
 *
 * Your components will be registered like
 * ```typescript
 * export const routes: Route[] = [
 *   {
 *     path: 'yourpath/tab-a',
 *     component: TabAComponent
 *   },
 *   {
 *     path: 'yourpath/tab-b',
 *     component: TabBComponent
 *   },
 *   {
 *     path: 'yourpath/tab-c',
 *     component: TabCComponent
 *   }
 * ];
 * ```
 *
 * In the simple case where Tab A is the first tab on the view and it is always displayed, you can register
 * your view in the navigation with a similar navigator node:
 *
 * ```typescript
 * new NavigatorNode({
 *   label: gettext('My tabs'),
 *   path: 'yourpath/tab-a',
 *   icon: 'gears',
 *   parent: gettext('Some parent node'),
 *   priority: 100
 * })
 * ```
 *
 * This will navigate to the first tab's component and activate the first tab in the view.
 *
 * In case Tab A is displayed conditionally you cannot link it from a navigator node since it may not be available in some cases.
 * In this situation `ConditionalTabsOutletComponent` comes handy as it will forward users to the first available tab on your view:
 *
 * ```typescript
 * new NavigatorNode({
 *   label: gettext('My tabs'),
 *   path: 'yourpath', // note that here we use only the parent route
 *   icon: 'gears',
 *   parent: gettext('Some parent node'),
 *   priority: 100
 * })
 *
 * [...]
 *
 * export const routes: Route[] = [
 *   {
 *     path: 'yourpath',
 *     component: ConditionalTabsOutletComponent // we register ConditionalTabsOutletComponent for the parent path
 *   },
 *   {
 *     path: 'yourpath/tab-a',
 *     component: TabAComponent
 *   },
 *   {
 *     path: 'yourpath/tab-b',
 *     component: TabBComponent
 *   },
 *   {
 *     path: 'yourpath/tab-c',
 *     component: TabCComponent
 *   }
 * ];
 * ```
 */
declare class ConditionalTabsOutletComponent implements OnInit, OnDestroy {
    private tabsService;
    private router;
    private endSubscriptions$;
    constructor(tabsService: TabsService, router: Router);
    ngOnInit(): void;
    ngOnDestroy(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<ConditionalTabsOutletComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ConditionalTabsOutletComponent, "c8y-conditional-tabs-outlet", never, {}, {}, never, never, true, never>;
}

declare class TabsOutletComponent implements OnDestroy, AfterContentInit, OnChanges {
    private router;
    private renderer;
    private header;
    private tabsService;
    private activatedRoute;
    tabs: Tab[];
    orientation: 'vertical' | 'horizontal';
    navigatorOpen: boolean;
    outletName: string | undefined;
    context: any;
    openFirstTab: boolean;
    /**
     * Identifies if the current view has a header element.
     */
    hasHeader: boolean;
    showLeft: boolean;
    showRight: boolean;
    extras: NavigationExtras;
    get isNavigatorOpen(): boolean;
    get hasTabs(): any;
    get isHorizontal(): boolean;
    get isVertical(): boolean;
    private container;
    private tabsContainer;
    private destroy$;
    private tabsChanges$;
    constructor(router: Router, renderer: Renderer2, header: HeaderService, tabsService: TabsService, activatedRoute: ActivatedRoute);
    ngOnInit(): void;
    ngOnChanges(changes: SimpleChanges): void;
    ngOnDestroy(): void;
    ngAfterContentInit(): void;
    trackByPath(index: any, tab: Tab): any;
    isActive(tab: Tab): boolean;
    navigateTo(path: string | any[]): void;
    scroll(direction?: 'right' | 'left'): void;
    private scrollSubscribe;
    private updateScroll;
    private getDimensions;
    static ɵfac: i0.ɵɵFactoryDeclaration<TabsOutletComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<TabsOutletComponent, "c8y-tabs-outlet,c8y-ui-tabs", never, { "tabs": { "alias": "tabs"; "required": false; }; "orientation": { "alias": "orientation"; "required": false; }; "navigatorOpen": { "alias": "navigatorOpen"; "required": false; }; "outletName": { "alias": "outletName"; "required": false; }; "context": { "alias": "context"; "required": false; }; "openFirstTab": { "alias": "openFirstTab"; "required": false; }; "hasHeader": { "alias": "hasHeader"; "required": false; }; }, {}, never, never, true, never>;
}

declare class TabComponent implements AfterContentInit, OnDestroy, TabWithTemplate<string> {
    private tabs;
    template: TemplateRef<any>;
    path: string;
    label: string;
    icon: SupportedIconsSuggestions;
    priority: number;
    orientation: 'horizontal' | 'vertical';
    injector: Injector;
    tabsOutlet: string;
    isActive: boolean;
    text: string;
    showAlways: boolean;
    onSelect: EventEmitter<any>;
    constructor(tabs: TabsService, _injector: EnvironmentInjector);
    ngAfterContentInit(): void;
    ngOnDestroy(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<TabComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<TabComponent, "c8y-tab", never, { "path": { "alias": "path"; "required": false; }; "label": { "alias": "label"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "priority": { "alias": "priority"; "required": false; }; "orientation": { "alias": "orientation"; "required": false; }; "injector": { "alias": "injector"; "required": false; }; "tabsOutlet": { "alias": "tabsOutlet"; "required": false; }; "isActive": { "alias": "isActive"; "required": false; }; "text": { "alias": "text"; "required": false; }; "showAlways": { "alias": "showAlways"; "required": false; }; }, { "onSelect": "onSelect"; }, never, ["*"], true, never>;
}

declare class TabsModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<TabsModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<TabsModule, never, [typeof CommonModule, typeof i1$2.RouterModule, typeof i3.TooltipModule, typeof HeaderModule, typeof ConditionalTabsOutletComponent, typeof TabsOutletComponent, typeof TabComponent], [typeof ConditionalTabsOutletComponent, typeof TabsOutletComponent, typeof TabComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<TabsModule>;
}

/**
 * Template to be used to override the icons inside the step header.
 */
declare class C8yStepperIcon {
    templateRef: TemplateRef<any>;
    /** Name of the icon to be overridden. */
    name: StepState;
    constructor(templateRef: TemplateRef<any>);
    static ɵfac: i0.ɵɵFactoryDeclaration<C8yStepperIcon, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<C8yStepperIcon, "ng-template[c8yStepperIcon]", never, { "name": { "alias": "c8yStepperIcon"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * `C8yStepper` extends the `CdkStepper`. You can use cdk based functionality and inputs.
 * Additional to that you are able to modify the behavior and also the look and feel when
 * using the `C8yStepper`.
 *
 * The `C8yStepper` is used to present any step-based process to the user.
 * A stepper, `C8yStepper` and/or `CdkStepper` is the parent of cdk-steps.
 * Each cdk-step represents one step in the whole process that you want to provide to the user.
 *
 * The `C8yStepper` will create, based on the given `cdk-steps`, a kind of stepper-progress which looks like this:
 * `(1)---(2)---(3)---(n)`
 * The stepper will handle the state of each step and provides styles for active steps, done-steps or in edit-mode.
 * You are able to override icons for each step in the stepper-progress with a template. You are also able to activate
 * default-icons for states like 'edit' and 'done'.
 *
 * To force users through every provided step, set the stepper to 'linear'.
 * This will disable the possibility to move for example from step one to step three.
 *
 * Whenever it comes to validation try to use formGroups. It is possible to
 * assign a `formGroup` to a `cdk-step` input called `[stepControl]`, which automatically respects the
 * validation-rules that you created for this `formGroup`. If fields are required but not filled or
 * any other validation, like a pattern, is not matched the `formGroup` will be invalid. In this case
 * stepping in a linear stepper to the next step gets impossible.
 *
 * If there is the need to execute asynchronous code you have at least two possibilities.
 * First: As you learned, a cdk-step works with `formGroups` and `Validators`, so you are able to use
 * asyncValidators as well.
 * Second: The `C8yStepper` provides an event-emitter `onStepChange` which is called whenever a step-button `(1)--(2)--(n)`
 * in the stepper-progress is clicked. The event of this emitter holds the index of the step as number. You can
 * use this `EventEmitter` to call for example a custom navigate-method which performs first any async-call and then moves
 * on to the given step.
 *
 * ```typescript
 * <c8y-stepper
 * (onStepChange)="navigate($event)"
 * [disableDefaultIcons]="{ edit: true, done: false }"
 * [customClasses]="['m-l-40', 'm-r-40', 'm-t-32']"
 * linear
 * >
 * <!-- override icons -->
 * <ng-template c8yStepperIcon="final">
 *   <span [c8yIcon]="'hand-peace-o'"></span>
 * </ng-template>
 *
 * <cdk-step [stepControl]="formGroupStepOne" label="Name of the hero">
 *   <div class="m-l-40 m-r-40 m-t-32">
 *     <h4 class="p-b-8" translate>What is the name of your hero?</h4>
 *     <c8y-form-group>
 *      <div [formGroup]="formGroupStepOne">
 *       <input
 *         class="form-control"
 *         type="text"
 *         formControlName="name"
 *         placeholder="Mister X"
 *         #nameRef
 *         required
 *       />
 *       <c8y-messages>
 *         <c8y-message *ngIf="!formGroupStepOne.untouched && !nameRef.value" translate
 *           >Enter the name of the Superhero</c8y-message
 *         >
 *       </c8y-messages>
 *      </div>
 *     </c8y-form-group>
 *   </div>
 *   <c8y-stepper-buttons></c8y-stepper-buttons>
 * </cdk-step>
 * <cdk-step>
 *  ...
 * </cdk-step state="final">
 * </c8y-stepper>
 * ```
 */
declare class C8yStepper extends CdkStepper implements AfterContentInit, OnDestroy, ProductExperienceEventSource {
    private dir;
    private changeDetectorRef;
    private elementRef?;
    /**
     * Optional
     * Indicator if icons for edit and done state should be shown in step-header buttons
     */
    disableDefaultIcons?: {
        edit: boolean;
        done: boolean;
    };
    /**
     * Optional
     * Disable/enable navigation by stepper progress buttons
     * default: false
     */
    disableProgressButtons?: boolean;
    /**
     * Optional
     * Possibility to add any kind of custom css classes to the step-header
     */
    customClasses?: string[];
    /**
     * Optional
     * Possibility to hide the stepper progress completely.
     */
    hideStepProgress?: boolean;
    /**
     * Optional
     * If `true`, the label defined on a cdk-step won't get rendered below each step-header button.
     * Instead, it will be used as a title only.
     */
    useStepLabelsAsTitlesOnly?: boolean;
    /**
     * Will emit the step index number whenever a step-header button was clicked
     * It listens to the stepIndex Subject.
     * @deprecated: Use the default `selectionChange` event emitter.
     */
    onStepChange: EventEmitter<number>;
    /**
     * Holding a QueryList of C8yStepperIcons
     * These are templateRefs which overrides any step-header button icon with matching state of cdk-step
     *
     * ```typescript
     * <!-- override icons -->
     *  <ng-template c8yStepperIcon="final">
     *   <span [c8yIcon]="'hand-peace-o'"></span>
     *  </ng-template>
     *
     * <cdk-step state="final" label="Job done!">
     *  <div class="m-l-40 m-r-40 m-t-32">
     *    <h4 class="p-b-32" style="text-align: center;" translate>
     *     Your Superhero is now ready to save the world!
     *   </h4>
     *  </div>
     *  <c8y-stepper-buttons
     *    [hidden]="!isModal"
     *    (onBack)="close()"
     *    [labels]="{ back: 'Got it!' }"
     *  ></c8y-stepper-buttons>
     *  <c8y-stepper-buttons [hidden]="isModal"></c8y-stepper-buttons>
     * </cdk-step>
     * ```
     */
    _icons: QueryList<C8yStepperIcon>;
    /** Consumer-specified template-refs to be used to override the header icons. */
    _iconOverrides: {
        [key: string]: TemplateRef<any>;
    };
    productExperienceEvent: ProductExperienceEvent;
    private _stepIndex;
    private _stepIndexSubscription;
    /**
     * @ignore
     */
    constructor(dir: Directionality, changeDetectorRef: ChangeDetectorRef, elementRef?: ElementRef<HTMLElement>);
    /**
     * @ignore
     */
    ngAfterContentInit(): void;
    /**
     * @ignore
     */
    ngOnDestroy(): void;
    /**
     * Manipulates the state based on the disabledDefaultIcons Input()
     * Changing edit or done to false will change the icons within step-header buttons
     * @param index step index
     * @param state step state, like 'done', 'edit', 'error'
     */
    getIndicatorType(index: number, state: StepState): string;
    /**
     * Pushes the step index to the subject
     * @param index step index
     */
    setIndex(index: number): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<C8yStepper, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<C8yStepper, "c8y-stepper", never, { "disableDefaultIcons": { "alias": "disableDefaultIcons"; "required": false; }; "disableProgressButtons": { "alias": "disableProgressButtons"; "required": false; }; "customClasses": { "alias": "customClasses"; "required": false; }; "hideStepProgress": { "alias": "hideStepProgress"; "required": false; }; "useStepLabelsAsTitlesOnly": { "alias": "useStepLabelsAsTitlesOnly"; "required": false; }; }, { "onStepChange": "onStepChange"; }, ["_icons"], never, true, never>;
}

declare class C8yStepperProgress {
    /** List of overriden icons as TemplateRef. Also default icons could be overriden.
     *  The given overriden icons will replace an icon with matching state: StepState
     *
     * <ng-container
     * *ngSwitchCase="true"
     * [ngTemplateOutlet]="iconOverrides[state]"
     * ></ng-container>
     *
     */
    iconOverrides: {
        [key: string]: TemplateRef<any>;
    };
    /** The index of the current step */
    index: number;
    /** Whether the step is currently selected or not  */
    selected: boolean;
    /** The current state of the step */
    state: StepState;
    /** Disable navigation buttons */
    disabled: boolean;
    /** Emits the index: number of the step which was clicked */
    onStepClicked: EventEmitter<number>;
    /** Called on click and emits the step index */
    stepSelected(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<C8yStepperProgress, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<C8yStepperProgress, "c8y-stepper-progress", never, { "iconOverrides": { "alias": "iconOverrides"; "required": false; }; "index": { "alias": "index"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "state": { "alias": "state"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "onStepClicked": "onStepClicked"; }, never, never, true, never>;
}

/**
 * `C8yStepperButtons` provides a convenient way to have, according to
 * the `C8yStepper` and each `cdk-step`, buttons to navigate between steps or to cancel the whole
 * step-process. Buttons rendered with the help of this component will use the branding css.
 *
 * By default all steps with this component in use will render a next button, expect the last step.
 * The other way around, every step using this component will render a back button, expect the first step.
 * To get a cancel button rendered you need to handle the onCancel event.
 * For next and back button you don't need to handle the available events `onNext` and `onBack` because default behavior
 * is implemented. The default will just call, according to the button, the `stepper.next()` or `stepper.previous()`
 * methods and moves the stepper forth or back. Using the `EventEmitter` `onNext` and `onBack` will emit for you the following
 * object: `{stepper: C8yStepper, step: CdkStep}`. This is useful if you need to implement custom logic before moving
 * to the next step or sending data to a backend. In this case you need to tell the stepper to move forward or back
 * on your own.
 *
 * With the component input `[labels]` you can change the label of each button in each step. It takes an object like this:
 * `{next?: string, back?: string, cancel?: string}`
 *
 * The `[pending]` input is of type boolean and will enable css animation for the next button when true.
 *
 * If the `cdk-step` provides a `stepControl` the component will set the next button disabled when the formGroup
 * behind it is invalid. As long as the `[pending]` input is true the back and next button is also disabled.
 * This will prevent multiple clicks while running a request or stepping back while a request is ongoing.
 *
 * ```html
 * <c8y-stepper>
 *  <cdk-step>
 *    <!--
 *      your html code
 *          ...
 *          ...    -->
 *    <c8y-stepper-buttons
 *     (onNext)="save()"
 *     [labels]="{ next: 'Save' }"
 *     [pending]="pendingStatus"
 *     ></c8y-stepper-buttons>
 *  </cdk-step>
 * </c8y-stepper>
 * ```
 *
 * ```js
 * // in your component:
 * async save() {
 *   this.pendingStatus = true;
 *   // your async request goes here ...
 *   // await something();
 *   this.pendingStatus = false;
 *   this.stepper.next();
 * }
 * ```
 */
declare class C8yStepperButtons implements AfterContentInit, OnDestroy {
    private stepper;
    private step;
    private gainsightService;
    /**
     * Optional
     * Specify custom labels for each button (cancel, back or next)
     */
    labels?: {
        cancel?: string;
        back?: string;
        next?: string;
        custom?: string;
    };
    /**
     * Optional
     * Indicates if a request is pending and sets the next button
     * to disabled when true
     */
    pending?: boolean;
    /**
     * Disabled state of a button
     */
    disabled?: boolean;
    /**
     * EventEmitter which emits when cancel button is clicked
     */
    onCancel: EventEmitter<any>;
    /**
     * EventEmitter which emits {stepper: C8yStepper; step: CdkStep} when next button is clicked.
     */
    onNext: EventEmitter<{
        stepper: C8yStepper;
        step: CdkStep;
    }>;
    /**
     * EventEmitter which emits {stepper: C8yStepper; step: CdkStep} when back button is clicked.
     */
    onBack: EventEmitter<{
        stepper: C8yStepper;
        step: CdkStep;
    }>;
    /**
     * EventEmitter which emits when the optional custom button is clicked
     */
    onCustom: EventEmitter<any>;
    /**
     * Indicator which button should be shown.
     * Based on the cdk-steps within the c8y-stepper
     * next and back buttons are rendered.
     */
    showBtns: StepperButtonsVisibility;
    /**
     * Flag that indicates that the default settings defined in the showBtns have been overwritten.
     */
    forceShowBtns: boolean;
    private statusChangeSubscription;
    constructor(stepper: C8yStepper, step: CdkStep, gainsightService: GainsightService);
    /**
     * This option forces the display of the buttons passed by the input.
     * It will override the default settings and take precedence over the standard settings.
     *
     * ```html
     * <c8y-stepper-buttons
     *   [labels]="{ custom: 'Custom btn', cancel: 'Cancel btn' }"
     *   [showButtons]="{ custom: true, cancel: true }"
     * ></c8y-stepper-buttons>
     * ```
     *
     * @param btns An object that contains options for displaying buttons.
     */
    set showButtons(btns: StepperButtonsVisibility);
    /**
     * @ignore
     */
    ngAfterContentInit(): void;
    ngOnDestroy(): void;
    /**
     * Gets called when cancel button is clicked.
     * It will emit immediate.
     */
    cancel(): void;
    /**
     * Gets called when next button is clicked. When onNext EventEmitter has an observer registered
     * it will emit the following object {stepper: C8yStepper; step: CdkStep}.
     * Otherwise it will call stepper.next() as default.
     */
    next(): void;
    /**
     * Gets called when back button is clicked. When onBack EventEmitter has an observer registered
     * it will emit the following object {stepper: C8yStepper; step: CdkStep}.
     * Otherwise it will call stepper.previous() as default.
     */
    back(): void;
    /**
     * Gets called when the custom button is clicked.
     * It will emit immediately.
     */
    custom(): void;
    private triggerEvent;
    static ɵfac: i0.ɵɵFactoryDeclaration<C8yStepperButtons, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<C8yStepperButtons, "c8y-stepper-buttons", never, { "labels": { "alias": "labels"; "required": false; }; "pending": { "alias": "pending"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "showButtons": { "alias": "showButtons"; "required": false; }; }, { "onCancel": "onCancel"; "onNext": "onNext"; "onBack": "onBack"; "onCustom": "onCustom"; }, never, ["button"], true, never>;
}

declare class StepperOutletComponent {
    steps: IndexedStep[];
    showDefaultButtons: boolean;
    static ɵfac: i0.ɵɵFactoryDeclaration<StepperOutletComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<StepperOutletComponent, "c8y-stepper-outlet", never, { "steps": { "alias": "steps"; "required": false; }; "showDefaultButtons": { "alias": "showDefaultButtons"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * The angular module definition for c8y-stepper (Wizard).
 * @exports C8yStepper
 * @exports C8yStepperIcon
 * @exports C8yStepperButtons
 * @exports CdkStep
 */
declare class StepperModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<StepperModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<StepperModule, never, [typeof CommonModule, typeof i2$3.CdkStepperModule, typeof i3.TooltipModule, typeof i2$1.FormsModule, typeof C8yStepper, typeof C8yStepperIcon, typeof C8yStepperProgress, typeof C8yStepperButtons, typeof StepperOutletComponent], [typeof C8yStepper, typeof i2$3.CdkStep, typeof C8yStepperIcon, typeof C8yStepperButtons, typeof StepperOutletComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<StepperModule>;
}

type AcceptedPropertyTypes = string | string[] | number | number[];
interface PropertiesListItem {
    /**
     * The label to show.
     */
    label: string;
    /**
     * The value to show for this label.
     */
    value?: AcceptedPropertyTypes;
    /**
     * The key to determine the value from an object. You need to provide this object then to the
     * properties-list component as well in the [values] input. Note, you can only either display
     * a value or a key. A key always is preferred over an value.
     */
    key?: string;
    /**
     * The display type of this item.
     */
    type?: 'string' | 'group' | 'array' | 'link';
    /**
     * An action which will be shown as a link on the value.
     */
    action?: (event: any, value: AcceptedPropertyTypes) => void;
    /**
     * Allows to transform a value if needed.
     */
    transform?: (value: AcceptedPropertyTypes) => AcceptedPropertyTypes;
}

/**
 * Renders a list of properties of an object.
 *
 * ```html
 * <c8y-properties-list
 *   icon="info"
 *   [properties]="properties"
 *   [data]="options"
 *   [emptyLabel]="'-'"
 *   [title]="'Application properties' | translate"
 * ></c8y-properties-list>
 * ```
 */
declare class PropertiesListComponent implements OnChanges {
    /**
     * The properties that this list should display.
     */
    properties: PropertiesListItem[];
    /**
     * A title for the list.
     */
    title: string;
    /**
     * An icon which is displayed next to the title.
     */
    icon: SupportedIconsSuggestions;
    /**
     * An object where the properties keys are resolved from.
     */
    data: object;
    /**
     * A string array of groups that are shown. If noParse is set to false,
     * each complex key will form a group.
     */
    groups: string[];
    /**
     * The component tries to parse the properties and resolve keys and types. You can
     * avoid this by setting this property to true.
     */
    noParse: boolean;
    /**
     * Set this label to display all properties but the empty ones
     * get the `emptyLabel` assigned. If the empty label is not set,
     * defaults to 'c8ydontshow' and it not rendered
     */
    emptyLabel: string;
    private originalProperties;
    /**
     * Checks if a certain property has an group associated.
     * @param item The property to verify.
     */
    hasGroup(item: PropertiesListItem): boolean;
    /**
     * @ignore
     */
    ngOnInit(): void;
    ngOnChanges(changes: SimpleChanges): void;
    /**
     * Used in trackBy to avoid recalculation all the time.
     * @ignore
     */
    identity(index: any, item: any): any;
    private parseProperties;
    private parsePropertyItem;
    private resolveValueFromKey;
    private resolveType;
    private attachEmptyLabel;
    static ɵfac: i0.ɵɵFactoryDeclaration<PropertiesListComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<PropertiesListComponent, "c8y-properties-list", never, { "properties": { "alias": "properties"; "required": false; }; "title": { "alias": "title"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "data": { "alias": "data"; "required": false; }; "groups": { "alias": "groups"; "required": false; }; "noParse": { "alias": "noParse"; "required": false; }; "emptyLabel": { "alias": "emptyLabel"; "required": false; }; }, {}, never, never, true, never>;
}

declare class PropertiesListModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<PropertiesListModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<PropertiesListModule, never, [typeof CommonModule, typeof PropertiesListComponent], [typeof PropertiesListComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<PropertiesListModule>;
}

interface SetupStep extends IndexedStep {
    setupId: string;
}
/**
 * The state determines the current status of the wizard:
 * START: First view, showing application properties
 * WIZARD: Custom wizard to change configurations.
 * FINALIZING: Status between saving and finishing the setup.
 * RELOADING: Status between finishing and reloading the app.
 */
declare enum SetupState {
    START = 0,
    WIZARD = 1,
    FINALIZING = 2,
    RELOADING = 3
}
declare const NEEDED_ROLE_FOR_SETUP = "ROLE_APPLICATION_MANAGEMENT_ADMIN";
declare const SETUP_FINISHED_STEP_ID = "c8ySetupFinished";

/**
 * This component is the parent of each setup and can be injected
 * into setup steps to control them.
 */
declare class SetupComponent implements OnInit {
    options: OptionsService;
    private stepperService;
    private appState;
    private alert;
    private permissions;
    private setupService;
    /**
     * A subject which can be used to exchange data between
     * steps.
     */
    data$: BehaviorSubject<Record<string, unknown>>;
    /**
     * All current shown setup steps.
     */
    steps: SetupStep[];
    /**
     * The current state. SetupState.START shows an application overview
     * while SetupState.WIZARD shows the steps.
     */
    currentSetupState: SetupState;
    /**
     * Emits when the setup is done. You can add certain operations before completing the setup that needed to be awaited. Return
     * true if everything is fine, otherwise false.
     *
     * ```typescript
     * const asyncOperation = delay(2000);
     * this.setup.completed$ = this.setup.completed$.pipe(asyncOperation, map(() => true));
     * ```
     *
     * Note: Remember that a step can be viewed multiple times. The step needs to ensure, to only add a completed operation ones.
     */
    completed$: Observable<boolean>;
    /**
     * @ignore
     */
    readonly stepperId = Steppers.SETUP;
    /**
     * @ignore
     */
    setupState: typeof SetupState;
    /**
     * @ignore
     */
    properties: any[];
    /**
     * @ignore
     */
    canSkip: boolean;
    /**
     * @ignore
     */
    hasRole: boolean;
    /**
     * @ignore
     */
    isOwner: boolean;
    private readonly RELOAD_APP_TIMEOUT;
    constructor(options: OptionsService, stepperService: StepperService, appState: AppStateService, alert: AlertService, permissions: Permissions, setupService: SetupService);
    /**
     * Mark a step as completed. If the step is required, this is needed to fulfill
     * the setup.
     * @param stepIndex The index of the step you want to mark as completed
     * @param isCompleted Defaults to true to mark it as completed but can be set to false to invalidate the step.
     */
    stepCompleted(stepIndex: any, isCompleted?: boolean): void;
    /**
     * Returns a step by it index position in the wizard.
     * @param stepIndex The step index that you want to receive.
     * @returns An indexed step definition.
     */
    getByIndex(stepIndex: any): SetupStep;
    /**
     * @ignore
     */
    ngOnInit(): Promise<void>;
    /**
     * Skips the current setup wizard
     */
    skip(): void;
    /**
     * Starts the wizards (or finish the setup if no steps are found)
     */
    start(): void;
    /**
     * Cancels the wizards and goes back to the start view.
     */
    cancel(): void;
    /**
     * Finish the wizard and will start the application.
     */
    finish(): void;
    finalize(): Promise<void>;
    /**
     * Verifies every step and checks if all required are completed.
     * Updates the icons to reflect the state of the steps (error, warning, done).
     * @returns Returns true if no error was found.
     */
    verify(): boolean;
    private reloadApp;
    private hasRequiredSteps;
    private getState;
    static ɵfac: i0.ɵɵFactoryDeclaration<SetupComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<SetupComponent, "c8y-setup", never, {}, {}, never, never, true, never>;
}

declare class SetupCompletedComponent implements OnInit, OnDestroy {
    stepper: C8yStepper;
    step: CdkStep;
    setup: SetupComponent;
    status: 'done' | 'warning' | 'error';
    readonly STEP_LABEL: "Step";
    private isVerified;
    private stepperSelectionChangeSubscription;
    constructor(stepper: C8yStepper, step: CdkStep, setup: SetupComponent);
    ngOnInit(): void;
    ngOnDestroy(): void;
    verify(selectedIndex: any): void;
    start(): void;
    back(): void;
    gotoStep(index: any): void;
    private getOverallStatus;
    static ɵfac: i0.ɵɵFactoryDeclaration<SetupCompletedComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<SetupCompletedComponent, "c8y-setup-completed", never, {}, {}, never, never, true, never>;
}

declare class SetupModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<SetupModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<SetupModule, never, [typeof CommonModule, typeof HeaderModule, typeof StepperModule, typeof PluginsModule, typeof PropertiesListModule, typeof SetupComponent, typeof SetupCompletedComponent], [typeof SetupComponent, typeof SetupCompletedComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<SetupModule>;
}

declare class CookieBannerComponent implements OnInit {
    private bsModalService;
    private cookieBannerService;
    settings: Partial<CookieBannerSettings>;
    showBanner: boolean;
    shouldDisable: boolean;
    cookiePreferences: CookiePreferences;
    constructor(bsModalService: BsModalService, cookieBannerService: CookieBannerService);
    ngOnInit(): void;
    getSettings(): Partial<CookieBannerSettings>;
    onConfigurePreferences(): void;
    acceptCookies(): void;
    rejectCookies(): void;
    private shouldShowCookieBanner;
    private disableButtons;
    private setCookieBannerVisibility;
    static ɵfac: i0.ɵɵFactoryDeclaration<CookieBannerComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<CookieBannerComponent, "c8y-cookie-banner", never, {}, {}, never, never, true, never>;
}

declare class CookieBannerPreferencesModalComponent {
    private cookieBannerService;
    modalRef: ConfirmModalComponent;
    closeSubject: Subject<CookiePreferences>;
    title: "Cookie preferences";
    labels: ModalLabels;
    status: StatusType;
    configCookiePreferences: CookiePreferences;
    configCookiePreferencesList: Cookie[];
    constructor(cookieBannerService: CookieBannerService);
    ngOnInit(): void;
    ngAfterViewInit(): Promise<void>;
    onClose(): void;
    onDismiss(): void;
    getCookieDescription(cookieType: 'required' | 'functional' | 'marketing'): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<CookieBannerPreferencesModalComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<CookieBannerPreferencesModalComponent, "c8y-cookie-banner-preferences-modal", never, {}, {}, never, never, true, never>;
}

interface MessageBannerSettings {
    messageBannerEnabled?: boolean;
    messageBannerContent?: string;
    messageBannerType?: Alert['type'];
    messageBannerId?: string;
}

declare class MessageBannerComponent implements OnInit {
    settings$: Observable<Partial<MessageBannerSettings>>;
    showBanner$: Observable<boolean>;
    private messageBannerService;
    ngOnInit(): void;
    dismiss(settings: Partial<MessageBannerSettings>, acknowledge: boolean): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<MessageBannerComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<MessageBannerComponent, "c8y-message-banner", never, {}, {}, never, never, true, never>;
}

/**
 * The module which allows to bootstrap a custom application.
 * Use it as `bootstrap: []` component in your main app module
 * or as `<c8y-bootstrap>` in your main app.
 */
declare class BootstrapModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<BootstrapModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<BootstrapModule, never, [typeof i2$1.FormsModule, typeof CommonModule, typeof HeaderModule, typeof i1$2.RouterModule, typeof TabsModule, typeof ActionBarModule, typeof AlertModule, typeof NavigatorModule, typeof i3.TooltipModule, typeof ModalModule, typeof SetupModule, typeof DrawerModule, typeof BootstrapComponent, typeof CookieBannerComponent, typeof CookieBannerPreferencesModalComponent, typeof MessageBannerComponent], [typeof BootstrapComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<BootstrapModule>;
}

declare class MessageBannerService {
    readonly MESSAGE_BANNER = "messageBanner";
    private readonly DISMISSED_BANNERS_KEY;
    private options;
    showBanner$: Subject<boolean>;
    private isPreview;
    settings$(): Observable<Partial<MessageBannerSettings>>;
    showBanner(isPreview?: boolean): void;
    dismiss(bannerId?: string, acknowledge?: boolean): void;
    currentValue(): _c8y_options.MessageBannerConfiguration;
    /**
     * Checks if a banner with the given ID has been dismissed before.
     */
    isBannerDismissed(bannerId: string): boolean;
    /**
     * Marks a banner as dismissed in localStorage.
     */
    private markBannerAsDismissed;
    static ɵfac: i0.ɵɵFactoryDeclaration<MessageBannerService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<MessageBannerService>;
}

interface DrawerHost {
    drawerHost: ViewContainerRef;
    disableClickOutside: boolean;
    closeOnEscape: boolean;
    drawerOpen$: Observable<boolean>;
    hide(): void;
}
interface DrawerOptions<C> {
    /**
     * A host element the drawer will be appended to.
     */
    host?: HTMLElement;
    /**
     * Data to pass to component inside drawer.
     */
    initialState?: Partial<C>;
    /**
     * Defines whether the drawer should be closed when navigation start is detected. Defaults to <code>true</code>.
     */
    closeOnNavigation?: boolean;
    /**
     * Defines whether it should be possible to click outside of the drawer to close the drawer.
     */
    disableClickOutside?: boolean;
    /**
     * Defines whether the drawer should be closed when Escape key is pressed.
     * Even if set to false, you can still close the drawer manually by injecting the BottomDrawerRef and calling the <code>close()</code> method.
     */
    closeOnEscape?: boolean;
}

declare const DRAWER_ANIMATION_TIME = 400;
declare class BottomDrawerRef<C> {
    private drawerComponent;
    private applicationRef;
    private router;
    private options?;
    private removeCallback?;
    private isTopCallback?;
    /**
     * Event fired when the bottom drawer behind the reference is closed.
     */
    get onClosed$(): Observable<void>;
    /**
     * The instance of the component created.
     */
    instance: C;
    private drawerComponentRef;
    private closedSubject$;
    private closedObs$;
    constructor(component: Type<C>, drawerComponent: Type<DrawerHost>, applicationRef: ApplicationRef, router: Router, options?: DrawerOptions<C>, removeCallback?: (ref: BottomDrawerRef<C>) => void, isTopCallback?: (ref: BottomDrawerRef<C>) => boolean);
    /**
     * Checks if this drawer is the topmost open drawer.
     */
    isTop(): boolean;
    /**
     * Closes the bottom drawer behind the reference.
     */
    close(): Promise<void>;
    private attachDrawerToView;
    private detachDrawerFromView;
    private detachDrawerWithAnimationDelay;
    private handleNavigation;
}

/**
 * Bottom drawer component that slides up from the bottom of the viewport.
 * Typically managed by BottomDrawerService.
 */
declare class BottomDrawerComponent implements DrawerHost {
    private bottomDrawerRef;
    drawerHost: ViewContainerRef;
    /**
     * When enabled, clicking outside the drawer will not close it.
     */
    disableClickOutside: boolean;
    closeOnEscape: boolean;
    private drawerOpenSubject$;
    private drawerOpenObs$;
    constructor(bottomDrawerRef: BottomDrawerRef<any>);
    get drawerOpen$(): rxjs.Observable<boolean>;
    /**
     * Handles Escape key press to close the drawer.
     */
    onEscapeKey(event: KeyboardEvent): void;
    /**
     * Hides the drawer with animation.
     */
    hide(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<BottomDrawerComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<BottomDrawerComponent, "c8y-bottom-drawer", never, {}, {}, never, never, true, never>;
}

/**
 * Service for opening components in a bottom drawer.
 *
 * @example
 * ```typescript
 * const drawer = this.drawerService.openDrawer(MyComponent, {
 *   initialState: { data: 'some data' },
 *   disableClickOutside: true
 * });
 * ```
 */
declare class BottomDrawerService {
    private applicationRef;
    private router;
    private openDrawers;
    constructor(applicationRef: ApplicationRef, router: Router);
    /**
     * Opens a component in a bottom drawer.
     *
     * @param component - The component type to render
     * @param options - Configuration options (initialState, disableClickOutside, closeOnNavigation, host)
     * @returns A reference to the bottom drawer instance
     */
    openDrawer<C>(component: Type<C>, options?: DrawerOptions<C>): BottomDrawerRef<C>;
    isTop(drawerRef: BottomDrawerRef<any>): boolean;
    private remove;
    static ɵfac: i0.ɵɵFactoryDeclaration<BottomDrawerService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<BottomDrawerService>;
}

interface PatternMessages {
    [pattern: string]: {
        gettext: string;
        placeholders?: {
            [placeholder: string]: string | any;
        };
    };
}
/**
 * @deprecated Consider using the `hookPatternMessages` function instead.
 */
declare const HOOK_PATTERN_MESSAGES: InjectionToken<unknown>;
/**
 * You can either provide a single `PatternMessages` as parameter:
 * ```typescript
 *  hookPatternMessages(...)
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  hookPatternMessages([...])
 * ```
 *
 * Or you provide an Service that implements `ExtensionFactory<PatternMessages>`
 * ```typescript
 *  export class MyPatternMessagesFactory implements ExtensionFactory<PatternMessages> {...}
 *  ...
 *  hookPatternMessages(MyPatternMessagesFactory)
 * ```
 * A typed alternative to `HOOK_PATTERN_MESSAGES`.
 * @param patterns The `PatternMessages`'s or `ExtensionFactory` to be provided.
 * @returns An `Provider` to be provided in your module.
 */
declare function hookPatternMessages(patterns: GenericHookType<PatternMessages>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;

/**
 * A service to translate messages by using regexp patterns.
 */
declare class PatternMessagesService {
    translateService: TranslateService$1;
    translateStore: TranslateStore;
    patterns: PatternMessages;
    pipes: {
        absoluteDate: (date: string | number | Date) => string;
        translate: (key: any) => any;
    };
    constructor(patterns: PatternMessages[], translateService: TranslateService$1, translateStore: TranslateStore);
    translate(message: string): any;
    private translateWithPatterns;
    private translateWithParams;
}

declare const LANGUAGES: InjectionToken<unknown>;

declare const LOCALE_PATH: InjectionToken<unknown>;

/**
 * @ignore
 */
declare function loadLocale(moduleLang: string): Promise<any>;

declare class MissingTranslationCustomHandler implements MissingTranslationHandler {
    private parser;
    private store;
    private patterns;
    cache: Map<string, Map<string, string>>;
    patternMessagesServices: Map<TranslateService$1, PatternMessagesService>;
    constructor(parser: TranslateParser, store: TranslateStore, patterns: PatternMessages[]);
    handle(params: MissingTranslationHandlerParams): string;
    getPatternMessagesService(translateService: TranslateService$1): PatternMessagesService;
    private getFromCache;
    private addToCache;
    private getCacheKey;
    private getPatternMessageTranslation;
    static ɵfac: i0.ɵɵFactoryDeclaration<MissingTranslationCustomHandler, [null, null, { optional: true; }]>;
    static ɵprov: i0.ɵɵInjectableDeclaration<MissingTranslationCustomHandler>;
}

/**
 * @deprecated Use `import { gettext } from '@c8y/ngx-components/gettext';` instead.
 */
declare function gettext<T extends string>(str: T): T;

declare const MESSAGES_CORE_I18N: {
    readonly '^Access is denied$': {
        readonly gettext: "Access denied.";
    };
    readonly '^API is not available with the new domain$': {
        readonly gettext: "Could not activate custom domain. DNS setup is incorrect.";
    };
    readonly '^Availability monitoring record$': {
        readonly gettext: "Availability monitoring record";
    };
    readonly '^Failed to update domain at the platform$': {
        readonly gettext: "Failed to update domain at the platform.";
    };
    readonly '^Following mandatory fields should be included: (.+?)$': {
        readonly gettext: "Following mandatory fields should be included: {{fields}}";
        readonly placeholders: {
            readonly fields: "$1";
        };
    };
    readonly '^I/O error: Connection refused; nested exception is Connection refused : Connection refused$': {
        readonly gettext: "Connection refused";
    };
    readonly '^I/O error: Read timed out; nested exception is Read timed out : Read timed out$': {
        readonly gettext: "Read timed out";
    };
    readonly '^Log file requested$': {
        readonly gettext: "Log file requested.";
    };
    readonly '^Managed object deleted$': {
        readonly gettext: "Managed object deleted";
    };
    readonly '^Managed object "(.+?)" deleted$': {
        readonly gettext: "Managed object \"{{name}}\" deleted";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^Maximum file size exceeded$': {
        readonly gettext: "Maximum file size exceeded.";
    };
    readonly '^Maximum age cannot be bigger than 10 years.$': {
        readonly gettext: "Maximum age cannot be bigger than 10 years.";
    };
    readonly '^Real-time event processing is currently overloaded and may stop processing your events\\. Please contact support\\.$': {
        readonly gettext: "Real-time event processing is currently overloaded and may stop processing your events. Please contact support.";
    };
    readonly '^Resource ID \\[type=com_cumulocity_model_idtype_GId, value=(.+?)\\] for this request not found.$': {
        readonly gettext: "Could not find the resource with ID \"{{id}}\".";
        readonly placeholders: {
            readonly id: "$1";
        };
    };
    readonly '^Too Many Requests$': {
        readonly gettext: "Too many requests. Try again later.";
    };
    readonly '^Send message "(.+)".$': {
        readonly gettext: "Send message \"{{str}}\".";
        readonly placeholders: {
            readonly str: "$1";
        };
    };
    readonly '^Update configuration to (.+).$': {
        readonly gettext: "Update configuration to: {{ name }}.";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^Execute generic command: (.+).?$': {
        readonly gettext: "Execute generic command: {{command}}";
        readonly placeholders: {
            readonly command: "$1";
        };
    };
    readonly '^Error while processing report$': {
        readonly gettext: "Error while processing report";
    };
    readonly '^Expected 1 endpointId argument$': {
        readonly gettext: "Expected 1 endpointId argument";
    };
    readonly '^Option created$': {
        readonly gettext: "Option created.";
    };
    readonly '^Option "(.+?)" created$': {
        readonly gettext: "Option \"{{option}}\" created.";
        readonly placeholders: {
            readonly option: "$1";
        };
    };
    readonly '^Option deleted$': {
        readonly gettext: "Option deleted.";
    };
    readonly '^Option "(.+?)" deleted$': {
        readonly gettext: "Option \"{{option}}\" deleted.";
        readonly placeholders: {
            readonly option: "$1";
        };
    };
    readonly '^unable to find option with given key (.+?) : Could not find entity Option by ID (.+?)!$': {
        readonly gettext: "Unable to get tenant option: \"{{option}}\".";
        readonly placeholders: {
            readonly option: "$2";
        };
    };
    readonly '^unable to find option with given key (.+?) : There is no system property for key (.+?)$': {
        readonly gettext: "Unable to get system option: \"{{option}}\".";
        readonly placeholders: {
            readonly option: "$2";
        };
    };
    readonly "^Message with ID (.+?) doesn't exist in smart rest template (.+?)$": {
        gettext: "Message with ID \"{{messageId}}\" doesn't exist in SmartREST template with ID \"{{templateId}}\"";
        placeholders: {
            messageId: string;
            templateId: string;
        };
    };
    readonly "^Smart rest template (.+?) doesn't exist$": {
        gettext: "SmartREST template with ID \"{{templateId}}\" doesn't exist.";
        placeholders: {
            templateId: string;
        };
    };
    readonly '^Command state is invalid: (.+)$': {
        readonly gettext: "Command state is invalid: {{violations}}";
        readonly placeholders: {
            readonly violations: {
                readonly capture: "$1";
                readonly translate: {
                    readonly '(\\w+?) - may not be null': {
                        readonly gettext: "\"{{field}}\" must not be null";
                        readonly placeholders: {
                            readonly field: "$1";
                        };
                    };
                };
            };
        };
    };
    readonly '^Simulator state is invalid: (.+)$': {
        readonly gettext: "Simulator state is invalid: {{violations}}";
        readonly placeholders: {
            readonly violations: {
                readonly capture: "$1";
                readonly translate: {
                    readonly '(\\w+?) - may not be null': {
                        readonly gettext: "\"{{field}}\" should not be null";
                        readonly placeholders: {
                            readonly field: "$1";
                        };
                    };
                    readonly '(\\w+?) - must be less than or equal to (\\d+)': {
                        readonly gettext: "\"{{field}}\" must be less than or equal to {{maxValue}}";
                        readonly placeholders: {
                            readonly field: "$1";
                            readonly maxValue: "$2";
                        };
                    };
                    readonly '(\\w+?) - should not contain null values': {
                        readonly gettext: "\"{{field}}\" should not contain null values";
                        readonly placeholders: {
                            readonly field: "$1";
                        };
                    };
                    readonly '(\\w+?) - must be true': {
                        readonly gettext: "\"{{field}}\" must be true";
                        readonly placeholders: {
                            readonly field: "$1";
                        };
                    };
                    readonly '(\\w+?) - must not be empty': {
                        readonly gettext: "\"{{field}}\" must not be empty";
                        readonly placeholders: {
                            readonly field: "$1";
                        };
                    };
                };
            };
        };
    };
    readonly '^Cycle detected for route (.+?)!$': {
        readonly gettext: "Cycle detected for route {{route}}.";
        readonly placeholders: {
            readonly route: "$1";
        };
    };
    readonly '^Data broker processing is currently overloaded and may stop forwarding your data\\. Please contact support\\.$': {
        readonly gettext: "Data broker processing is currently overloaded and may stop forwarding your data. Please contact support.";
    };
    readonly '^Data broker processing is not able to connect do destination tenant, thus data forwarding is not working\\. Please contact support\\.$': {
        readonly gettext: "Data broker processing is not able to connect to destination tenant, thus data forwarding is not working. Please contact support.";
    };
    readonly '^Duplicated connector for instanceUrl (.+?)!$': {
        readonly gettext: "Target URL {{targetUrl}} already used by another connector.";
        readonly placeholders: {
            readonly targetUrl: "$1";
        };
    };
    readonly '^Duplicated connector for name (.+?)!$': {
        readonly gettext: "Connector name \"{{name}}\" already used by another connector.";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^Connector updated$': {
        readonly gettext: "Connector updated";
    };
    readonly '^Connector (.+?) updated: filters [(.+?)] added$': {
        readonly gettext: "Connector \"{{name}}\" updated: filters [{{filters}}] added";
        readonly placeholders: {
            readonly name: "$1";
            readonly filters: "$2";
        };
    };
    readonly '^Connector deleted$': {
        readonly gettext: "Connector deleted";
    };
    readonly '^Connector (.+?) deleted$': {
        readonly gettext: "Connector \"{{name}}\" deleted";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^Connector created$': {
        readonly gettext: "Connector created";
    };
    readonly '^Connector (.+?) created: (.+?) added, (.+?)$': {
        readonly gettext: "Connector \"{{name}}\" created: {{configuration}} added, {{baseProperties}}";
        readonly placeholders: {
            readonly name: "$1";
            readonly configuration: "$2";
            readonly baseProperties: "$3";
        };
    };
    readonly '^Connector (.+?) updated: (.+?) added, (.+?) removed$': {
        readonly gettext: "Connector \"{{name}}\" updated: {{newConfig}} added, {{oldConfig}} removed";
        readonly placeholders: {
            readonly name: "$1";
            readonly newConfig: "$2";
            readonly oldConfig: "$3";
        };
    };
    readonly '^Connector (.+?) updated: (.+?) removed, (.+?) added$': {
        readonly gettext: "Connector \"{{name}}\" updated: {{newConfig}} added, {{oldConfig}} removed";
        readonly placeholders: {
            readonly name: "$1";
            readonly oldConfig: "$2";
            readonly newConfig: "$3";
        };
    };
    readonly '^Could not login to ssh server on endpoint "(.+)"\\. Provided credential for user "(.+)" is incorrect\\.$': {
        readonly gettext: "Could not access SSH server on endpoint \"{{endpointName}}\". Provided credentials for user \"{{userName}}\" are incorrect.";
        readonly placeholders: {
            readonly endpointName: "$1";
            readonly userName: "$2";
        };
    };
    readonly '^Could not connect to endpoint (.+)\\. Could not verify `(.+)` host key with fingerprint `(.+)` for `(.+)` on port (.+)\\. If you expected that key, please remove the previous one from configuration to allow for connection\\.$': {
        readonly gettext: "Could not connect to endpoint \"{{endpointName}}\". Could not verify {{keyType}} host key with fingerprint {{fingerprint}} for host {{host}} on port {{port}}. If you expected this key, please remove the previous one from configuration to allow for connection.";
        readonly placeholders: {
            readonly endpointName: "$1";
            readonly keyType: "$2";
            readonly fingerprint: "$3";
            readonly host: "$4";
            readonly port: "$5";
        };
    };
    readonly '^Could not save object remoteAccessUpdate: (.+)$': {
        readonly gettext: "{{errorMessages}}";
        readonly placeholders: {
            readonly errorMessages: {
                readonly capture: "$1";
                readonly translate: {
                    readonly 'Could not recognize host-key format': {
                        readonly gettext: "Could not recognize \"Host key\" format";
                    };
                    readonly 'Could not recognize key-pair format': {
                        readonly gettext: "Could not recognize the format of \"Public key\" or \"Private key\"";
                    };
                };
            };
        };
    };
    readonly '^Password cipher does not match$': {
        readonly gettext: "Password cipher does not match.";
    };
    readonly '^Private key must be provided in KEY_PAIR credentials$': {
        readonly gettext: "Private key must be provided when \"Public/private keys\" option is selected.";
    };
    readonly '^Protocol "(.+?)" does not support "(.+?)" credentials type$': {
        readonly gettext: "Protocol \"{{protocol}}\" does not support \"{{credentialsType}}\" credentials type.";
        readonly placeholders: {
            readonly protocol: "$1";
            readonly credentialsType: "$2";
        };
    };
    readonly '^Private key cipher does not match$': {
        readonly gettext: "Private key cipher does not match";
    };
    readonly '^LWM2M device type$': {
        readonly gettext: "LWM2M device type";
    };
    readonly '^LWM2M server URI$': {
        readonly gettext: "LWM2M server URI";
    };
    readonly '^coaps://<LWM2M-server-domain>:<coaps-port>$': {
        readonly gettext: "coaps://<LWM2M-server-domain>:<coaps-port>";
    };
    readonly '^Endpoint client ID$': {
        readonly gettext: "Endpoint client ID";
    };
    readonly '^Server public key$': {
        readonly gettext: "Server public key";
    };
    readonly '^Generate bootstrap server config$': {
        readonly gettext: "Generate bootstrap server config";
    };
    readonly '^LWM2M bootstrap short server ID$': {
        readonly gettext: "LWM2M bootstrap short server ID";
    };
    readonly '^LWM2M short server ID$': {
        readonly gettext: "LWM2M short server ID";
    };
    readonly '^Registration lifetime$': {
        readonly gettext: "Registration lifetime";
    };
    readonly '^in seconds$': {
        readonly gettext: "in seconds";
    };
    readonly '^Security instance offset$': {
        readonly gettext: "Security instance offset";
    };
    readonly '^Default minimum period$': {
        readonly gettext: "Default minimum period";
    };
    readonly '^Default maximum period$': {
        readonly gettext: "Default maximum period";
    };
    readonly '^Binding mode$': {
        readonly gettext: "Binding mode";
    };
    readonly '^applicable for LWM2M 1\\.0$': {
        readonly gettext: "applicable for LWM2M 1.0";
    };
    readonly '^Awake time registration parameter$': {
        readonly gettext: "Awake time registration parameter";
    };
    readonly '^in milliseconds, 0 means device is always online$': {
        readonly gettext: "in milliseconds, 0 means device is always online";
    };
    readonly '^Use common timestamp resources 5518 and 6050 or object specific timestamp for object 6 reported by the device if available$': {
        readonly gettext: "Use common timestamp resources 5518 and 6050 or object specific timestamp for object 6 reported by the device if available";
    };
    readonly '^Notification storing when disabled or offline$': {
        readonly gettext: "Notification storing when disabled or offline";
    };
    readonly '^Disable timeout$': {
        readonly gettext: "Disable timeout";
    };
    readonly '^LWM2M request timeout$': {
        readonly gettext: "LWM2M request timeout";
    };
    readonly '^in milliseconds$': {
        readonly gettext: "in milliseconds";
    };
    readonly '^Binary delivery encoding$': {
        readonly gettext: "Binary delivery encoding";
    };
    readonly '^Firmware update delivery method$': {
        readonly gettext: "Firmware update delivery method";
    };
    readonly '^Firmware update supported device protocol$': {
        readonly gettext: "Firmware update supported device protocol";
    };
    readonly '^Firmware update reset mechanism$': {
        readonly gettext: "Firmware update reset mechanism";
    };
    readonly '^Firmware update URL$': {
        readonly gettext: "Firmware update URL";
    };
    readonly '^Failed to find operation data in the internal memory store\\. Try again!$': {
        readonly gettext: "Failed to find operation data in the internal memory store. Try again.";
    };
    readonly '^Security mode$': {
        readonly gettext: "Security mode";
    };
    readonly '^Bootstrap PSK ID$': {
        readonly gettext: "Bootstrap PSK ID";
    };
    readonly '^Bootstrap pre-shared key$': {
        readonly gettext: "Bootstrap pre-shared key";
    };
    readonly '^LWM2M PSK ID$': {
        readonly gettext: "LWM2M PSK ID";
    };
    readonly '^LWM2M pre-shared key$': {
        readonly gettext: "LWM2M pre-shared key";
    };
    readonly '^LWM2M bulk device upload operation$': {
        readonly gettext: "LWM2M bulk device upload operation";
    };
    readonly '^This operation is only triggered by the agent when user uploads a CSV file with all required information to register new LWM2M devices\\. The source of the operation is the LWM2M device connector\\. Users are not able to trigger this operation using the shell command\\.$': {
        readonly gettext: "This operation is only triggered by the agent when user uploads a CSV file with all required information to register new LWM2M devices. The source of the operation is the LWM2M device connector. Users are not able to trigger this operation using the shell command.";
    };
    readonly '^Write$': {
        readonly gettext: "Write";
    };
    readonly '^Execute$': {
        readonly gettext: "Execute";
    };
    readonly '^Execute with parameters$': {
        readonly gettext: "Execute with parameters";
    };
    readonly '^Execute with Parameters$': {
        readonly gettext: "Execute with parameters";
    };
    readonly '^Delete Instance$': {
        readonly gettext: "Delete instance";
    };
    readonly '^Create Instance$': {
        readonly gettext: "Create instance";
    };
    readonly '^Read Object$': {
        readonly gettext: "Read object";
    };
    readonly '^Read Instance$': {
        readonly gettext: "Read instance";
    };
    readonly '^LWM2M bulk device removal operation$': {
        readonly gettext: "LWM2M bulk device removal operation";
    };
    readonly '^This operation is only triggered by the agent when user uploads a CSV file with a list of endpoint IDs to delete from C8Y\\.The source of the operation is the LWM2M device connector\\. Users are not able to trigger this operation using the shell command\\.$': {
        readonly gettext: "This operation is only triggered by the agent when user uploads a CSV file with a list of endpoint IDs to delete from the platform. The source of the operation is the LWM2M device connector. Users are not able to trigger this operation using the shell command.";
    };
    readonly '^Could not find device$': {
        readonly gettext: "Could not find device";
    };
    readonly '^Exception occurred while removing device (.+?)$': {
        readonly gettext: "Exception occurred while removing device: {{ exceptionMessage }}";
        readonly placeholders: {
            readonly exceptionMessage: "$1";
        };
    };
    readonly '^This command can be used to migrate LWM2M devices which are created in a non-standard way\\. It can take comma-separated device managed object IDs as parameters\\. If the IDs are specified then the migration will be done only for those devices\\. If the command is sent without any parameters then the agent will look up for possible Lwm2m devices that are not created in a standard way and try to migrate them\\. Usage: migrateLwm2mDevices 1122,3344 or migrateLwm2mDevices$': {
        readonly gettext: "This command can be used to migrate LWM2M devices which are created in a non-standard way. It can take comma-separated device managed object IDs as parameters. If the IDs are specified then the migration will be done only for those devices. If the command is sent without any parameters then the agent will look up for possible LWM2M devices that are not created in a standard way and try to migrate them. Usage: migrateLwm2mDevices 1122,3344 or migrateLwm2mDevices";
    };
    readonly '^Unable to migrate devices$': {
        readonly gettext: "Unable to migrate devices";
    };
    readonly '^LWM2M device registration$': {
        readonly gettext: "LWM2M device registration";
    };
    readonly '^The required and optional properties to register and setup LWM2M Devices$': {
        readonly gettext: "The required and optional properties to register and setup LWM2M devices";
    };
    readonly '^Bootstrap$': {
        readonly gettext: "Bootstrap";
    };
    readonly '^Advanced$': {
        readonly gettext: "Advanced";
    };
    readonly '^Bulk LWM2M device registration$': {
        readonly gettext: "Bulk LWM2M device registration";
    };
    readonly '^This command returns a list of shell commands with description that can be created for the Lwm2m device connector\\.$': {
        readonly gettext: "This command returns a list of shell commands with description that can be created for the LWM2M device connector.";
    };
    readonly '^The following operations are supported:$': {
        readonly gettext: "The following operations are supported:";
    };
    readonly '^PSK template$': {
        readonly gettext: "PSK template";
    };
    readonly '^A bulk registration CSV template showing all mandatory fields$': {
        readonly gettext: "A bulk registration CSV template showing all mandatory fields";
    };
    readonly '^Mandatory fields template$': {
        readonly gettext: "Mandatory fields template";
    };
    readonly '^General template$': {
        readonly gettext: "General template";
    };
    readonly '^A bulk registration CSV template for NO_SEC devices with all optional fields$': {
        readonly gettext: "A bulk registration CSV template for NO_SEC devices with all optional fields";
    };
    readonly '^A general bulk registration CSV template showing all possible fields$': {
        readonly gettext: "A general bulk registration CSV template showing all possible fields";
    };
    readonly '^A bulk registration CSV template for PSK devices with all optional fields$': {
        readonly gettext: "A bulk registration CSV template for PSK devices with all optional fields";
    };
    readonly '^NO_SEC template$': {
        readonly gettext: "NO_SEC template";
    };
    readonly '^Authentication to the Loriot platform failed with status code (.+?). Check if the credentials are correct or if Session ID is expired.$': {
        readonly gettext: "Authentication to the LORIOT platform failed with status code {{ statusCode }}. Check if the credentials are correct or if session ID is expired.";
        readonly placeholders: {
            readonly statusCode: "$1";
        };
    };
    readonly '^Authentication to the Loriot platform failed with status code (.+?). Check if the base URL, credentials are correct and the application with the given ID exists.$': {
        readonly gettext: "Authentication to the LORIOT platform failed with status code {{ statusCode }}. Check if the base URL, credentials are correct and the application with the given ID exists.";
        readonly placeholders: {
            readonly statusCode: "$1";
        };
    };
    readonly '^Application output creation failed due to status code (.+?)$': {
        readonly gettext: "Application output creation failed due to status code {{ statusCode }}.";
        readonly placeholders: {
            readonly statusCode: "$1";
        };
    };
    readonly '^Application output update failed due to status code (.+?)$': {
        readonly gettext: "Application output update failed due to status code {{ statusCode }}.";
        readonly placeholders: {
            readonly statusCode: "$1";
        };
    };
    readonly '^Error creating the device due to status code (.+?). Check if the application Id, devEui, appEui and appKey are in the correct format or the device limit has been exceeded or has been registered with another account in the Loriot provider$': {
        readonly gettext: "Error creating the device due to status code {{ statusCode }}. Check if the application name, Device EUI, Application EUI and Application key are in the correct format or the device limit has been exceeded or has been registered with another account in the LORIOT provider.";
        readonly placeholders: {
            readonly statusCode: "$1";
        };
    };
    readonly '^Error retrieving application with given ID: (.+?) with status code 400. Check if the applicationId provided is in the correct format$': {
        readonly gettext: "Error retrieving application with given ID: {{ applicationId }} with status code 400. Check if the selected application is correct";
        readonly placeholders: {
            readonly applicationId: "$1";
        };
    };
    readonly "^LNS connection name can't be null or blank.$": {
        readonly gettext: "LNS connection name can't be empty.";
    };
    readonly '^Unexpected error occurred while accessing the cached LNS connections map with key (.+?)$': {
        readonly gettext: "Unexpected error occurred while accessing the cached LNS connections map with key \"{{ connectionName }}\".";
        readonly placeholders: {
            readonly connectionName: "$1";
        };
    };
    readonly "^LNS connection named (.+?) doesn't exist.$": {
        readonly gettext: "LNS connection named \"{{ connectionName }}\" doesn't exist.";
        readonly placeholders: {
            readonly connectionName: "$1";
        };
    };
    readonly '^LNS connection named (.+?) already exists.$': {
        readonly gettext: "LNS connection named \"{{ connectionName }}\" already exists.";
        readonly placeholders: {
            readonly connectionName: "$1";
        };
    };
    readonly "^New LNS connection can't be null.$": {
        readonly gettext: "New LNS connection can't be empty.";
    };
    readonly "^LNS connection to update can't be null.$": {
        readonly gettext: "LNS connection to update can't be empty.";
    };
    readonly "^The name of the LNS connection to update can't be null.$": {
        readonly gettext: "The name of the LNS connection to update can't be empty.";
    };
    readonly '^Can not delete the LNS connection with name "(.+?)" as it\'s associated with (.+?) device(s).$': {
        readonly gettext: "Could not delete the LNS connection with the name \"{{ connectionName }}\" as it's associated with {{ numberOfDevices }} device(s).";
        readonly placeholders: {
            readonly connectionName: "$1";
            readonly numberOfDevices: "$2";
        };
    };
    readonly '^Can not update the LNS connection with name "(.+?)" as it\'s associated with (.+?) device(s).$': {
        readonly gettext: "Could not update the LNS connection with the name \"{{ connectionName }}\" as it's associated with {{ numberOfDevices }} device(s).";
        readonly placeholders: {
            readonly connectionName: "$1";
            readonly numberOfDevices: "$2";
        };
    };
    readonly '^Authentication to the Actility platform failed with status code (.+?). Check if the credentials are correct.$': {
        readonly gettext: "Authentication to the Actility platform failed with status code {{ statusCode }}. Check if the credentials are correct.";
        readonly placeholders: {
            readonly statusCode: "$1";
        };
    };
    readonly '^Authentication to the Actility platform failed with status code (.+?). Check if the profile Id is correct.$': {
        readonly gettext: "Authentication to the Actility platform failed with status code {{ statusCode }}. Check if the Profile ID is correct.";
        readonly placeholders: {
            readonly statusCode: "$1";
        };
    };
    readonly '^Authentication to the Actility platform failed. Check if the base URL (.+?) is correct.$': {
        readonly gettext: "Authentication to the Actility platform failed. Check if the base URL {{ baseUrl }} is correct.";
        readonly placeholders: {
            readonly baseUrl: "$1";
        };
    };
    readonly '^Authentication to the Sigfox platform failed. Check if the base URL (.+) is correct.$': {
        readonly gettext: "Authentication to the Sigfox platform failed. Check if the base URL {{ baseUrl }} is correct.";
        readonly placeholders: {
            readonly baseUrl: "$1";
        };
    };
    readonly '^Authentication to the Sigfox platform failed. Check if the Parent group Id and/or the credentials are correct.$': {
        readonly gettext: "Authentication to the Sigfox platform failed. Check if the Parent group ID and/or the credentials are correct.";
    };
    readonly '^Authentication to the Loriot platform failed with status code (.+?). Session Id might have expired.$': {
        readonly gettext: "Authentication to the LORIOT platform failed with status code {{ statusCode }}. Session ID might have expired.";
        readonly placeholders: {
            readonly statusCode: "$1";
        };
    };
    readonly '^Authentication to the Actility platform failed with status code (.+?). Check if the base URL and/or the credentials are correct.$': {
        readonly gettext: "Authentication to the Actility platform failed with status code {{ statusCode }}. Check if the base URL and/or the credentials are correct.";
        readonly placeholders: {
            readonly statusCode: "$1";
        };
    };
    readonly '^Error on deleting group: (.+?) : Role (.+?) is used in SSO dynamic access mapping$': {
        readonly gettext: "Role \"{{ roleName }}\" cannot be deleted because it is assigned to a dynamic access mapping in Single sign-on configuration.";
        readonly placeholders: {
            readonly roleName: "$1";
        };
    };
    readonly '^The series param (.+?) has wrong format. Valid format is (.+?)$': {
        readonly gettext: "The data cannot be retrieved because the fragment and series combination <code>{{ seriesParam }}</code> has an invalid format. Please verify your fragment and series selections in the data point configuration. The correct format should be <code>{{ validFormat }}</code>.";
        readonly placeholders: {
            readonly seriesParam: "$1";
            readonly validFormat: "$2";
        };
    };
    readonly '^Http status code: 404\n{error="options/Not Found",message="Unable to find option by given key: sigfox-agent/provider.token",info="https://www.cumulocity.com/guides/reference-guide/#error_reporting",details="null"}$': {
        readonly gettext: "Unable to find option by given key: sigfox-agent/provider.token";
    };
    readonly '^Creating device on LoRa platform failed$': {
        readonly gettext: "Could not create the device in the LoRa platform.";
    };
    readonly '^No LoRa provider settings are found. Please configure the connectivity settings.$': {
        readonly gettext: "No LoRa provider settings are found. Please configure the connectivity settings.";
    };
    readonly "^Can't delete user because it is used by another managed object$": {
        readonly gettext: "Cannot delete device with associated device owner because this owner is still assigned to other device(s). Try to remove only the device.";
    };
    readonly '^Could not update user. : Error persisting user (.+?)!$': {
        readonly gettext: "Could not update user \"{{username}}\".";
        readonly placeholders: {
            readonly username: "$1";
        };
    };
    readonly '^Owner field error. : Cannot introduce cyclic dependency.$': {
        readonly gettext: "Could not introduce cyclic ownership dependency.";
    };
    readonly "^User alias equals username '(.+)'$": {
        readonly gettext: "Username and login alias must be different.";
    };
    readonly '^User created$': {
        readonly gettext: "User created";
    };
    readonly '^User (.+?) created$': {
        readonly gettext: "User \"{{name}}\" created";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^User deleted$': {
        readonly gettext: "User deleted";
    };
    readonly '^User (.+?) deleted$': {
        readonly gettext: "User \"{{name}}\" deleted";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^User updated$': {
        readonly gettext: "User updated";
    };
    readonly '^User (.+?) updated: (.+)$': {
        readonly gettext: "User \"{{name}}\" updated: {{updatesList}}";
        readonly placeholders: {
            readonly name: "$1";
            readonly updatesList: {
                readonly capture: "$2";
                readonly translate: {
                    readonly "delegatedBy='(.+?)'": {
                        readonly gettext: "delegated by: \"{{delegate}}\"";
                        readonly placeholders: {
                            readonly delegate: "$1";
                        };
                    };
                    readonly "owner='(.+?)'": {
                        readonly gettext: "owner: \"{{owner}}\"";
                        readonly placeholders: {
                            readonly owner: "$1";
                        };
                    };
                    readonly 'inventory assignment \\[(.+?)\\] added': {
                        readonly gettext: "inventory assignment [{{inventoryAssignment}}] added";
                        readonly placeholders: {
                            readonly inventoryAssignment: "$1";
                        };
                    };
                    readonly 'inventory assignment \\[(.+?)\\] removed': {
                        readonly gettext: "inventory assignment [{{inventoryAssignment}}] removed";
                        readonly placeholders: {
                            readonly inventoryAssignment: "$1";
                        };
                    };
                    readonly 'applications \\[(.+?)\\] added': {
                        readonly gettext: "applications [{{applicationsList}}] added";
                        readonly placeholders: {
                            readonly applicationsList: "$1";
                        };
                    };
                    readonly 'applications \\[(.+?)\\] removed': {
                        readonly gettext: "applications [{{applicationsList}}] removed";
                        readonly placeholders: {
                            readonly applicationsList: "$1";
                        };
                    };
                    readonly 'global roles \\[(.+?)\\] added': {
                        readonly gettext: "global roles [{{globalRolesList}}] added";
                        readonly placeholders: {
                            readonly globalRolesList: "$1";
                        };
                    };
                    readonly 'global roles \\[(.+?)\\] removed': {
                        readonly gettext: "global roles [{{globalRolesList}}] removed";
                        readonly placeholders: {
                            readonly globalRolesList: "$1";
                        };
                    };
                };
            };
        };
    };
    readonly "^User with username '(.+?)' already exists! : Duplicated: (.+?)$": {
        readonly gettext: "User \"{{username}}\" already exists.";
        readonly placeholders: {
            readonly username: "$1";
        };
    };
    readonly "^User with username or alias '(.+)' already exists! : Duplicated: (.+)$": {
        readonly gettext: "User with username or login alias \"{{usernameOrAlias}}\" already exists.";
        readonly placeholders: {
            readonly usernameOrAlias: "$1";
        };
    };
    readonly "^User with email '(.+?)' already exists! : Duplicated: (.+?)$": {
        readonly gettext: "User with email \"{{email}}\" already exists.";
        readonly placeholders: {
            readonly email: "$1";
        };
    };
    readonly "^User '(.+)' is managed by a remote identity management service defined by an administrator, direct update is forbidden$": {
        readonly gettext: "User \"{{userName}}\" is managed by a remote identity management service defined by an administrator, direct update is forbidden.";
        readonly placeholders: {
            readonly userName: "$1";
        };
    };
    readonly '^User logout$': {
        readonly gettext: "User logout";
    };
    readonly '^(.+?) user logout$': {
        readonly gettext: "\"{{name}}\" user logout";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^Display name$': {
        readonly gettext: "Login alias";
    };
    readonly '^(.+)pplication for tenant (.+) with properties \\( (.+?) \\) already exists$': {
        readonly gettext: "Application for tenant \"{{tenant}}\" with the following values ({{valuesList}}) already exists.";
        readonly placeholders: {
            readonly tenant: "$2";
            readonly valuesList: "$3";
        };
    };
    readonly '^Domain name is already in use by another tenant!$': {
        readonly gettext: "Domain name is already used by another tenant.";
    };
    readonly '^Tenant creation failed. : Tenant with given id already exists.$': {
        readonly gettext: "Could not create a tenant. Tenant with given domain/URL already exists.";
    };
    readonly '^Tenant id cannot be a reserved sql keyword "(.+?)".$': {
        readonly gettext: "Could not use a reserved SQL keyword \"{{tenantId}}\" as a domain name.";
        readonly placeholders: {
            readonly tenantId: "$1";
        };
    };
    readonly '^Tenant "(.+?)" activated$': {
        readonly gettext: "Tenant \"{{tenant}}\" activated.";
        readonly placeholders: {
            readonly tenant: "$1";
        };
    };
    readonly '^Tenant (.+?) has sub-tenants, please remove them first!$': {
        readonly gettext: "Could not remove tenant \"{{tenant}}\". Remove its subtenants first.";
        readonly placeholders: {
            readonly tenant: "$1";
        };
    };
    readonly '^Tenant activated$': {
        readonly gettext: "Tenant activated.";
    };
    readonly '^Tenant "(.+?)" created$': {
        readonly gettext: "Tenant \"{{tenant}}\" created.";
        readonly placeholders: {
            readonly tenant: "$1";
        };
    };
    readonly '^Tenant created$': {
        readonly gettext: "Tenant created.";
    };
    readonly '^Tenant "(.+?)" deleted$': {
        readonly gettext: "Tenant \"{{tenant}}\" deleted.";
        readonly placeholders: {
            readonly tenant: "$1";
        };
    };
    readonly '^Tenant deleted$': {
        readonly gettext: "Tenant deleted.";
    };
    readonly '^Tenant "(.+?)" suspended$': {
        readonly gettext: "Tenant \"{{tenant}}\" suspended.";
        readonly placeholders: {
            readonly tenant: "$1";
        };
    };
    readonly '^Tenant suspended$': {
        readonly gettext: "Tenant suspended";
    };
    readonly '^Tenant "(.+?)" updated: (.+?)$': {
        readonly gettext: "Tenant \"{{tenant}}\" updated: {{properties}}.";
        readonly placeholders: {
            readonly tenant: "$1";
            readonly properties: "$2";
        };
    };
    readonly '^Tenant updated$': {
        readonly gettext: "Tenant updated.";
    };
    readonly '^Global Role updated$': {
        readonly gettext: "Global role updated";
    };
    readonly '^Global Role (.+?) updated$': {
        readonly gettext: "Global role \"{{name}}\" updated";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^Global Role (.+?) updated: (.+)$': {
        readonly gettext: "Global role \"{{name}}\" updated: {{updatesList}}";
        readonly placeholders: {
            readonly name: "$1";
            readonly updatesList: {
                readonly capture: "$2";
                readonly translate: {
                    readonly 'applications \\[([^\\]]+?)\\] added': {
                        readonly gettext: "applications {{list}} added";
                        readonly placeholders: {
                            readonly list: "$1";
                        };
                    };
                    readonly 'applications \\[([^\\]]+?)\\] removed': {
                        readonly gettext: "applications {{list}} removed";
                        readonly placeholders: {
                            readonly list: "$1";
                        };
                    };
                    readonly 'roles \\[([^\\]]+?)\\] added': {
                        readonly gettext: "roles {{list}} added";
                        readonly placeholders: {
                            readonly list: "$1";
                        };
                    };
                    readonly 'roles \\[([^\\]]+?)\\] removed': {
                        readonly gettext: "roles {{list}} removed";
                        readonly placeholders: {
                            readonly list: "$1";
                        };
                    };
                };
            };
        };
    };
    readonly '^Global Roles$': {
        readonly gettext: "Global roles";
    };
    readonly '^Inventory Role removed$': {
        readonly gettext: "Inventory role removed";
    };
    readonly '^Inventory Role (.+?) removed$': {
        readonly gettext: "Inventory role \"{{name}}\" deleted.";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^Inventory Role updated$': {
        readonly gettext: "Inventory role updated";
    };
    readonly '^Inventory Role (.+?) updated$': {
        readonly gettext: "Inventory role \"{{name}}\" updated.";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^Global Manager$': {
        readonly gettext: "Global Manager";
    };
    readonly '^Can read and write all data from all devices$': {
        readonly gettext: "Can read and write all data from all devices.";
    };
    readonly '^Global Reader$': {
        readonly gettext: "Global Reader";
    };
    readonly '^Can read all data \\(including users, in contrast to "Global Reader"\\)$': {
        readonly gettext: "Can read all data (including users, in contrast to \"Global Reader\").";
    };
    readonly '^Tenant Manager$': {
        readonly gettext: "Tenant Manager";
    };
    readonly '^Can manage tenant wide configurations like applications, tenant options and retention rules$': {
        readonly gettext: "Can manage tenant wide configurations like applications, tenant options and retention rules.";
    };
    readonly '^CEP Manager$': {
        readonly gettext: "CEP Manager";
    };
    readonly '^Has full access to all deployed CEP modules and SmartRules$': {
        readonly gettext: "Has full access to all deployed CEP modules and smart rules.";
    };
    readonly '^Cockpit User$': {
        readonly gettext: "Cockpit User";
    };
    readonly '^User to work in Cockpit application. This does not include the access to any device data.$': {
        readonly gettext: "User to work in Cockpit application. This does not include the access to any device data.";
    };
    readonly '^Global User Manager$': {
        readonly gettext: "Global User Manager";
    };
    readonly '^Can access and modify the full user hierarchy$': {
        readonly gettext: "Can access and edit the full user hierarchy.";
    };
    readonly '^Shared User Manager$': {
        readonly gettext: "Shared User Manager";
    };
    readonly '^Can create new user as his own sub-users and manage this$': {
        readonly gettext: "Can create new own sub-users and manage them.";
    };
    readonly '^Reader$': {
        readonly gettext: "Reader";
    };
    readonly '^Can read all data of the asset.$': {
        readonly gettext: "Can read all data of the asset.";
    };
    readonly '^Devicemanagement User$': {
        readonly gettext: "Device Management User";
    };
    readonly '^Gives access to bulk operations and device management application. This does not include access to any device data.$': {
        readonly gettext: "Gives access to bulk operations and Device Management application. This does not include access to any device data.";
    };
    readonly '^A role marker for device users. After registration, a device automatically has this role$': {
        readonly gettext: "A role marker for device users. After registration, a device automatically has this role.";
    };
    readonly '^Operations: All$': {
        readonly gettext: "Operations: All";
    };
    readonly '^Can remotely manage the assets by sending operations to the device. This includes for example remote configuration, software update, etc.$': {
        readonly gettext: "Can remotely manage the assets by sending operations to the device. This includes remote configuration, software update and more.";
    };
    readonly '^Operations: Restart Device$': {
        readonly gettext: "Operations: Restart Device";
    };
    readonly '^Can restart devices.$': {
        readonly gettext: "Can restart devices.";
    };
    readonly '^Can access all devices and their data but has no management permission in the tenant$': {
        readonly gettext: "Can access all devices and their data but has no management permission in the tenant.";
    };
    readonly '^Can read all data from all devices$': {
        readonly gettext: "Can read all data from all devices.";
    };
    readonly '^Enables administrative permissions. The first user created for the tenant receives this role$': {
        readonly gettext: "Enables administrative permissions. The first user created for the tenant receives this role.";
    };
    readonly '^Creation ramp must be greater than (\\d+?)$': {
        readonly gettext: "Bulk operation delay must be greater than {{minSeconds}} seconds.";
        readonly placeholders: {
            readonly minSeconds: "$1";
        };
    };
    readonly '^Close relay (.+).$': {
        readonly gettext: "Close relay {{number}}.";
        readonly placeholders: {
            readonly number: "$1";
        };
    };
    readonly '^Open relay (.+).$': {
        readonly gettext: "Open relay {{number}}.";
        readonly placeholders: {
            readonly number: "$1";
        };
    };
    readonly '^Change trace status to (.+).$': {
        readonly gettext: "Change trace status to {{state | translate}}.";
        readonly placeholders: {
            readonly state: "$1";
        };
    };
    readonly '^Change relay status to (.+).$': {
        readonly gettext: "Change relay status to {{status | translate}}.";
        readonly placeholders: {
            readonly status: "$1";
        };
    };
    readonly '^Closing relay (.+).$': {
        readonly gettext: "Closing relay {{number}}.";
        readonly placeholders: {
            readonly number: "$1";
        };
    };
    readonly '^Opening relay (.+).$': {
        readonly gettext: "Opening relay {{number}}.";
        readonly placeholders: {
            readonly number: "$1";
        };
    };
    readonly '^Operation updated: (.+)$': {
        readonly gettext: "Operation updated: {{updatesList}}";
        readonly placeholders: {
            readonly updatesList: {
                readonly capture: "$1";
                readonly translate: {
                    readonly "status='(.+?)'": {
                        readonly gettext: "status: \"{{ status | translate }}\"";
                        readonly placeholders: {
                            readonly status: "$1";
                        };
                    };
                    readonly "description='(.+?)'": {
                        readonly gettext: "description: \"{{ description | translate }}\"";
                        readonly placeholders: {
                            readonly description: "$1";
                        };
                    };
                    readonly "device name='(.+?)'": {
                        readonly gettext: "device name: \"{{ deviceName }}\"";
                        readonly placeholders: {
                            readonly deviceName: "$1";
                        };
                    };
                    readonly "failure reason='(.+?)'": {
                        readonly gettext: "failure reason: \"{{ failureReason | translate }}\"";
                        readonly placeholders: {
                            readonly failureReason: "$1";
                        };
                    };
                };
            };
        };
    };
    readonly '^Operation created$': {
        readonly gettext: "Operation created.";
    };
    readonly '^Operation updated$': {
        readonly gettext: "Operation updated.";
    };
    readonly "^Operation created: status='(.+?)'.$": {
        readonly gettext: "Operation created: status: \"{{ status | translate }}\".";
        readonly placeholders: {
            readonly status: "$1";
        };
    };
    readonly '^Change value of "(.+)" to (.+) (.+).$': {
        readonly gettext: "Change value of \"{{name}}\" to {{value}}{{unit}}.";
        readonly placeholders: {
            readonly name: "$1";
            readonly value: "$2";
            readonly unit: "$3";
        };
    };
    readonly '^Change value of "(.+)" to (.+).$': {
        readonly gettext: "Change value of \"{{name}}\" to {{value}}.";
        readonly placeholders: {
            readonly name: "$1";
            readonly value: "$2";
        };
    };
    readonly '^Change status of "(.+)" to "(.+)".$': {
        readonly gettext: "Change status of \"{{name}}\" to \"{{label}}\".";
        readonly placeholders: {
            readonly name: "$1";
            readonly label: "$2";
        };
    };
    readonly '^Created container$': {
        readonly gettext: "Container created.";
    };
    readonly '^Created pod: (.+)$': {
        readonly gettext: "Pod \"{{imageName}}\" created.";
        readonly placeholders: {
            readonly imageName: "$1";
        };
    };
    readonly '^Microservice not available.*$': {
        readonly gettext: "Microservice is not available.";
    };
    readonly '^Started container$': {
        readonly gettext: "Container started.";
    };
    readonly '^Error syncing pod$': {
        readonly gettext: "Pod synchronization error.";
    };
    readonly '^Failed create pod sandbox.$': {
        readonly gettext: "Pod sandbox creation failed.";
    };
    readonly '^Deleted pod: (.+)$': {
        readonly gettext: "Pod \"{{imageName}}\" deleted.";
        readonly placeholders: {
            readonly imageName: "$1";
        };
    };
    readonly '^Container image "(.+)" already present on machine$': {
        readonly gettext: "Container image \"{{imageName}}\" already exists.";
        readonly placeholders: {
            readonly imageName: "$1";
        };
    };
    readonly '^Scaled up replica set (.+) to (\\d+)$': {
        readonly gettext: "Replica set \"{{replicaSetName}}\" scaled up to \"{{scaleNumber}}\".";
        readonly placeholders: {
            readonly replicaSetName: "$1";
            readonly scaleNumber: "$2";
        };
    };
    readonly '^Scaled down replica set (.+) to (\\d+)$': {
        readonly gettext: "Replica set \"{{replicaSetName}}\" scaled down to \"{{scaleNumber}}\".";
        readonly placeholders: {
            readonly replicaSetName: "$1";
            readonly scaleNumber: "$2";
        };
    };
    readonly '^Not within any context!$': {
        readonly gettext: "A problem occurred with microservice subscription.";
    };
    readonly '^pulling image "(.+)"$': {
        readonly gettext: "Pulling image: \"{{imageName}}\".";
        readonly placeholders: {
            readonly imageName: "$1";
        };
    };
    readonly '^RESTART (.+?)$': {
        readonly gettext: "RESTART`verb, action` {{service}}";
        readonly placeholders: {
            readonly service: "$1";
        };
    };
    readonly '^START (.+?)$': {
        readonly gettext: "START`verb, action` {{service}}";
        readonly placeholders: {
            readonly service: "$1";
        };
    };
    readonly '^STOP (.+?)$': {
        readonly gettext: "STOP`verb, action` {{service}}";
        readonly placeholders: {
            readonly service: "$1";
        };
    };
    readonly '^Successfully assigned (.+) to (.+)$': {
        readonly gettext: "\"{{imageName}}\" assigned to \"{{address}}\".";
        readonly placeholders: {
            readonly imageName: "$1";
            readonly address: "$2";
        };
    };
    readonly '^Successfully pulled image "(.+)"$': {
        readonly gettext: "Image \"{{imageName}}\" pulled.";
        readonly placeholders: {
            readonly imageName: "$1";
        };
    };
    readonly '^Write failed with error code 16733 and error message \'trying to index text where term list is too big, max is 4mb _id: "(.+?)"\'$': {
        readonly gettext: "The uploaded image cannot be bigger than 4 MB. Please upload a smaller one.";
    };
    readonly '^Write failed with error code 17280 and error message \'WiredTigerIndex::insert: key too large to index, failing (.+?) { : "(.+?)" }\'$': {
        readonly gettext: "The selected name is too long. Please try a shorter one.";
    };
    readonly '^No nodes are available that match all of the predicates: (.+).$': {
        readonly gettext: "No nodes are available that match all of the predicates: [{{predicates}}].";
        readonly placeholders: {
            readonly predicates: "$1";
        };
    };
    readonly '^Readiness probe failed: (.+) (.+): (.+): request canceled while waiting for connection \\(Client.Timeout exceeded while awaiting headers\\)$': {
        readonly gettext: "Readiness probe failed: {{requestMethod}} {{uri}}: {{protocol}}: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).";
        readonly placeholders: {
            readonly requestMethod: "$1";
            readonly uri: "$2";
            readonly protocol: "$3";
        };
    };
    readonly '^Liveness probe failed: (.+) (.+): (.+): request canceled while waiting for connection \\(Client.Timeout exceeded while awaiting headers\\)$': {
        readonly gettext: "Liveness probe failed: {{requestMethod}} {{uri}}: {{protocol}}: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).";
        readonly placeholders: {
            readonly requestMethod: "$1";
            readonly uri: "$2";
            readonly protocol: "$3";
        };
    };
    readonly '^Apply software changes: (.+?)\\.?$': {
        readonly gettext: "Apply software changes: {{ softwareChanges }}";
        readonly placeholders: {
            readonly softwareChanges: {
                readonly capture: "$1";
                readonly translate: {
                    readonly 'install "(.+?)" \\(version: (.+?)\\)': {
                        readonly gettext: "install \"{{ softwareName }}\" (version: {{ softwareVersion }})";
                        readonly placeholders: {
                            readonly softwareName: "$1";
                            readonly softwareVersion: "$2";
                        };
                    };
                    readonly 'install "([^"]+)"(?! \\(version: .+?\\))': {
                        readonly gettext: "install \"{{ softwareName }}\"";
                        readonly placeholders: {
                            readonly softwareName: "$1";
                        };
                    };
                    readonly 'delete "(.+?)" \\(version: (.+?)\\)': {
                        readonly gettext: "delete \"{{ softwareName }}\" (version: {{ softwareVersion }})";
                        readonly placeholders: {
                            readonly softwareName: "$1";
                            readonly softwareVersion: "$2";
                        };
                    };
                    readonly 'delete "([^"]+)"(?! \\(version: .+?\\))': {
                        readonly gettext: "delete \"{{ softwareName }}\"";
                        readonly placeholders: {
                            readonly softwareName: "$1";
                        };
                    };
                };
            };
        };
    };
    readonly '^Update firmware to: "?(.+?)"? \\(version: (.+)\\)\\.?$': {
        readonly gettext: "Update firmware to: \"{{ name }}\" (version: {{ version }})";
        readonly placeholders: {
            readonly name: "$1";
            readonly version: "$2";
        };
    };
    readonly '^Update firmware to: "?(.+?)"?\\.?$': {
        readonly gettext: "Update firmware to: \"{{ name }}\"";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^Assign device profile (.+?) to device (.+?)$': {
        readonly gettext: "Assign device profile {{profileName}} to device {{deviceName}}";
        readonly placeholders: {
            readonly profileName: "$1";
            readonly deviceName: "$2";
        };
    };
    readonly "^Device id '(.+?)' contains '(.+?)' character which is not permitted.$": {
        readonly gettext: "ID \"{{deviceId}}\" contains invalid character: \"{{invalidCharacter}}\".";
        readonly placeholders: {
            readonly deviceId: "$1";
            readonly invalidCharacter: "$2";
        };
    };
    readonly '^Device (.+?) already registered to a tenant.$': {
        readonly gettext: "Device {{ devEUI }} is already registered in your tenant or in another tenant in the platform.";
        readonly placeholders: {
            readonly devEUI: "$1";
        };
    };
    readonly '^Device with external ID(s) (.+?) was replaced by device with external ID(s) (.+?)$': {
        readonly gettext: "Device with external ID(s) {{ oldExtIds }} was replaced by device with external ID(s) {{ newExtIds }}.";
        readonly placeholders: {
            readonly oldExtIds: "$1";
            readonly newExtIds: "$2";
        };
    };
    readonly "^Finding device data from database failed : No managedObject for id '(.+?)'!$": {
        readonly gettext: "Could not find managed object with ID \"{{deviceId}}\".";
        readonly placeholders: {
            readonly deviceId: "$1";
        };
    };
    readonly '^NewDeviceRequest for id = (.+?) already exists.$': {
        readonly gettext: "Device registration request with ID {{id}} already exists.";
        readonly placeholders: {
            readonly id: "$1";
        };
    };
    readonly '^NewDeviceRequest for device id (.+?) is in state BLOCKED, not PENDING_ACCEPTANCE.$': {
        readonly gettext: "Device registration request with ID \"{{deviceId}}\" is in state \"Blocked\", not \"Pending acceptance\". Remove this registration request and start over.";
        readonly placeholders: {
            readonly deviceId: "$1";
        };
    };
    readonly '^No communication with device since (.+?)$': {
        readonly gettext: "No communication with device since {{timestamp | absoluteDate}}.";
        readonly placeholders: {
            readonly timestamp: "$1";
        };
    };
    readonly '^No data received from device within required interval.$': {
        readonly gettext: "No data received from device within required interval.";
    };
    readonly '^Provided security key does not match key stored for device (.+?).$': {
        readonly gettext: "Provided security token does not match the security token stored for this device \"{{deviceId}}\".";
        readonly placeholders: {
            readonly deviceId: "$1";
        };
    };
    readonly '^Provided security key does not match key stored for device (.+?).Reached maximum number of failed attempts while trying to register this device. Request will now be blocked and has to be removed manually to restart the process.$': {
        readonly gettext: "The provided security token does not match the token stored for device \"{{deviceId}}\". You have reached the maximum number of failed attempts while trying to register this device. The request will now be blocked and must be removed manually to restart the process.";
        readonly placeholders: {
            readonly deviceId: "$1";
        };
    };
    readonly '^Retrieve configuration snapshot from device (.+?)$': {
        readonly gettext: "Retrieve configuration snapshot from device {{deviceName}}";
        readonly placeholders: {
            readonly deviceName: "$1";
        };
    };
    readonly '^Retrieve (.+?) configuration snapshot from device (.+?)$': {
        readonly gettext: "Retrieve {{configurationType}} configuration snapshot from device {{deviceName}}";
        readonly placeholders: {
            readonly configurationType: "$1";
            readonly deviceName: "$2";
        };
    };
    readonly '^Send configuration snapshot (.+?) of configuration type (.+?) to device (.+?)$': {
        readonly gettext: "Send configuration snapshot {{snapshotName}} of configuration type {{configurationType}} to device {{deviceName}}";
        readonly placeholders: {
            readonly snapshotName: "$1";
            readonly configurationType: "$2";
            readonly deviceName: "$3";
        };
    };
    readonly '^Send configuration snapshot (.+?) to device (.+?)$': {
        readonly gettext: "Send configuration snapshot {{snapshotName}} to device {{deviceName}}";
        readonly placeholders: {
            readonly snapshotName: "$1";
            readonly deviceName: "$2";
        };
    };
    readonly '^You have reached devices limit. No more devices can be registered.$': {
        readonly gettext: "You reached devices limit. No more devices can be registered.";
    };
    readonly '^Added new child device to "(.+)" \\(ID: (.+)\\).$': {
        readonly gettext: "Added new child device to \"{{parentDeviceName}}\" (ID: {{parentDeviceId}}).";
        readonly placeholders: {
            readonly parentDeviceName: "$1";
            readonly parentDeviceId: "$2";
        };
    };
    readonly '^Updated child device of "(.+)" \\(ID: (.+)\\).$': {
        readonly gettext: "Updated child device of \"{{parentDeviceName}}\" (ID: {{parentDeviceId}}).";
        readonly placeholders: {
            readonly parentDeviceName: "$1";
            readonly parentDeviceId: "$2";
        };
    };
    readonly '^Added child device "(.+)" \\(ID: (.+)\\).$': {
        readonly gettext: "Added child device \"{{name}}\" (ID: {{id}}).";
        readonly placeholders: {
            readonly name: "$1";
            readonly id: "$2";
        };
    };
    readonly '^Removed child device "(.+)" \\(ID: (.+)\\).$': {
        readonly gettext: "Removed child device \"{{name}}\" (ID: {{id}}).";
        readonly placeholders: {
            readonly name: "$1";
            readonly id: "$2";
        };
    };
    readonly '^Apply device profile: (.+).?$': {
        readonly gettext: "Apply device profile: {{ name }}";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^Device put into maintenance state$': {
        readonly gettext: "Device put into maintenance state";
    };
    readonly '^device with id: (.+?) is put into maintenance state$': {
        readonly gettext: "Device with ID \"{{deviceId}}\" is put into maintenance state";
        readonly placeholders: {
            readonly deviceId: "$1";
        };
    };
    readonly '^External id not found; external id = ID \\[type=(.+?), value=(.+?)\\]$': {
        readonly gettext: "External ID not found for type \"{{type}}\" and value \"{{value}}\".";
        readonly placeholders: {
            readonly type: "$1";
            readonly value: "$2";
        };
    };
    readonly '^ID \\[type=(.+?), value=(.+?)\\] was already bound to different Global ID.$': {
        readonly gettext: "External ID \"{{value}}\" of the type \"{{type}}\" already exists.";
        readonly placeholders: {
            readonly type: "$1";
            readonly value: "$2";
        };
    };
    readonly '^Can not activate a certificate which is either expired or not yet valid$': {
        readonly gettext: "Cannot activate a certificate which is either expired or not yet valid.";
    };
    readonly '^Cannot add certificate - certificate with (.+?) fingerprint already exists. : Certificate with (.+?) fingerprint already exists.$': {
        readonly gettext: "Could not add certificate. Certificate with {{fingerprint}} fingerprint already exists.";
        readonly placeholders: {
            readonly fingerprint: "$1";
        };
    };
    readonly '^Cannot parse X509 certificate. : Could not parse certificate: (.+?)$': {
        readonly gettext: "Could not parse X.509 certificate: {{ failureReason | translate }}.";
        readonly placeholders: {
            readonly failureReason: "$1";
        };
    };
    readonly '^Domain name in uploaded certificate differs from the one in use$': {
        readonly gettext: "Domain name in uploaded certificate differs from the one in use. Please deactivate the custom domain before uploading new certificate.";
    };
    readonly '^Failed to extract certificate from PKCS12$': {
        readonly gettext: "Failed to extract certificate from PKCS12.";
    };
    readonly "^Trusted certificate updated on '(.+?)'\\.$": {
        readonly gettext: "Trusted certificate updated on tenant \"{{ tenantId }}\"";
        readonly placeholders: {
            readonly tenantId: "$1";
        };
    };
    readonly "^Trusted certificate deleted from '(.+?)'\\.$": {
        readonly gettext: "Trusted certificate deleted from tenant \"{{ tenantId }}\"";
        readonly placeholders: {
            readonly tenantId: "$1";
        };
    };
    readonly "^Certificate fingerprint: '(.+?)'\\.\\n\\s*Certificate subject name: '(.+?)'\\.\\n$": {
        readonly gettext: "Certificate fingerprint: \"{{ fingerprint }}\".\nCertificate subject name: \"{{ subjectName }}\".";
        readonly placeholders: {
            readonly fingerprint: "$1";
            readonly subjectName: "$2";
        };
    };
    readonly "^Certificate fingerprint: '(.+?)'\\.\\n\\s*Certificate subject name: '(.+?)'\\.\\n\\s*NotAfter='(.+?)'.*$": {
        readonly gettext: "Certificate fingerprint: \"{{ fingerprint }}\".\nCertificate subject name: \"{{ subjectName }}\".\nExpiration date: {{ expirationDate | absoluteDate }}.";
        readonly placeholders: {
            readonly fingerprint: "$1";
            readonly subjectName: "$2";
            readonly expirationDate: "$3";
        };
    };
    readonly "^Certificate fingerprint: '(.+?)'\\.\\n\\s*Certificate subject name: '(.+?)'\\.\\n\\s*Status='(.+?)'.*$": {
        readonly gettext: "Certificate fingerprint: \"{{ fingerprint }}\".\nCertificate subject name: \"{{ subjectName }}\".\nStatus: \"{{ status }}\".";
        readonly placeholders: {
            readonly fingerprint: "$1";
            readonly subjectName: "$2";
            readonly status: "$3";
        };
    };
    readonly '^The CA certificate has not been refreshed\\.\\s+It may either still have sufficient remaining validity.*$': {
        readonly gettext: "The CA certificate has not been renewed; however, it may still have sufficient validity remaining.";
    };
    readonly "^Provisioned certificate stored in user object: '(.+?)'.*$": {
        readonly gettext: "Provisioned certificate stored in user object: \"{{ userName }}\"";
        readonly placeholders: {
            readonly userName: "$1";
        };
    };
    readonly "^Certificate serial number: '(.+?)'\\.\\n\\s*NotAfter='(.+?)'.*$": {
        readonly gettext: "Certificate serial number: \"{{ serialNumber }}\".\nExpiration date: {{ expirationDate | absoluteDate }}.";
        readonly placeholders: {
            readonly serialNumber: "$1";
            readonly expirationDate: "$2";
        };
    };
    readonly "^Provisioned certificates removed from user: '(.+?)'.*$": {
        readonly gettext: "Provisioned certificates removed from user object: \"{{ userName }}\"";
        readonly placeholders: {
            readonly userName: "$1";
        };
    };
    readonly "^Certificate serial number hex: '(.+?)'.*$": {
        readonly gettext: "Certificate serial number: \"{{ serialNumber }}\"";
        readonly placeholders: {
            readonly serialNumber: "$1";
        };
    };
    readonly "^Tenant certificate authority\\(CA\\) created on '(.+?)'.*$": {
        readonly gettext: "Tenant certificate authority (CA) created for tenant \"{{ tenantId }}\"";
        readonly placeholders: {
            readonly tenantId: "$1";
        };
    };
    readonly "^Tenant certificate authority\\(CA\\) was renewed for Tenant: '(.+?)'.*$": {
        readonly gettext: "Tenant certificate authority (CA) was renewed for tenant \"{{ tenantId }}\"";
        readonly placeholders: {
            readonly tenantId: "$1";
        };
    };
    readonly "^Tenant certificate authority\\(CA\\) renewal for Tenant: '(.+?)' failed.*$": {
        readonly gettext: "Tenant certificate authority (CA) renewal for tenant \"{{ tenantId }}\" failed";
        readonly placeholders: {
            readonly tenantId: "$1";
        };
    };
    readonly '^Tenant certificate authority\\(CA\\) signed certificate for device: (.+?)\\.$': {
        readonly gettext: "Tenant certificate authority (CA) signed certificate for device: \"{{ deviceId }}\".";
        readonly placeholders: {
            readonly deviceId: "$1";
        };
    };
    readonly '^Tenant certificate authority\\(CA\\) re-signed certificate for device: (.+?)\\.$': {
        readonly gettext: "Tenant certificate authority (CA) re-signed certificate for device: \"{{ deviceId }}\".";
        readonly placeholders: {
            readonly deviceId: "$1";
        };
    };
    readonly '^Revoked serials: (.+?)$': {
        readonly gettext: "Revoked serials: {{ revokedSerials }}";
        readonly placeholders: {
            readonly revokedSerials: "$1";
        };
    };
    readonly '^Cep module created$': {
        readonly gettext: "CEP module created";
    };
    readonly '^Cep module updated$': {
        readonly gettext: "CEP module updated";
    };
    readonly '^Cep module deleted$': {
        readonly gettext: "CEP module deleted";
    };
    readonly '^Cep module "(.+?)" created$': {
        readonly gettext: "CEP module \"{{name}}\" created";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^Cep module "(.+?)" updated$': {
        readonly gettext: "CEP module \"{{name}}\" updated";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^Cep module "(.+?)" deleted$': {
        readonly gettext: "CEP module \"{{name}}\" deleted";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^Cannot deploy module (.*)$': {
        readonly gettext: "Cannot deploy module due to error: \"{{ errorMessage | translate }}\".";
        readonly placeholders: {
            readonly errorMessage: "$1";
        };
    };
    readonly "^Cannot deploy module (.+?)! : Compilation failed in module '(.+?)' in expression '(.+?)' : Incorrect syntax near '(.+?)' at line (\\d+) column (\\d+) \\[([\\S\\s]+?)\\]$": {
        readonly gettext: "Could not deploy module \"{{moduleName}}\". Compilation failed in expression \"{{expression}}\": incorrect syntax near \"{{incorrectExpression}}\" at line {{line}} column {{column}}.";
        readonly placeholders: {
            readonly moduleName: "$1";
            readonly expression: "$3";
            readonly incorrectExpression: "$4";
            readonly line: "$5";
            readonly column: "$6";
        };
    };
    readonly "^Cannot deploy module (.+?)! : Compilation failed in module '(.+?)' in expression '(.+?)' : Incorrect syntax near '(.+?)' at line (\\d+) column (\\d+) near reserved keyword '(.+?)' \\[([\\S\\s]+?)\\]$": {
        readonly gettext: "Could not deploy module \"{{moduleName}}\". Compilation failed in expression \"{{expression}}\": incorrect syntax near \"{{incorrectExpression}}\" at line {{line}} column {{column}} near reserved keyword \"{{keyword}}\".";
        readonly placeholders: {
            readonly moduleName: "$1";
            readonly expression: "$3";
            readonly incorrectExpression: "$4";
            readonly line: "$5";
            readonly column: "$6";
            readonly keyword: "$7";
        };
    };
    readonly "^Cannot deploy module (.+?)! : Compilation failed in module '(.+?)' in expression '(.+?)' : Incorrect syntax near '(.+?)' at line (\\d+) column (\\d+), please check the where clause \\[([\\S\\s]+?)\\]$": {
        readonly gettext: "Could not deploy module \"{{moduleName}}\". Compilation failed in expression \"{{expression}}\": incorrect syntax near \"{{incorrectExpression}}\" at line {{line}} column {{column}}, check \"where\" clause.";
        readonly placeholders: {
            readonly moduleName: "$1";
            readonly expression: "$3";
            readonly incorrectExpression: "$4";
            readonly line: "$5";
            readonly column: "$6";
        };
    };
    readonly "^Cannot deploy module (.+?)! : Deployment failed in module '(.+?)' in expression '(.+?)' : Exception compiling script '(.+?)' of dialect '(.+?)': missing (.+?) before statement \\((.+?)\\) \\[([\\S\\s]+?)\\]$": {
        readonly gettext: "Could not deploy module \"{{moduleName}}\". Compilation failed in expression \"{{expression}}\": exception compiling script \"{{scriptName}}\" of dialect \"{{scriptDialect}}\": missing \"{{missingSyntax}}\" before statement \"{{affectedStatement}}\".";
        readonly placeholders: {
            readonly moduleName: "$1";
            readonly expression: "$3";
            readonly scriptName: "$4";
            readonly scriptDialect: "$5";
            readonly missingSyntax: "$6";
            readonly affectedStatement: "$7";
        };
    };
    readonly "^Error in statement (.+?):(.+?)! : Incorrect syntax near '(.+?)' near reserved keyword '(.+?)' \\[([\\S\\s]+?)\\]$": {
        readonly gettext: "Error in statement {{moduleName}}:{{statementNumber}}. Incorrect syntax near expression \"{{expression}}\" near reserved keyword \"{{keyword}}\".";
        readonly placeholders: {
            readonly moduleName: "$1";
            readonly statementNumber: "$2";
            readonly expression: "$3";
            readonly keyword: "$4";
        };
    };
    readonly '^Exception on tenant (.+) in statement \'(.+)\': Http status code: (\\d+) \\{error="alarm/Unprocessable Entity",message="(.+)",info="https://www.cumulocity.com/guides/reference-guide/#error_reporting",details="null"\\}$': {
        readonly gettext: "Exception on tenant {{tenantId}} in statement \"{{statement}}\": HTTP status code: {{httpStatusCode}} : {{message | translate}}";
        readonly placeholders: {
            readonly tenantId: "$1";
            readonly statement: "$2";
            readonly httpStatusCode: "$3";
            readonly message: "$4";
        };
    };
    readonly "^Exception on tenant (.+) in statement '(.+)': Invocation exception when invoking method '(.+)' of class '(.+)' passing parameters \\[(.+)\\] for statement '(.+)': (.+) : (.+)$": {
        readonly gettext: "Exception on tenant {{tenantId}} in statement \"{{moduleName}}\": Invocation exception when invoking method \"{{methodName}}\" of class \"{{classPath}}\" passing parameters [{{parameters}}] for statement \"{{statement}}\": {{exceptionType}} : {{exceptionMessage}}.";
        readonly placeholders: {
            readonly tenantId: "$1";
            readonly moduleName: "$2";
            readonly methodName: "$3";
            readonly classPath: "$4";
            readonly parameters: "$5";
            readonly statement: "$6";
            readonly exceptionType: "$7";
            readonly exceptionMessage: "$8";
        };
    };
    readonly '^Smart rule created$': {
        readonly gettext: "Smart rule created.";
    };
    readonly '^Smart rule updated$': {
        readonly gettext: "Smart rule updated.";
    };
    readonly '^Smart rule enabled$': {
        readonly gettext: "Smart rule activated.";
    };
    readonly '^Smart rule disabled$': {
        readonly gettext: "Smart rule deactivated.";
    };
    readonly '^Smart rule deleted$': {
        readonly gettext: "Smart rule deleted.";
    };
    readonly '^Smart rule "(.+?)" created$': {
        readonly gettext: "Smart rule \"{{name}}\" created.";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^Smart rule "(.+?)" updated$': {
        readonly gettext: "Smart rule \"{{name}}\" updated.";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^Smart rule "(.+?)" enabled$': {
        readonly gettext: "Smart rule \"{{name}}\" activated.";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^Smart rule "(.+?)" disabled$': {
        readonly gettext: "Smart rule \"{{name}}\" deactivated.";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^Smart rule "(.+?)" deleted$': {
        readonly gettext: "Smart rule \"{{name}}\" deleted.";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^(.+) succeeded for volume "(.+)"$': {
        readonly gettext: "Operation \"{{operation}}\" succeeded for volume \"{{volume}}\".";
        readonly placeholders: {
            readonly operation: "$1";
            readonly volume: "$2";
        };
    };
    readonly '^CSV file contained empty dataset$': {
        readonly gettext: "No entries found in uploaded CSV file.";
    };
    readonly "^Cannot execute bulk operation on empty group. Group with id='(\\d+?)' doesn't have child assets.$": {
        readonly gettext: "Could not execute bulk operation on an empty group. Group with ID \"{{groupId}}\" has no child assets.";
        readonly placeholders: {
            readonly groupId: "$1";
        };
    };
    readonly "^Cannot execute bulk operation on empty group. DynamicGroup with id='(\\d+?)' doesn't have child assets$": {
        readonly gettext: "Could not execute bulk operation on an empty group. Smart group with ID \"{{groupId}}\" has no child assets.";
        readonly placeholders: {
            readonly groupId: "$1";
        };
    };
    readonly '^Cannot reschedule bulk operation. All its operations are successful$': {
        readonly gettext: "Cannot reschedule bulk operation. All its operations are already successful.";
    };
    readonly '^Create bulk operation$': {
        readonly gettext: "Create bulk operation";
    };
    readonly '^Create bulk operation: (.+)$': {
        readonly gettext: "Create bulk operation: {{updatesList}}";
        readonly placeholders: {
            updatesList: {
                capture: string;
                translate: {
                    "status='(.+?)'": {
                        gettext: "status: \"{{ status | translate }}\"";
                        placeholders: {
                            status: string;
                        };
                    };
                    "generalStatus='(.+?)'": {
                        gettext: "general status: \"{{ generalStatus | translate }}\"";
                        placeholders: {
                            generalStatus: string;
                        };
                    };
                    "progress='(.+?)'": {
                        gettext: "progress: \"{{ progress }}\"";
                        placeholders: {
                            progress: string;
                        };
                    };
                    'note=(.+?)': {
                        gettext: "note: \"{{ note }}\"";
                        placeholders: {
                            note: string;
                        };
                    };
                };
            };
        };
    };
    readonly '^Delete bulk operation$': {
        readonly gettext: "Delete bulk operation";
    };
    readonly '^Delete bulk operation: (.+)$': {
        readonly gettext: "Delete bulk operation: {{updatesList}}";
        readonly placeholders: {
            updatesList: {
                capture: string;
                translate: {
                    "status='(.+?)'": {
                        gettext: "status: \"{{ status | translate }}\"";
                        placeholders: {
                            status: string;
                        };
                    };
                    "generalStatus='(.+?)'": {
                        gettext: "general status: \"{{ generalStatus | translate }}\"";
                        placeholders: {
                            generalStatus: string;
                        };
                    };
                    "progress='(.+?)'": {
                        gettext: "progress: \"{{ progress }}\"";
                        placeholders: {
                            progress: string;
                        };
                    };
                    'note=(.+?)': {
                        gettext: "note: \"{{ note }}\"";
                        placeholders: {
                            note: string;
                        };
                    };
                };
            };
        };
    };
    readonly '^Update bulk operation$': {
        readonly gettext: "Update bulk operation";
    };
    readonly '^Update bulk operation: (.+)$': {
        readonly gettext: "Update bulk operation: {{updatesList}}";
        readonly placeholders: {
            updatesList: {
                capture: string;
                translate: {
                    "status='(.+?)'": {
                        gettext: "status: \"{{ status | translate }}\"";
                        placeholders: {
                            status: string;
                        };
                    };
                    "generalStatus='(.+?)'": {
                        gettext: "general status: \"{{ generalStatus | translate }}\"";
                        placeholders: {
                            generalStatus: string;
                        };
                    };
                    "progress='(.+?)'": {
                        gettext: "progress: \"{{ progress }}\"";
                        placeholders: {
                            progress: string;
                        };
                    };
                    'note=(.+?)': {
                        gettext: "note: \"{{ note }}\"";
                        placeholders: {
                            note: string;
                        };
                    };
                };
            };
        };
    };
    readonly '^DATAHUB_ADMINISTRATOR$': {
        readonly gettext: "DataHub Administrator";
    };
    readonly '^Can conduct administrative tasks and manage offloading pipelines$': {
        readonly gettext: "Can conduct administrative tasks and manage offloading pipelines.";
    };
    readonly '^DATAHUB_MANAGER$': {
        readonly gettext: "DataHub Manager";
    };
    readonly '^Can manage offloading pipelines$': {
        readonly gettext: "Can manage offloading pipelines.";
    };
    readonly '^DATAHUB_READER$': {
        readonly gettext: "DataHub Reader";
    };
    readonly '^Can execute SQL queries against the data in the data lake$': {
        readonly gettext: "Can execute SQL queries against the data in the data lake.";
    };
    readonly '^Authentication failed! : User account is locked$': {
        readonly gettext: "Authentication failed due to: user account is locked.";
    };
    readonly '^Cannot change password. : Provided token does not exist.$': {
        readonly gettext: "Cannot change password: provided token is invalid.";
    };
    readonly '^Cannot reset user password : Cannot find user with such email.$': {
        readonly gettext: "Cannot reset password for user with such email: email not found.";
    };
    readonly '^Error during password validation. : Password must have at least (\\d+?) characters and no more than (\\d+?) and must contain only Latin1 characters.$': {
        readonly gettext: "Password is invalid. It must have at least {{minCharactersCount}} and no more than {{maxCharactersCount}} characters.";
        readonly placeholders: {
            readonly minCharactersCount: "$1";
            readonly maxCharactersCount: "$2";
        };
    };
    readonly '^Error during password validation. : Your password has been used already. Choose another.$': {
        readonly gettext: "This password has already been used earlier. Use a different one.";
    };
    readonly '^Invalid credentials! : Bad credentials$': {
        readonly gettext: "Invalid credentials.";
    };
    readonly '^Invalid credentials! : No phone number provided$': {
        readonly gettext: "Log into the management tenant first and enter your phone number.";
    };
    readonly '^Password change is temporary blocked.$': {
        readonly gettext: "Password change is temporarily blocked.";
    };
    readonly '^(.+?) user login with OAuth internal mode failed$': {
        readonly gettext: "\"{{name}}\" user login with OAI-Secure mode failed";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^Error updating tenant! Cannot insert second configuration for Password code grant internal/Bad Request$': {
        readonly gettext: "This login mode was already set by another administrator. Refresh the page to update the data.";
    };
    readonly '^(.+?) user logged in to the platform with OAuth internal login mode$': {
        readonly gettext: "\"{{name}}\" user logged in to the platform with OAI-Secure login mode";
        readonly placeholders: {
            readonly name: "$1";
        };
    };
    readonly '^Authentication with id: (.+?) configuration updated.$': {
        readonly gettext: "Authentication configuration with ID \"{{id}}\" updated.";
        readonly placeholders: {
            readonly id: "$1";
        };
    };
    readonly '^Authentication configuration with id: (.+?) added.$': {
        readonly gettext: "Authentication configuration with ID \"{{id}}\" added.";
        readonly placeholders: {
            readonly id: "$1";
        };
    };
    readonly '^Configuration type: oauth2_internal.$': {
        readonly gettext: "Configuration type: OAI-Secure.";
    };
    readonly '^Configuration type: oauth2.$': {
        readonly gettext: "Configuration type: Single sign-on.";
    };
    readonly '^User "(.+?)" password was updated by user "(.+?)"$': {
        readonly gettext: "\"{{ targetUserName }}\" user's password was updated by \"{{ userName }}\" user";
        readonly placeholders: {
            readonly targetUserName: "$1";
            readonly userName: "$2";
        };
    };
    readonly '^User password update$': {
        readonly gettext: "User password update";
    };
    readonly '^User "(.+?)" password updated$': {
        readonly gettext: "\"{{ userName }}\" user changed own password";
        readonly placeholders: {
            readonly userName: "$1";
        };
    };
    readonly '^Configuration type: basic.$': {
        readonly gettext: "Configuration type: Basic Auth.";
    };
    readonly '^Application with given name already exist$': {
        readonly gettext: "Application with given name already exists.";
    };
    readonly '^Application with id (.+?) is already assigned to the tenant (.+?)$': {
        readonly gettext: "This application is already assigned to tenant \"{{tenant}}\".";
        readonly placeholders: {
            readonly tenant: "$2";
        };
    };
    readonly '^Cannot update/delete application binary via this endpoint$': {
        readonly gettext: "Cannot update/delete application binary via this endpoint";
    };
    readonly '^Error occurred when trying to find an Application for id ID (.+) : Could not find application by ID (\\d+)$': {
        readonly gettext: "Could not find application by ID {{applicationId}}.";
        readonly placeholders: {
            readonly applicationId: "$2";
        };
    };
    readonly '^Failed to delete application.  : Cannot remove application assigned to other tenants.$': {
        readonly gettext: "Could not delete application assigned to other tenants.";
    };
    readonly "^name of Application cannot start with '(.+)' prefix.$": {
        readonly gettext: "Application name must not start with \"{{ prefix }}\".";
        readonly placeholders: {
            readonly prefix: "$1";
        };
    };
    readonly '^Microservice application name incorrect. Please use only lower-case letters, digits and dashes. Maximum length is (\\d+) characters.$': {
        readonly gettext: "Microservice application name is incorrect: only lower case letters, digits and dashes allowed. Maximum length: {{maxLength}}.";
        readonly placeholders: {
            readonly maxLength: "$1";
        };
    };
    readonly '^Platform application cannot be added to, nor removed from any tenant.$': {
        readonly gettext: "Platform application cannot be added to, nor removed from any tenant.";
    };
    readonly '^Failed to refresh application. : Cannot refresh non local-hosted application.$': {
        readonly gettext: "Could not reactivate the application as it is not hosted locally.";
    };
    readonly '^Failed to refresh application. : Cannot refresh application without active version id.$': {
        readonly gettext: "Could not reactivate the application as it has no active version.";
    };
    readonly '^Application deleted$': {
        readonly gettext: "Application deleted";
    };
    readonly '^Microservice application "(.+?)" deleted for tenant "(.+?)"$': {
        readonly gettext: "Microservice application \"{{appName}}\" deleted for tenant \"{{tenant}}\"";
        readonly placeholders: {
            readonly appName: "$1";
            readonly tenant: "$2";
        };
    };
    readonly '^Hosted application "(.+?)" deleted for tenant "(.+?)"$': {
        readonly gettext: "Hosted application \"{{appName}}\" deleted for tenant \"{{tenant}}\"";
        readonly placeholders: {
            readonly appName: "$1";
            readonly tenant: "$2";
        };
    };
    readonly '^External application "(.+?)" deleted for tenant "(.+?)"$': {
        readonly gettext: "External application \"{{appName}}\" deleted for tenant \"{{tenant}}\"";
        readonly placeholders: {
            readonly appName: "$1";
            readonly tenant: "$2";
        };
    };
    readonly '^Application activated$': {
        readonly gettext: "Application activated";
    };
    readonly '^Microservice application "(.+?)" activated: version \\[(.+?)\\] added, activeVersionId \\[(.+?)\\] added$': {
        readonly gettext: "Microservice application \"{{appName}}\" activated: version \"{{version}}\" added, activeVersionId \"{{activeVersionId}}\" added";
        readonly placeholders: {
            readonly appName: "$1";
            readonly version: "$2";
            readonly activeVersionId: "$3";
        };
    };
    readonly '^Hosted application "(.+?)" activated: version \\[(.+?)\\] added, activeVersionId \\[(.+?)\\] added$': {
        readonly gettext: "Hosted application \"{{appName}}\" activated: version \"{{version}}\" added, activeVersionId \"{{activeVersionId}}\" added";
        readonly placeholders: {
            readonly appName: "$1";
            readonly version: "$2";
            readonly activeVersionId: "$3";
        };
    };
    readonly '^Hosted application "(.+?)" activated: activeVersionId \\[\'(.+?)\'\\] added$': {
        readonly gettext: "Hosted application \"{{appName}}\" activated: activeVersionId \"{{activeVersionId}}\" added";
        readonly placeholders: {
            readonly appName: "$1";
            readonly activeVersionId: "$2";
        };
    };
    readonly '^External application "(.+?)" activated: version \\[(.+?)\\] added, activeVersionId \\[(.+?)\\] added$': {
        readonly gettext: "External application \"{{appName}}\" activated: version \"{{version}}\" added, activeVersionId \"{{activeVersionId}}\" added";
        readonly placeholders: {
            readonly appName: "$1";
            readonly version: "$2";
            readonly activeVersionId: "$3";
        };
    };
    readonly "^Scaling application '(.+?)' from (.+?) to (.+?) instances$": {
        readonly gettext: "Scaling application \"{{appName}}\" from {{from}} to {{to}} instances";
        readonly placeholders: {
            readonly appName: "$1";
            readonly from: "$2";
            readonly to: "$3";
        };
    };
    readonly '^Entry is outside of the target dir: (.+)$': {
        readonly gettext: "File entry outside of the target directory: \"{{path}}\".";
        readonly placeholders: {
            readonly path: "$1";
        };
    };
    readonly '^Alarm created$': {
        readonly gettext: "Alarm created";
    };
    readonly '^Alarm updated$': {
        readonly gettext: "Alarm updated";
    };
    readonly "^Device name: '(.+?)', alarm text: '(.+?)'$": {
        readonly gettext: "Device name: \"{{deviceName}}\", alarm text: \"{{alarmText | translate}}\"";
        readonly placeholders: {
            readonly deviceName: "$1";
            readonly alarmText: "$2";
        };
    };
};

/**
 * A service to provide unmodified, cached translations for angular.
 */
declare class CachedLocaleDictionaryService {
    cachedDictionary: {
        [lang: string]: {
            [key: string]: string;
        };
    };
    static ɵfac: i0.ɵɵFactoryDeclaration<CachedLocaleDictionaryService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<CachedLocaleDictionaryService>;
}

declare class C8yTranslationCache {
    private optionsService;
    private cachedLocaleDictionaryService;
    private pluginResolverService;
    private path;
    private languages;
    private cache;
    constructor(optionsService: OptionsService, cachedLocaleDictionaryService: CachedLocaleDictionaryService, pluginResolverService: PluginsResolveService, path?: string, languages?: {
        [key: string]: {
            url?: string;
        };
    } | null);
    getTranslation(lang: string, pluginContextPath?: string | null): Observable<TranslationObject>;
    clearCache(): void;
    protected getTranslationsForPlugins(lang: string): Observable<{}>;
    protected getTranslationsForPlugin(lang: string, pluginContextPath: string): Observable<{}>;
    protected getTranslationsFromApp(lang: string): Observable<{
        [key: string]: string;
    }>;
    protected getUserDefinedTranslations(lang: string): Observable<{
        [key: string]: string;
    }>;
    protected getTranslationFromPath(path: string, lang: string): Observable<{
        [key: string]: string;
    }>;
    static ɵfac: i0.ɵɵFactoryDeclaration<C8yTranslationCache, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<C8yTranslationCache>;
}
declare class C8yTranslationLoader implements TranslateLoader {
    private translationCache;
    private pluginContextPath;
    constructor(translationCache: C8yTranslationCache, pluginContextPath?: string);
    getTranslation(lang: string): Observable<TranslationObject>;
    static ɵfac: i0.ɵɵFactoryDeclaration<C8yTranslationLoader, [null, { optional: true; }]>;
    static ɵprov: i0.ɵɵInjectableDeclaration<C8yTranslationLoader>;
}

/**
 * Returns a trimmed translation key.
 * If the key contains HTML, it also removes all whitespaces.
 * The reason behind it is that by default Angular compiler removes
 * whitespaces from adjacent inline elements,
 * which prevents ngx-translate from finding a matching entry in the dictionary.
 */
declare function trimTranslationKey(key: string): string;
/**
 * We want to have translation keys unified, so they don't contain unnecessary spaces and line breaks.
 * This way we can dynamically build keys from HTML, and match them to extracted string, that might be HTML as well.
 */
declare function getDictionaryWithTrimmedKeys(dictionary: object): any;
/**
 * Removes inline context indicators enclosed in backticks from a translation string.
 *
 * @param translation - The original translation string that may contain backtick-enclosed context indicators.
 *
 * @example
 * ```ts
 * removeContextIndicators("Hello World`context`");
 * // Returns: "Hello World"
 * ```
 */
declare function removeContextIndicators(translation: string): string;

/**
 * Factory enabling extension of the navigator menu through the **HOOK_NAVIGATOR_NODES** hook.
 * Refer to [Libraries > Component library > Extension points](https://cumulocity.com/guides/web/libraries/#extension-points) in our Web SDK guide.
 *
 * ```typescript
 * export class ExampleNavigatorFactory implements NavigatorNodeFactory {
 *   get() {
 *     const navs: NavigatorNode[] = [];
 *     navs.push(
 *       new NavigatorNode({
 *         label: 'Hello',
 *         icon: 'rocket',
 *         path: '/hello',
 *         priority: 100
 *       })
 *     );
 *     return navs;
 *   }
 * }
 * ```
 */
type NavigatorNodeFactory = ExtensionFactory<NavigatorNode>;

/**
 * Root navigator node. Top node in the hierarchy.
 * The root node is used as an anchor point for the rest of the nodes.
 */
declare class NavigatorNodeRoot extends NavigatorNode {
    /**
     * Adds top nodes to the navigator tree structure. These nodes are the direct children of the root node.
     * In the case of the cockpit application, such a node is, for example, the "Home" menu entry.
     *
     * ```ts
     * const nodeData: NavigatorNodeData = { label: 'Home' } ;
     * const root: NavigatorNodeRoot = new NavigatorNodeRoot();
     *
     * // Based on the node data, a new node will be created and assigned to root.
     * root.addRoot(nodeData);
     *
     * const parentNode: NavigatorNode =  new NavigatorNode({ label: 'Configuration'...});
     * const nodeData: NavigatorNodeData = { label: 'Exports', parent: parentNode } ;
     * const root: NavigatorNodeRoot = new NavigatorNodeRoot();
     *
     * // Based on the node data, parent node will be directly assigned to the root node, and newly created child node
     * // will be added to the parent node.
     * root.add(nodeData);
     * ```
     *
     * @param {Partial<NavigatorNodeData>} nodeData Data on the basis of which a new node is created.
     */
    addRoot(nodeData: Partial<NavigatorNodeData>): any;
    /**
     * Creates a new navigator node.
     * @param nodeData The data that serves as the basis for creating a new node.
     */
    createNode(nodeData: string | object | NavigatorNodeData | NavigatorNode): NavigatorNode;
}

declare class NavigatorTopComponent {
    ui: AppStateService;
    app$: Observable<IApplication>;
    constructor(ui: AppStateService);
    static ɵfac: i0.ɵɵFactoryDeclaration<NavigatorTopComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<NavigatorTopComponent, "header[c8y-navigator-top]", never, {}, {}, never, never, true, never>;
}

declare class NavigatorTopModule {
    static providers(): (i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider)[];
    static ɵfac: i0.ɵɵFactoryDeclaration<NavigatorTopModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<NavigatorTopModule, never, [typeof CommonModule, typeof ApplicationModule, typeof NavigatorTopComponent], never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<NavigatorTopModule>;
}

declare class NavigatorBottomModule {
    static providers(): (i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider)[];
    static ɵfac: i0.ɵɵFactoryDeclaration<NavigatorBottomModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<NavigatorBottomModule, never, never, never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<NavigatorBottomModule>;
}

declare class PasswordStrengthCheckerService {
    private GREEN;
    private YELLOW;
    private RED;
    hasLowerCase(password: string): boolean;
    hasUpperCase(password: string): boolean;
    hasNumbers(password: string): boolean;
    hasSpecialChars(password: string): boolean;
    getStrengthColor(password: string): PasswordStrengthColor;
    static ɵfac: i0.ɵɵFactoryDeclaration<PasswordStrengthCheckerService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<PasswordStrengthCheckerService>;
}

/**
 * Password validation directive using shared PasswordValidationService.
 *
 * Returns `{ password: { minLength, maxLength, allowedCharactersList } }` for full message (with allowed symbols)
 * or `{ passwordSimple: { minLength, maxLength, allowedCharactersList } }` for simple message (length only).
 */
declare class PasswordValidationDirective implements Validator {
    private validationService;
    passwordStrengthEnforced?: boolean;
    /** Minimum length to be considered strong/green. Only used when strength is enforced. */
    minLength?: number;
    validate(control: AbstractControl): ValidationErrors | null;
    static ɵfac: i0.ɵɵFactoryDeclaration<PasswordValidationDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<PasswordValidationDirective, "[c8yPasswordValidation]", never, { "passwordStrengthEnforced": { "alias": "passwordStrengthEnforced"; "required": false; }; "minLength": { "alias": "minLength"; "required": false; }; }, {}, never, never, true, never>;
}

interface ValidationRules {
    pattern?: RegExp;
    message?: string;
    maxLength?: number;
    minLength?: number;
}
declare enum DatapointLibraryValidationErrors {
    IS_REQUIRED = "required",
    PATTERN = "pattern",
    SHOULD_CONTAIN_NUMBER = "number",
    SHOULD_BE_DEFINED = "should-be-defined",
    GREATER_THAN_SCALE_MAX = "greater-than-scale-max",
    LESS_THAN_SCALE_MIN = "less-than-scale-min",
    GREATER_THAN_RANGE_MAX = "greater-than-range-max",
    LESS_THAN_RANGE_MIN = "less-than-range-min",
    MIN_ACTIVE_COUNT = "minActiveCount",
    MAX_ACTIVE_COUNT = "maxActiveCount"
}
declare class ValidationPattern {
    static readonly messages: {
        readonly deviceId: "Device ID must not contain spaces or slashes (\"/\").";
        readonly domain: string;
        readonly email: "Invalid email address.";
        readonly emails: "Invalid email addresses.";
        readonly internationalPhoneNumber: "Must be a valid phone number (only digits, spaces, slashes (\"/\"), dashes (\"-\"), and plus (\"+\") allowed, for example: +49 9 876 543 210).";
        readonly loginAlias: "Login alias must not contain slashes (\"/\", \"\\\") nor (\"+\"), (\":\"), (\"$\") signs.";
        readonly invalidColor: "Invalid color \"{{ currentValue }}\".";
        readonly max: "Max value: {{ max }}";
        readonly min: "Min value: {{ min }}";
        readonly minLength: "Should have at least {{ minLength }} characters.";
        readonly minlength: "Should have at least {{ requiredLength }} characters.";
        readonly maxLength: "Should have at most {{ maxLength }} characters.";
        readonly maxlength: "Should have at most {{ requiredLength }} characters.";
        readonly pattern: "Does not match pattern {{ requiredPattern }}.";
        readonly opcuaBrowsePath: "Invalid OPC UA URI.";
        readonly password: "Password must have at least {{ minLength }} characters and no more than {{ maxLength }} and can only contain letters, numbers and following symbols: {{ allowedCharactersList }}";
        readonly passwordSimple: "Password must have at least {{ minLength }} characters and no more than {{ maxLength }}.";
        readonly passwordConfirm: "Passwords do not match.";
        readonly passwordStrength: "Password is not strong enough, use a stronger password.";
        readonly passwordStrengthChecklist: "Password is not strong enough, use a stronger password. Check the requirements listed on the right.";
        readonly required: "This field is required.";
        readonly tenantId: string;
        readonly urlSegment: "Slash, single or double dots and white space not allowed.";
        readonly user: "Username must not contain spaces nor slashes (\"/\", \"\\\") nor (\"+\"), (\":\"), (\"$\") signs.";
        readonly httpUrl: "Must be a valid HTTP(S) URL.";
        readonly colonedHexNumber: "Must be a valid hexadecimal number. Must contain only the following characters: 0-9, a-f, A-F, :.";
        readonly noWhiteSpaceOnly: "This field must not contain only whitespaces";
        readonly noLeadingOrTrailingWhitespaces: "Must not contain any leading or trailing whitespaces.";
        readonly noDots: "Dots not allowed.";
        readonly integer: "Invalid type, expected integer.";
        readonly simpleJsonPath: "Must be a valid JSON path";
        readonly number: "This field must contain a number.";
        readonly "should-be-defined": "Value must be defined.";
        readonly "greater-than-scale-max": "Value must be less than scale maximum.";
        readonly "less-than-scale-min": "Value must be greater than scale minimum.";
        readonly "greater-than-range-max": "Value must be less than respective maximum.";
        readonly "less-than-range-min": "Value must be greater than respective minimum.";
        readonly quickLinkUrl: "Value must be a full or relative URL.";
    };
    static readonly rules: {
        deviceId: {
            pattern: RegExp;
        };
        domain: {
            pattern: RegExp;
        };
        groupName: {
            maxLength: number;
        };
        hostname: {
            pattern: RegExp;
        };
        ip: {
            pattern: RegExp;
        };
        opcuaBrowsePath: {
            pattern: RegExp;
        };
        password: {
            pattern: RegExp;
        };
        tenantId: {
            pattern: RegExp;
        };
        user: {
            pattern: RegExp;
        };
        urlSegment: {
            pattern: RegExp;
        };
        loginAlias: {
            pattern: RegExp;
        };
        noWhiteSpaceOnly: {
            pattern: RegExp;
        };
        noLeadingOrTrailingWhitespaces: {
            pattern: RegExp;
        };
        noDots: {
            pattern: RegExp;
        };
        httpUrl: {
            pattern: RegExp;
        };
        colonedHexNumber: {
            pattern: RegExp;
        };
        integer: {
            pattern: RegExp;
        };
        quickLinkUrl: {
            pattern: RegExp;
        };
    };
    static get(key: string): ValidationRules;
}

interface FilePickerConfig {
    maxlength?: string | number;
}

interface PickedFiles {
    url?: string;
    droppedFiles?: DroppedFile[];
}

/**
 * User can upload a binary directly or use an URL.
 *
 * ## Usage
 *
 * ```html
 * <div>
 * <c8y-file-picker [maxAllowedFiles]="1" (onFilesPicked)="onFile($event)">
 * </c8y-file-picker>
 * </div>
 * ```
 */
declare class FilePickerComponent implements OnInit {
    dropArea: DropAreaComponent;
    onFilesPicked: EventEmitter<PickedFiles>;
    maxAllowedFiles: number;
    uploadChoice: 'uploadBinary' | 'uploadUrl' | 'provided';
    allowedUploadChoices: Array<'uploadBinary' | 'uploadUrl' | 'provided'>;
    fileUrl: string;
    fileBinary: DroppedFile;
    config: FilePickerConfig;
    /**
     * Used only when displaying multiple file pickers in the same view.
     */
    filePickerIndex: number;
    /**
     * Additional string to be displayed in a popover.
     */
    fileUrlPopover: string;
    ValidationPattern: typeof ValidationPattern;
    droppedFiles: DroppedFile[];
    private fileToSave;
    providedPopover: "Use this option if the device will resolve the binary itself. No file is uploaded.";
    /**
     * @ignore
     */
    ngOnInit(): void;
    /**
     * Triggered by dropped file in component and pass it into drop-area component.
     */
    onFileDropped(droppedFiles: DroppedFile[]): void;
    /**
     * Triggered when user changes upload choice, from upload url to upload binary.
     */
    clearInputFromUrl(): void;
    /**
     * Triggered when user changes upload choice, to avoid cumulation of droppedFiles.
     */
    clearSelectedFiles(): void;
    /**
     * Triggered when user puts binary's url to upload.
     */
    onFileUrlChange(urlStr: any): void;
    /**
     * Checks if there is popover to display.
     */
    isPopoverUsed(): boolean;
    setProvidedOption(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<FilePickerComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<FilePickerComponent, "c8y-file-picker", never, { "maxAllowedFiles": { "alias": "maxAllowedFiles"; "required": false; }; "uploadChoice": { "alias": "uploadChoice"; "required": false; }; "allowedUploadChoices": { "alias": "allowedUploadChoices"; "required": false; }; "fileUrl": { "alias": "fileUrl"; "required": false; }; "fileBinary": { "alias": "fileBinary"; "required": false; }; "config": { "alias": "config"; "required": false; }; "filePickerIndex": { "alias": "filePickerIndex"; "required": false; }; "fileUrlPopover": { "alias": "fileUrlPopover"; "required": false; }; }, { "onFilesPicked": "onFilesPicked"; }, never, never, true, never>;
}

/**
 * The angular module definition for a drop-area.
 * @exports FilePickerComponent
 */
declare class FilePickerModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<FilePickerModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<FilePickerModule, never, [typeof FormsModule, typeof i1.CommonModule, typeof DropAreaModule, typeof i2$1.FormsModule, typeof CommonModule, typeof i3$1.PopoverModule, typeof FilePickerComponent], [typeof FilePickerComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<FilePickerModule>;
}

interface IAvailableValidators {
    fileMaxSize?: boolean;
    fileNonEmpty?: boolean;
    fileNameMaxLength?: boolean;
}
/**
 File uploader
 */
declare class FilePickerFormControlComponent implements OnInit, AfterViewInit, ControlValueAccessor, Validator {
    private filesService;
    private injector;
    filePlaceholder: ElementRef<HTMLElement>;
    /** Specifies a filter for what file types the user can pick from the file input dialog box.
     * By default all types are accepted.
     *
     * Specify file types by extensions:
     * ```html
     *  ...
     *  [accept]="'.zip,.7z'"
     *  ...
     * ```
     *
     * Specify file types by extensions and generic types [GENERIC_FILE_TYPE]{@link GENERIC_FILE_TYPE}:
     * ```html
     *  ...
     *  [accept]="'.pdf,archive'"
     *  ...
     * ```
     *
     * Specify file types by generic types [GENERIC_FILE_TYPE]{@link GENERIC_FILE_TYPE}:
     *  ```html
     *  ...
     *  [accept]="'archive,video'"
     *  ...
     *
     * ```
     */
    accept?: string;
    /**
     * Sets how many files can be submitted, accepts only numbers.
     */
    maxAllowedFiles?: number;
    /**
     * Sets the minimum number of files to be uploaded, accepts only numbers.
     */
    minRequiredFiles?: number;
    /**
     * Allows to disable default validators. Accepts object with following optional properties:
      - fileMaxSize - Providing `true` disables default validation for file size, accepts only boolean
      - fileNonEmpty - Providing `true` disables default validation for empty files, accepts only boolean
      - fileNameMaxLength - Providing `true` disables default validation for file name length, accepts only boolean
     */
    disableValidators: IAvailableValidators;
    /**
     * Displays upload progress bar, accepts only boolean.
     */
    uploadInProgress: boolean;
    /** The array of progress state objects for each selected file (matched by index). */
    uploadProgress: IFetchWithProgress[];
    /** Display warning if any file dragged over the drop area has unsupported extension. */
    validateExtensionOnDrag: boolean;
    /** Emits an event with the array of File objects representing the dropped files. */
    dropped: EventEmitter<File[]>;
    droppedFiles: File[];
    isDraggingFiles$: Observable<boolean>;
    isDraggingOverFilePlaceholder$: Observable<boolean>;
    isExtensionAllowed$: Observable<boolean>;
    isDropAreaEnlarged$: Observable<boolean>;
    isDraggedFileUnsupported$: Observable<boolean>;
    acceptedExts: string[];
    valid: boolean;
    errors: ValidationErrors;
    controlInstance: AbstractControl;
    disabled: boolean;
    disabledValidators: IAvailableValidators;
    loadingMessage: "Upload in progress";
    private isExtensionAllowed;
    private fileSizeLimit;
    constructor(filesService: FilesService, injector: Injector);
    ngOnInit(): void;
    ngAfterViewInit(): void;
    afterValueChanged(): void;
    onDrop(e: DragEvent): void;
    filesSelected(ev: Event): void;
    deleteAt(index: number): void;
    registerOnChange(fn: never): void;
    registerOnTouched(fn: never): void;
    setDisabledState(isDisabled: boolean): void;
    registerOnValidatorChange(fn: () => void): void;
    writeValue(files: File[] | null): void;
    onDragOver(e: any): void;
    onWindowDrop(e: any): void;
    validate(control: AbstractControl): ValidationErrors | null;
    private onChange;
    private onTouched;
    private onValidatorChange;
    static ɵfac: i0.ɵɵFactoryDeclaration<FilePickerFormControlComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<FilePickerFormControlComponent, "c8y-file-picker-form-control", never, { "accept": { "alias": "accept"; "required": false; }; "maxAllowedFiles": { "alias": "maxAllowedFiles"; "required": false; }; "minRequiredFiles": { "alias": "minRequiredFiles"; "required": false; }; "disableValidators": { "alias": "disableValidators"; "required": false; }; "uploadInProgress": { "alias": "uploadInProgress"; "required": false; }; "uploadProgress": { "alias": "uploadProgress"; "required": false; }; "validateExtensionOnDrag": { "alias": "validateExtensionOnDrag"; "required": false; }; }, { "dropped": "dropped"; }, never, never, true, never>;
}

/**
 * The angular module definition for a drop-area.
 * @exports FilePickerFormControlComponent
 */
declare class FilePickerFormControlModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<FilePickerFormControlModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<FilePickerFormControlModule, never, [typeof FormsModule, typeof i1.CommonModule, typeof i2$1.FormsModule, typeof CommonModule, typeof i3.TooltipModule, typeof FilePickerFormControlComponent], [typeof FilePickerFormControlComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<FilePickerFormControlModule>;
}

declare class ChangeCurrentUserPasswordService {
    private modalService;
    constructor(modalService: BsModalService);
    changeCurrentUserPassword(): Promise<void>;
    static ɵfac: i0.ɵɵFactoryDeclaration<ChangeCurrentUserPasswordService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<ChangeCurrentUserPasswordService>;
}

interface ContextData {
    /**
     * The data of this route. E.g. on ViewContext.Device an managed object
     * of the device.
     */
    contextData: IIdentified;
    /**
     * The current ViewContext used.
     */
    context: ViewContext;
}
/**
 * The context routes that are supported by the application.
 */
declare enum ViewContext {
    Device = "device/:id",
    Group = "group/:id",
    User = "users/:id",
    Application = "ecosystem/application/applications/:id",
    Extension = "ecosystem/extension/extensions/:id",
    Feature = "ecosystem/application/features/:id",
    Microservice = "ecosystem/microservice/microservices/:id",
    SubscribedApplications = "subscribedApplications/:id",
    Tenant = "tenants/:id",
    Report = "reports/:id",
    Service = "service/:id",
    DatapointLibrary = "datapointlibrary/:id",
    Simulators = "simulators/:id",
    Alarms = "alarms/:id",
    GroupAlarms = "group/:id/alarms/:id",
    DeviceAlarms = "device/:id/alarms/:id",
    ServiceAlarms = "service/:id/alarms/:id",
    SimulatorsAlarms = "simulators/:id/alarms/:id",
    Dashboard = "dashboard/:dashboardId"
}
interface ViewContexServiceConfig {
    [key: string]: {
        /**
         * Defines if the route is automatically generated by the router service or
         * if the route is somewhere defined by the developer.
         */
        autoRoute: boolean;
        /**
         * The path used to route.
         */
        path: string;
        /**
         * The @c8y/client service to use for this context.
         */
        service: Type<{
            detail(entityOrId: string | number | IIdentified, filter?: object): Promise<IResult<IIdentified>>;
            list(filter?: object): Promise<IResultList<IIdentified>>;
        }>;
    };
}
/**
 * A ViewContext base route.
 */
type ViewContextRootRoute = Route & {
    rootContext: ViewContext;
};
/**
 * A route that can be added via the HOOK_ROUTE.
 */
type Route = RouteDefault | RouteWithTab | RouteWithComponent;
/**
 * A usual route
 */
interface RouteDefault extends Route$1 {
    context?: never;
    label?: never;
    tabs?: never;
}
interface RouteBase {
    /**
     * Which order should be used.
     */
    priority?: number;
    /**
     * Id to identify specific feature.
     */
    featureId?: string;
    /**
     * The injector to use. If not set, the default root injector will be used.
     */
    _injector?: Injector;
    /**
     * An optional root context for hooks to apend children to this route.
     */
    rootContext?: ViewContext;
}
/**
 * A component based context route.
 */
interface RouteWithComponent extends Route$1, RouteBase {
    /**
     * The view context to add this route to.
     */
    context: ViewContext;
    label?: never;
}
/**
 * A tab that is added to a context route and opens the associated
 * component on this context.
 */
interface RouteWithTab extends Omit<TabWithTemplate<string | any[]>, 'injector' | 'path' | 'component' | 'title'>, Route$1, RouteBase {
    /**
     * The view context to add this route to.
     */
    context: ViewContext;
    /**
     * Allow to emit multiple tabs on one context route.
     */
    tabs?: Tab[];
}
type RouteFactory = Route | Route[] | ExtensionFactory<Route>;

declare class RouterTabsResolver {
    private injector;
    private router;
    constructor(injector: Injector, router: Router);
    get routerStateSnapshot(): RouterStateSnapshot;
    resolve(currentRoute: ActivatedRouteSnapshot): Observable<Tab[]>;
    private getBaselUrl;
    private getLatestChildRoutes;
    private findRootContextRoutes;
    private getGuards;
    static ɵfac: i0.ɵɵFactoryDeclaration<RouterTabsResolver, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<RouterTabsResolver>;
}

declare class ContextRouteService {
    private tabsResolver;
    private tabsService;
    private router;
    private apiService;
    private injector;
    private dataSubscription;
    private routerSubscription;
    private lastAddedTabs;
    private ID_REGEX;
    refreshTrigger$: Subject<void>;
    /**
     * Last context data snapshot
     */
    activatedContextData: ContextData;
    constructor(tabsResolver: RouterTabsResolver, tabsService: TabsService, router: Router, apiService: ApiService, injector: Injector);
    /**
     * Resolves the current context data. If no context was found, null is returned.
     *
     * @param activatedRoute The current activated route.
     */
    getContextData(activatedRoute: ActivatedRoute | ActivatedRouteSnapshot): (Data & ContextData) | null;
    /**
     * Returns a route for the given ContextData.
     *
     * @param contextData The ContextData object.
     * @returns A route with the ids set correctly.
     */
    getContextRoute(contextData: ContextData): string;
    /**
     * Verifies if a given url is a view context route.
     *
     * @param url A route url.
     * @param contextToCheck The view context(s) to check. If not provided, all contexts are checked.
     * @returns true if the given url is a view context route.
     */
    isContextRoute(url: string, contextToCheck?: ViewContext[]): boolean;
    /**
     * @deprecated: Use ScopedContextRouteService instead. Will be removed in 10.22
     */
    init(route: ActivatedRoute): void;
    /**
     * @deprecated: Use ScopedContextRouteService instead. Will be removed in 10.22
     */
    destroy(): void;
    /**
     * Reloads all ViewContexts.
     */
    refreshContext(): void;
    /**
     * Sets a new contextData in the ActivatedRoute.
     * @param activatedRoute The current activated route.
     * @param contextData New contextData.
     */
    setContext(activatedRoute: ActivatedRoute, contextData: IIdentified): void;
    /**
     * @deprecated: Use ScopedContextRouteService instead. Will be removed in 10.21
     */
    updatedContext(route: ActivatedRoute): Observable<ApiCall>;
    /**
     * Gets the rootContext from the deepest child route in the hierarchy.
     *
     * Traverses the route tree from activatedRoute to find the furthest child route that exists.
     * Then extracts the rootContext from that route's configuration.
     *
     * @returns The rootContext value from the deepest route, or undefined if not found
     */
    getRootContextOfChild(currentRoute: ActivatedRoute): any;
    private updateTabs;
    private redirectToFirstTab;
    private needsRedirect;
    private getMatchingContextRoute;
    private getSnapshot;
    private getContextDataSnapshot;
    static ɵfac: i0.ɵɵFactoryDeclaration<ContextRouteService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<ContextRouteService>;
}

/**
 * An extension HOOK can use either a pure value:
 * ```typescript
 *  { provide: HOOK_X, useValue: { ...hookValue }, multi: true }
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  { provide: HOOK_X, useValue: [{ ...hookValues }], multi: true }
 * ```
 *
 * Or an ExtensionFactory which allows to define a get() function. This function
 * gets called on each navigation with the current route and can return values
 * async (observable or promise).
 * ```typescript
 *  { provide: HOOK_X, useFactory: { get: (route) => doSomethingAsync(route) }, multi: true }
 * ```
 */
type RouteExtension = Route | Route[] | ExtensionFactory<Route>;
/**
 * A hook to use for Multi Provider extension.
 * @deprecated Consider using the `hookRoute` function instead.
 */
declare const HOOK_ROUTE: InjectionToken<RouteFactory>;
/**
 * You can either provide a single `Route` as parameter:
 * ```typescript
 *  hookRoute(...)
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  hookRoute([...])
 * ```
 *
 * Or you provide an Service that implements `ExtensionFactory<Route>`
 * ```typescript
 *  export class MyRouteFactory implements ExtensionFactory<Route> {...}
 *  ...
 *  hookRoute(MyRouteFactory)
 * ```
 * A typed alternative to `HOOK_ROUTE`.
 * @param route The `Route`'s or `ExtensionFactory` to be provided.
 * @returns An `Provider` to be provided in your module.
 */
declare function hookRoute(route: GenericHookType<Route>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
/**
 * A service which defines routes for the application. You can use
 * HOOK_ROUTES or pass
 */
declare class RouterService extends ExtensionPointWithoutStateForPlugins<Route> {
    router: Router;
    private contextRouteService;
    readonly state: Map<string, Route>;
    readonly readyForInitialNavigation$: Observable<void>;
    constructor(rootInjector: Injector, router: Router, contextRouteService: ContextRouteService, plugins: PluginsResolveService, options: OptionsService);
    /**
     * Refresh the current context
     */
    refresh(): void;
    /**
     * Add a new route to the router configuration or a context.
     * @param route The route to add
     */
    addRoute(route: Route | Route[]): void;
    /**
     * Determines if the given MO is an group or an device and returns
     * the correct href to link correctly to that MO.
     * @param groupOrDevice The MO of a group or the device.
     * @param prefix How should the link be prefixed.
     */
    getHref(groupOrDevice: IManagedObject, prefix?: string): string;
    protected setupItemsObservable(): Observable<Route[]>;
    private addRoutes;
    private attachExistingChildRoutes;
    private convertRoute;
    private findAllRootContextRoutes;
    private resolveRouterForChildRoutes;
    static ɵfac: i0.ɵɵFactoryDeclaration<RouterService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<RouterService>;
}

/**
 * A service which is injected into the context route component to handle the context data.
 */
declare class ScopedContextRouteService implements OnDestroy {
    private tabsResolver;
    private tabsService;
    private router;
    private apiService;
    private injector;
    private destroyRef;
    private lastAddedTabs;
    private refreshTrigger$;
    private ID_REGEX;
    /**
     * The context used by this service.
     */
    private currentContext;
    constructor(tabsResolver: RouterTabsResolver, tabsService: TabsService, router: Router, apiService: ApiService, injector: Injector, destroyRef: DestroyRef);
    /**
     * Indicates that the data is loading
     * @returns An boolean observable which indicates if the data is loading.
     */
    isLoading$(): Observable<boolean>;
    /**
     * Initializes the context route.
     * @param route The current activated route.
     */
    init(route: ActivatedRoute): void;
    /**
     * Destroys the service.
     */
    ngOnDestroy(): void;
    /**
     * Refreshes the context.
     */
    refreshContext(): void;
    private redirectToFirstTabOnActivationEnd;
    /**
     * Sets an API hook to refresh the contextData on changes.
     * @param activatedRoute The current activated route.
     */
    private updatedContext;
    private updateTabs;
    private redirectToFirstTabOnUpdateTabs;
    private needsRedirectLegacy;
    private needsRedirect;
    private getMatchingContextRoute;
    static ɵfac: i0.ɵɵFactoryDeclaration<ScopedContextRouteService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<ScopedContextRouteService>;
}

declare class ContextRouteComponent implements OnInit {
    private route;
    private scopedContextRouteService;
    private contextRouteService;
    private destroyRef;
    isLoading$: Observable<boolean>;
    constructor(route: ActivatedRoute, scopedContextRouteService: ScopedContextRouteService, contextRouteService: ContextRouteService, destroyRef: DestroyRef);
    ngOnInit(): void;
    refreshTabs(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<ContextRouteComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ContextRouteComponent, "c8y-context-route", never, {}, {}, never, never, true, never>;
}

declare class EmptyComponent {
    static ɵfac: i0.ɵɵFactoryDeclaration<EmptyComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<EmptyComponent, "empty", never, {}, {}, never, never, true, never>;
}

declare const extraRoutes: Route[];
declare const viewContextRoutes: ViewContextRootRoute[];
/**
 * A C8Y router implementation. It implements some default routes needed
 * as well as context routes. Context routes are useful, if you want to
 * use context data on a certain view (e.g. a device), then this routes
 * automatically resolve the associated managed object.
 *
 * You can use this in combination of the Angular default RouterModule
 * or use only this module. Context routes can only be added via the
 * HOOK_ROUTES hook.
 */
declare class RouterModule {
    private routerService;
    /**
     * Same interface as @angular/router module.
     * Sets `initialNavigation` always to `disabled` and `useHash` always to `true`.
     * @param routes The configured routes.
     * @param config The router default configuration.
     * @returns The module and providers.
     */
    static forRoot(routes?: Routes, config?: ExtraOptions): ModuleWithProviders<RouterModule>;
    constructor(routerService: RouterService);
    static ɵfac: i0.ɵɵFactoryDeclaration<RouterModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<RouterModule, never, [typeof i1$2.RouterModule, typeof HeaderModule, typeof CommonModule, typeof ContextRouteComponent, typeof EmptyComponent], never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<RouterModule>;
}

declare class ContextRouteGuard {
    private injector;
    private caches;
    constructor(injector: Injector);
    canActivate(route: ActivatedRouteSnapshot): Observable<boolean>;
    private service;
    private detailCached;
    private clearDetailCached;
    private getCache;
    static ɵfac: i0.ɵɵFactoryDeclaration<ContextRouteGuard, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<ContextRouteGuard>;
}

declare class ViewContextServices {
    static services: ViewContexServiceConfig;
    static contextToService(context: ViewContext): i0.Type<{
        detail(entityOrId: string | number | _c8y_client.IIdentified, filter?: object): Promise<_c8y_client.IResult<_c8y_client.IIdentified>>;
        list(filter?: object): Promise<_c8y_client.IResultList<_c8y_client.IIdentified>>;
    }>;
    static getPath(context: ViewContext): string;
    static isAutoRoute(context: ViewContext): boolean;
}

/**
 * Helper type for form group configuration based on a given entity interface.
 * Ensures that model changes will be detected at compile time
 * avoiding runtime errors and possible data loss.
 */
type FormGroupConfig<T> = {
    [P in keyof T]?: [
        (T[P] | {
            value: T[P];
            disabled: boolean;
        })?,
        (AbstractControlOptions | ValidatorFn | ValidatorFn[])?
    ];
};

declare class C8yValidators {
    static integerValidator(): ValidatorFn;
    static minMaxValidator(): ValidatorFn;
    static requireBothMinAndMax(): ValidatorFn;
    static withinScale(field: string): ValidatorFn;
    static maxActiveCount(maxActive: number, activeAttribute?: string): ValidatorFn;
    static minActiveCount(minActive: number, activeAttribute?: string): ValidatorFn;
    static filesValidator(options: {
        maximumFileSizeInKb?: number;
        typePrefix?: string;
        allowedFileEndings?: string[];
    }): ValidatorFn;
    private static removeErrors;
}

declare enum SendStatus {
    AVAILABLE = "AVAILABLE",
    UNAVAILABLE = "UNAVAILABLE",
    UNKNOWN = "UNKNOWN",
    MAINTENANCE = "MAINTENANCE",
    NOT_MONITORED = "NOT_MONITORED"
}
declare enum PushStatus {
    CONNECTED = "CONNECTED",
    DISCONNECTED = "DISCONNECTED",
    UNKNOWN = "UNKNOWN",
    MAINTENANCE = "MAINTENANCE"
}
declare const SendStatusLabels: {
    readonly AVAILABLE: "Send connection: online";
    readonly NOT_MONITORED: "Send connection: not monitored";
    readonly UNAVAILABLE: "Send connection: offline";
    readonly UNKNOWN: "Send connection status unknown";
    readonly MAINTENANCE: "Device is under maintenance";
};
declare const PushStatusLabels: {
    readonly CONNECTED: "Push connection: active";
    readonly DISCONNECTED: "Push connection: inactive";
    readonly UNKNOWN: "Push connection: inactive";
    readonly MAINTENANCE: "Device is under maintenance";
};
declare const deviceAvailabilityIconMap: {
    sendData: {
        AVAILABLE: {
            icon: string;
            class: string;
        };
        UNAVAILABLE: {
            icon: string;
            class: string;
        };
        UNKNOWN: {
            icon: string;
            class: string;
        };
        NOT_MONITORED: {
            icon: string;
            class: string;
        };
    };
    push: {
        CONNECTED: {
            icon: string;
            class: string;
        };
        DISCONNECTED: {
            icon: string;
            class: string;
        };
        UNKNOWN: {
            icon: string;
            class: string;
        };
        MAINTENANCE: {
            icon: string;
            class: string;
        };
    };
    device: {
        MAINTENANCE: {
            icon: string;
            class: string;
        };
    };
};
declare const tooltips: {
    sendStatusConnected: (lastMessage: any, translateService: any) => any;
    sendStatusDisconnected: "Connection not monitored";
    pushStatusConnected: "Connection to device established";
    pushStatusDisconnected: "Connection to device not established (not supported by device or no connectivity)";
    maintenance: "Device is under maintenance";
};

declare class SupportOutletComponent implements OnInit {
    ui: AppStateService;
    private optionsService;
    private modalService;
    private translateService;
    private tenantService;
    private alertService;
    private userService;
    private headerService;
    isCollapsed: boolean;
    drawerOpen$: Observable<boolean>;
    userSupportAvailable: boolean;
    supportUrl: string | boolean;
    isCollapsible: boolean;
    supportUserEnabled$: Observable<boolean>;
    textClass: string;
    tabIndex$: Observable<'0' | '-1'>;
    PRODUCT_EXPERIENCE: {
        readonly ACTION_BAR: {
            readonly EVENTS: {
                readonly ACTION_BAR_ITEM: "actionBarItem";
            };
            readonly COMPONENTS: {
                readonly ACTION_BAR_COMPONENT: "action-bar";
            };
            readonly ACTIONS: {};
            readonly RESULTS: {};
        };
        readonly QUICK_LINKS: {
            readonly EVENTS: {
                readonly QUICK_LINK_RIGHT_DRAWER: "quickLinkRightDrawer";
            };
            readonly COMPONENTS: {
                readonly RIGHT_DRAWER_COMPONENT: "right-drawer";
            };
            readonly ACTIONS: {
                readonly ACTIVATE_SUPPORT_ACCESS: "activateSupportAccess";
                readonly DEACTIVATE_SUPPORT_ACCESS: "deactivateSupportAccess";
                readonly OPEN_SUPPORT_LINK: "openSupportLink";
            };
            readonly RESULTS: {};
        };
    };
    constructor(ui: AppStateService, optionsService: OptionsService, modalService: ModalService, translateService: TranslateService$1, tenantService: TenantService, alertService: AlertService, userService: UserService, headerService: HeaderService);
    activateSupportAccess(): Promise<void>;
    deactivateSupportAccess(): Promise<void>;
    ngOnInit(): void;
    private refreshCurrentUser;
    static ɵfac: i0.ɵɵFactoryDeclaration<SupportOutletComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<SupportOutletComponent, "c8y-support-outlet", never, {}, {}, never, never, true, never>;
}

declare class SupportOutletModule {
    static providers(): (i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider)[];
    static ɵfac: i0.ɵɵFactoryDeclaration<SupportOutletModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<SupportOutletModule, never, [typeof CommonModule, typeof i2.CollapseModule, typeof ProductExperienceModule, typeof UserModule, typeof SupportOutletComponent], [typeof SupportOutletComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<SupportOutletModule>;
}

declare class HelpAndSupportOutletComponent {
    private docsService;
    private appState;
    private headerService;
    PRODUCT_EXPERIENCE: {
        readonly ACTION_BAR: {
            readonly EVENTS: {
                readonly ACTION_BAR_ITEM: "actionBarItem";
            };
            readonly COMPONENTS: {
                readonly ACTION_BAR_COMPONENT: "action-bar";
            };
            readonly ACTIONS: {};
            readonly RESULTS: {};
        };
        readonly QUICK_LINKS: {
            readonly EVENTS: {
                readonly QUICK_LINK_RIGHT_DRAWER: "quickLinkRightDrawer";
            };
            readonly COMPONENTS: {
                readonly RIGHT_DRAWER_COMPONENT: "right-drawer";
            };
            readonly ACTIONS: {
                readonly ACTIVATE_SUPPORT_ACCESS: "activateSupportAccess";
                readonly DEACTIVATE_SUPPORT_ACCESS: "deactivateSupportAccess";
                readonly OPEN_SUPPORT_LINK: "openSupportLink";
            };
            readonly RESULTS: {};
        };
    };
    helpAndSupport$: Observable<DocLink[]>;
    documentationOpen: boolean;
    appState$: Observable<any>;
    drawerOpen$: Observable<boolean>;
    constructor(docsService: DocsService, appState: AppStateService, headerService: HeaderService);
    static ɵfac: i0.ɵɵFactoryDeclaration<HelpAndSupportOutletComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<HelpAndSupportOutletComponent, "c8y-help-and-support-outlet", never, {}, {}, never, never, true, never>;
}

declare class HelpAndSupportOutletModule {
    static providers(): (i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider)[];
    static ɵfac: i0.ɵɵFactoryDeclaration<HelpAndSupportOutletModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<HelpAndSupportOutletModule, never, [typeof CommonModule, typeof i2.CollapseModule, typeof ProductExperienceModule, typeof SupportOutletModule, typeof HelpAndSupportOutletComponent], never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<HelpAndSupportOutletModule>;
}

declare class LegalNoticesOutletComponent {
    private docsService;
    private headerService;
    PRODUCT_EXPERIENCE: {
        readonly ACTION_BAR: {
            readonly EVENTS: {
                readonly ACTION_BAR_ITEM: "actionBarItem";
            };
            readonly COMPONENTS: {
                readonly ACTION_BAR_COMPONENT: "action-bar";
            };
            readonly ACTIONS: {};
            readonly RESULTS: {};
        };
        readonly QUICK_LINKS: {
            readonly EVENTS: {
                readonly QUICK_LINK_RIGHT_DRAWER: "quickLinkRightDrawer";
            };
            readonly COMPONENTS: {
                readonly RIGHT_DRAWER_COMPONENT: "right-drawer";
            };
            readonly ACTIONS: {
                readonly ACTIVATE_SUPPORT_ACCESS: "activateSupportAccess";
                readonly DEACTIVATE_SUPPORT_ACCESS: "deactivateSupportAccess";
                readonly OPEN_SUPPORT_LINK: "openSupportLink";
            };
            readonly RESULTS: {};
        };
    };
    legalNotices$: Observable<DocLink>;
    drawerOpen$: Observable<boolean>;
    constructor(docsService: DocsService, headerService: HeaderService);
    static ɵfac: i0.ɵɵFactoryDeclaration<LegalNoticesOutletComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<LegalNoticesOutletComponent, "c8y-legal-notices-outlet", never, {}, {}, never, never, true, never>;
}

declare class LegalNoticesOutletModule {
    static providers(): (i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider)[];
    static ɵfac: i0.ɵɵFactoryDeclaration<LegalNoticesOutletModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<LegalNoticesOutletModule, never, [typeof CommonModule, typeof ProductExperienceModule, typeof LegalNoticesOutletComponent], never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<LegalNoticesOutletModule>;
}

declare class GuideHrefDirective {
    private elementRef;
    c8yGuideHref: any;
    private htmlAnchor;
    set baseHref(href: any);
    constructor(elementRef: ElementRef);
    static ɵfac: i0.ɵɵFactoryDeclaration<GuideHrefDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<GuideHrefDirective, "[c8y-guide-href]", never, { "c8yGuideHref": { "alias": "c8y-guide-href"; "required": false; }; }, {}, never, never, true, never>;
}

declare class GuideDocsComponent implements OnInit, AfterContentInit, OnDestroy {
    private docs;
    private el;
    private renderer;
    baseUrl: string;
    links: QueryList<GuideHrefDirective>;
    /**
     * Provides access to translate directive, so it is possible to adjust anchor html tags, after
     * content is translated.
     */
    private _translateDirective;
    get translateDirective(): C8yTranslateDirective;
    set translateDirective(value: C8yTranslateDirective);
    private destroyed$;
    constructor(docs: DocsService, el: ElementRef, renderer: Renderer2, translateDirective: C8yTranslateDirective);
    ngOnInit(): void;
    /**
     * After content is initialized we subscribe for translation events, then we are able to modify
     * anchor just as C8yGuideHrefDirective does.
     */
    ngAfterContentInit(): void;
    /**
     * Find and modify anchor elements
     */
    replaceAnchorAttributes(): void;
    /**
     * Recursive function, returns array of Anchor elements inside HTMLElement.
     */
    findGuideAnchors(el: HTMLElement): HTMLElement[];
    ngOnDestroy(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<GuideDocsComponent, [null, null, null, { optional: true; }]>;
    static ɵcmp: i0.ɵɵComponentDeclaration<GuideDocsComponent, "[c8y-guide-docs]", never, {}, {}, ["translateDirective", "links"], ["*"], true, never>;
}

declare class DocsModule {
    static providers(): (i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider)[];
    static ɵfac: i0.ɵɵFactoryDeclaration<DocsModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<DocsModule, never, [typeof i1.CommonModule, typeof HelpAndSupportOutletModule, typeof LegalNoticesOutletModule, typeof GuideHrefDirective, typeof GuideDocsComponent], [typeof GuideHrefDirective, typeof GuideDocsComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<DocsModule>;
}

interface BasicInputArrayFormConfigInterface {
    /**
     * sets form's key
     */
    key: string;
    /**
     * text inside button that adds additional fields
     */
    addText: string;
    /**
     * label displayed above fields
     */
    label: string;
    /**
     * placeholder attribute value
     */
    placeholder: string;
    /**
     * if provided, blue information icon will be rendered with onHover tooltip
     */
    tooltip?: string;
    /**
     * If provided with true value, generated field will not be required.
     */
    optional?: boolean;
}
/**
 *  Generates simple array formFieldConfig
 *   @returns FormlyFieldConfig[]
 */
declare function getBasicInputArrayFormFieldConfig(config: BasicInputArrayFormConfigInterface): FormlyFieldConfig[];

declare class DynamicComponentAlertAggregator {
    anyAlertExists$: Observable<boolean>;
    /**
     * Array containing grouped alerts with data necessary to display alerts and whether alert group should be dismissible.
     */
    alertGroups: Array<{
        type: AlertType;
        value: AlertGroupData;
    }>;
    /**
     * Private Map of alerts data.
     */
    private aggregatedAlertsData;
    private anyAlertExistsSubject;
    constructor(alerts?: DynamicComponentAlert[]);
    /**
     * Adds alert to aggregator.
     *
     * @param {DynamicComponentAlert[]} alerts List of alerts that should be added to aggregator.
     *
     */
    addAlerts(...alerts: DynamicComponentAlert[]): void;
    /**
     * Remove alerts in group by provided alert type or removes all alerts when no param is provided.
     *
     * @param {AlertType} type Type of alerts group that should be removed.
     *
     */
    clear(type?: AlertType): void;
    /**
     * Sets possibility of alert to be dismissed in specific way.
     *
     * @param {AlertType} alertType Type of alerts for which the dismissal strategy should be set.
     * @param {dismissStrategy} dismissStrategy Type of dismissal strategy that will be set for the alert type.
     *
     */
    setAlertGroupDismissStrategy(alertType: AlertType, dismissStrategy: DismissAlertStrategy): void;
    /**
     * Removes alerts in group due to dismissal dismissStrategy and sets userDismissalChoice property.
     * If group has dismissal strategy declared as TEMPORARY_OR_PERMANENT, its userDismissalChoice property can be set to
     * REMIND_ALLOWED or REMIND_DISALLOWED depending on parameter.
     *
     * @param {AlertType} alertType Type of alerts group that should be dismissed.
     * @param {boolean} permanent Determines whether the dismissal of alerts of a given type is permanent.
     *
     */
    dismissAlertGroup(alertType: AlertType, isPermanent?: boolean): void;
    /**
     * Alert aggregator as a widget property should not be serialized and stored in database.
     */
    toJSON(): any;
    private initAlertsGroups;
    private setAlerts;
    private onDataChanged;
}

declare class DynamicResolverService {
    private injector;
    bulkResolvingTrigger$: Observable<number>;
    private _triggerBulkResolving;
    private requestId;
    constructor(injector: Injector);
    executeResolvers(details: Array<{
        componentId: string;
        config: any;
    }>, dynamicDef: DynamicComponentDefinition[]): Promise<unknown[]>;
    serialize(details: Array<{
        componentId: string;
        config: any;
    }>, dynamicDef: DynamicComponentDefinition[]): {
        [key: string]: Partial<any> | Partial<any>[];
    }[];
    private serializeSingleComponent;
    private triggerResolving;
    private executeResolversForSingleComponent;
    private waitForResults;
    private waitForResultsOfSingleEntry;
    private awaitResult;
    private getRequestId;
    static ɵfac: i0.ɵɵFactoryDeclaration<DynamicResolverService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<DynamicResolverService>;
}

/**
 * A DynamicDetailsResolver is responsible to resolve items of a dynamic components configuration.
 * Ideally the resolve method is implemented in a way that causes not a request per component instance.
 * Instead it should collect the requests it would like to perform within the resolve method,
 * and returns a Promise/Observable that takes care that duplicate objects are just retrieved a single time.
 * The bulkResolvingTrigger$ of the DynamicResolverService can be utilized to know when bulk resolving should be triggered.
 *
 * The serialize method is used for storing the configuration within the backend.
 * It should be implemented in a way, that will reduce it's output to only the required attributes
 * of the entity that are needed for retrieving it afterwards again via the resolve method.
 */
interface DynamicDetailsResolver<T = any> {
    /**
     * Used to resolve/refresh a certain attribute of a widgets configuration.
     * @param  {any} config The dynamic components configuration.
     * @param  {string} attribute The attribute of the dynamic components configuration to be resolved.
     * @returns T
     */
    resolve(config: any, attribute: string, bulkRequestId: number): T | Array<DynamicComponentAlert<T> | T> | DynamicComponentAlert<T> | Promise<T | Array<DynamicComponentAlert<T> | T> | DynamicComponentAlert<T>> | Observable<T | Array<DynamicComponentAlert<T> | T> | DynamicComponentAlert<T>>;
    /**
     * Used to serialize a certain attribute of a dynamic components configuration.
     * This is e.g. used when storing the configuration of a widget on a dashboard to the backend.
     * Usually you should be able to reduce the stored configuration to only e.g. the id of the entity instead of storing the complete entity.
     * @param  {any} config The dynamic components configuration.
     * @param  {string} attribute  The attribute of the dynamic components configuration to be serialized.
     * @returns any The serialized value behind the attribute.
     */
    serialize(config: any, attribute: string): Partial<T> | Array<Partial<T>>;
}
/**
 * An abstract class to simplify implementing the DynamicDetailsResolver interface for performing bulk resolving.
 */
declare abstract class DynamicBulkDetailsResolver<T extends {
    [key: string]: any;
}> implements DynamicDetailsResolver<T> {
    protected dynamicResolver: DynamicResolverService;
    protected translateService: TranslateService$1;
    /**
     * Provides an Observable of the results of all bulk requests.
     */
    resultsOfBulkLoad: Observable<{
        result: T[];
        bulkRequestId: number;
        errors: DynamicBulkRetrievalError[];
    }>;
    /**
     * Map containing the ids to be retrieved per bulk request.
     */
    protected idsGroupedByBulkId: Map<number, string[]>;
    constructor(dynamicResolver: DynamicResolverService, translateService: TranslateService$1);
    resolve(config: any, attribute: string, bulkRequestId: number): T | Array<DynamicComponentAlert<T> | T> | DynamicComponentAlert<T> | Promise<T | Array<DynamicComponentAlert<T> | T> | DynamicComponentAlert<T>> | Observable<T | Array<DynamicComponentAlert<T> | T> | DynamicComponentAlert<T>>;
    /**
     * Provides an Observable of the results of the given bulkRequestId.
     */
    getResult$(bulkRequestId: number): Observable<{
        result: T[];
        errors: DynamicBulkRetrievalError[];
    }>;
    /**
     * Adds a single id or an array of ids to the idsGroupedByBulkId Map for the provided bulkRequestId.
     */
    addIdsToBeLoaded(bulkRequestId: number, ...ids: string[]): void;
    /**
     * Default implementation compatible with serializing an object or an Array of objects.
     * Calls serializeSingleObject for an object and for every entry within the array.
     */
    serialize(config: any, attribute: string): Partial<T> | Array<Partial<T>>;
    /**
     * Called in case a specific id wasn't found as part of the returned dataset.
     */
    abstract buildRetrievalAlert(entity: Partial<T>, errors?: Array<{
        id: string;
        status: number;
        statusText: string;
    }>): DynamicComponentAlert;
    /**
     * Used to perform the request(s) to retrieve the provided ids.
     */
    protected abstract performBulkRequest(uniqIds: string[], bulkRequestId: number): Promise<{
        result: T[];
        bulkRequestId: number;
        errors: DynamicBulkRetrievalError[];
    }> | Observable<{
        result: T[];
        bulkRequestId: number;
        errors: DynamicBulkRetrievalError[];
    }>;
    /**
     * Used to extract the ids to be provided to the performBulkRequest method from the configuration.
     */
    protected abstract extractIdsToBeRetrieved(valueBehindAttribute: Partial<T> | Array<Partial<T>>): string | string[];
    /**
     * Responsible for serializing a single object. The returned value will be e.g. stored in the widgets configuration to the backend.
     * It should reduce the provided object to it's essentials attributes to find it via API, so e.g. the id.
     * It is basically reversing the thing performed as part of the resolve method.
     */
    protected abstract serializeSingleObject(obj: T): Partial<T>;
    /**
     * Checks wether an object is of given id.
     * Will by default compare the id attribute with the given id.
     */
    protected isEntityOfId(obj: T, id: string): boolean;
}

declare enum GLOBAL_CONTEXT_DISPLAY_MODE {
    DASHBOARD = "dashboard",
    CONFIG = "config",
    VIEW_AND_CONFIG = "view_and_config"
}

/** Context control feature constants for type-safe access */
declare const CONTEXT_FEATURE: {
    /** Time range selector for live mode (relative time window that moves with current time) */
    readonly LIVE_TIME: "liveTime";
    /** Time range selector for history mode (fixed date range for historical analysis) */
    readonly HISTORY_TIME: "historyTime";
    /** Data aggregation options (hourly, daily, etc.) - history mode only */
    readonly AGGREGATION: "aggregation";
    /** Auto-refresh toggle (fixed 5s interval) - live mode only */
    readonly AUTO_REFRESH: "autoRefresh";
    /** Manual refresh button (shown in all modes) */
    readonly REFRESH: "refresh";
    /** Manual refresh button - live mode only */
    readonly REFRESH_LIVE: "refreshLive";
    /** Manual refresh button - history mode only */
    readonly REFRESH_HISTORY: "refreshHistory";
};
type ContextFeature = (typeof CONTEXT_FEATURE)[keyof typeof CONTEXT_FEATURE];
/** Preset name constants for type-safe access */
declare const PRESET_NAME: {
    readonly DEFAULT: "default";
    readonly ALARM_LIST: "alarmList";
    readonly CHART: "chart";
    readonly DATA_TABLE: "dataTable";
    readonly DATA_TABLE_CONFIG: "dataTableConfig";
    readonly LIVE_ONLY: "liveOnly";
    readonly AUTO_REFRESH_ONLY: "autoRefreshOnly";
    readonly AUTO_REFRESH_ONLY_CONFIG: "autoRefreshOnlyConfig";
    readonly HISTORY_ONLY: "historyOnly";
    readonly ALARM_LIST_CONFIG: "alarmListConfig";
    readonly ALARM_LIST_LEGACY: "alarmListLegacy";
    readonly KPI: "kpi";
    readonly KPI_CONFIG: "kpiConfig";
    readonly DATA_POINTS_LIST: "dataPointsList";
    readonly DATA_POINTS_LIST_CONFIG: "dataPointsListConfig";
    readonly DATAPOINTS_GRAPH: "datapointsGraph";
    readonly DATAPOINTS_GRAPH_CONFIG: "datapointsGraphConfig";
};
type PresetName = (typeof PRESET_NAME)[keyof typeof PRESET_NAME];
type PresetDefinition = {
    [GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD]: ContextFeature[];
    [GLOBAL_CONTEXT_DISPLAY_MODE.CONFIG]: ContextFeature[];
    [GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG]: ContextFeature[];
};

/**
 * Time the hook waits until it emits an undefined value.
 * Used for not defined widgets -> by default after 5s we
 * show an error that the widget could not be loaded.
 */
declare const RESOLVING_COMPONENT_WAIT_TIME: InjectionToken<number>;
/**
 * An extension HOOK can use either a pure value:
 * ```typescript
 *  { provide: HOOK_X, useValue: { ...hookValue }, multi: true }
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  { provide: HOOK_X, useValue: [{ ...hookValues }], multi: true }
 * ```
 *
 * Or an ExtensionFactory which allows to define a get() function. This function
 * gets called on each navigation with the current route and can return values
 * async (observable or promise).
 * ```typescript
 *  { provide: HOOK_X, useFactory: { get: (route) => doSomethingAsync(route) }, multi: true }
 * ```
 */
type DynamicComponentExtension = DynamicComponentDefinition | DynamicComponentDefinition[] | ExtensionFactory<DynamicComponentDefinition>;
/**
 * A hook to add dynamic components to the UI (e.g. widgets).
 * @deprecated Consider using the `hookComponent` function instead.
 */
declare const HOOK_COMPONENTS: InjectionToken<DynamicComponentExtension[]>;
/**
 * A hook to add dynamic components to the UI (e.g. widgets).
 *
 * You can either provide a single `DynamicComponentDefinition` as parameter:
 * ```typescript
 *  hookComponent(...)
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  hookComponent([...])
 * ```
 *
 * Or you provide an Service that implements `ExtensionFactory<DynamicComponentDefinition>`
 * ```typescript
 *  export class MyDynamicComponentDefinitionFactory implements ExtensionFactory<DynamicComponentDefinition> {...}
 *  ...
 *  hookComponent(MyDynamicComponentDefinitionFactory)
 * ```
 * A typed alternative to `HOOK_COMPONENTS`.
 * @param components The `DynamicComponentDefinition`'s or `ExtensionFactory` to be provided.
 * @returns An `Provider` to be provided in your module.
 */
declare function hookComponent(components: GenericHookType<DynamicComponentDefinition>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
/**
 * Hook to add dynamic widget components to the UI.
 *
 * You can either provide a single `DynamicWidgetDefinition` as parameter:
 * ```typescript
 *  hookWidget(...)
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  hookWidget([...])
 * ```
 *
 *  * Or you provide a Service that implements `ExtensionFactory<DynamicWidgetDefinition>`
 * ```typescript
 *  export class MyDynamicWidgetDefinitionFactory implements ExtensionFactory<DynamicWidgetDefinition> {...}
 *  ...
 *  hookWidget(MyDynamicWidgetDefinitionFactory)
 * ```
 * A widget specific alternative to `hookComponent`..
 * @param components The `DynamicWidgetDefinition`'s or `ExtensionFactory` to be provided.
 * @param options Options to configure the hook.
 * @returns An `Provider` to be provided in your module.
 */
declare function hookWidget(components: GenericHookType<DynamicWidgetDefinition>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
/**
 * A dynamic component can be defined in a the HOOK_COMPONENTS to display any kind
 * of component dynamically just by referencing it's id. The most common use case is on dashboards,
 * where the `configComponent` is used to define what is displayed on the `component`
 * on the dashboard.
 *
 * To use the component you can use the c8y-dynamic-component.
 *
 * ```
 *   <c8y-dynamic-component
 *     componentId="angular.widget.demo"
 *     [config]="{ text: 'Hello world' }"
 *     [mode]="editComponent ? 'config' : 'component'"
 *   ></c8y-dynamic-component>
 *   ```
 */
type DynamicComponentDefinition = DynamicComponentDefinitionBase & DynamicComponents;
type DynamicWidgetDefinition = DynamicWidgetDefinitionBase & DynamicComponents;
interface DynamicComponentDefinitionBase extends DefinitionBase {
    /**
     * Add any random data, specially to angular.js dashboards.
     * Should be serializable to allow to save it to the API.
     */
    data?: any;
}
interface DynamicWidgetDefinitionBase extends DefinitionBase {
    /**
     * Add any random data, specially to angular.js dashboards.
     * Should be serializable to allow to save it to the API.
     */
    data?: WidgetDataType;
}
interface DefinitionBase {
    /**
     * Unique serializable id
     */
    id: string;
    /**
     * The label shown for this dynamic component on add widgets
     */
    label: string;
    /**
     * The description shown on add widget
     */
    description: string;
    /**
     * Add any random data, specially to angular.js dashboards.
     * Should be searilzabled to allow to save it to the API.
     */
    data?: any;
    /**
     * An url to an preview image.
     */
    previewImage?: string;
    /**
     * The injector to use to inject this component. If used in a module federation
     * plugin, the injector of the plugin should be used. Defaults to the root injector.
     */
    injector?: Injector;
    /**
     * Attributes of the dynamic components configuration to be resolved.
     */
    resolve?: {
        [key: string]: Type<DynamicDetailsResolver>;
    };
    /**
     * Determines if dynamic component or widget itself should render alerts.
     */
    errorStrategy?: DynamicComponentErrorStrategy;
    /**
     * Ordering of the components
     */
    priority?: number;
}
type WidgetDisplaySettingsCore = {
    /**
     * If enabled the widget is bound to the global time context. You can listen to ngOnChanges() change detection
     * to react to changes on the context. When a more detailed configuration is needed, use the <c8y-widget-time-context>
     * component instead.
     */
    globalTimeContext?: boolean;
    /**
     * If enabled the widget is bound to the global realtime context. You can listen to ngOnChanges() change detection
     * to react to changes on the context.
     */
    globalRealtimeContext?: boolean;
    /**
     * If enabled the widget is bound to the global aggregation context. You can listen to ngOnChanges() change detection
     * to react to changes on the context.
     */
    globalAggregationContext?: boolean;
    globalAutoRefreshContext?: boolean;
};
interface WidgetImportExportInjectorOptions {
    /**
     * The injector where the import/export is happening (e.g. dashboarding).
     */
    injector: Injector;
    /**
     * The injector where the widget is coming from (e.g. module federation plugin).
     */
    pluginInjector: Injector;
}
interface WidgetDataType {
    /**
     * Settings that define the context to which the widget is bound.
     * E.g. global time context, global realtime context, global aggregation context.
     */
    displaySettings?: WidgetDisplaySettingsCore;
    /**
     * Settings that are used to configure the widget.
     * They are static and will not be saved.
     */
    settings?: WidgetSettings;
    /**
     * Callback to get the schema for the widget e.g. for widget config JSON validation purposes in runtime.
     * In order to use this feature, schema should contain `c8y-schema-loader` prefix, interface name as param
     * and path to file where interface is defined to match "c8y-schema-loader?interfaceName=<interface name>&type=widget-config!<path to file>".
     * ```ts
     * // schema: () => import('c8y-schema-loader?interfaceName=KpiWidgetConfig&type=widget-config!@c8y/ngx-components/widgets/implementations/kpi')
     * ```
     * Schema will be generated in build process and will be available in runtime.
     */
    schema?: () => Promise<{
        schema: JSONSchema7;
    }>;
    /**
     * Widget controls configuration for global context integration.
     * Defines how the widget interacts with global context features like
     * time filters, aggregation, and auto-refresh settings.
     * @deprecated Use `controls` instead.
     */
    widgetControls?: any;
    /**
     * Widget controls configuration for global context integration.
     * Defines how the widget interacts with global context features like
     * time filters, aggregation, and auto-refresh settings.
     */
    controls?: PresetName | PresetDefinition;
    /**
     * Method to export the widget configuration during dashboard export to a json file. It enhances the configuration with
     * additional data that can be used later by the `import` method to restore the widget configuration in a new context.
     * @param config Widget configuration
     * @param dashboardMetaData Metadata of the current dashboard
     * @param options Options with injectors that can be used to export the configuration
     * @return Enhanced widget configuration
     */
    export?: (config: any, dashboardMetaData: any, options: WidgetImportExportInjectorOptions) => any | Promise<any>;
    /**
     * Method to import the widget configuration during dashboard import from a json file. It restores the widget configuration
     * with data exported by the `export` method.
     * @param config Widget configuration enhanced with export method
     * @param dashboardMetaData Metadata of the current dashboard
     * @param options Options with injectors that can be used to import the configuration
     * @return Restored widget configuration
     */
    import?: (config: any, dashboardMetaData: any, options: WidgetImportExportInjectorOptions) => any | Promise<any>;
}
/**
 * The configuration size view is divided into configuration and preview.
 * The configuration can be collapsed, fixed, half or full (preview hidden).
 * The default value is 560px fixed size.
 */
declare enum WIDGET_CONFIGURATION_GRID_SIZE {
    COLLAPSED = "0px",
    DEFAULT = "560px",
    HALF = "50%",
    FULL = "100%"
}
interface WidgetSettings {
    /**
     * Avoids to show the widget in the "add widget" modal
     */
    noNewWidgets?: boolean;
    /**
     * Indicates that the widget was upgraded from an angularjs widget.
     */
    upgrade?: boolean;
    /**
     * The size of the configuration view.
     * If provided as string, it needs to be a valid CSS size (e.g. '400px' or '50%').
     * If not provided, the default size is '560px' (WidgetConfigurationGridSize.DEFAULT).
     */
    configurationViewGridSize?: WIDGET_CONFIGURATION_GRID_SIZE | string;
    /**
     * The default settings when the widget is added to a dashboard.
     */
    widgetDefaults?: {
        /**
         * The grid width of the widget when added to a dashboard.
         */
        _width?: number;
        /**
         * The grid height of the widget when added to a dashboard.
         */
        _height?: number;
        [key: string]: any;
    };
    ng1?: {
        options?: {
            /**
             * Set this to false, to hide the device/group selector
             * @deprecated: This is currently only implemented in angularjs and will be exported to a separate component.
             */
            noDeviceTarget?: boolean;
            /**
             * Set this to false to only select devices
             * @deprecated: This is currently only implemented in angularjs and will be exported to a separate component.
             */
            groupsSelectable?: boolean;
            /**
             * Set this to false to make the device target not required.
             * @deprecated: This is currently only implemented in angularjs and will be exported to a separate component.
             */
            deviceTargetNotRequired?: boolean;
            [key: string]: any;
        };
        /**
         * The context from the device selector.
         */
        context?: {
            id?: string;
            name?: string;
            [key: string]: any;
        };
        [key: string]: any;
    };
    /**
     * Additional settings for the widget.
     */
    [key: string]: any;
}
interface AngularJSWidgetSettings extends WidgetSettings {
    /**
     * The config component name.
     * @deprecated: Only used for angularjs plugins.
     */
    configComponent?: string;
    /**
     * The widget component name.
     * @deprecated: Only used for angularjs plugins.
     */
    widgetComponent?: string;
    /**
     * The config template URL for legacy plugins.
     * @deprecated: Only used for angularjs plugins.
     */
    configTemplateUrl?: string;
    /**
     * Transforms widget's config by executing transform function.
     * The transform function can take injectable arguments
     * @deprecated: Only used for angularjs plugins.
     */
    transformConfigWithContext?: () => void;
}
type DynamicComponents = EagerDynamicComponents | LazyDynamicComponents;
interface EagerDynamicComponents {
    /**
     * The component which is used when the component should be displayed (e.g. on a dashboard)
     */
    component: Type<any>;
    loadComponent?: never;
    /**
     * The configuration component used when a widget is added or edited.
     * @deprecated: Use a hookWidgetConfig instead.
     */
    configComponent?: Type<any>;
    loadConfigComponent?: never;
}
interface LazyDynamicComponents {
    /**
     * A function returning a promise of the component which is used when the component should be displayed (e.g. on a dashboard)
     *
     * A sample function to be provided could look like this:
     * ```
     * async function loadViewComponent() {
     *  const { LazyWidgetViewComponent } = await import('./lazy-widget-view');
     *  return LazyWidgetViewComponent;
     * }
     * ```
     */
    loadComponent: () => Promise<Type<any>>;
    component?: never;
    /**
     * A function returning a promise of the configuration component used when a widget is added or edited.
     *
     * A sample function to be provided could look like this:
     * ```
     * async function loadConfigComponent() {
     *  const { LazyWidgetConfigComponent } = await import('./lazy-widget-config');
     *  return LazyWidgetConfigComponent;
     * }
     * ```
     * @deprecated: Use a hookWidgetConfig instead.
     */
    loadConfigComponent?: () => Promise<Type<any>>;
    configComponent?: never;
}
declare function isLazyDynamicComponents(componentDefinition: DynamicComponents): componentDefinition is LazyDynamicComponents;
declare function isEagerDynamicComponents(componentDefinition: DynamicComponents): componentDefinition is EagerDynamicComponents;
declare enum DynamicComponentErrorStrategy {
    /**
     * Will not render/initialize the Widget in case an error was detected.
     */
    NOT_RENDER = "NOT_RENDER",
    /**
     * Will add an overlay over the Widget, displaying the error message.
     */
    OVERLAY_ERROR = "OVERLAY_ERROR",
    /**
     * The widget implements error handling on its own.
     */
    CUSTOM = "CUSTOM"
}
/**
 * Use this interface on any component to define the interchange between
 * config and display component.
 */
interface DynamicComponent {
    /**
     * The configuration which is shared between configuration component and display component.
     * Should be searilzabled to allow to save it to the API.
     */
    config: any;
    /**
     * Alerts related to the dynamic component.
     * Can either be set by the dynamic component it self or via it's resolvers.
     */
    alerts?: DynamicComponentAlertAggregator;
    /**
     * A reference to the ng1Form on angularjs dashboards to disable/enable the save button.
     * @deprecated: Will not work on Angular-Dashboards (1.6.1.0). Use `ContextServiceDashboard.formDisabled` instead.
     */
    ng1FormRef?: any;
}
/**
 * An lifecycle hook which is called before an configuration is saved.
 * @deprecated Use widgetConfigService.addOnBeforeSave() instead.
 */
interface OnBeforeSave {
    /**
     * Called before a configuration object is saved. The function can be used to manipulate the
     * passed config object or to cancel the saving (return false or Observable<boolean>).
     * @deprecated Use widgetConfigService.addOnBeforeSave() instead.
     */
    onBeforeSave(config?: any): boolean | Promise<boolean> | Observable<boolean>;
}

declare class DynamicComponentService extends ExtensionPointForPlugins<DynamicComponentDefinition> {
    private router;
    private waitTimeout;
    private dynamicResolver;
    private plugins;
    private DEFAULT_WAIT_TIMEOUT;
    constructor(rootInjector: Injector, router: Router, waitTimeout: number, dynamicResolver: DynamicResolverService, plugins: PluginsResolveService);
    get state(): Set<DynamicComponentDefinition>;
    /**
     * Returns a component by it's id as an observable.
     * @param id The id of the component.
     */
    getById(id: any): Promise<DynamicComponentDefinition>;
    add(component: DynamicComponentDefinition): void;
    remove(component: DynamicComponentDefinition): void;
    executeResolvers(componentIdAndConfig: Array<{
        componentId: string;
        config: any;
    }>): Promise<unknown[]>;
    serializeConfigs(componentIdAndConfig: Array<{
        componentId: string;
        config: any;
    }>): Promise<{
        [key: string]: Partial<any> | Partial<any>[];
    }[]>;
    protected setupItemsObservable(): Observable<DynamicComponentDefinition[]>;
    static ɵfac: i0.ɵɵFactoryDeclaration<DynamicComponentService, [null, null, { optional: true; }, null, null]>;
    static ɵprov: i0.ɵɵInjectableDeclaration<DynamicComponentService>;
}

/**
 * C8y dynamic component.
 *
 * register component in HOOK in module:
 * ```typescript
 *  import { hookComponent } from '@c8y/ngx-components';
 *
 * @NgModule({
 *  ...,
 *  providers: [
 *    hookComponent({
 *      id: 'test-component',
 *      label: 'My test component',
 *      description: 'this is test component',
 *      component: TestComponent
 *    })
 *  ...
 *  ]
 *
 * ```
 * Showing dynamic component:
 * ```html
 * <c8y-dynamic-component [componentId]="'test-component'" [config]="config"></c8y-dynamic-component>
 * ```
 */
declare class DynamicComponentComponent implements OnDestroy {
    private dynamicComponentService;
    private injector;
    /**
     * The ID of the registered component. It needs to be a component that is hooked
     * with the HOOK_COMPONENTS extension hook.
     */
    componentId: string;
    /**
     * The configuration to pass.
     */
    config: unknown;
    /**
     * DynamicComponents can have two modes, an edit (config) and an view (component) mode.
     * By default it is shown in the component mode.
     */
    mode: 'config' | 'component';
    /**
     * Disable this to hide the error that is shown if the component was not found.
     */
    notFoundError: boolean;
    /**
     * If set to true, it will execute the components resolvers before initializing the component.
     * Defaults to false.
     */
    executeResolvers: boolean;
    /**
     * Allows to set additional classes for widget styling.
     */
    updateWidgetClasses: EventEmitter<Record<string, boolean>>;
    /**
     * @ignore
     */
    host: ViewContainerRef;
    /**
     * @ignore
     */
    error: any;
    /**
     * @ignore
     */
    expandErrorDetails: boolean;
    componentInstance: DynamicComponent;
    errorStrategy: DynamicComponentErrorStrategy;
    dynamicComponentErrorStrategy: typeof DynamicComponentErrorStrategy;
    private destroy$;
    private componentRef;
    /**
     * @ignore only DI
     */
    constructor(dynamicComponentService: DynamicComponentService, injector: Injector);
    /**
     * Calls the dynamic component life cycle hook. Currently only
     * supporting onBeforeSave, a hook which is called before a config component
     * is saved.
     */
    callLifeCycleHooks(): Observable<boolean>;
    /**
     * @ignore
     */
    ngOnChanges(changes: SimpleChanges): Promise<void>;
    /**
     * If an outside component changes the configuration, this function triggers ngOnChange on the dynamic component.
     * @param newConfigValues The new configuration value.
     */
    emitConfigChange(newConfigValues: unknown): void;
    ngOnDestroy(): void;
    private emitChangeOnComponent;
    private loadComponent;
    /**
     * Safely reflects the component metadata.
     * If reflection fails, it returns a default object with an empty inputs array.
     */
    private safeReflectComponentType;
    private getComponentType;
    private subscribeForOverlayChange;
    private callOnBeforeSaveHook;
    static ɵfac: i0.ɵɵFactoryDeclaration<DynamicComponentComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<DynamicComponentComponent, "c8y-dynamic-component", never, { "componentId": { "alias": "componentId"; "required": false; }; "config": { "alias": "config"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "notFoundError": { "alias": "notFoundError"; "required": false; }; "executeResolvers": { "alias": "executeResolvers"; "required": false; }; }, { "updateWidgetClasses": "updateWidgetClasses"; }, never, never, true, never>;
}

declare class DynamicComponentAlertsComponent extends AlertOutletBase implements OnInit, OnDestroy {
    alertService: AlertService;
    private ref;
    dismissAlertStrategy: typeof DismissAlertStrategy;
    private destroy$;
    alerts: DynamicComponentAlertAggregator;
    constructor(alertService: AlertService, ref: ChangeDetectorRef);
    ngOnInit(): void;
    ngOnDestroy(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<DynamicComponentAlertsComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<DynamicComponentAlertsComponent, "c8y-dynamic-component-alerts", never, { "alerts": { "alias": "alerts"; "required": false; }; }, {}, never, never, true, never>;
}

declare class DynamicComponentModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<DynamicComponentModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<DynamicComponentModule, never, [typeof CommonModule, typeof i2.CollapseModule, typeof i1$2.RouterModule, typeof I18nModule, typeof DynamicComponentComponent, typeof DynamicComponentAlertsComponent], [typeof DynamicComponentComponent, typeof DynamicComponentAlertsComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<DynamicComponentModule>;
}

declare abstract class DynamicBulkIIdentifiedResolver<T extends {
    id: string | number;
    [key: string]: any;
}> extends DynamicBulkDetailsResolver<T> {
    protected dynamicResolver: DynamicResolverService;
    protected translateService: TranslateService$1;
    /**
     * You either have to provide the service or implement the performBulkRequest method on your own.
     */
    protected service?: Service<T> & {
        detail(entityOrId: string | number): Promise<IResult<T>>;
    };
    /**
     * Used within the buildRetrievalAlert method to generate the alert text.
     * For ManagedObjects this would be e.g. 'Unable to retrieve the following managed object: {{requestedEntity}}'
     */
    protected abstract readonly errorMessage: `${string}: "{{entityName}}" ({{entityId}}).`;
    constructor(dynamicResolver: DynamicResolverService, translateService: TranslateService$1, 
    /**
     * You either have to provide the service or implement the performBulkRequest method on your own.
     */
    service?: Service<T> & {
        detail(entityOrId: string | number): Promise<IResult<T>>;
    });
    buildRetrievalAlert(entity: Partial<T>, errors: DynamicBulkRetrievalError[]): DynamicComponentAlert;
    protected performBulkRequest(uniqIds: string[], bulkRequestId: number): Promise<{
        result: T[];
        bulkRequestId: number;
        errors: DynamicBulkRetrievalError[];
    }> | Observable<{
        result: T[];
        bulkRequestId: number;
        errors: DynamicBulkRetrievalError[];
    }>;
    protected extractIdsToBeRetrieved(valueBehindAttribute: Partial<T> | Array<Partial<T>>): string | string[];
    protected serializeSingleObject(obj: T): Partial<T>;
}

/**
 * A DynamicDetailsResolver responsible to resolve managedObjects for dynamic components.
 * This service implements bulk resolving. This reduces the number of requests made to
 * the backend by querying multiple managedObjectIds in a single request.
 */
declare class DynamicManagedObjectResolver extends DynamicBulkIIdentifiedResolver<IManagedObject> {
    protected dynamicResolver: DynamicResolverService;
    protected translateService: TranslateService$1;
    protected inventory: InventoryService;
    protected moChunkLoader: MOChunkLoaderService;
    protected errorMessage: "Unable to retrieve the following managed object: \"{{entityName}}\" ({{entityId}}).";
    protected readonly maxNumberOfManagedObjectsPerRequest = 50;
    protected queryFilter: any;
    constructor(dynamicResolver: DynamicResolverService, translateService: TranslateService$1, inventory: InventoryService, moChunkLoader: MOChunkLoaderService);
    protected performBulkRequest(uniqIds: string[], bulkRequestId: number): Promise<{
        result: IManagedObject[];
        bulkRequestId: number;
        errors: DynamicBulkRetrievalError[];
    }> | Observable<{
        result: IManagedObject[];
        bulkRequestId: number;
        errors: DynamicBulkRetrievalError[];
    }>;
    protected loadManagedObjectsInChunks(uniqIds: string[], bulkRequestId: number): Promise<{
        result: IManagedObject[];
        bulkRequestId: number;
        errors: any[];
    }>;
    protected loadAChunkOfManagedObjects(uniqIds: string[]): Promise<{
        managedObjects: IManagedObject[];
        errors: DynamicBulkRetrievalError[];
    }>;
    static ɵfac: i0.ɵɵFactoryDeclaration<DynamicManagedObjectResolver, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<DynamicManagedObjectResolver>;
}

/**
 * A DynamicDetailsResolver responsible to resolve configured datapoints for dynamic components.
 * This service implements bulk resolving and uses the DynamicManagedObjectResolver in the background.
 * It will update the datapoint details with the current values from the datapoint library and
 * also updates the target of the datapoint in case e.g. the name changed.
 */
declare class DynamicDatapointsResolver implements DynamicDetailsResolver {
    protected moResolver: DynamicManagedObjectResolver;
    protected datapointSyncService: DatapointSyncService;
    constructor(moResolver: DynamicManagedObjectResolver, datapointSyncService: DatapointSyncService);
    resolve(config: any, attribute: string, bulkRequestId: number): any[] | Promise<any[]> | Observable<any[]>;
    serialize(config: any, attribute: string): any;
    static ɵfac: i0.ɵɵFactoryDeclaration<DynamicDatapointsResolver, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<DynamicDatapointsResolver>;
}

declare class HelpService {
    private translateService;
    private options;
    readonly contextHelp: BehaviorSubject<boolean | string>;
    isWarningAlertViewed: boolean;
    private readonly SUPPORTED_LANGUAGES;
    constructor(translateService: TranslateService$1, options: OptionsService);
    isSupportedLanguage(): boolean;
    private handleContextHelp;
    private getContextHelpOption;
    static ɵfac: i0.ɵɵFactoryDeclaration<HelpService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<HelpService>;
}

/**
 * A component which shows a context help in
 * the action bar.
 *
 * ```html
 * <c8y-help src="/docs/cockpit/working-with-dashboards/#working-with-dashboards"></c8y-help>
 * ```
 */
declare class HelpComponent {
    private docsService;
    helpService: HelpService;
    /**
     * The source of the documentation. Used to link to the documentation as well as
     * to parse the source to display.
     */
    src: string;
    /**
     * Indicates if the help dialog is collapsed.
     */
    isCollapsed: boolean;
    /**
     * The priority where the help icon should be shown in the action bar. "-Infinity" value means that priority
     * of this item is the lowest possible, so it will be placed at the right edge of action bar.
     */
    priority: number;
    /**
     * A custom icon. If not set, the navigator icon is resolved
     */
    icon: any;
    /**
     * A title. Set in open by passing the source.
     */
    title: string;
    /**
     * The section heading in the doc which is going to be displayed.
     */
    sectionHeading: string;
    /**
     * The section content in the doc which is going to be displayed.
     */
    sectionContent: string;
    /**
     * Indicates if the component is loading.
     */
    isLoading: boolean;
    /**
     * Indicates if the component failed loading the source.
     */
    hasError: boolean;
    /**
     * Indicates if a warning should be shown.
     */
    showLangWarning: boolean;
    /**
     * @ignore
     */
    isInit: boolean;
    /**
     * @ignore Only private DI
     */
    constructor(docsService: DocsService, helpService: HelpService);
    /**
     * The component is shown by default and therefore breaks e2e test. This is
     * to prevent the visibility on first navigation.
     * @ignore
     */
    onCollapsed(): void;
    /**
     * Builds the URL based on the src. The Base URL can be set in the application options docBaseUrl.
     * @param src The source of the help on the guide.
     * @param index This flag is used to call the index.json content of a guide. For example, "https://cumulocity.com/docs/cockpit/data-explorer/index.json".
     */
    getUrl(src?: string, index?: boolean): string;
    /**
     * Toggles the visibility of the help dialog.
     */
    toggle(): void;
    /**
     * Closes the help dialog.
     */
    close(): void;
    /**
     * Opens the help dialog.
     */
    open(): void;
    private requestContent;
    private clean;
    private resolveIcon;
    private render;
    static ɵfac: i0.ɵɵFactoryDeclaration<HelpComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<HelpComponent, "c8y-help", never, { "src": { "alias": "src"; "required": false; }; "isCollapsed": { "alias": "isCollapsed"; "required": false; }; "priority": { "alias": "priority"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * Provides components which allow to display help elements
 * inside the app.
 * @exports HelpComponent A component which shows a context help in
 *                        the action bar.
 */
declare class HelpModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<HelpModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<HelpModule, never, [typeof CommonModule, typeof i2.CollapseModule, typeof i3.TooltipModule, typeof ActionBarModule, typeof ProductExperienceModule, typeof HelpComponent], [typeof HelpComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<HelpModule>;
}

declare class DashboardChildActionComponent {
    template: any;
    static ɵfac: i0.ɵɵFactoryDeclaration<DashboardChildActionComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<DashboardChildActionComponent, "c8y-dashboard-child-action", never, {}, {}, never, ["*"], true, never>;
}

/**
 * Describes a legacy widget. Please use
 * the proper Widget interface instead.
 */
interface LegacyWidget {
    /**
     * The name of the widget.
     * @deprecated Use componenId
     */
    name?: string;
    /**
     * The template URL for legacy plugins.
     * @deprecated: Only used for angularjs plugins.
     */
    templateUrl?: string;
    /**
     * The config template URL for legacy plugins.
     * @deprecated: Only used for angularjs plugins.
     */
    configTemplateUrl?: string;
    /**
     * The config component name.
     * @deprecated: Only used for angularjs plugins.
     */
    configComponent?: string;
    /**
     * The widget component name.
     * @deprecated: Only used for angularjs plugins.
     */
    widgetComponent?: string;
    transformConfigWithContext?: () => void;
}
/**
 * A widget is a child on a dashboard which can be added and configured
 * by the user. A widget can be defined by the [[DynamicComponentDefinition]]
 * by any module of an application. Thew widget itself stores beside it's
 * link (componentId) to the DynamicComponentDefinition the information
 * about the title, layout (classes) and the configuration.
 */
interface Widget extends LegacyWidget {
    /**
     * x dimension parameters
     */
    _x?: number;
    /**
     * y dimension parameters
     */
    _y?: number;
    /**
     * width dimension parameters
     */
    _width?: number;
    /**
     * height dimension parameters
     */
    _height?: number;
    /**
     * The unique component id to find the component in the
     * HOOK_COMPONENTS dynamic-component implementation.
     */
    componentId: string;
    /**
     * A random key for saving it to the object.
     */
    id: string;
    /**
     * The current configuration of the widget.
     */
    config: any;
    /**
     * The current title of the widget.
     */
    title?: string;
    /**
     * Which classes should be added.
     */
    classes?: {
        [key: string]: boolean;
    };
}
/**
 * Is used to configure a widget dashboard. It allows
 * to set certain parameter that change the behavior
 * of the dashboard.
 */
interface DashboardSettings {
    /**
     * If the dashboard is frozen, the user can't edit it any more.
     * However he can delete it and change the frozen state.
     */
    isFrozen: boolean;
    /**
     * If the dashboard is disabled, no changes on this dashboard are allowed.
     * E.g. because the user doesn't have the rights.
     */
    isDisabled: boolean;
    /**
     * The gap between each widget as pixel
     */
    widgetMargin: number;
    /**
     * Should attempt translating user-defined widget's title if translation is available.
     */
    translateWidgetTitle: boolean;
    /**
     * Should attempt translating user-defined dashboard's title if translation is available.
     */
    translateDashboardTitle: boolean;
    /**
     * New added widgets get that height attached (in css grid columns units)
     */
    defaultHeight: number;
    /**
     * New added widgets get that width attached (in css grid row units)
     */
    defaultWidth: number;
    /**
     * Should the user be able to switch to fullscreen mode.
     */
    allowFullscreen: boolean;
    /**
     * A global title that is used for this dashboard.
     */
    title?: string;
    /**
     * If set to false, the dashboard can not be copied (default true).
     */
    canCopy?: boolean;
    /**
     * If set to false, the dashboard can not be removed (default true).
     */
    canDelete?: boolean;
    /**
     * Indicates that the dashboard is loading.
     */
    isLoading?: boolean;
    /**
     * The amount of columns on that dashboard.
     * Can be freely chosen, but product uses either 12 or 24.
     */
    columns?: number;
}
interface HeaderTemplates {
    template: TemplateRef<unknown>;
    priority?: number;
}
interface DashboardChildDimension {
    x?: number;
    y?: number;
    width: number;
    height: number;
}
interface DashboardChildResizeDimension {
    pointer: {
        x: number;
        y: number;
    };
    width: number;
    height: number;
}
interface DashboardChildArrangement {
    current: DashboardChildDimension;
    scan: DashboardChildComponent[];
    spacing: number;
    origin: DashboardChildDimension;
}
interface DashboardChange {
    source: DashboardChildComponent;
    children: DashboardChildComponent[];
}
interface WidgetChange {
    widget: Widget;
    dashboard: DashboardComponent;
    source: DashboardChildComponent;
}
declare const CopyDashboardDisabledReason: {
    readonly PERMISSIONS: "PERMISSIONS";
    readonly WRONG_REFERENCE: "WRONG_REFERENCE";
};
type DashboardCopyPermission = {
    state: true;
    reason?: never;
} | {
    state: false;
    reason: (typeof CopyDashboardDisabledReason)[keyof typeof CopyDashboardDisabledReason];
};
declare const NEW_DASHBOARD_ROUTER_STATE_PROP = "newDashboard";

/**
 * Displays a CSS grid which is customizable by the customer. You can set
 * `c8y-dashboard-child`-components on it or position any element on it by
 * setting the grid CSS properties. On change (resize, or rearrange) the
 * component emits an change event.
 *
 * ```html
 * <c8y-title>Hello from outlet</c8y-title>
 *
 * <c8y-action-bar-item [placement]="'right'">
 *   <button class="btn btn-link" (click)="addRandom()"><i c8yIcon="plus-circle"></i> Add random</button>
 * </c8y-action-bar-item>
 * <c8y-action-bar-item [placement]="'right'">
 *   <button class="btn btn-link" (click)="isFrozen = !isFrozen">
 *     <i [c8yIcon]="isFrozen ? 'lock' : 'unlock'"></i> Toggle freeze
 *   </button>
 * </c8y-action-bar-item>
 *
 * <c8y-dashboard (dashboardChange)="dashboardChange($event)">
 *   <c8y-dashboard-child
 *     [isFrozen]="isFrozen"
 *     title="dynamic"
 *     *ngFor="let widget of widgets"
 *     #current
 *   >
 *     x: {{ current.x }}<br />
 *     y: {{ current.y }}<br />
 *     width: {{ current.width }}<br />
 *     height: {{ current.height }}<br />
 *   </c8y-dashboard-child>
 *   <c8y-dashboard-child
 *     #cpWidget
 *     [isFrozen]="isFrozen"
 *     [x]="0"
 *     [y]="1"
 *     [width]="3"
 *     [height]="2"
 *     [data]="widget"
 *     [class]="'card card-dashboard panel-title-regular panel-content-branded panel-title-overlay'"
 *   >
 *     <c8y-dashboard-child-title>
 *       <span>World!</span>
 *     </c8y-dashboard-child-title>
 *     x: {{ cpWidget.x }}<br />
 *     y: {{ cpWidget.y }}<br />
 *     width: {{ cpWidget.width }}<br />
 *     height: {{ cpWidget.height }}<br />
 *   </c8y-dashboard-child>
 *   <c8y-dashboard-child
 *     #cpWidget2
 *     [isFrozen]="isFrozen"
 *     [x]="8"
 *     [y]="1"
 *     [width]="4"
 *     [height]="4"
 *     [class]="'card card-dashboard panel-content-dark'"
 *   >
 *     <c8y-dashboard-child-title>
 *       <span>Hello!</span>
 *     </c8y-dashboard-child-title>
 *     <c8y-dashboard-child-action>
 *       <a href="" (click)="cpWidget2.isFrozen = !cpWidget2.isFrozen; (false)">
 *         <i [c8yIcon]="cpWidget2.isFrozen ? 'lock' : 'unlock'"></i> Toggle freeze
 *       </a>
 *     </c8y-dashboard-child-action>
 *     x: {{ cpWidget2.x }}<br />
 *     y: {{ cpWidget2.y }}<br />
 *     width: {{ cpWidget2.width }}<br />
 *     height: {{ cpWidget2.height }}<br />
 *   </c8y-dashboard-child>
 *
 *   <c8y-dashboard-child
 *     #cpWidget3
 *     [isFrozen]="isFrozen"
 *     [x]="0"
 *     [y]="3"
 *     [width]="4"
 *     [height]="4"
 *     [class]="'card-dashboard panel-content-transparent'"
 *   >
 *     <c8y-dashboard-child-title *ngIf="showTitle">
 *       <span>Transparent!</span>
 *     </c8y-dashboard-child-title>
 *     <c8y-dashboard-child-action>
 *       <a href="" (click)="showTitle = !showTitle; (false)">
 *         <i [c8yIcon]="'heading'"></i> Hide/show title
 *       </a>
 *     </c8y-dashboard-child-action>
 *     <c8y-dashboard-child-action>
 *       <a href="" (click)="cpWidget3.isFrozen = !cpWidget3.isFrozen; (false)">
 *         <i [c8yIcon]="cpWidget3.isFrozen ? 'lock' : 'unlock'"></i> Toggle freeze
 *       </a>
 *     </c8y-dashboard-child-action>
 *     x: {{ cpWidget3.x }}<br />
 *     y: {{ cpWidget3.y }}<br />
 *     width: {{ cpWidget3.width }}<br />
 *     height: {{ cpWidget3.height }}<br />
 *   </c8y-dashboard-child>
 * </c8y-dashboard>
 * ```
 */
declare class DashboardComponent implements AfterContentInit {
    private element;
    private sanitizer;
    /**
     * All children in that dashboard.
     */
    children: DashboardChildComponent[];
    /**
     * The amount of columns on that dashboard.
     */
    columns: number;
    /**
     * The spacing between each children in pixel.
     */
    gap: number;
    /**
     * The amount of rows to dusplay. Set to auto to
     * auto extend the rows.
     */
    rows: number | 'auto';
    /**
     * An event fired if the dashboard was changed.
     */
    dashboardChange: EventEmitter<DashboardChange>;
    dashboardRect: DOMRect;
    private lastRow;
    private readonly DEFAULT_ROW_SIZE;
    /**
     * The current column size.
     */
    get columnSize(): number;
    /**
     * The current row size.
     */
    get rowSize(): number;
    /**
     * Returns all positioning styles. Nasty workaround for that issue:
     * https://github.com/angular/angular/issues/9343
     */
    get inlineStyle(): _angular_platform_browser.SafeStyle;
    constructor(element: ElementRef, sanitizer: DomSanitizer);
    ngAfterContentInit(): void;
    onResize(): void;
    /**
     * Updates the current rect size of the dashboard.
     */
    updateRectSize(): void;
    emitChange(widget: DashboardChildComponent): void;
    private calculateRowSize;
    static ɵfac: i0.ɵɵFactoryDeclaration<DashboardComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<DashboardComponent, "c8y-dashboard", never, { "columns": { "alias": "columns"; "required": false; }; "gap": { "alias": "gap"; "required": false; }; "rows": { "alias": "rows"; "required": false; }; }, { "dashboardChange": "dashboardChange"; }, never, ["*"], true, never>;
}

/**
 * A dashboard child allows to position elements
 * correctly on a grid.
 *
 * By setting `c8y-dashboard-child-actions` and
 * `c8y-dashboard-child-title` on the element you can add
 * custom actions or a custom title to the current child.
 *
 * By adding the correct branded classes, you can define
 * the look and feel of the child. By default it is displayed
 * as a card.
 *
 * ```html
 *   <c8y-dashboard-child
 *     #cpWidget3
 *     [x]="0"
 *     [y]="3"
 *     [width]="4"
 *     [height]="4"
 *     [class]="'card-dashboard panel-content-transparent'"
 *   >
 *     <c8y-dashboard-child-title *ngIf="showTitle">
 *       <span>Transparent!</span>
 *     </c8y-dashboard-child-title>
 *     <c8y-dashboard-child-action>
 *       <a href="" (click)="showTitle = !showTitle; (false)">
 *         <i [c8yIcon]="'heading'"></i> Hide/show title
 *       </a>
 *     </c8y-dashboard-child-action>
 *     x: {{ cpWidget3.x }}<br />
 *     y: {{ cpWidget3.y }}<br />
 *     width: {{ cpWidget3.width }}<br />
 *     height: {{ cpWidget3.height }}<br />
 *   </c8y-dashboard-child>
 * ```
 */
declare class DashboardChildComponent implements DashboardChildDimension {
    dashboard: DashboardComponent;
    private sanitizer;
    element: ElementRef;
    actions: DashboardChildActionComponent[];
    set templateActions(actions: DashboardChildActionComponent[]);
    dragSource: CdkDrag;
    isResize: boolean;
    isDragging: boolean;
    klasses: {};
    _additionalHeaderTemplates: BehaviorSubject<HeaderTemplates[]>;
    additionalHeaderTemplates$: Observable<HeaderTemplates[]>;
    _pxWidth: string;
    _pxHeight: string;
    fullscreen: boolean;
    readonly MD_BOOTSTRAP_BREAKPOINT_READONLY_CLASS_PROPERTY = 768;
    /**
     * The x position of the child.
     */
    x: any;
    /**
     * The y position of the child.
     */
    y: any;
    /**
     * The width of the component in grid-columns.
     */
    width: number;
    /**
     * The height of the component in grid-rows.
     */
    height: number;
    /**
     * The data object can be used as a dataTransfer object for events of the child.
     */
    data: Widget | any;
    /**
     * The margin of the child in pixel.
     */
    margin: number;
    /**
     * The child content is initialized, as soon it is scrolled into viewport
     */
    useIntersection: boolean;
    /**
     * If a dashboard is frozen, all children cannot be moved
     * or resized.
     * @deprecated use editMode.
     */
    set isFrozen(value: boolean);
    canToggleFullscreen: boolean;
    /**
     * If a dashboard editing is disabled no widgets can be moved, edited, removed
     * or added.
     */
    editMode: boolean;
    /**
     * An event fired if a child change is started (dragging or resizing)
     */
    changeStart: EventEmitter<DashboardChildComponent>;
    /**
     * An event fired if a child change is ended
     */
    changeEnd: EventEmitter<DashboardChildComponent>;
    /**
     * An event fired if the fullscreen toggle button was pressed.
     */
    toggleFullscreen: EventEmitter<void>;
    /**
     * All classes added to this child
     */
    class: string[] | {
        [key: string]: boolean;
    };
    /**
     * Updates the pixel width of the child (used for resizing)
     */
    set pxWidth(value: any);
    /**
     * Updates the pixel height of the child (used for resizing)
     */
    set pxHeight(value: any);
    /**
     * Triggers on every resize and returns true if in one column view (mobile view)
     */
    isOneColumnView$: Observable<boolean>;
    /**
     * An indicator if the child is intersected (that mean visible for the user)
     */
    intersected: boolean;
    /**
     * Tells if the last change was a dragging or resizing event;
     */
    lastChange: 'drag' | 'resize';
    /**
     * nasty workaround for that issue:
     * https://github.com/angular/angular/issues/9343
     */
    get inlineStyle(): _angular_platform_browser.SafeStyle;
    /**
     * The observable subscription which is listen to
     * on changes (drag or resize).
     */
    changeSubscription: Subscription;
    constructor(dashboard: DashboardComponent, sanitizer: DomSanitizer, element: ElementRef);
    ngOnChanges(): void;
    ngOnInit(): void;
    ngAfterViewInit(): void;
    setDynamicDimension(): void;
    resizeStarted($event: CdkDragStart): void;
    dragStarted($event: CdkDragStart): void;
    reset($event?: CdkDragEnd): void;
    ngOnDestroy(): void;
    addActions(actions: DashboardChildActionComponent[], prepend?: boolean): void;
    private removeSelfFromDashboard;
    private sortByPriority;
    private getOrder;
    private childInView;
    static ɵfac: i0.ɵɵFactoryDeclaration<DashboardChildComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<DashboardChildComponent, "c8y-dashboard-child", never, { "x": { "alias": "x"; "required": false; }; "y": { "alias": "y"; "required": false; }; "width": { "alias": "width"; "required": false; }; "height": { "alias": "height"; "required": false; }; "data": { "alias": "data"; "required": false; }; "margin": { "alias": "margin"; "required": false; }; "useIntersection": { "alias": "useIntersection"; "required": false; }; "isFrozen": { "alias": "isFrozen"; "required": false; }; "canToggleFullscreen": { "alias": "canToggleFullscreen"; "required": false; }; "editMode": { "alias": "editMode"; "required": false; }; "class": { "alias": "class"; "required": false; }; }, { "changeStart": "changeStart"; "changeEnd": "changeEnd"; "toggleFullscreen": "toggleFullscreen"; }, ["templateActions"], ["c8y-dashboard-child-title", "*"], true, never>;
}

declare class DashboardChildTitleComponent {
    static ɵfac: i0.ɵɵFactoryDeclaration<DashboardChildTitleComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<DashboardChildTitleComponent, "c8y-dashboard-child-title", never, {}, {}, never, ["*"], true, never>;
}

/**
 * Type for describing widget change events. It's possible
 * to extend this by adding additional events to discriminated union type.
 */
type WidgetChangeEvent = TimeContextEvent;
interface TimeContextEvent {
    type: 'TIME_CONTEXT';
    data: WidgetTimeContext;
}
type WidgetChangeEventType = WidgetChangeEvent['type'];
type RevertChangeType = 'undo' | 'redo';
type DateTimeContext = [Date, Date];
type WidgetTimeContext = ({
    dateTimeContext: DateTimeContext;
    realtime: boolean;
    aggregation: aggregationType;
} & {
    interval?: never;
}) | ({
    dateTimeContext?: never;
} & {
    interval: Interval['id'];
    realtime: boolean;
    aggregation: aggregationType;
});

declare class WidgetAutoRefreshContextComponent implements OnInit, OnDestroy, AfterViewInit {
    form: ReturnType<WidgetAutoRefreshContextComponent['createForm']>;
    editMode$: BehaviorSubject<boolean>;
    globalRefreshWidgetLoading: boolean;
    readonly ACTION_BAR_GROUP_ID = "globalrefreshcontext";
    readonly ACTION_BAR_PRIORITY = 5;
    private destroy$;
    private readonly fb;
    private readonly widgetGlobalAutoRefresh;
    ngOnInit(): void;
    ngAfterViewInit(): void;
    ngOnDestroy(): void;
    onRefresh(): void;
    private createForm;
    private subscribeOnAutoRefreshSecondsChange;
    private subscribeOnAutoRefreshChange;
    private initializeWidgetSubscriptions;
    private setAutoRefreshQueryParam;
    private subscribeOnQueryParamChange;
    private subscribeOnRouterEvents;
    private onContextDestroy;
    private listenOnDashboardSaveOperation;
    static ɵfac: i0.ɵɵFactoryDeclaration<WidgetAutoRefreshContextComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<WidgetAutoRefreshContextComponent, "c8y-widget-auto-refresh-context", never, { "editMode$": { "alias": "editMode$"; "required": false; }; }, {}, never, never, true, never>;
}

declare class AutoRefreshControlComponent implements AfterViewInit, OnDestroy, ControlValueAccessor {
    readonly DISABLE_AUTO_REFRESH: "Disable auto refresh";
    readonly ENABLE_AUTO_REFRESH: "Enable auto refresh";
    readonly DEFAULT_INTERVAL_VALUE = 30000;
    countdownIntervalComponent: CountdownIntervalComponent;
    loading: EventEmitter<boolean>;
    private readonly widgetGlobalAutoRefresh;
    showIntervalRefresh$: BehaviorSubject<boolean>;
    autoRefreshSeconds$: BehaviorSubject<number>;
    private isBtnDisabledSubject;
    isBtnDisabled$: rxjs.Observable<boolean>;
    private destroy$;
    onChange: (value: boolean) => void;
    onTouched: () => void;
    ngAfterViewInit(): void;
    ngOnDestroy(): void;
    toggleIntervalRefresh(): void;
    registerOnChange(fn: any): void;
    writeValue(showIntervalRefresh: boolean): void;
    registerOnTouched(fn: any): void;
    private subscribeOnCountdownChangeState;
    private setUpOnCountdownEndedListener;
    private handleCountdownEnded;
    static ɵfac: i0.ɵɵFactoryDeclaration<AutoRefreshControlComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<AutoRefreshControlComponent, "c8y-auto-refresh-control", never, {}, { "loading": "loading"; }, never, never, true, never>;
}

declare class AutoRefreshSelectControlComponent implements ControlValueAccessor {
    readonly DEFAULT_INTERVAL_VALUES: number[];
    readonly START_INTERVAL_VALUE = 30000;
    readonly SECONDS_UNTIL_REFRESH: "{{ seconds }} s`until refresh`";
    autoRefreshSeconds: number;
    onChange: (value: number) => void;
    onTouched: () => void;
    registerOnChange(fn: any): void;
    registerOnTouched(fn: any): void;
    writeValue(autoRefreshSeconds: number): void;
    onIntervalChange(autoRefreshSeconds: number): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<AutoRefreshSelectControlComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<AutoRefreshSelectControlComponent, "c8y-auto-refresh-select-control", never, {}, {}, never, never, true, never>;
}

declare const DEFAULT_INTERVAL_VALUE = 30000;
declare const DEFAULT_INTERVAL_VALUES: number[];
declare const DEFAULT_INTERVAL_STATE = true;
declare const GLOBAL_CONTEXT_AUTO_REFRESH = "globalContextAutoRefresh";
type GlobalAutoRefreshQueryParam = {
    [GLOBAL_CONTEXT_AUTO_REFRESH]: boolean;
};
interface GlobalAutoRefreshWidgetConfig {
    /**
     * Indicates if instance of widget is bound to global auto refresh context. It can be only used with widgets which
     * dynamic component definition contains displaySettings allowing to use it with global auto refresh context.
     */
    widgetInstanceGlobalAutoRefreshContext?: boolean;
}

declare class WidgetGlobalAutoRefreshService {
    /**
     * A BehaviorSubject that tracks the number of loading operations in progress.
     * Initialized with a count of 0.
     */
    private loadingCount$;
    /**
     * An Observable that emits a boolean indicating whether any widgets with global refresh option are currently loading.
     * The value is true if the loading count is non-zero, and false if the loading count is zero.
     * Uses distinctUntilChanged() to emit only when the boolean value changes.
     */
    private isLoadingWidgets$;
    /**
     * Object containing behavior subjects for managing auto-refresh settings.
     */
    autoRefreshSettings: {
        /**
         * BehaviorSubject that emits the current state of auto-refresh button.
         * Defaults to DEFAULT_INTERVAL_STATE.
         */
        isEnabled$: BehaviorSubject<boolean>;
        /**
         * BehaviorSubject that emits the current auto-refresh interval value.
         * Defaults to DEFAULT_INTERVAL_VALUE.
         */
        refreshInterval$: BehaviorSubject<number>;
        /**
         * BehaviorSubject that emits whether auto-refresh has been manually disabled by the user.
         * Defaults to false.
         */
        userDisabledManually$: BehaviorSubject<boolean>;
    };
    /**
     * Object containing subjects for managing countdown actions.
     */
    countdownActions: {
        /**
         * Subject used to stop the countdown.
         */
        stop$: Subject<void>;
        /**
         * Subject used to reset the countdown.
         */
        reset$: Subject<void>;
        /**
         * Subject that emits when the countdown has ended.
         */
        countdownEnded$: Subject<void>;
    };
    /**
     * Subject that emits when a dashboard save operation is triggered.
     */
    onDashboardSave$: Subject<void>;
    /**
     * A signal representing the number of widgets with the global auto-refresh option enabled.
     */
    globalRefreshWidgetsCount: i0.WritableSignal<number>;
    /**
     * Tracks the navigation state.
     *
     * The signal returns a boolean indicating whether a navigation operation is currently in progress.
     * It initializes with a default value of `false` and can be toggled to `true` during navigation events from `handleNavigationInProgress$`.
     */
    private navigationInProgress;
    private readonly router;
    private readonly activatedRoute;
    /**
     * Increments the loading count by 1.
     */
    incrementLoading(): void;
    /**
     * Decrements the loading count by 1.
     */
    decrementLoading(): void;
    /**
     * Retrieves an observable that emits the value of a Global Auto Refresh query parameter
     * whenever it changes. The query parameter being tracked is determined by
     * `GlobalAutoRefreshName.GLOBAL_CONTEXT_AUTO_REFRESH`.
     *
     * @returns An observable that emits the parsed value of the `GLOBAL_CONTEXT_AUTO_REFRESH` query parameter.
     */
    getQueryParamChangeValue$(): Observable<boolean | null>;
    /**
     * Monitors router navigation events and updates the navigation progress state.
     *
     * @returns An Observable that emits router events of types NavigationStart, NavigationEnd,
     *          NavigationCancel, and NavigationError.
     */
    handleNavigationInProgress$(): Observable<Event$1>;
    /**
     * Sets the global auto-refresh query parameter in the current route.
     *
     * @param queryParams - An object representing the query parameters to set for the global auto-refresh option.
     *                      The existing query parameters will be merged with these.
     */
    setAutoRefreshQueryParam(queryParams: GlobalAutoRefreshQueryParam): Promise<void>;
    /**
     * Handles changes to the edit mode and updates the isEnabled$ variable.
     *
     * - If auto-refresh was manually disabled by the user (`userDisabledManually$` is `true`), auto-refresh will remain disabled regardless of the edit mode state.
     * - If auto-refresh was not manually disabled, it will be disabled when entering edit mode and enabled when exiting edit mode.
     *
     * @param editMode - A boolean indicating the current state of edit mode (`true` if edit mode is active, `false` otherwise).
     */
    onEditModeChange(editMode: boolean): void;
    /**
     * Returns an Observable that triggers the countdown reset action when loading completes.
     *
     * This method creates an Observable that:
     * - Skips a specified number of initial emissions from `isLoadingWidgets$` based on the `skipInitialBehaviorSubjectEmission$` method.
     * - Filters out emissions where the loading state is true.
     * - On emission where the loading state is false, it triggers a countdown reset action.
     *
     */
    resetCountdownOnLoadingComplete$(): MonoTypeOperatorFunction<any>;
    /**
     * Resets the service's settings and parameters to their default values.
     */
    resetServiceToDefaults(): void;
    /**
     * Resets the countdown timer by emitting a reset action after a short delay.
     */
    resetCountdown(): void;
    /**
     * Initializes the auto-refresh countdown logic based on the widget loading state and edit mode.
     *
     * This method returns an observable that monitors the widget loading state and triggers specific actions
     * related to the countdown process. It performs the following steps:
     *
     * 1. Skips the initial loading state emitted by `isLoadingWidgets$`.
     * 2. Stops the countdown if the widgets are currently loading.
     * 3. Filters out cases where widgets are loading or the application is in edit mode.
     * 4. Resets the countdown when widgets are not loading and the application is not in edit mode.
     *
     * @param editMode$ - A `BehaviorSubject` representing whether the application is currently in edit mode.
     *
     * @returns An `Observable<boolean>` that emits the loading state of the widgets after the initialization steps.
     */
    initializeAutoRefreshCountdownLoading$(editMode$: BehaviorSubject<boolean>): Observable<boolean>;
    /**
     * Parses a string representation of global auto-refresh parameter into a boolean or null.
     *
     * Converts the provided `globalAutoRefresh` string into a boolean value or null based on its content:
     * - Returns `true` if `globalAutoRefresh` is 'true'.
     * - Returns `false` if `globalAutoRefresh` is 'false'.
     * - Returns `null` if `globalAutoRefresh` is neither 'true' nor 'false'.
     *
     * @param globalAutoRefresh - The string representation of the global auto-refresh parameter.
     *
     * @returns A boolean value corresponding to the parsed global auto-refresh state, or null if the input is not 'true' or 'false'.
     */
    private parseGlobalAutoRefreshParam;
    /**
     * Resets the loading count to zero.
     */
    private resetLoadingToZero;
    /**
     * Clears the global auto-refresh query parameter by navigating to the current route with the parameter set to null.
     *
     */
    private clearQueryParam;
    static ɵfac: i0.ɵɵFactoryDeclaration<WidgetGlobalAutoRefreshService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<WidgetGlobalAutoRefreshService>;
}

declare class WidgetAutoRefreshContextIconBarComponent {
    globalAutoRefreshTooltip: "This widget is in sync with the dashboard auto refresh context.";
    static ɵfac: i0.ɵɵFactoryDeclaration<WidgetAutoRefreshContextIconBarComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<WidgetAutoRefreshContextIconBarComponent, "c8y-widget-auto-refresh-context-icon-bar", never, {}, {}, never, never, true, never>;
}

declare function globalAutoRefreshLoading(globalRefreshService: WidgetGlobalAutoRefreshService): MonoTypeOperatorFunction<boolean>;

declare class WidgetsDashboardComponent {
    private dynamic;
    private translateService;
    private route;
    private modal;
    private widgetGlobalAutoRefresh;
    private router;
    private elementRef;
    set widgets(value: Widget[]);
    get widgets(): Widget[];
    context: any;
    /**
     * Indicates if device info in config should be overridden with values from context property.
     */
    contextDashboard: any;
    set _settings(settings: Partial<DashboardSettings>);
    isCopyDisabled: DashboardCopyPermission | boolean;
    breadcrumb: BreadcrumbItem;
    editModeButtons: {
        undoButtonDisabled: boolean;
        changeToUndoName: string;
        redoButtonDisabled: boolean;
        changeToRedoName: string;
    };
    isSaveDisabled: boolean;
    get isDeviceTypeDashboard(): boolean;
    settings: DashboardSettings;
    onAddWidget: EventEmitter<DashboardComponent>;
    onEditWidget: EventEmitter<WidgetChange>;
    onDeleteWidget: EventEmitter<WidgetChange>;
    onChangeDashboard: EventEmitter<DashboardChange>;
    onResize: EventEmitter<void>;
    onEditDashboard: EventEmitter<DashboardComponent>;
    onCopyDashboard: EventEmitter<DashboardComponent>;
    onDeleteDashboard: EventEmitter<DashboardComponent>;
    onChangeStart: EventEmitter<WidgetChange>;
    onChangeEnd: EventEmitter<WidgetChange>;
    onSaveDashboard: EventEmitter<any>;
    onCancelDashboard: EventEmitter<any>;
    revertChange: EventEmitter<RevertChangeType>;
    resolvedWidgets$: Observable<Widget[]>;
    isLoadingWidgets$: Observable<boolean>;
    copyDisabledPopoverMsg: string;
    widgetInFullscreenMode: boolean;
    inFullScreen$: Observable<boolean>;
    editMode$: BehaviorSubject<boolean>;
    get nativeElement(): any;
    readonly copyDashboardLabel: "Copy dashboard";
    readonly undoMessage: "Undo: \"{{ changeToUndo }}\"";
    readonly redoMessage: "Redo: \"{{ changeToRedo }}\"";
    readonly ACTION_BAR_EDIT_WIDGETS_PRIORITY = 10;
    private _widgets;
    private isLoading$;
    private isExecutingResolvers$;
    constructor(dynamic: DynamicComponentService, translateService: TranslateService$1, route: ActivatedRoute, modal: ModalService, widgetGlobalAutoRefresh: WidgetGlobalAutoRefreshService, router: Router, elementRef: ElementRef);
    ngOnChanges(changes: SimpleChanges): void;
    canDeactivate(omitConfirm?: boolean): Promise<boolean>;
    toggleFullscreen(hasWidget?: boolean): void;
    fullScreen(): boolean;
    toggleFullscreenOnWidget(child: DashboardChildComponent): void;
    updateWidgetClasses(widget: Widget, classes: Record<string, boolean>): void;
    updateWidgetConfig(data: any, widget: Widget): void;
    cancelDashboardSave(): Promise<void>;
    saveDashboard(): void;
    enableEditMode(): void;
    private setCopyDisabledPopoverMsg;
    private confirmClosing;
    private executeResolversOfWidgets;
    /**
     * Recursively traverses an object/array and replaces specified keys with 'this.context'
     * @param obj - The object or array to process
     * @param keys - Array of keys to replace
     * @returns The modified object with replaced values
     */
    private replaceKeysWithContext;
    static ɵfac: i0.ɵɵFactoryDeclaration<WidgetsDashboardComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<WidgetsDashboardComponent, "c8y-widgets-dashboard", never, { "widgets": { "alias": "widgets"; "required": false; }; "context": { "alias": "context"; "required": false; }; "contextDashboard": { "alias": "contextDashboard"; "required": false; }; "_settings": { "alias": "settings"; "required": false; }; "isCopyDisabled": { "alias": "isCopyDisabled"; "required": false; }; "breadcrumb": { "alias": "breadcrumb"; "required": false; }; "editModeButtons": { "alias": "editModeButtons"; "required": false; }; "isSaveDisabled": { "alias": "isSaveDisabled"; "required": false; }; }, { "onAddWidget": "onAddWidget"; "onEditWidget": "onEditWidget"; "onDeleteWidget": "onDeleteWidget"; "onChangeDashboard": "onChangeDashboard"; "onResize": "onResize"; "onEditDashboard": "onEditDashboard"; "onCopyDashboard": "onCopyDashboard"; "onDeleteDashboard": "onDeleteDashboard"; "onChangeStart": "onChangeStart"; "onChangeEnd": "onChangeEnd"; "onSaveDashboard": "onSaveDashboard"; "onCancelDashboard": "onCancelDashboard"; "revertChange": "revertChange"; }, never, never, true, never>;
}

type Aggregation = {
    id: aggregationType | null;
    title: string;
};
declare const AGGREGATIONS: Aggregation[];
declare const AGGREGATION_LIMITS: {
    MINUTELY_LIMIT: number;
    HOURLY_LIMIT: number;
    DAILY_LIMIT: number;
};
declare const AGGREGATION_ICONS: Record<aggregationType | 'undefined', string>;
declare const AGGREGATION_TEXTS: Record<aggregationType | 'undefined' | 'disabled', string>;
declare const AGGREGATION_VALUES: {
    readonly none: "NONE";
    readonly minutely: aggregationType.MINUTELY;
    readonly hourly: aggregationType.HOURLY;
    readonly daily: aggregationType.DAILY;
};
declare const AGGREGATION_VALUES_ARR: readonly ["NONE", aggregationType.MINUTELY, aggregationType.HOURLY, aggregationType.DAILY];
declare const AGGREGATION_LABELS: {
    readonly NONE: string;
    readonly MINUTELY: string;
    readonly HOURLY: string;
    readonly DAILY: string;
};
/**
 * Represents the available aggregation options.
 * Aggregation 'none' is not handled by our backend.
 */
type AggregationOption = typeof AGGREGATION_VALUES.none | `${aggregationType}`;
/**
 * Represents the status of aggregation options.
 * Used to determine which aggregation options should be disabled.
 */
type AggregationOptionStatus = {
    [key in AggregationOption]?: boolean;
};

declare class AggregationService {
    readonly AGGREGATION_MAP: {
        minutes: "NONE";
        hours: packages_client_lib.aggregationType.MINUTELY;
        days: packages_client_lib.aggregationType.HOURLY;
    };
    /**
     * Determines which aggregation options should be disabled based on the time range between two dates.
     * It calculates the time difference and checks against predefined time spans to decide if daily,
     * hourly, or minutely aggregations should be disabled.
     *
     * @param dateFrom - The start date of the time range, as a `Date` object or an ISO date string.
     * @param dateTo - The end date of the time range, as a `Date` object or an ISO date string.
     * @returns An `AggregationOptionStatus` object indicating the disabled state of each aggregation option.
     */
    getDisabledAggregationOptions(dateFrom: Date | string, dateTo: Date | string): AggregationOptionStatus;
    /**
     * Determines the new aggregation value based on the current value and disabled options.
     *
     * Goal is to switch to the next available aggregation option if the current one is disabled.
     * - If the current option is disabled, sets the control to the first available (non-disabled) option based on the following order:
     *   - If the current value is `DAILY`, it switches to `HOURLY` if it's not disabled, otherwise to `MINUTELY` if `HOURLY` is also disabled.
     *   - If the current value is `HOURLY`, it switches to `MINUTELY` if it's not disabled.
     *   - If all options are disabled, it sets the value to `NONE`.
     *
     * @param currentValue - The current aggregation option.
     * @param disabledOptions - An object containing disabled options.
     * @returns The new aggregation option.
     */
    determineFirstNewAvailableAggregationValue(currentValue: AggregationOption, disabledOptions: AggregationOptionStatus): AggregationOption;
    /**
     * Determines the aggregation value based on the provided interval.
     *
     * @param interval - The time range interval.
     * @returns The corresponding aggregation value.
     */
    determineAggregationValue(interval: Interval['id']): AggregationOption;
    static ɵfac: i0.ɵɵFactoryDeclaration<AggregationService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<AggregationService>;
}

/**
 * A service which can be used, to emit data on a dashboard level.
 * Each Widget Dashboard gets an own instance of this service provided
 * and you can then update all or only one.
 */
declare class WidgetsDashboardEventService {
    /**
     * All events sent on the current dashboard.
     */
    private events$;
    private lastValueByEvent;
    /**
     * Returns a subscribable event observable of specific event type if eventType is passed, or observable of
     * all the events if no param is passed to method.
     * @param eventType The event you want an observable for.
     * @returns An observable of event.
     */
    getObservable<T extends WidgetChangeEvent>(eventType?: WidgetChangeEventType): Observable<T['data']>;
    /**
     * Returns the last value of the event.
     * @param eventType The change event type you want the last value from.
     * @returns The last value used by this event, undefined if non was sent so far.
     */
    getLastValue(eventType: WidgetChangeEventType): WidgetTimeContext;
    /**
     * Emits a new event.
     * @param event The WidgetChangeEvent to emit.
     */
    emit(event: WidgetChangeEvent): void;
    setRealtimeTimeContextSetting(value?: boolean): void;
    /**
     * @ignore
     */
    ngOnDestroy(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<WidgetsDashboardEventService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<WidgetsDashboardEventService>;
}

type WidgetDisplaySettings = {
    /**
     * If enabled the widget is bound to the global time context. You can listen to ngOnChanges() change detection
     * to react to changes on the context. When a more detailed configuration is needed, use the <c8y-widget-time-context>
     * component instead.
     */
    globalTimeContext?: boolean;
    /**
     * If enabled the widget is bound to the global realtime context. You can listen to ngOnChanges() change detection
     * to react to changes on the context.
     */
    globalRealtimeContext?: boolean;
    /**
     * If enabled the widget is bound to the global aggregation context. You can listen to ngOnChanges() change detection
     * to react to changes on the context.
     */
    globalAggregationContext?: boolean;
    /**
     * If enabled the widget is bound to the global auto refresh context. You can listen to ngOnChanges() change detection
     * to react to changes on the context. When a more detailed configuration is needed, use the WidgetGlobalAutoRefreshService
     * service instead.
     */
    globalAutoRefreshContext?: boolean;
};
interface GlobalTimeContextWidgetConfig {
    /**
     * Indicates if instance of widget is bound to global date context. It can be only used with widgets which
     * dynamic component definition contains displaySettings allowing to use it with global date context.
     */
    widgetInstanceGlobalTimeContext?: boolean;
    /**
     * Indicates if widget that is bound to global date context can decouple from it. If that widget is decoupled, it is
     * unsubscribed from global date context updates and date context related controls are displayed on widget view.
     */
    canDecoupleGlobalTimeContext?: boolean;
}
type WidgetTimeContextState = {
    date: DateTimeContext;
    interval: Interval['id'];
    realtime: boolean;
    aggregation: aggregationType;
};
declare enum DateContextQueryParamNames {
    DATE_CONTEXT_FROM = "dateContextFrom",
    DATE_CONTEXT_TO = "dateContextTo",
    DATE_CONTEXT_INTERVAL = "dateContextInterval",
    DATE_CONTEXT_REALTIME = "dateContextRealtime",
    DATE_CONTEXT_AGGREGATION = "dateContextAggregation"
}
type DateContextFromToQueryParams = {
    [DateContextQueryParamNames.DATE_CONTEXT_FROM]: string;
    [DateContextQueryParamNames.DATE_CONTEXT_TO]: string;
    [DateContextQueryParamNames.DATE_CONTEXT_INTERVAL]?: never;
};
type DateContextIntervalQueryParams = {
    [DateContextQueryParamNames.DATE_CONTEXT_FROM]?: never;
    [DateContextQueryParamNames.DATE_CONTEXT_TO]?: never;
    [DateContextQueryParamNames.DATE_CONTEXT_INTERVAL]: Interval['id'];
};
/**
 * Input query params is an object representing all possible query params related to widget time context.
 * It can be provided by user typing them in browser URL address bar, so all of them should be considered.
 */
type InputDateContextQueryParams = {
    [DateContextQueryParamNames.DATE_CONTEXT_FROM]?: string;
    [DateContextQueryParamNames.DATE_CONTEXT_TO]?: string;
    [DateContextQueryParamNames.DATE_CONTEXT_INTERVAL]?: Interval['id'];
    [DateContextQueryParamNames.DATE_CONTEXT_REALTIME]?: boolean;
    [DateContextQueryParamNames.DATE_CONTEXT_AGGREGATION]?: aggregationType;
};
/**
 * Output query params is an object representing params that are applied to current URL in browser address bar.
 * These params are set programmatically.
 * Time context interval and time range described by date "from" and date "to" exclude each other.
 */
type OutputDateContextQueryParams = (DateContextFromToQueryParams | DateContextIntervalQueryParams) & {
    [DateContextQueryParamNames.DATE_CONTEXT_REALTIME]: boolean;
    [DateContextQueryParamNames.DATE_CONTEXT_AGGREGATION]: aggregationType;
};
declare enum WidgetTimeContextActionBarPriority {
    NONE = 0,
    LOW = 1,
    MEDIUM = 2,
    HIGH = 3
}

declare class WidgetTimeContextHelperService {
    /**
     * Validates provided param for being selectable Interval id.
     * @param intervalId Interval id to be validated.
     * @returns True if provided id is valid, selectable Interval id and false if it's not.
     */
    isSelectableInterval(intervalId: Interval['id']): boolean;
    /**
     * Validates provided date "from" and date "to":
     * - if both dates are proper date strings
     * - if provided date from is earlier than date to.
     * @param stringifiedDateFrom Date "from" that should be validated.
     * @param stringifiedDateTo Date "to" that should be validated.
     * @returns Result of validation of dates range.
     */
    isValidDateRange(stringifiedDateFrom: string, stringifiedDateTo: string): boolean;
    /**
     * Validates provided aggregation:
     * @param aggregation Date "from" that should be validated.
     * @returns Result of validation of aggregation.
     */
    isValidAggregation(aggregation: aggregationType): boolean;
    /**
     * Calculates date time context according to provided interval.
     * @param intervalId Interval id indicating time range.
     * @returns Tuple of dates- the first one is date "from" according to selected interval, second one is date "to" (now).
     */
    getDateTimeContextByInterval(intervalId: Interval['id']): DateTimeContext;
    /**
     * Defines priority for single action bar item of bar items that has the 'timecontext' groupId.
     * Widgets that uses WidgetTimeContextComponent can be assigned to three levels of priority:
     * HIGH priority means that widget is using time range pickers, realtime and aggregation features.
     * Widgets: Data points graph, Data points graph 2.0, Data points table.
     * MEDIUM priority means that widget is using time range pickers and realtime features.
     * Widgets: Event list.
     * LOW priority means that widget is using realtime feature only.
     * Widgets: Map
     * @param displaySettings Settings indicating which features of WidgetTimeContextComponent are used by widget.
     * @returns priority of widget action bar item.
     */
    getActionBarPriority(displaySettings: WidgetDisplaySettings): WidgetTimeContextActionBarPriority;
    static ɵfac: i0.ɵɵFactoryDeclaration<WidgetTimeContextHelperService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<WidgetTimeContextHelperService>;
}

declare class WidgetTimeContextQueryService {
    private activatedRoute;
    private helperService;
    private router;
    constructor(activatedRoute: ActivatedRoute, helperService: WidgetTimeContextHelperService, router: Router);
    /**
     * Returns observable that emits date context query params every time query params change.
     * Invalid values are filtered out.
     *
     * @returns Observable of date context query params.
     */
    queryParamsChange$(): Observable<InputDateContextQueryParams>;
    /**
     * Creates widget time context from query parameters.
     * Interval data takes precedence over date time context described by date "from" and date "to",
     * so if valid interval is provided, date "from" and date "to" are ignored, and they are recalculated
     * with interval.
     *
     * @returns Widget time context state based on current query params or null if query params provide no valid context.
     */
    dateTimeContextFromQueryParams(): WidgetTimeContextState | null;
    /**
     * Sets query parameters related to date time context.
     * Valid interval (and other than 'custom') takes precedence over context described by date "from" and date "to".
     * Interval and context described by date "from" and date "to" exclude each other.
     *
     * @param widgetTimeContextState Widget time context state.
     */
    setDateContextQueryParams({ interval, date, realtime, aggregation }: WidgetTimeContextState): void;
    /**
     * Clears all date time context related query parameters.
     */
    clearQueryParams(): void;
    /**
     * Parses and validates date context from query params described by date "from" and date "to".
     *
     * @returns Date context as tuple of date "from" and date "to", or null if date context is invalid.
     */
    private getDateContextFromQueryParams;
    /**
     * Parses realtime query param.
     *
     * @returns Parsed realtime value or null.
     */
    private parseRealtime;
    /**
     * Maps query params object to proper type.
     *
     * @param params Query parameters object with string values only.
     *
     * @returns Query params object of proper type.
     */
    private processQueryParams;
    /**
     * Determines if provided query params contains valid time range.
     *
     * @param params Query parameters object.
     *
     * @returns True if query params contains valid time range, otherwise false.
     */
    private queryParamsContainsTimeRange;
    static ɵfac: i0.ɵɵFactoryDeclaration<WidgetTimeContextQueryService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<WidgetTimeContextQueryService>;
}

declare class WidgetTimeContextComponent implements OnInit, OnDestroy, AfterViewInit {
    private widgetEventService;
    private dashboardChild;
    private formBuilder;
    private queryService;
    private helperService;
    private router;
    private actionBarService;
    private aggregationService;
    private route;
    readonly INTERVAL_TITLES: Record<"custom" | "hours" | "minutes" | "days" | "weeks" | "months", string>;
    readonly DATE_FORMAT = "short";
    /**
     * Indicates if the component can decouple or not.
     */
    canDecouple: boolean;
    displaySettings: WidgetDisplaySettings;
    hidden: boolean;
    /**
     * Emits each change as an array of dates [from, to].
     */
    dateContextChange: EventEmitter<any>;
    /**
     * @ignore
     */
    action: DashboardChildActionComponent;
    dropdown: BsDropdownDirective;
    /**
     * Indicates if the time context is bound to the global scope.
     */
    isCoupled: boolean;
    decoupleTimeContextLabel: "Decouple time context";
    coupleTimeContextLabel: "Couple time context";
    form: ReturnType<WidgetTimeContextComponent['createForm']>;
    actionBarInGroupPriority: number;
    disabledAggregations: Partial<Record<aggregationType, boolean>>;
    isAutoRefreshEnabled: boolean;
    readonly DEFAULT_INTERVAL: Interval['id'];
    readonly ACTION_BAR_PRIORITY = 7;
    readonly ACTION_BAR_GROUP_ID = "timecontext";
    readonly REALTIME_INTERVAL = 1000;
    private subscription;
    private destroy$;
    private navigationInProgress;
    private realtimeSubscription;
    /**
     * @ignore only DI.
     */
    constructor(widgetEventService: WidgetsDashboardEventService, dashboardChild: DashboardChildComponent, formBuilder: FormBuilder, queryService: WidgetTimeContextQueryService, helperService: WidgetTimeContextHelperService, router: Router, actionBarService: ActionBarService, aggregationService: AggregationService, route: ActivatedRoute);
    /**
     * @ignore Subscribing to the global context.
     */
    ngOnInit(): void;
    /**
     * @ignore Adding custom actions.
     */
    ngAfterViewInit(): void;
    /**
     * Toggles the coupling on or off.
     */
    toggleDecoupling(): void;
    /**
     * Applies form value to global or local date context.
     */
    applyDatetimeContext(): void;
    /**
     * Resets form to initial value and update context.
     */
    reset(): void;
    /**
     * @ignore unsubscribing.
     */
    ngOnDestroy(): void;
    private subscribeToIntervalChange;
    private subscribeToRealtimeChange;
    private subscribeToAggregationChange;
    private createForm;
    /**
     * Fires a new WidgetChangeEvent either on the local change emitter or on the global one.
     * @param widgetTimeContextState New widget time context value.*/
    private update;
    private subscribeToGlobalContext;
    private updateFormValues;
    private unsubscribeFromGlobalContext;
    private getInitialContext;
    private subscribeToQueryParamsChange;
    private clearQueryParamsIfNeeded;
    private subscribeToRouterEvents;
    private getDefaultContext;
    private startRealtime;
    private handleAutoRefreshChange;
    private onDisableAutoRefresh;
    private disableDateRangeAndAggregation;
    private enableDateRangeAndAggregation;
    private stopRealtime;
    private onRealtimeValueChange;
    private calculateAggregation;
    static ɵfac: i0.ɵɵFactoryDeclaration<WidgetTimeContextComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<WidgetTimeContextComponent, "c8y-widget-time-context", never, { "canDecouple": { "alias": "canDecouple"; "required": false; }; "displaySettings": { "alias": "displaySettings"; "required": false; }; "hidden": { "alias": "hidden"; "required": false; }; }, { "dateContextChange": "dateContextChange"; }, never, never, true, never>;
}

declare class RealtimeControlComponent implements ControlValueAccessor {
    readonly disableRealtimeLabel: "Disable realtime";
    readonly enableRealtimeLabel: "Enable realtime";
    value: boolean;
    touched: boolean;
    disabled: boolean;
    onChange: (_: any) => void;
    onTouched: () => void;
    writeValue(value: boolean): void;
    registerOnChange(fn: any): void;
    registerOnTouched(onTouched: any): void;
    markAsTouched(): void;
    setDisabledState(disabled: boolean): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<RealtimeControlComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<RealtimeControlComponent, "c8y-realtime-control", never, {}, {}, never, never, true, never>;
}

declare class AggregationPickerComponent implements ControlValueAccessor {
    /**
     * Configuration for disabling specific types of aggregation.
     * By default no aggregation type is disabled.
     */
    disabledAggregations: Partial<Record<aggregationType, boolean>>;
    readonly AGGREGATIONS: Aggregation[];
    readonly AGGREGATION_ICONS: Record<"undefined" | aggregationType, string>;
    readonly AGGREGATION_TEXTS: Record<"undefined" | "disabled" | aggregationType, string>;
    value: aggregationType;
    touched: boolean;
    disabled: boolean;
    onChange: (_: any) => void;
    onTouched: () => void;
    writeValue(value: aggregationType): void;
    registerOnChange(fn: any): void;
    registerOnTouched(onTouched: any): void;
    markAsTouched(): void;
    setDisabledState(disabled: boolean): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<AggregationPickerComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<AggregationPickerComponent, "c8y-aggregation-picker", never, { "disabledAggregations": { "alias": "disabledAggregations"; "required": false; }; }, {}, never, never, true, never>;
}

declare class WidgetTimeContextIconBar {
    globalContextButtonText: string;
    readonly AGGREGATION_ICONS: Record<"undefined" | packages_client_lib.aggregationType, string>;
    readonly AGGREGATION_TEXTS: Record<"undefined" | "disabled" | packages_client_lib.aggregationType, string>;
    /**
     * Widget configuration object.
     */
    config: any;
    ngOnInit(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<WidgetTimeContextIconBar, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<WidgetTimeContextIconBar, "c8y-widget-time-context-icon-bar", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
}

declare class DashboardModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<DashboardModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<DashboardModule, never, [typeof CommonModule, typeof ActionBarModule, typeof DynamicComponentModule, typeof i3$2.DragDropModule, typeof i5.BsDropdownModule, typeof i3.TooltipModule, typeof HeaderModule, typeof DocsModule, typeof BreadcrumbModule, typeof FormsModule, typeof i4$1.BsDatepickerModule, typeof DynamicFormsModule, typeof HelpModule, typeof DateTimePickerModule, typeof CountdownIntervalModule, typeof i16$1.IntervalPickerComponent, typeof i3$1.PopoverModule, typeof DashboardChildComponent, typeof DashboardComponent, typeof DashboardChildTitleComponent, typeof DashboardChildActionComponent, typeof WidgetsDashboardComponent, typeof WidgetTimeContextComponent, typeof RealtimeControlComponent, typeof AggregationPickerComponent, typeof WidgetAutoRefreshContextComponent, typeof WidgetAutoRefreshContextIconBarComponent, typeof AutoRefreshControlComponent, typeof AutoRefreshSelectControlComponent, typeof WidgetTimeContextIconBar], [typeof DashboardComponent, typeof DashboardChildComponent, typeof DashboardChildTitleComponent, typeof DashboardChildActionComponent, typeof WidgetsDashboardComponent, typeof WidgetTimeContextComponent, typeof AggregationPickerComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<DashboardModule>;
}

declare class DashboardChildChange {
    child: DashboardChildComponent;
    children: DashboardChildComponent[];
    private dashboard;
    private readonly MIN_WIDTH;
    private MIN_HEIGHT;
    private readonly PIXEL_SIZE_THRESHOLD;
    private diffX;
    private diffY;
    constructor(childToChange: DashboardChildComponent);
    get resize$(): rxjs.Observable<DashboardChildDimension>;
    get drag$(): rxjs.Observable<DashboardChildDimension>;
    findFreeDimension(): DashboardChildDimension;
    collapseUpAll(): void;
    arrangeAll(arrange: DashboardChildArrangement): {
        current: DashboardChildComponent;
        scan: DashboardChildComponent[];
        spacing: any;
        origin: DashboardChildDimension;
    }[];
    private arrangePipe;
    private collapseUp;
    private setDimension;
    private setPixelSize;
    private getPixelSize;
    private getDimensionSize;
    private getDimensionPosition;
    private doesCollide;
    private getCollided;
}

declare class WidgetTimeContextMediatorService {
    globalUpdate: i0.WritableSignal<any>;
    /**
     * Flag indicating the current update originated from a slider zoom interaction.
     * Used to prevent resetting initialTimeRange when syncing zoom across widgets.
     */
    isSliderZoomUpdate: i0.WritableSignal<boolean>;
    static ɵfac: i0.ɵɵFactoryDeclaration<WidgetTimeContextMediatorService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<WidgetTimeContextMediatorService>;
}

declare class WidgetTimeContextDateRangeService {
    private mediator;
    initialTimeRange: i0.WritableSignal<any>;
    displayMode: i0.WritableSignal<"dashboard" | "config" | "view_and_config">;
    fullReload$: Subject<void>;
    constructor(mediator: WidgetTimeContextMediatorService);
    updateInitialTimeRange(data: any): void;
    updateDisplayMode(mode: 'dashboard' | 'view_and_config' | 'config'): void;
    triggerFullReload(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<WidgetTimeContextDateRangeService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<WidgetTimeContextDateRangeService>;
}

declare class WidgetActionWrapperComponent implements OnDestroy {
    private dashboardChild;
    private registeredTemplate;
    set headerTemplate(template: TemplateRef<unknown>);
    ngOnDestroy(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<WidgetActionWrapperComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<WidgetActionWrapperComponent, "c8y-widget-action", never, {}, {}, never, ["*"], true, never>;
}

declare const ACTIONS_STEPPER: {
    CLICK_STEPPER_CANCEL_BTN: string;
    CLICK_STEPPER_NEXT_BTN: string;
    CLICK_STEPPER_BACK_BTN: string;
    CLICK_STEPPER_CUSTOM_BTN: string;
};

interface DateRangePickerConfig extends Partial<BsDaterangepickerConfig> {
}
interface TimeInterval {
    dateFrom: Date;
    dateTo: Date;
}
interface TimeIntervalOption {
    label: string;
    getStartDate?: () => Date;
}
declare const LAST_MINUTE: TimeIntervalOption;
declare const LAST_HOUR: {
    label: "Last hour";
    getStartDate: () => Date;
};
declare const LAST_DAY: {
    label: "Last day";
    getStartDate: () => Date;
};
declare const LAST_WEEK: {
    label: "Last week";
    getStartDate: () => Date;
};
declare const LAST_MONTH: {
    label: "Last month";
    getStartDate: () => Date;
};
declare const CUSTOM: {
    label: "Custom";
};
declare const INTERVAL_OPTIONS: TimeIntervalOption[];

declare class TimeIntervalComponent implements OnInit, AfterViewInit {
    intvervals: TimeIntervalOption[];
    CUSTOM: {
        label: "Custom";
    };
    minCustomDate: Date;
    maxCustomDate: Date;
    dateRangePickerConfig: DateRangePickerConfig;
    selectedInterval: TimeIntervalOption;
    interval: EventEmitter<TimeInterval>;
    customRange: Date[];
    private dateFormatService;
    ngOnInit(): void;
    ngAfterViewInit(): void;
    changeInterval(intervalOption: TimeIntervalOption): void;
    changeCustomRange(range: Date[]): void;
    reload(): void;
    private getEndDate;
    private rangeToInterval;
    private isToday;
    private emitInterval;
    static ɵfac: i0.ɵɵFactoryDeclaration<TimeIntervalComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<TimeIntervalComponent, "c8y-time-interval", never, { "minCustomDate": { "alias": "minCustomDate"; "required": false; }; "maxCustomDate": { "alias": "maxCustomDate"; "required": false; }; "dateRangePickerConfig": { "alias": "dateRangePickerConfig"; "required": false; }; "selectedInterval": { "alias": "selectedInterval"; "required": false; }; }, { "interval": "interval"; }, never, never, true, never>;
}

declare class ColorInputComponent implements ControlValueAccessor {
    currentValue: string;
    isDisabled: boolean;
    private onTouched;
    private onChange;
    writeValue(obj: string): void;
    registerOnChange(fn: (value: string) => void): void;
    registerOnTouched(fn: () => void): void;
    setDisabledState?(isDisabled: boolean): void;
    valueChange(value: string): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<ColorInputComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ColorInputComponent, "c8y-color-input", never, {}, {}, never, never, true, never>;
}

declare class ChangeIconComponent {
    currentIcon: i0.InputSignal<string>;
    onButtonClick: i0.OutputEmitterRef<void>;
    static ɵfac: i0.ɵɵFactoryDeclaration<ChangeIconComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ChangeIconComponent, "c8y-change-icon", never, { "currentIcon": { "alias": "currentIcon"; "required": false; "isSignal": true; }; }, { "onButtonClick": "onButtonClick"; }, never, ["*"], true, never>;
}

/**
 * Audit log component allows to show audits list. Component fetches audit records for the source object given as input.
 *
 * **Example**
 *
 * ```html
 *  <c8y-audit-log [source]="sourceId"></c8y-audit-log>
 * ```
 */
declare class AuditLogComponent implements OnInit {
    private audit;
    /**
     * The source ID for which audits will be shown in the list.
     */
    source: string | number;
    /**
     * The type of audit record to search for.
     */
    type: AuditRecordType;
    /**
     * Audit records retrieved from auditRecords endpoint.
     */
    records: Promise<IResultList<IAuditRecord>>;
    /**
     * @ignore
     */
    constructor(audit: AuditService);
    /**
     * After page view is initialized, component gets audit records from auditRecords endpoint.
     */
    ngOnInit(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<AuditLogComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<AuditLogComponent, "c8y-audit-log", never, { "source": { "alias": "source"; "required": false; }; "type": { "alias": "type"; "required": false; }; }, {}, never, never, true, never>;
}

/** Audit module allows to show audits list. */
declare class AuditLogModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<AuditLogModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<AuditLogModule, never, [typeof CommonModule, typeof AuditLogComponent], [typeof AuditLogComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<AuditLogModule>;
}

interface ISelectModalInternalObject extends ISelectModalObject {
    selectedId: string | number;
}
declare class SelectModalComponent implements ProductExperienceEventSource {
    private bsModalRef;
    icon: SupportedIconsSuggestions;
    title: string;
    subTitle: string;
    items: ISelectModalInternalObject[];
    mode: ModalSelectionMode;
    disableSelected: boolean;
    showFilter: boolean;
    additionalFilterTemplate: TemplateRef<any>;
    areMoreEntries: boolean;
    set labels(labels: ModalLabels);
    get labels(): ModalLabels;
    noItemsMessage: string;
    hideEmptyItems: boolean;
    result: EventEmitter<IIdentified[]>;
    search: EventEmitter<string>;
    onChoiceUpdated: EventEmitter<IIdentified>;
    selected: boolean;
    filterTerm: string;
    listItems: ISelectModalInternalObject[];
    productExperienceEvent: ProductExperienceEvent;
    emptyItemsOnly: boolean;
    private debouncer;
    private _labels;
    constructor(bsModalRef: BsModalRef);
    ngOnChanges(changes: SimpleChanges): Promise<void>;
    updatePipe(filterTerm: string): void;
    updateChoice({ item, id }: {
        item: any;
        id: any;
    }): void;
    dismiss(): void;
    select(): void;
    ngOnDestroy(): void;
    private getOutput;
    static ɵfac: i0.ɵɵFactoryDeclaration<SelectModalComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<SelectModalComponent, "c8y-select-modal", never, { "icon": { "alias": "icon"; "required": false; }; "title": { "alias": "title"; "required": false; }; "subTitle": { "alias": "subTitle"; "required": false; }; "items": { "alias": "items"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "disableSelected": { "alias": "disableSelected"; "required": false; }; "showFilter": { "alias": "showFilter"; "required": false; }; "additionalFilterTemplate": { "alias": "additionalFilterTemplate"; "required": false; }; "areMoreEntries": { "alias": "areMoreEntries"; "required": false; }; "labels": { "alias": "labels"; "required": false; }; "noItemsMessage": { "alias": "noItemsMessage"; "required": false; }; "hideEmptyItems": { "alias": "hideEmptyItems"; "required": false; }; }, { "result": "result"; "search": "search"; "onChoiceUpdated": "onChoiceUpdated"; }, never, never, true, never>;
}

declare class SelectModalFilterPipe implements PipeTransform {
    transform(items: ISelectModalObject[], filterTerm: string): any;
    private filterContainString;
    private extractValues;
    static ɵfac: i0.ɵɵFactoryDeclaration<SelectModalFilterPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<SelectModalFilterPipe, "selectModalFilterPipe", true>;
}

declare class SelectModalModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<SelectModalModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<SelectModalModule, never, [typeof i5.BsDropdownModule, typeof CommonModule, typeof ListGroupModule, typeof CoreSearchModule, typeof FormsModule, typeof ProductExperienceModule, typeof SelectModalComponent, typeof SelectModalFilterPipe], [typeof SelectModalComponent, typeof SelectModalFilterPipe]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<SelectModalModule>;
}

/**
 * A wrapper class for handling realtime notifications in RxJS fashion.
 */
declare abstract class RealtimeService<T> {
    protected realtimeSubject: RealtimeSubjectService;
    /**
     * A flag displaying if realtime notifications are currently active.
     */
    get active(): boolean;
    /**
     * An observable emitting a value in case the realtime connection has been interrupted.
     * Can be used to reload data of e.g. a datapoint graph that wasn't received while realtime was interrupted.
     */
    get reconnect$(): Observable<void>;
    /**
     * An observable emitting either `connected` or `disconnected` depending on the state of the realtime connection.
     * Can be used to e.g. inform the user about the interrupted realtime connection.
     */
    get connectionStatus$(): Observable<'connected' | 'disconnected'>;
    private isActive;
    constructor(realtimeSubject: RealtimeSubjectService);
    /**
     * Get an Observable of all realtime notifications.
     *
     * @param entityOrId Entity object or id
     *
     * @returns An [[Observable]] of notifications wrapped as [[RealtimeMessage]]
     */
    onAll$(entityOrId?: string | number | IIdentified): Observable<RealtimeMessage<T>>;
    /**
     * Subscribes again all realtime channels with active observers.
     */
    start(): void;
    /**
     * Stops realtime notifications and unsubscribes all realtime channels.
     */
    stop(): void;
    /**
     * Get an Observable of all CREATE realtime notifications.
     *
     * @param entityOrId Entity object or id
     *
     * @returns An [[Observable]] of newly created entity objects.
     */
    onCreate$(entityOrId?: string | number | IIdentified): Observable<T>;
    /**
     * Get an Observable of all UPDATE realtime notifications.
     *
     * @param entityOrId Entity object or id
     *
     * @returns An [[Observable]] of updated entity objects.
     */
    onUpdate$(entityOrId?: string | number | IIdentified): Observable<T>;
    /**
     * Get an Observable of all DELETE realtime notifications.
     *
     * @param entityOrId Entity object or id
     *
     * @returns An [[Observable]] of deleted entity objects.
     */
    onDelete$(entityOrId?: string | number | IIdentified): Observable<number>;
    protected getIdString(reference: number | string | IIdentified): string;
    protected getChannel(entityOrId?: string | number | IIdentified): string;
    protected abstract channel(): string;
}

declare class RealtimeButtonComponent {
    service: RealtimeService<unknown>;
    label: string;
    title: string;
    disabled: boolean;
    onToggle: EventEmitter<boolean>;
    get active(): boolean;
    toggle(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<RealtimeButtonComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<RealtimeButtonComponent, "c8y-realtime-btn", never, { "service": { "alias": "service"; "required": false; }; "label": { "alias": "label"; "required": false; }; "title": { "alias": "title"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "onToggle": "onToggle"; }, never, never, true, never>;
}

declare class RealtimeModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<RealtimeModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<RealtimeModule, never, [typeof CommonModule, typeof RealtimeButtonComponent], [typeof RealtimeButtonComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<RealtimeModule>;
}

interface RangeDisplay {
    /**
     * The minimum value of the range display (optional)
     * Default should be 0.
     */
    min?: number;
    /**
     * The maximum value of the range display (optional)
     * Default should be 100.
     */
    max?: number;
    /**
     * Target value of the measurement (optional)
     */
    target?: number;
    /**
     * Current value of the measurement (optional)
     */
    current?: number;
    /**
     * Current time of the measurement (optional)
     */
    time?: string;
    /**
     * Minimum value for the yellow range. (optional)
     */
    yellowRangeMin?: number;
    /**
     * Maximum value for the yellow range. (optional)
     */
    yellowRangeMax?: number;
    /**
     * Minimum value for the red range. (optional)
     */
    redRangeMin?: number;
    /**
     * Maximum value for the red range. (optional)
     */
    redRangeMax?: number;
    /**
     * Unit of the measurement. E.g. 'C'(optional)
     */
    unit?: string;
    /**
     * Determines the number of decimal places (optional)
     */
    fractionSize?: number;
    /**
     * Widget orientation. Can only be 'horizontal' or 'vertical'. (optional)
     */
    orientation?: 'horizontal' | 'vertical';
}

declare class RangeDisplayComponent implements AfterViewInit, OnDestroy, OnChanges {
    private sanitizer;
    config: RangeDisplay;
    display: 'full' | 'compact' | 'inline';
    private currentRangeWidthObserver;
    private currentRangeWidthChanged;
    private readonly CURRENT_RANGE_WIDTH_TRANSITION_TIME;
    private readonly DEFAULT_TOOLTIP_SHIFT;
    private readonly MIN_TOOLTIP_SHIFT;
    private tooltipShift;
    get inlineStyle(): _angular_platform_browser.SafeStyle;
    private rangeDisplay;
    private currentRangeElement;
    private destroyed$;
    constructor(sanitizer: DomSanitizer);
    ngOnChanges(): void;
    ngAfterViewInit(): void;
    ngOnDestroy(): void;
    /**
     *
     * @returns true if the target value is within the defined range, false otherwise.
     * This method checks if the target value is defined and falls within the minimum and maximum range
     */
    checkTarget(): boolean;
    rulerCalc(index: any): number;
    trackByIndex(index: number): number;
    isRedRangeDisplayed(): any;
    isYellowRangeDisplayed(): any;
    /**
     * Checks if the given range is displayed.
     * @param rangeMin - The minimum value of the range.
     * @param rangeMax - The maximum value of the range.
     * * @returns true if the range is displayed, false otherwise.
     */
    isRangeDisplayed(rangeMin: any, rangeMax: any): any;
    private setupTooltipShifting;
    private setTooltipShiftValue;
    private setupTooltipShiftingIfPossible;
    private getTooltipBackground;
    private isValueInRange;
    static ɵfac: i0.ɵɵFactoryDeclaration<RangeDisplayComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<RangeDisplayComponent, "c8y-range-display", never, { "config": { "alias": "config"; "required": false; }; "display": { "alias": "display"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * The angular module definition for a range-display.
 * @exports RangeDisplayModule
 */
declare class RangeDisplayModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<RangeDisplayModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<RangeDisplayModule, never, [typeof CommonModule, typeof RangeDisplayComponent], [typeof RangeDisplayComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<RangeDisplayModule>;
}

interface DisplayOption {
    name: 'AUTO' | 'GRID' | 'LIST';
    value: string;
    label: string;
    default?: boolean;
    getListClass: any;
}

declare class ListDisplaySwitchComponent implements OnInit {
    private location;
    /**
     * The key used to identify the list in local storage.
     */
    listKey: string;
    /**
     * The length of the list to display.
     */
    set listLength(val: number);
    /**
     * The pipe used to filter the list items. It should return an observable that emits the filtered items.
     */
    filterPipe: rxjs.UnaryFunction<rxjs.Observable<unknown>, rxjs.Observable<unknown>>;
    onListClassChange: EventEmitter<string>;
    selectedOption: DisplayOption;
    readonly DISPLAY_OPTIONS: DisplayOption[];
    private readonly AUTO_GRID_ITEMS_LIMIT;
    private _listLength;
    constructor(location: Location);
    ngOnInit(): void;
    onOptionSelect(option: DisplayOption): void;
    private loadSelectedOption;
    private getLocalStorageOption;
    private getDefaultOption;
    private getLocalStorageKey;
    private getListKey;
    static ɵfac: i0.ɵɵFactoryDeclaration<ListDisplaySwitchComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ListDisplaySwitchComponent, "c8y-list-display-switch", never, { "listKey": { "alias": "listKey"; "required": false; }; "listLength": { "alias": "listLength"; "required": false; }; "filterPipe": { "alias": "filterPipe"; "required": false; }; }, { "onListClassChange": "onListClassChange"; }, never, never, true, never>;
}

/**
 * The angular module definition for the list display switcher.
 * It allows to switch between a list and a grid view.
 * @exports ListDisplaySwitchComponent
 */
declare class ListDisplaySwitchModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<ListDisplaySwitchModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<ListDisplaySwitchModule, never, [typeof CommonModule, typeof i2$1.FormsModule, typeof ListDisplaySwitchComponent], [typeof ListDisplaySwitchComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<ListDisplaySwitchModule>;
}

/**
 * A hook to add wizard entries.
 * @deprecated Consider using the `hookWizard` function instead.
 */
declare const HOOK_WIZARD: InjectionToken<WizardExtension[]>;
/**
 * A hook to add wizard entries.
 *
 * You can either provide a single `WizardEntry` as parameter:
 * ```typescript
 *  hookWizard(...)
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  hookWizard([...])
 * ```
 *
 * Or you provide an Service that implements `ExtensionFactory<WizardEntry>`
 * ```typescript
 *  export class MyWizardFactory implements ExtensionFactory<WizardEntry> {...}
 *  ...
 *  hookWizard(MyWizardFactory)
 * ```
 * A typed alternative to `HOOK_WIZARD`.
 * @param wizard The `WizardEntry`'s or `ExtensionFactory` to be provided.
 * @returns An `Provider` to be provided in your module.
 */
declare function hookWizard(wizard: GenericHookType<WizardEntry>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
interface Wizard<T = any> {
    /**
     * The id parameter identifies the particular wizard and can be used to refer to it when hooking wizard entries.
     * Example: "wizardId".
     */
    id: string;
    /** Wizard configuration object. */
    wizardConfig?: WizardConfig;
    /** A state that will be assigned to the actual component contained by the wizard. */
    componentInitialState?: Partial<T>;
    /** The event that is emitted when the wizard entry is selected. */
    onSelect?: EventEmitter<WizardEntry>;
    /** The event that is emitted when the wizard is closed. */
    onClose?: EventEmitter<any>;
    /** The event that is emitted when the wizard is reset. */
    onReset?: EventEmitter<any>;
}
interface WizardConfig {
    /** Text that will be displayed in the header of the wizard  */
    headerText?: string;
    /** Icon that will be displayed in the header of the wizard  */
    headerIcon?: SupportedIconsSuggestions;
    /** Text that will be displayed in the header of the wizard body section  */
    bodyHeaderText?: string;
    /** Icon that will be displayed in the header of the wizard body section  */
    bodyHeaderIcon?: SupportedIconsSuggestions;
}
/**
 * A single item in the wizard.
 * An interface describing the entry displayed in the first step of the wizard as well as the configuration of the second step and their way of interaction.
 */
interface WizardEntry {
    /**
     * The identifier of a wizard to which the entry will be hooked.
     * Example: "wizardId".
     */
    wizardId: string;
    /** The name that will be displayed in the wizard menu  */
    name: string;
    /** The path where user will be redirected when this entry is selected in the wizard's menu. Takes precedence over `component` property. */
    path?: string;
    /** The component that will be rendered when this entry is selected in the wizard's menu. If `path` is provided, the `component` will be ignored. */
    component?: Type<any>;
    /** The injector to use. If not set, default injector will be used. */
    injector?: Injector;
    /** The icon that will be shown in the wizard menu next to the item. */
    c8yIcon?: SupportedIconsSuggestions;
}
type WizardExtension = WizardEntry | WizardEntry[] | ExtensionFactory<WizardEntry>;

declare class WizardService extends ExtensionPointForPlugins<WizardEntry> {
    private router;
    /** Wizard header subject. It emits header template. */
    readonly headerTemplate$: Subject<{
        wizardId: string;
        template: TemplateRef<any>;
    }>;
    /** Wizard body subject. It emits body template. */
    readonly bodyTemplate$: Subject<{
        wizardId: string;
        template: TemplateRef<any>;
    }>;
    /** Wizard footer subject. It emits footer template. */
    readonly footerTemplate$: Subject<{
        wizardId: string;
        template: TemplateRef<any>;
    }>;
    constructor(rootInjector: Injector, router: Router, plugins: PluginsResolveService);
    /**
     * Returns the current state.
     * @returns The current set of entries.
     * @readonly
     */
    get state(): Set<WizardEntry>;
    /**
     * Adds a new entry in the wizard.
     * @param entry Wizard entry to add.
     */
    add(entry: WizardEntry): void;
    /**
     * Removes entry from the wizard.
     * @param entry Wizard entry to remove.
     */
    remove(entry: WizardEntry): void;
    /**
     * List of wizard entries matching the given id.
     * @param id
     * @returns observable with list of wizard entries.
     */
    getEntriesListById(id: string): Observable<WizardEntry[]>;
    protected setupItemsObservable(): Observable<WizardEntry[]>;
    private getUniqueListBy;
    private getUniqIdentifierForKeys;
    static ɵfac: i0.ɵɵFactoryDeclaration<WizardService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<WizardService>;
}

declare class WizardOutletComponent implements AfterViewInit, OnDestroy {
    private router;
    private c8yWizardService;
    private viewContainerRef;
    private injector;
    container: ViewContainerRef;
    /**
     * The initial state to be assigned to the created component.
     */
    initialState: any;
    /**
     * The id parameter identifies the particular wizard and can be used to refer to it when hooking wizard entries.
     * Example: "wizardId".
     */
    id: string;
    /**
     * The event that is emitted when the wizard entry is clicked.
     */
    onSelect: EventEmitter<WizardEntry>;
    /**
     * The event that is emitted when the URL path is provided.
     */
    onPath: EventEmitter<string>;
    /**
     * List of wizard entries.
     */
    entries: WizardEntry[];
    /**
     * @ignore
     */
    showList: boolean;
    /**
     * @ignore
     */
    private destroy$;
    /**
     * @ignore
     */
    private componentInstance;
    constructor(router: Router, c8yWizardService: WizardService, viewContainerRef: ViewContainerRef, injector: Injector);
    ngAfterViewInit(): void;
    /**
     * Handles the wizard entry, if the entry contains a path, the user will be redirected to it.
     * Otherwise, an attempt will be made to create a dynamic component provided in the entry.
     * @param entry Wizard menu entry.
     */
    handleEntry(entry?: WizardEntry): void;
    /**
     * Resets the wizard to its initial state.
     */
    reset(): void;
    ngOnDestroy(): void;
    private onEntriesLoaded;
    private handlePath;
    private handleComponent;
    static ɵfac: i0.ɵɵFactoryDeclaration<WizardOutletComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<WizardOutletComponent, "c8y-wizard-outlet", never, { "initialState": { "alias": "initialState"; "required": false; }; "id": { "alias": "id"; "required": false; }; }, { "onSelect": "onSelect"; "onPath": "onPath"; }, never, never, true, never>;
}

/**
 * A generic component that is intended to serve as the building block of more wizards.
 *
 * **Example**
 * ```html
 * <button
 *    title="Add application"
 *    class="btn btn-primary"
 *    (click)="addApplication()"
 *  >
 *    Add application
 *  </button>
 * ```
 *
 * ```ts
 * import { Component } from '@angular/core';
 * import { WizardConfig, WizardService, Wizard } from '@c8y/ngx-components';
 * import { ModalOptions } from 'ngx-bootstrap/modal';
 *
 * @Component({
 *  selector: 'c8y-add-application-wizard',
 *  templateUrl: './templatePath'
 * })
 * export class AddApplicationWizardComponent {
 *   constructor(private wizardService: WizardService) {}
 *
 *   addApplication() {
 *     const wizardConfig: WizardConfig = {
 *       headerText: 'Add Application',
 *       headerIcon: 'c8y-icon-modules',
 *       bodyHeaderText: 'Select methods',
 *       bodyHeaderIcon: 'c8y-icon-modules'
 *     };
 *
 *     const initialState: Wizard = {
 *       wizardConfig,
 *       id: 'uploadApplication'
 *     };
 *
 *     const modalOptions: ModalOptions = { initialState };
 *
 *     this.wizardService.show(modalOptions);
 *   }
 * }
 * ```
 */
declare class WizardComponent<T = any> implements Wizard<T>, OnInit {
    wizardService: WizardService;
    bsModalRef: BsModalRef;
    header: TemplateRef<any>;
    body: TemplateRef<any>;
    footer: TemplateRef<any>;
    outlet: WizardOutletComponent;
    /**
     * The id parameter identifies the particular wizard and can be used to refer to it when hooking wizard entries.
     * Example: "wizardId".
     */
    id: string;
    /**
     * A configuration object that allows you to set header values, both text and icon.
     */
    wizardConfig: WizardConfig;
    /**
     * A state that will be assigned to the actual component contained by the wizard.
     */
    componentInitialState: Partial<T>;
    /**
     * The event that is emitted when the wizard is closed.
     */
    onClose: EventEmitter<any>;
    /**
     * The event that is emitted when the wizard is reseted.
     */
    onReset: EventEmitter<any>;
    /**
     * The event that is emitted when the wizard entry is clicked.
     */
    onSelect: EventEmitter<WizardEntry>;
    readonly headerTemplate$: rxjs.Observable<{
        wizardId: string;
        template: TemplateRef<any>;
    }>;
    readonly bodyTemplate$: rxjs.Observable<{
        wizardId: string;
        template: TemplateRef<any>;
    }>;
    readonly footerTemplate$: rxjs.Observable<{
        wizardId: string;
        template: TemplateRef<any>;
    }>;
    constructor(wizardService: WizardService, bsModalRef: BsModalRef);
    ngOnInit(): void;
    /**
     * Resets the wizard.
     * @param result Custom result object which will be emitted via onReset output.
     */
    reset(result?: any): void;
    /**
     * Closes the wizard.
     * @param result Custom result object which will be emitted via onClose output.
     */
    close(result?: any): void;
    onPath(): void;
    private emitTemplates;
    static ɵfac: i0.ɵɵFactoryDeclaration<WizardComponent<any>, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<WizardComponent<any>, "c8y-wizard", never, { "id": { "alias": "id"; "required": false; }; "wizardConfig": { "alias": "wizardConfig"; "required": false; }; }, { "onClose": "onClose"; "onReset": "onReset"; "onSelect": "onSelect"; }, never, never, true, never>;
}

declare class WizardHeaderComponent implements OnInit {
    private wizard;
    private wizardService;
    headerContent: TemplateRef<any>;
    constructor(wizard: WizardComponent, wizardService: WizardService);
    ngOnInit(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<WizardHeaderComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<WizardHeaderComponent, "c8y-wizard-header", never, {}, {}, never, ["*"], true, never>;
}

declare class WizardBodyComponent implements OnInit {
    private wizard;
    private wizardService;
    bodyContent: TemplateRef<any>;
    constructor(wizard: WizardComponent, wizardService: WizardService);
    ngOnInit(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<WizardBodyComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<WizardBodyComponent, "c8y-wizard-body", never, {}, {}, never, ["*"], true, never>;
}

declare class WizardFooterComponent implements OnInit {
    private wizard;
    private wizardService;
    footerContent: TemplateRef<any>;
    constructor(wizard: WizardComponent, wizardService: WizardService);
    ngOnInit(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<WizardFooterComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<WizardFooterComponent, "c8y-wizard-footer", never, {}, {}, never, ["*"], true, never>;
}

declare class WizardModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<WizardModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<WizardModule, never, [typeof i1$3.ModalModule, typeof i1.CommonModule, typeof CommonModule, typeof WizardComponent, typeof WizardOutletComponent, typeof WizardHeaderComponent, typeof WizardBodyComponent, typeof WizardFooterComponent], [typeof WizardComponent, typeof WizardOutletComponent, typeof WizardHeaderComponent, typeof WizardBodyComponent, typeof WizardFooterComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<WizardModule>;
}

declare class CoreModule {
    static forRoot(): ModuleWithProviders<CoreModule>;
    static ɵfac: i0.ɵɵFactoryDeclaration<CoreModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<CoreModule, never, [typeof TimeIntervalComponent, typeof ColorInputComponent, typeof ChangeIconComponent], [typeof ApplicationModule, typeof ActionBarModule, typeof ActionModule, typeof AlertModule, typeof AuditLogModule, typeof BootstrapModule, typeof BreadcrumbModule, typeof CommonModule, typeof DataGridModule, typeof DropAreaModule, typeof HeaderModule, typeof ModalModule, typeof NavigatorModule, typeof AuthenticationModule, typeof CoreSearchModule, typeof SelectModule, typeof TabsModule, typeof UserModule, typeof FormsModule, typeof DeviceStatusModule, typeof DocsModule, typeof StepperModule, typeof DynamicComponentModule, typeof DashboardModule, typeof ListGroupModule, typeof SelectModalModule, typeof FilePickerModule, typeof FilePickerFormControlModule, typeof DatePickerModule, typeof ProductExperienceModule, typeof HelpModule, typeof RealtimeModule, typeof RangeDisplayModule, typeof ListDisplaySwitchModule, typeof WizardModule, typeof PluginsModule, typeof DynamicFormsModule, typeof PropertiesListModule, typeof DateTimePickerModule, typeof TimePickerModule, typeof ClipboardModule, typeof VersionModule, typeof DrawerModule, typeof NavigatorTopModule, typeof NavigatorBottomModule, typeof UiSettingsModule, typeof TimeIntervalComponent, typeof CountdownIntervalModule, typeof ColorInputComponent, typeof ChangeIconComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<CoreModule>;
}

declare class QuickLinkComponent implements OnInit {
    icon: any;
    label: any;
    classes: string;
    ngOnInit(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<QuickLinkComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<QuickLinkComponent, "c8y-quick-link", never, { "icon": { "alias": "icon"; "required": false; }; "label": { "alias": "label"; "required": false; }; }, {}, never, never, true, never>;
}

declare class QuickLinkModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<QuickLinkModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<QuickLinkModule, never, [typeof CoreModule, typeof QuickLinkComponent], [typeof QuickLinkComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<QuickLinkModule>;
}

/**
 * Pipe to filter items by searching in their label property.
 * Performs a case-insensitive partial match on the item's label.
 *
 * @example
 * ```html
 * <c8y-li *ngFor="let item of items | filterBy: searchValue">
 *   {{ item.label }}
 * </c8y-li>
 * ```
 */
declare class FilterByPipe implements PipeTransform {
    /**
     * Filters an array of SelectableItemTemplate by checking if the label
     * contains the search value (case-insensitive).
     *
     * @param items - Array of items to filter
     * @param searchValue - Search string to match against item labels
     * @returns Filtered array of items
     */
    transform(items: SelectableItemTemplate[] | null | undefined, searchValue?: string): SelectableItemTemplate[];
    static ɵfac: i0.ɵɵFactoryDeclaration<FilterByPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<FilterByPipe, "filterBy", true>;
}

interface ProviderProperties {
    /** The unique identification of the provider the configration applies to */
    provider: string;
    /** All other provider configuration properties as defined in its schema */
    [key: string]: any;
}

/**
 * Allows you to fully configure a provider configuration page.
 */
interface DynamicProviderConfig {
    /** Allows you to configure routing and navigator properties for the provider page. */
    navigation: DynamicProviderNavigationConfig;
    /** Allows you to configure tabs for the provider page. */
    tab?: DynamicProviderTabsConfig;
    /** Allows you to configure page title, field and button labels, messages, etc. */
    layout: DynamicProviderLayoutConfig;
    /** Allows you to configure necessary service endpoints. */
    endpoint: DynamicProviderEndpointConfig;
}
type DynamicProviderTabsConfig = TabWithTemplate<string> & {
    canActivate?: any[];
};
type DynamicProviderNavigationConfig = NavigatorNodeData & {
    canActivate?: any[];
};
interface DynamicProviderLayoutConfig {
    /** The title displayed on the page header */
    pageTitle: string;
    /** The title displayed on the card header */
    cardTitle: string;
    /** Optional explanatory text displayed before the form */
    description?: string;
    /** The label to use for the provider selection dropdown */
    providerName: string;
    /** The placeholder text to use for the provider selection dropdown */
    providerNamePlaceholder: string;
    /** Message to display if user input does not match any of the available dropdown options */
    providerNameNoMatchesHint: string;
    /** Roles required for user to delete configuration */
    deleteRoles?: string[];
    /** Label to use for the delete button */
    deleteBtnLabel: string;
    /** Roles required for user to save configuration */
    saveRoles?: string[];
    /** Label to use for the save button */
    saveBtnLabel: string;
    /** Function to call before configuration is saved */
    beforeSaveHook?: (model: ProviderProperties, fields: FormlyFieldConfig[]) => Promise<ProviderProperties> | ProviderProperties;
    /** Message text to display after successful save/update of the configuration */
    configurationUpdatedSuccessMsg: string;
    /** The title displayed on the header of the modal for deletion confirmation */
    deleteConfigurationModalTitle: string;
    /** The text displayed in the body of the modal for deletion confirmation */
    deleteConfigurationModalBody: string;
    /** The label used for the OK button in the modal for deletion confirmation */
    deleteConfigurationModalOkBtnLabel?: string;
    /** The label used for the cancel button in the modal for deletion confirmation */
    deleteConfigurationModalCancelBtnLabel?: string;
    /** Message text to display after successful delete of the configuration */
    configurationDeletedSuccessMsg: string;
}
interface DynamicProviderEndpointConfig {
    /** Service endpoint that provides provider definitions */
    definitionsEndpoint: Endpoint;
    /** Service endpoint for configuration CRUD operations */
    configurationEndpoint: Endpoint;
}
/**
 * Used to define an enpoint by providing a base and list part of a URL.
 */
interface Endpoint {
    /** Base part of your endpoint URL, e.g. <code>/services/notifications/providers</code> */
    baseUrl: string;
    /** Entity part of your endpoint URL, e.g. <code>definitions</code> or <code>configuration</code> */
    listUrl: string;
}

interface ProviderDefinition {
    /** Unique identifier of the provider */
    id: string;
    /** A user friendly name of the provider */
    displayName: string;
    /** JSON Schema defining the configuration object for the provider */
    schema: JSONSchema7;
}

/**
 * @deprecated Consider using the `hookDynamicProviderConfig` function instead.
 */
declare const HOOK_DYNAMIC_PROVIDER_CONFIG: InjectionToken<unknown>;
/**
 * You can either provide a single `DynamicProviderConfig` as parameter:
 * ```typescript
 *  hookDynamicProviderConfig(...)
 * ```
 *
 * Or an array to directly register multiple:
 * ```typescript
 *  hookDynamicProviderConfig([...])
 * ```
 *
 * Or you provide an Service that implements `ExtensionFactory<DynamicProviderConfig>`
 * ```typescript
 *  export class MyDynamicProviderConfigFactory implements ExtensionFactory<DynamicProviderConfig> {...}
 *  ...
 *  hookDynamicProviderConfig(MyDynamicProviderConfigFactory)
 * ```
 * A typed alternative to `HOOK_DYNAMIC_PROVIDER_CONFIG`.
 * @param config The `DynamicProviderConfig`'s or `ExtensionFactory` to be provided.
 * @returns An `Provider` to be provided in your module.
 */
declare function hookDynamicProviderConfig(config: GenericHookType<DynamicProviderConfig>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;

declare class ProviderConfigurationNodeFactory implements NavigatorNodeFactory {
    private injector;
    private config;
    private nodes;
    constructor(config: DynamicProviderConfig[][], injector: Injector);
    get(): NavigatorNode[] | Observable<NavigatorNode[]>;
    private checkCanActivate;
    private getGuards;
    static ɵfac: i0.ɵɵFactoryDeclaration<ProviderConfigurationNodeFactory, [{ optional: true; }, null]>;
    static ɵprov: i0.ɵɵInjectableDeclaration<ProviderConfigurationNodeFactory>;
}

declare class ProviderConfigurationRouteFactory implements ExtensionFactory<Route$1> {
    private config;
    constructor(config: DynamicProviderConfig[][]);
    get(): any[];
    static ɵfac: i0.ɵɵFactoryDeclaration<ProviderConfigurationRouteFactory, [{ optional: true; }]>;
    static ɵprov: i0.ɵɵInjectableDeclaration<ProviderConfigurationRouteFactory>;
}

declare class ProviderConfigurationService extends Service<ProviderProperties> {
    private static readonly NO_DETAIL_ID;
    protected baseUrl: string;
    protected listUrl: string;
    constructor(client: FetchClient, activatedRoute: ActivatedRoute);
    detail(): Promise<IResult<ProviderProperties>>;
    update(entity: Partial<ProviderProperties>): Promise<IResult<ProviderProperties>>;
    delete(): Promise<IResult<null>>;
    /** There is a single provider configuration per tenant and detail URL is not needed */
    protected getDetailUrl(_: string | number | IIdentified): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<ProviderConfigurationService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<ProviderConfigurationService>;
}

declare class ProviderDefinitionsService extends Service<ProviderDefinition> {
    protected baseUrl: string;
    protected listUrl: string;
    constructor(client: FetchClient, activatedRoute: ActivatedRoute);
    list(): Promise<IResultList<ProviderDefinition>>;
    static ɵfac: i0.ɵɵFactoryDeclaration<ProviderDefinitionsService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<ProviderDefinitionsService>;
}

declare class ProviderConfigurationComponent {
    permissions: Permissions;
    private activatedRoute;
    private modalService;
    private alertService;
    private providerDefinitionsService;
    private providerConfigurationService;
    private jsonschema;
    layout$: Observable<DynamicProviderLayoutConfig>;
    allRoles$: Observable<string[]>;
    providers$: Observable<ProviderDefinition[]>;
    selectedProvider$: Observable<ProviderDefinition>;
    changeProvider$: Subject<ProviderDefinition>;
    configuration$: Observable<ProviderProperties>;
    providerInput$: BehaviorSubject<string>;
    form: FormGroup<{}>;
    model: ProviderProperties;
    fields: FormlyFieldConfig[];
    options: FormlyFormOptions;
    private reload$;
    private updatedConfiguration$;
    private layout;
    private beforeSaveHook;
    constructor(permissions: Permissions, activatedRoute: ActivatedRoute, modalService: ModalService, alertService: AlertService, providerDefinitionsService: ProviderDefinitionsService, providerConfigurationService: ProviderConfigurationService, jsonschema: C8yJSONSchema);
    ngOnInit(): void;
    saveProviderConfiguration(): Promise<void>;
    deleteProviderConfiguration(): Promise<void>;
    private removeEncryptedValues;
    static ɵfac: i0.ɵɵFactoryDeclaration<ProviderConfigurationComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ProviderConfigurationComponent, "c8y-sms-gateway", never, {}, {}, never, never, true, never>;
}

declare class ProviderConfigurationModule {
    static config(config: DynamicProviderConfig[]): ModuleWithProviders<ProviderConfigurationModule>;
    static ɵfac: i0.ɵɵFactoryDeclaration<ProviderConfigurationModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<ProviderConfigurationModule, never, [typeof CoreModule, typeof CommonModule, typeof DynamicFormsModule, typeof ProviderConfigurationComponent], [typeof ProviderConfigurationComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<ProviderConfigurationModule>;
}

declare class AlarmRealtimeService extends RealtimeService<IAlarm> {
    protected realtimeSubject: RealtimeSubjectService;
    constructor(realtimeSubject: RealtimeSubjectService);
    protected channel(): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<AlarmRealtimeService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<AlarmRealtimeService>;
}

declare class AlarmWithChildrenRealtimeService extends RealtimeService<IAlarm> {
    protected realtimeSubject: RealtimeSubjectService;
    constructor(realtimeSubject: RealtimeSubjectService);
    protected channel(): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<AlarmWithChildrenRealtimeService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<AlarmWithChildrenRealtimeService>;
}

declare class EventRealtimeService extends RealtimeService<IEvent> {
    protected realtimeSubject: RealtimeSubjectService;
    constructor(realtimeSubject: RealtimeSubjectService);
    protected channel(): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<EventRealtimeService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<EventRealtimeService>;
}

declare class ManagedObjectRealtimeService extends RealtimeService<IManagedObject> {
    protected realtimeSubject: RealtimeSubjectService;
    constructor(realtimeSubject: RealtimeSubjectService);
    /**
     * Get an Observable of all CREATE realtime notifications.
     *
     * @returns An [[Observable]] of newly created entity objects.
     */
    onCreate$(): Observable<IManagedObject>;
    protected channel(): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<ManagedObjectRealtimeService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<ManagedObjectRealtimeService>;
}

declare class MeasurementRealtimeService extends RealtimeService<IMeasurement> {
    protected realtimeSubject: RealtimeSubjectService;
    protected measurementService: MeasurementService;
    constructor(realtimeSubject: RealtimeSubjectService, measurementService: MeasurementService);
    /**
     * Get an Observable of all measurements filtered by fragment and series.
     *
     * @param {string} fragment Measurement fragment
     *
     * @param {string} series Measurement series
     *
     * @param {string | number | IIdentified} entityOrId Entity object or id
     *
     * @returns An [[Observable]] of newly created entity objects.
     */
    onCreateOfSpecificMeasurement$(fragment: string, series: string, entityOrId?: string | number | IIdentified): Observable<IMeasurement>;
    /**
     * Get an Observable of all measurements filtered by fragment and series.
     * Combines the latest value from measurement API and future values via realtime API.
     *
     * @param {string} fragment Measurement fragment
     *
     * @param {string} series Measurement series
     *
     * @param {string | number | IIdentified} entityOrId Entity object or id
     *
     * @param {number} pageSize Number of measurements to initially retrieve from backend
     *
     * @param {boolean} emitNullIfInitialValuesWereNotFound Flag that if set to true will initially emit value of null in case no measurement could have been retrieved from backend
     *
     * @returns An [[Observable]] of newly created entity objects.
     */
    latestValueOfSpecificMeasurement$(fragment: string, series: string, entityOrId: string | number | IIdentified, pageSize?: number, emitNullIfInitialValuesWereNotFound?: boolean, dateFrom?: Date | string, dateTo?: Date | string): Observable<IMeasurement>;
    lastMeasurement$(fragment: string, series: string, entityOrId: string | number | IIdentified, pageSize: number, emitNullIfInitialValuesWereNotFound?: boolean, dateFrom?: Date | string, dateTo?: Date | string): Observable<IMeasurement>;
    protected channel(): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<MeasurementRealtimeService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<MeasurementRealtimeService>;
}

/**
 * A service for handling bulk operation realtime notifications in RxJS fashion.
 */
declare class OperationBulkRealtimeService extends RealtimeService<IOperationBulk> {
    protected realtimeSubject: RealtimeSubjectService;
    constructor(realtimeSubject: RealtimeSubjectService);
    /**
     * Get an Observable of all CREATE realtime notifications.
     *
     * @returns An [[Observable]] of newly created entity objects.
     */
    onCreate$(): Observable<IOperationBulk>;
    protected channel(): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<OperationBulkRealtimeService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<OperationBulkRealtimeService>;
}

/**
 * A service for handling operation realtime notifications in RxJS fashion.
 */
declare class OperationRealtimeService extends RealtimeService<IOperation> {
    protected realtimeSubject: RealtimeSubjectService;
    constructor(realtimeSubject: RealtimeSubjectService);
    protected channel(): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<OperationRealtimeService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<OperationRealtimeService>;
}

interface IRealtimeDeviceBootstrap {
    id: string;
    status: DeviceRegistrationStatus;
}
/**
 * A service for handling device bootstrap realtime notifications in RxJS fashion.
 */
declare class DeviceBootstrapRealtimeService extends RealtimeService<IRealtimeDeviceBootstrap> {
    protected realtimeSubject: RealtimeSubjectService;
    constructor(realtimeSubject: RealtimeSubjectService);
    protected channel(): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<DeviceBootstrapRealtimeService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<DeviceBootstrapRealtimeService>;
}

interface PluginsConfig {
    remotes: ApplicationRemotePlugins;
    excludedRemotes?: ApplicationRemotePlugins;
}
declare enum ApplicationPluginStatus {
    ORPHANED = "ORPHANED",
    LATEST = "LATEST",
    OUTDATED = "OUTDATED",
    REVOKED = "REVOKED",
    AUTO = "AUTO"
}
declare enum PackageType {
    /**
     * A package coming from the official Cumulocity github enterprise.
     */
    OFFICIAL = "OFFICIAL",
    /**
     * A package coming from any connected partner repository.
     */
    COMMUNITY = "COMMUNITY",
    /**
     * A package where the origin is unknown (e.g. uploaded to management with an unknown label)
     */
    UNKNOWN = "UNKNOWN",
    /**
     * A custom package e.g. uploaded to the tenant by a user
     */
    CUSTOM = "CUSTOM",
    /**
     * A package that was archived by the user
     */
    ARCHIVED = "ARCHIVED"
}
interface ApplicationPlugin {
    id: string;
    idLatest: string;
    name?: string;
    module: string;
    path: string;
    description?: string;
    version?: string;
    scope?: PluginsExportScopes;
    installed?: boolean;
    contextPath?: string;
    status?: ApplicationPluginStatus;
    tags?: string[];
    license?: string;
    type?: PackageType;
    versioningMatrix?: VersioningMatrix;
    selected?: boolean;
    originApp?: IApplication;
    installedViaTag?: string | false;
    readmePath?: string;
}

declare class PluginsService {
    private applicationService;
    private appStateService;
    private client;
    static convertInstalledRemotesToIds(remotes: ApplicationRemotePlugins): string[];
    static createPluginId(contextPath: string, plugin: ApplicationPlugin | string, version: string, useLatest?: boolean): string;
    constructor(applicationService: ApplicationService, appStateService: AppStateService, client: FetchClient);
    /**
     * Fetches a list of available packages.
     * @param params Additional query parameters.
     * @returns Returns a list of packages.
     */
    listPackages(params?: any): Promise<IApplication[]>;
    /**
     * Checks if an application is a package.
     * @param application Application managed object.
     * @returns Returns true if the application is a package.
     */
    isPackage(application: IApplication): boolean;
    /**
     * Updates the remotes field in the application configuration by adding new plugins.
     * Important: if the remotes object is not set on the configuration object,
     * remotes will not be added. Make sure that this object exists in the application configuration.
     * @param application Application managed object.
     * @param plugins List of remotes to be added.
     * @returns Returns updated application remotes.
     */
    addRemotes(application: IApplication, plugins: ApplicationPlugin | ApplicationPlugin[]): Promise<PluginsConfig>;
    /**
     * Updates the remotes field in the application configuration by removing plugins.
     * @param application Application managed object.
     * @param plugins List of remotes to be removed.
     * @returns Returns updated application remotes.
     */
    removeRemotes(application: IApplication, plugins: ApplicationPlugin | ApplicationPlugin[]): Promise<PluginsConfig>;
    /**
     * Updates the remotes field in the application configuration.
     * @param application Application managed object.
     * @param plugins List of remotes to be added.
     * @returns Returns updated application remotes.
     */
    updateRemotesInAppConfig(application: IApplication, plugins: ApplicationRemotePlugins, excludedRemotes?: ApplicationRemotePlugins): Promise<PluginsConfig>;
    /**
     * Fetches the application manifest.
     * @param application Application managed object.
     * @returns Returns the application manifest.
     */
    getCumulocityJsonFile(application: IApplication): Promise<IManifest>;
    /**
     * Sets the initial state of remotes in the configuration (when it's missing), based on the list of remotes being in the application manifest.
     * @param application  Application managed object.
     * @returns Returns a list of remotes that has been assigned to the configuration object.
     */
    setInitialRemotes(application: IApplication): Promise<PluginsConfig>;
    resetRemotes(application: IApplication): Promise<IApplication & {
        config: PluginsConfig;
    }>;
    /**
     * Sorts versions list or list of objects by version property
     * @returns list of versions as array of strings or array of objects sorted by version property
     *
     * @param {{ list: T[]; path: string[] } | string[]} source data to sort
     * @param {'asc' | 'desc'} order ascending or descending order of sorting
     *
     * **Example**
     * ```typescript
     * const data = ['1.5.0', '2.0.0'];
     * const sortedData = pluginsService.sortVersions(versions, 'desc');
     * // sortedData:
     * // ['2.0.0', '1.5.0']
     * ```
     *
     * **Example**
     * ```typescript
     * const data = [
     *  {app: {appVersion: '1.5.0'}},
     *  {app: {appVersion: '2.0.0'}},
     * ];
     * const sortedData = pluginsService.sortVersions({list: data, path: ['app', 'appVersion']}, 'desc');
     * // sortedData:
     * // [
     * //  {app: {appVersion: '2.0.0'}},
     * //  {app: {appVersion: '1.5.0'}}
     * // ]
     * ```
     */
    sortVersions<T>(source: {
        list: T[];
        path: string[];
    }, order: 'asc' | 'desc'): T[];
    sortVersions(source: string[], order: 'asc' | 'desc'): string[];
    /**
     * Extracts a list of exported plugins from the application object.
     * @param application Application managed object.
     * @param useLatest Set this to true, to not bind the plugin to any version.
     * @returns Returns a list of exported plugins.
     */
    getMFExports(application: IApplication, excludedScopes?: PluginsExportScopes[], useLatest?: boolean): ApplicationPlugin[];
    /**
     * Extracts a list of exports from each available package.
     * @param allVersions If set to true, all and not only latest versions are included.
     * @param excludedScopes Defines which scopes should not be loaded.
     * @returns Returns a list of all exported plugins.
     */
    getAllMFExports(allVersions?: boolean, excludedScopes?: PluginsExportScopes[]): Promise<ApplicationPlugin[]>;
    /**
     * Extracts a list of remotes from the application object.
     * @param application Application managed object.
     * @returns Returns list of remotes.
     */
    getMFRemotes(application: IApplication): ApplicationRemotePlugins;
    /**
     * Determines the type of a package.
     * A package is OFFICIAL if it comes from management tenant and has a label attached called OFFICIAL.
     * A package is COMMUNITY if it has a label called COMMUNITY.
     * A package is CUSTOM if it does not have any label attached.
     * A package is UNKNOWN if it has a label attached but it does not match COMMUNITY or OFFICIAL.
     *
     * Labels can be used to identify the status of a package. Community packages always need
     * a license validation. The label will be shown on the application card to tell a user
     * whether they are looking into an official or community package.
     *
     * @param packageApplication The package application object to check.
     * @returns The package type.
     */
    getPackageType(packageApplication: IApplication): PackageType;
    /**
     * Verifies if an application is owned by management tenant.
     *
     * @param app The application to verify.
     * @returns True if owned by management tenant.
     */
    isOwnedByManagement(app: IApplication): boolean;
    pluginsFromManifest(manifest: IManifest): ApplicationPlugin[];
    getReadmeFileContent(baseUrl: string): Promise<string>;
    getChangelogFileContent(baseUrl: string): Promise<string>;
    getFileContent(baseUrl: string, fileType: 'readme' | 'changelog'): Promise<string>;
    private getFile;
    private isSelfScopedPlugin;
    private getSelfScopedPlugins;
    private getAllPluginsExceptSelfScoped;
    private removeDuplicates;
    private isFromCurrentTenant;
    /**
     * Modifies the list of plugins to have additional information such as id.
     * @ignore
     */
    private extendPluginsDetails;
    private listApplicationsByCurrentTenant;
    private addPluginToRemotesConfig;
    private removePluginsFromRemotesConfig;
    /**
     * Parses id of the plugin and returns object with context path, raw context path (without version) and module name.
     * For example:
     * ```ts
     * const id = 'widget-plugin@1021.0.1/WidgetPluginModule'
     * const parsed = parsePluginId(id); // { contextPath: 'widget-plugin@1021.0.1', moduleName: 'WidgetPluginModule', rawContextPath: 'widget-plugin' }
     * @param id Plugin id in the format of `<contextPath>@<version>/<moduleName>`
     * @returns Object with context path, module name and raw context path (without version).
     */
    private parsePluginId;
    static ɵfac: i0.ɵɵFactoryDeclaration<PluginsService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<PluginsService>;
}

declare class PluginLoadedPipe implements PipeTransform {
    private pluginsResolve;
    constructor(pluginsResolve: PluginsResolveService);
    transform(pluginName: string): Observable<boolean>;
    static ɵfac: i0.ɵɵFactoryDeclaration<PluginLoadedPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<PluginLoadedPipe, "c8yPluginLoaded", true>;
}

interface RemoteModuleWithMetadata {
    moduleRef?: NgModuleRef<unknown>;
    remoteNgModule?: NgModuleRef<unknown> | Type<unknown>;
    injector: EnvironmentInjector;
    name: string;
    fullContextPath: string;
}
/**
 * @deprecated Only meant for internal usage.
 * @internal
 */
declare const HOOK_PLUGIN: InjectionToken<any>;
/**
 * @deprecated Only meant for internal usage.
 * @internal
 */
declare function hookPlugin(plugins: GenericHookType<any>): ValueProvider | ClassProvider | ExistingProvider;
declare class PluginsLoaderService {
    private plugins;
    private injector;
    private pluginsResolveService;
    private optionsService;
    private injectorPerContextPath;
    constructor(plugins: Array<RemoteModuleFactoryWithMetadata<string>>, injector: EnvironmentInjector, pluginsResolveService: PluginsResolveService, optionsService: OptionsService);
    loadAllModulesAndSetState(): RemoteModuleWithMetadata[];
    /**
     * Loads modules and handles hooking correctly.
     * @param remoteNgModules The modules to load.
     */
    loadModulesDynamically(remoteModules: Array<RemoteModuleFactoryWithMetadata<string>>): RemoteModuleWithMetadata[];
    /**
     * Uses the provided remoteModule factories to load and instantiate the modules.
     * The provided injector is used as a parent to create the module instances.
     */
    protected loadModules(remoteModules: Array<RemoteModuleFactoryWithMetadata<string>>, injector: EnvironmentInjector): Array<RemoteModuleWithMetadata>;
    protected loadProviders(providers: Provider[], name: string, parentInjector: EnvironmentInjector): {
        injector: EnvironmentInjector;
    };
    protected loadModule<T = unknown>(remoteNgModule: NgModuleRef<T> | Type<T>, parentInjector: EnvironmentInjector): {
        moduleRef: NgModuleRef<T>;
        remoteNgModule: NgModuleRef<T> | Type<T>;
        injector: EnvironmentInjector;
    };
    static ɵfac: i0.ɵɵFactoryDeclaration<PluginsLoaderService, [{ optional: true; }, null, null, null]>;
    static ɵprov: i0.ɵɵInjectableDeclaration<PluginsLoaderService>;
}

/**
 * Injection token for providing the context path of a plugin.
 *
 * Can e.g. be used to construct URLs to assets within the plugin.
 */
declare const C8Y_PLUGIN_CONTEXT_PATH: InjectionToken<string>;
/**
 * Injection token for providing the name of a plugin.
 *
 * Can e.g. be used to identify the plugin within the application.
 */
declare const C8Y_PLUGIN_NAME: InjectionToken<string>;

/**
 * A factory providing the 'Summary' step to the setup stepper.
 */
declare class SetupStepperFactory implements ExtensionFactory<Step> {
    private readonly step;
    get(): SetupStep;
    static ɵfac: i0.ɵɵFactoryDeclaration<SetupStepperFactory, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<SetupStepperFactory>;
}

declare class WizardModalService {
    private bsModalService;
    constructor(bsModalService: BsModalService);
    /**
     * Shows a wizard modal.
     * @param modalOptions Modal options.
     * @returns a reference to the modal.
     */
    show(modalOptions?: ModalOptions): BsModalRef<WizardComponent>;
    static ɵfac: i0.ɵɵFactoryDeclaration<WizardModalService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<WizardModalService>;
}

interface ResizableGridConfig {
    collapseThreshold?: number;
    leftColumnWidth?: string;
    trackId?: string | null;
    collapsible?: boolean;
}
/**
 * Resizable Grid Component
 *
 * Provides a flexible layout with two adjustable columns separated by a draggable divider.
 *
 * ## Basic Usage
 *
 * ```html
 * <c8y-resizable-grid
 *   [leftColumnWidth]="'50%'"
 *   [collapseThreshold]="320"
 *   [collapsible]="true"
 *   [trackId]="'my-layout'">
 *   <div #colA>Left column content</div>
 *   <div #colB>Right column content</div>
 * </c8y-resizable-grid>
 * ```
 */
declare class ResizableGridComponent implements OnInit, AfterViewInit, OnChanges, OnDestroy {
    private renderer;
    /**
     * Initial width of the left column (A). Can be any valid CSS width value (e.g., '50%', '300px').
     */
    leftColumnWidth: string;
    /**
     * Optional key for localStorage to persist the left column width between sessions.
     */
    trackId: string | null;
    /**
     * Minimum width (in pixels) before a column is considered collapsed.
     */
    collapseThreshold: number;
    /**
     * If true, columns can collapse below the threshold. If false, columns stop at the threshold.
     */
    collapsible: boolean;
    /**
     * Reference to the left column element.
     */
    colA: ElementRef<HTMLDivElement>;
    /**
     * Reference to the right column element.
     */
    colB: ElementRef<HTMLDivElement>;
    /**
     * True if the user is currently resizing the grid.
     */
    isResizing: boolean;
    /**
     * CSS width value for the left column (A).
     * Used for dynamic styling via HostBinding.
     */
    private _colAWidth;
    /**
     * Public getter for aria-valuenow
     */
    get colAWidthPercent(): number;
    /**
     * X position of the mouse when resizing starts.
     */
    private startX;
    /**
     * Pixel width of column A when resizing starts.
     */
    private startColAWidthPx;
    /**
     * Last known non-collapsed width of column A (for restore logic).
     */
    private lastKnownNonCollapsedWidth;
    colAId: string;
    colBId: string;
    private resizeStep;
    /**
     * Creates an instance of ResizableGridComponent.
     * @param renderer Angular Renderer2 for DOM manipulation.
     */
    constructor(renderer: Renderer2);
    ngOnInit(): void;
    /**
     * Angular lifecycle hook. Sets up initial column width after view initialization.
     */
    ngAfterViewInit(): void;
    /**
     * Angular lifecycle hook. Handles changes to input properties.
     * @param changes Object containing changed input properties.
     */
    ngOnChanges(changes: SimpleChanges): void;
    /**
     * Angular lifecycle hook. Cleans up cursor style if resizing is active.
     */
    ngOnDestroy(): void;
    /**
     * Mouse down event handler for starting resize.
     * @param event MouseEvent
     */
    onMouseDown(event: MouseEvent): void;
    /**
     * Mouse move event handler for resizing columns.
     * @param event MouseEvent
     */
    onMouseMove(event: MouseEvent): void;
    /**
     * Mouse up event handler for ending resize and applying collapse logic.
     */
    onMouseUp(): void;
    /**
     * Keyboard event handler for resizing columns with arrow keys.
     * @param event KeyboardEvent
     */
    onKeyDown(event: KeyboardEvent): void;
    /**
     * Sets up the initial width of the left column, using localStorage if trackId is provided.
     */
    private setupInitialWidth;
    /**
     * Updates the column A width and handles boundaries.
     * @param targetWidthPx The desired width in pixels for column A.
     * @param applyCollapseImmediately If true, calls checkAndApplyCollapse directly.
     */
    private updateColumnWidth;
    /**
     * Checks if either column should be collapsed based on their widths and applies the appropriate classes/styles.
     * @param colAWidth Width of column A in pixels
     * @param colBWidth Width of column B in pixels
     */
    private checkAndApplyCollapse;
    /**
     * Removes collapse/expand classes from both columns.
     */
    private removeCollapseClasses;
    static ɵfac: i0.ɵɵFactoryDeclaration<ResizableGridComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ResizableGridComponent, "c8y-resizable-grid", never, { "leftColumnWidth": { "alias": "leftColumnWidth"; "required": false; }; "trackId": { "alias": "trackId"; "required": false; }; "collapseThreshold": { "alias": "collapseThreshold"; "required": false; }; "collapsible": { "alias": "collapsible"; "required": false; }; }, {}, never, ["[left-pane]", "[right-pane]"], true, never>;
}

/**
 * AssetTypesService is being used to manage a cache of all existing asset types.
 * This service is injected in the AssetOverviewNavigationFactory class, which will trigger
 * the initialization of the cache as the constructor is called.
 * @deprecated Consider using `AssetTypesRealtimeService` service instead.
 */
declare class AssetTypesService {
    private assetTypesRealtimeService;
    private apiService;
    private appStateService;
    private readonly DEFAULT_ASSET_ICON;
    private assetTypesCache;
    private allowedMethods;
    constructor(assetTypesRealtimeService: AssetTypesRealtimeService, apiService: ApiService, appStateService: AppStateService);
    /**
     * Returns an asset type from the cache based on the unique name property.
     * @param name Name of the asset type.
     * @returns IManagedObject which represents the asset type.
     */
    getAssetTypeByName(name: string): IManagedObject;
    /**
     * Returns an asset type from the cache based on the id.
     * @param assetTypeId Id of the asset type.
     * @returns IManagedObject which represents the asset type.
     */
    getAssetTypeById(assetTypeId: string): IManagedObject;
    /**
     * Returns all the available asset types from the cache.
     * @returns available asset types.
     */
    getAssetTypesCache(): Record<string, IManagedObject>;
    /**
     * Extracts an icon from an asset type.
     * @param type Type of the asset type.
     * @returns Returns an icon for a given asset type.
     */
    getIcon(type: string): string;
    /**
     * Add an asset type to the local cache.
     * @param assetType Asset type which should be added to the cache.
     * @returns void.
     */
    private addAssetType;
    /**
     * Delete an asset type from the local cache based on the given asset type id.
     * @param assetTypeId Id of the asset type which should be deleted.
     * @returns void.
     */
    private deleteAssetType;
    /**
     * Update an asset type in the local cache.
     * @param assetType Asset type which should be updated in the cache.
     * @returns void.
     */
    private updateAssetType;
    /**
     * Subscribes to api PUT, POST and DELETE requests interceptor to update local asset types cache.
     * If a new asset type has been created it will be added to the local cache. If an asset
     * type has been deleted it will be removed from the local cache.
     */
    private subscribeForAssetTypeUpdates;
    private isExpectedMethod;
    private handleDelete;
    private handlePutOrPost;
    private hasIsAssetTypeFragment;
    private getMoIdFromUrl;
    /**
     * Managed objects inventory api filter, allowing only PUT, POST and DELETE methods.
     * @param call Api call to filter.
     * @returns Returns true if api call meets the required criteria.
     */
    private checkIfInventoryMoApiCall;
    static ɵfac: i0.ɵɵFactoryDeclaration<AssetTypesService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<AssetTypesService>;
}

/**
 * Will provide the backend versions of the tenant.
 * The system option 'system' -> 'version' is used for this.
 */
declare class BackendVersionFactory implements ExtensionFactory<Version> {
    private config;
    private appState;
    backendVersion$: Observable<Version | Version[]>;
    constructor(config: VersionModuleConfig, appState: AppStateService);
    get(): Observable<Version | Version[]>;
    private buildBackendVersion;
    static ɵfac: i0.ɵɵFactoryDeclaration<BackendVersionFactory, [{ optional: true; }, null]>;
    static ɵprov: i0.ɵɵInjectableDeclaration<BackendVersionFactory>;
}

/**
 * Will provide the application version (taken from package.json's `version` field) and
 * the installed versions of the packages`@c8y/ng1-modules` and `@c8y/ngx-components` if available.
 */
declare class WebSDKVersionFactory implements ExtensionFactory<Version> {
    private config;
    private appState;
    webSDKVersions: Version[];
    private defaults;
    constructor(config: VersionModuleConfig, appState: AppStateService);
    get(): Version[];
    static ɵfac: i0.ɵɵFactoryDeclaration<WebSDKVersionFactory, [{ optional: true; }, null]>;
    static ɵprov: i0.ɵɵInjectableDeclaration<WebSDKVersionFactory>;
}

declare function colorValidator(allowedModes?: string[]): AsyncValidatorFn;

declare const SHOW_PREVIEW_FEATURES = "showPreviewFeatures";
type PreviewFeature = PreviewFeatureCustom | PreviewFeatureDefault;
interface PreviewFeatureCustom extends BasePreviewFeature {
    key?: never;
    scope?: never;
    onToggle: (state: any) => Promise<boolean>;
    active$: Observable<boolean>;
}
interface PreviewFeatureDefault extends BasePreviewFeature {
    key: string;
    scope?: 'user' | 'tenant' | 'temp' | 'platform';
    onToggle?: never;
    active$?: never;
}
interface BasePreviewFeature {
    label: string;
    description: () => Promise<string | Type<any>>;
    settings?: {
        reload?: boolean;
    };
}

declare const HOOK_PREVIEW: InjectionToken<PreviewFeature[]>;
declare function hookPreview(preview: GenericHookType<PreviewFeature>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
declare class PreviewService extends ExtensionPointForPlugins<PreviewFeature> {
    items$: Observable<PreviewFeature[]>;
    reload$: BehaviorSubject<boolean>;
    private readonly LOCAL_STORAGE_KEY;
    private seenFeatures$;
    hasUnseenFeatures$: Observable<boolean>;
    private readonly featureService;
    private readonly featureCacheService;
    private readonly optionsService;
    private toggledFeaturesWithReload;
    constructor(rootInjector: Injector, pluginService: PluginsResolveService);
    get state(): Set<PreviewFeature>;
    /**
     * Get the state of a specific feature.
     * @param key The unique key or label for the feature. Label is used to find the custom features.
     * @returns Observable<boolean> representing the state of the feature.
     */
    getState$(key: string): Observable<boolean>;
    /**
     * Toggle the state of a specific feature.
     * @param key The unique key or label for the feature. Label is used to find the custom features.
     * @returns Promise<void> after toggling the state.
     */
    setFeatureActiveState(key: string, toggleValue: boolean): Promise<void>;
    /**
     * Marks all unseen features as seen by the user and updates the local storage.
     * This assumes all features are provided via the `items$` observable.
     */
    markAllFeaturesAsSeen(): Promise<void>;
    /**
     * Filters the features to only include those that are available by checking the feature toggle API.
     */
    getAvailableFeatures$(): Observable<PreviewFeature[]>;
    checkIfReloadNeeded(feature: PreviewFeature, key: string): void;
    /**
     *
     * @returns An array of feature names that have been seen by the user. This is retrieved from local storage.
     */
    private getSeenFeatures;
    protected setupItemsObservable(): Observable<PreviewFeature[]>;
    static ɵfac: i0.ɵɵFactoryDeclaration<PreviewService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<PreviewService>;
}

declare class PreviewFeatureButtonComponent implements OnDestroy {
    open$: Observable<boolean>;
    hasUnseenFeatures$: Observable<boolean>;
    private readonly previewService;
    private readonly headerService;
    private readonly router;
    private readonly route;
    private destroy$;
    ngOnInit(): Promise<void>;
    openPreviewFeature(): Promise<void>;
    ngOnDestroy(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<PreviewFeatureButtonComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<PreviewFeatureButtonComponent, "c8y-preview-feature-button", never, {}, {}, never, never, true, never>;
}

declare const PREVIEW_FEATURE_PROVIDERS: Provider[];

declare class PreviewFeatureShowNotification implements CumulocityServiceRegistry.NotificationServiceProvider {
    private previewService;
    private permissions;
    private appState;
    private options;
    shouldShowNotification$: rxjs.Observable<boolean>;
    constructor(previewService: PreviewService, permissions: Permissions, appState: AppStateService, options: OptionsService);
    static ɵfac: i0.ɵɵFactoryDeclaration<PreviewFeatureShowNotification, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<PreviewFeatureShowNotification>;
}

interface QueryParamConfig {
    /**
     * The name of the query parameter to observe.
     */
    queryParam: string;
    /**
     * This function will be called when the query parameter is present in the URL.
     */
    trigger: () => void | Promise<void>;
    /**
     * The injector to use. If not set, the default root injector will be used.
     */
    injector?: Injector;
}
declare const HOOK_QUERY_PARAM: InjectionToken<QueryParamConfig[]>;
declare function hookQueryParam(config: GenericHookType<QueryParamConfig>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
declare class QueryParamHandlerService extends ExtensionPointWithoutStateForPlugins<QueryParamConfig> {
    private router;
    private activatedRoute;
    constructor(rootInjector: Injector, router: Router, pluginService: PluginsResolveService, activatedRoute: ActivatedRoute);
    protected setupItemsObservable(): Observable<QueryParamConfig[]>;
    static ɵfac: i0.ɵɵFactoryDeclaration<QueryParamHandlerService, [null, null, null, { optional: true; }]>;
    static ɵprov: i0.ɵɵInjectableDeclaration<QueryParamHandlerService>;
}

type QueryParamModalConfig = QueryParamModalConfigLazy | QueryParamModalConfigEager;
interface QueryParamModalConfigEager extends QueryParamModalConfigBase {
    /**
     * The component to display in the modal.
     */
    component: ComponentType<any>;
    loadComponent?: never;
}
interface QueryParamModalConfigLazy extends QueryParamModalConfigBase {
    component?: never;
    /**
     * The component to display in the modal.
     */
    loadComponent: () => Promise<ComponentType<any>>;
}
interface QueryParamModalConfigBase {
    /**
     * The name of the query parameter to observe.
     */
    queryParam: string;
    /**
     * Optional configuration settings for the modal.
     */
    modalConfig?: ModalOptions;
    /**
     * The injector to use. If not set, the default root injector will be used.
     */
    injector?: Injector;
}
declare const HOOK_QUERY_PARAM_MODAL: InjectionToken<QueryParamModalConfig[]>;
declare function hookQueryParamModal(config: GenericHookType<QueryParamModalConfig>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
/**
 * Service to manage the display of modals based on URL query parameter.
 *
 * This service listens for specific query parameters in the URL and opens corresponding modals when detected.
 * It automatically cleans up the query parameters from the URL when the modal is closed or query parameter value passed as 'false'.
 */
declare class QueryParamModalStateService extends ExtensionPointWithoutStateForPlugins<QueryParamModalConfig> {
    constructor(rootInjector: Injector, pluginService: PluginsResolveService);
    protected setupItemsObservable(): Observable<QueryParamModalConfig[]>;
    static ɵfac: i0.ɵɵFactoryDeclaration<QueryParamModalStateService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<QueryParamModalStateService>;
}
declare class QueryParamModalFactory implements ExtensionFactory<QueryParamConfig> {
    private readonly queryParamModalStateService;
    private readonly bsModalService;
    private readonly router;
    private readonly activatedRoute;
    private modalCloseSubscription;
    constructor(queryParamModalStateService: QueryParamModalStateService, bsModalService: BsModalService, router: Router, activatedRoute: ActivatedRoute);
    get(): Observable<QueryParamConfig[]>;
    /**
     * Handles the display of a modal based on a specific query parameter.
     *
     * @param config - Configuration object specifying the query parameter, component, and optional modal settings.
     * @returns An observable that listens for changes in the query parameter.
     */
    handleQueryParamModal(config: QueryParamModalConfig): Promise<void>;
    /**
     * Removes the specified query parameter from the URL.
     *
     * @param paramKey - The key of the query parameter to remove.
     */
    private removeQueryParam;
    /**
     * Displays a modal with the specified component and configuration.
     *
     * @param component - The component to display in the modal.
     * @param modalConfig - Optional settings for the modal appearance and behavior.
     */
    private showModal;
    /**
     * Cleans up subscriptions related to modal events.
     * Ensures no memory leaks by unsubscribing from modal close events.
     */
    private cleanup;
    static ɵfac: i0.ɵɵFactoryDeclaration<QueryParamModalFactory, [null, null, null, { optional: true; }]>;
    static ɵprov: i0.ɵɵInjectableDeclaration<QueryParamModalFactory>;
}

interface QueryParamBottomDrawerConfig {
    /**
     * The name of the query parameter to observe.
     */
    queryParam: string;
    /**
     * Defines whether the drawer should be closed when navigation start is detected. Defaults to <code>true</code>.
     */
    closeOnNavigation: boolean;
    /**
     * Defines whether it should be possible to click outside of the drawer to close the drawer.
     */
    disableClickOutside: boolean;
    /**
     * The component to display in the bottom drawer.
     */
    component: ComponentType<any>;
    /**
     * The injector to use. If not set, the default root injector will be used.
     */
    injector?: Injector;
}
declare const HOOK_QUERY_PARAM_BOTTOM_DRAWER: InjectionToken<QueryParamBottomDrawerConfig[]>;
declare function hookQueryParamBottomDrawer(config: GenericHookType<QueryParamBottomDrawerConfig>, options?: Partial<GenericHookOptions>): i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider;
declare class QueryParamBottomDrawerStateService extends ExtensionPointWithoutStateForPlugins<QueryParamBottomDrawerConfig> {
    constructor(rootInjector: Injector, pluginService: PluginsResolveService);
    protected setupItemsObservable(): Observable<QueryParamBottomDrawerConfig[]>;
    static ɵfac: i0.ɵɵFactoryDeclaration<QueryParamBottomDrawerStateService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<QueryParamBottomDrawerStateService>;
}
declare class QueryParamBottomDrawerFactory implements ExtensionFactory<QueryParamConfig> {
    private readonly queryParamBottomDrawerStateService;
    private readonly bottomDrawerService;
    constructor(queryParamBottomDrawerStateService: QueryParamBottomDrawerStateService, bottomDrawerService: BottomDrawerService);
    get(): Observable<QueryParamConfig[]>;
    handleQueryParamBottomDrawer(config: QueryParamBottomDrawerConfig): Promise<void>;
    static ɵfac: i0.ɵɵFactoryDeclaration<QueryParamBottomDrawerFactory, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<QueryParamBottomDrawerFactory>;
}

declare const QUERY_PARAM_HANDLER_PROVIDERS: (i0.ValueProvider | i0.ClassProvider | i0.ExistingProvider | i0.EnvironmentProviders)[];

/**
 * Interface representing a DTM asset property definition.
 */
interface AssetPropertyDefinition {
    identifier: string;
    jsonSchema: SchemaNode;
    creationTime: string;
    lastUpdated: string;
    [key: string]: any;
}
interface SchemaNode {
    title?: string;
    description?: string;
    type?: string;
    properties?: Record<string, SchemaNode>;
    [key: string]: any;
}
interface AssetPropertyDefinitionResponse {
    definitions: AssetPropertyDefinition[];
    statistics: {
        currentPage: number;
        pageSize: number;
        totalPages: number;
        totalElements: number;
    };
}
interface AssetPropertyFilter {
    identifiers?: string[];
    titles?: string[];
    tags?: string[];
    currentPage?: number;
    pageSize?: number;
    [key: string]: any;
}
interface TreeNode {
    id: string;
    title: string;
    description?: string;
    type?: string;
    tags?: string[];
    children?: TreeNode[];
    hasChildren?: boolean;
}

declare class AssetPropertyService extends Service<AssetPropertyDefinition> {
    private appState;
    protected baseUrl: string;
    protected listUrl: string;
    protected propertyName: string;
    constructor(client: FetchClient, appState: AppStateService);
    canRetrieveAssetProperties(): Promise<boolean>;
    list(filterInput?: object): Promise<IResultList<AssetPropertyDefinition>>;
    getByIdentifier(identifier: string): Promise<AssetPropertyDefinition>;
    search(searchTerm: string): Promise<IResultList<AssetPropertyDefinition>>;
    private buildFilter;
    protected getPaging(json: AssetPropertyDefinitionResponse, filter: object): Paging<AssetPropertyDefinition>;
    static ɵfac: i0.ɵɵFactoryDeclaration<AssetPropertyService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<AssetPropertyService>;
}

interface C8yJsonSchemaProperty {
    type: C8yPropertyType;
    title?: string;
    label?: string;
    description?: string;
    key?: string;
    name?: string;
    minimum?: number;
    maximum?: number;
    minLength?: number;
    maxLength?: number;
    pattern?: string;
    required?: boolean;
    readOnly?: boolean;
    printFormat?: C8yPropertyFormat;
    'x-schema-form'?: {
        type: string;
    };
    properties?: Record<string, C8yJsonSchemaProperty>;
    items?: C8yJsonSchemaProperty;
    'x-show-if-any-available'?: {
        contextPath: string;
    }[];
    [key: string]: any;
}
type C8yPropertyType = 'string' | 'number' | 'integer' | 'boolean' | 'object' | 'array' | 'null' | 'date' | 'enum' | 'file' | 'c8y_JsonSchema' | ['string', 'null'] | Array<C8yPropertyType>;
type C8yPropertyFormat = 'datetime' | 'hidden' | 'textarea';
interface C8yJsonSchema {
    properties: Record<string, C8yJsonSchemaProperty>;
    required?: string[];
}

/**
 * Asset Definition model representing the structure of an asset definition.
 * It's copy from `cumuloctity-solutions-enablement` ui/dtm-client/src/model/AssetDefinition.ts
 */
interface AssetDefinition {
    creationTime?: string;
    identifier: string;
    jsonSchema?: JsonSchema;
    lastUpdated?: string;
    tags?: string[];
    [key: string]: any;
}
interface JsonSchema {
    description?: string;
    title: string;
    properties?: Record<string, C8yJsonSchemaProperty & {
        $ref?: string;
    }>;
    definitions?: Record<string, C8yJsonSchemaProperty>;
    [key: string]: any;
}

declare class AssetDefinitionsService extends Service<AssetDefinition> {
    protected baseUrl: string;
    protected listUrl: string;
    constructor(client: FetchClient);
    getByIdentifier(identifier: string): Promise<AssetDefinition>;
    static ɵfac: i0.ɵɵFactoryDeclaration<AssetDefinitionsService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<AssetDefinitionsService>;
}

/**
 * Service to manage selection state in split view components.
 * Provides methods to select/deselect items and track selection state.
 */
declare class SplitViewSelectionService<T = unknown> implements OnDestroy {
    private readonly _selectedItem$;
    ngOnDestroy(): void;
    /**
     * Observable of the currently selected item
     */
    get selectedItem$(): Observable<T | null>;
    /**
     * Get the current selected item value
     */
    get selectedItem(): T | null;
    /**
     * Check if an item is currently selected
     */
    get hasSelection(): boolean;
    /**
     * Select an item
     */
    select(item: T): void;
    /**
     * Clear the current selection
     */
    clearSelection(): void;
    /**
     * Check if a specific item is selected
     */
    isSelected(item: T): boolean;
    static ɵfac: i0.ɵɵFactoryDeclaration<SplitViewSelectionService<any>, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<SplitViewSelectionService<any>>;
}

/**
 * A responsive split view layout component with automatic selection management and resizable panes.
 *
 * #### Basic usage
 *
 *
 * ```typescript
 * export class MyComponent {
 *   items: Device[] = [];
 *   selectedItem?: Device;
 *
 *   onSelectionChange(item: Device | null) {
 *     this.selectedItem = item || undefined;
 *   }
 * }
 * ```
 *
 * ```html
 * <c8y-sv (selectionChange)="onSelectionChange($event)">
 *   <c8y-sv-list [title]="'Devices'">
 *     <c8y-sv-header-actions>
 *       <button class="btn btn-primary">Add Device</button>
 *     </c8y-sv-header-actions>
 *
 *     @for (item of items; track item.id) {
 *       <c8y-li [c8ySvListItem]="item">
 *         {{ item.name }}
 *       </c8y-li>
 *     }
 *
 *     <c8y-sv-footer>
 *       Total: {{ items.length }}
 *     </c8y-sv-footer>
 *   </c8y-sv-list>
 *
 *   <c8y-sv-details
 *     emptyStateIcon="c8y-devices"
 *     emptyStateTitle="No device selected"
 *     emptyStateSubtitle="Select a device to view details">
 *     @if (selectedItem) {
 *       <c8y-sv-extra-header>
 *         <c8y-icon-panel [sections]="sections"></c8y-icon-panel>
 *       </c8y-sv-extra-header>
 *     }
 *
 *     @if (selectedItem) {
 *       <h3>{{ selectedItem.name }}</h3>
 *       <p>{{ selectedItem.description }}</p>
 *     }
 *   </c8y-sv-details>
 * </c8y-sv>
 * ```
 *
 * #### Router-Outlet integration
 *
 * For components using Angular router:
 *
 * ```html
 * <c8y-sv>
 *   <c8y-alarms-list>...</c8y-alarms-list>
 *
 *   <c8y-sv-details (backClick)="handleBackClick()">
 *     <router-outlet></router-outlet>
 *   </c8y-sv-details>
 * </c8y-sv>
 * ```
 *
 * ```typescript
 * async handleBackClick(): Promise<void> {
 *   await this.alarmsViewService.closeDetailsView(this.activatedRoute);
 * }
 * ```
 *
 * #### Resizable configuration
 *
 * ```html
 * <c8y-sv
 *   [isResizable]="true"
 *   [resizableBreakpoint]="991"
 *   [resizableConfig]="{
 *     trackId: 'my-split-view',
 *     leftColumnWidth: '40%',
 *     collapseThreshold: 320,
 *     collapsible: false
 *   }"
 *   [initialSelection]="items[0]"
 *   (selectionChange)="onSelectionChange($event)">
 *   <!-- content -->
 * </c8y-sv>
 * ```
 *
 * #### List-Only mode
 *
 * Omit `<c8y-sv-details>` for a simple list view:
 * ```html
 * <c8y-sv>
 *   <c8y-sv-list [title]="'Items'">
 *     @for (item of items; track item.id) {
 *       <c8y-li>{{ item.name }}</c8y-li>
 *     }
 *   </c8y-sv-list>
 * </c8y-sv>
 * ```
 *
 */
declare class SplitViewComponent<T = unknown> implements OnInit, OnDestroy {
    selectionService: SplitViewSelectionService<T>;
    private readonly destroyRef;
    /**
     * Whether to show a default router outlet in right-view if no right-view slot content provided.
     * @default true
     */
    showDefaultRouterOutlet: boolean;
    /**
     * Enable resizable grid functionality with draggable divider.
     * When `true`, users can resize the split panes by dragging the divider.
     * Above `resizableBreakpoint`, the resizable grid is active.
     * Below `resizableBreakpoint`, falls back to CSS-based responsive layout.
     * @default true
     */
    isResizable: boolean;
    /**
     * Initial item to select when the component is initialized.
     * If provided, this item will be automatically selected on component load.
     *
     * @example
     * ```html
     * <c8y-sv [initialSelection]="items[0]">
     * ```
     *
     */
    initialSelection?: T;
    /**
     * Minimum window width (in pixels) required for resizable grid to be active.
     * Below this width, the component switches to a stacked mobile layout.
     * @default 991
     */
    resizableBreakpoint: number;
    /**
     * Emits when the selected item changes.
     * The event emits the selected item or `null` when selection is cleared.
     *
     * @example
     * ```html
     * <c8y-sv (selectionChange)="onSelectionChange($event)">
     * ```
     *
     * ```typescript
     * onSelectionChange(item: Device | null) {
     *   this.selectedItem = item || undefined;
     * }
     * ```
     */
    selectionChange: EventEmitter<T>;
    /**
     * Internal flag to track if current viewport width allows resizable grid
     */
    private _isResizableAtCurrentWidth;
    /**
     * Configuration for resizable grid behavior.
     *
     * @property trackId - Unique ID for persisting column widths in localStorage
     * @property leftColumnWidth - Initial width of left column (default: '50%')
     * @property collapseThreshold - Width threshold (in px) for collapsing columns (default: 320)
     * @property collapsible - Whether columns can collapse below threshold (default: true)
     *
     * @example
     * ```html
     * <c8y-sv [resizableConfig]="{
     *   trackId: 'device-list-view',
     *   leftColumnWidth: '40%',
     *   collapseThreshold: 320,
     *   collapsible: false
     * }">
     * ```
     */
    set resizableConfig(config: ResizableGridConfig);
    get resizableConfig(): ResizableGridConfig;
    private _resizableConfig;
    private _memoizedResizableConfig;
    /**
     * Detect if details are projected to decide on router-outlet fallback
     */
    private _detailsComp?;
    constructor(selectionService: SplitViewSelectionService<T>);
    ngOnInit(): void;
    ngOnDestroy(): void;
    /**
     * Checks if a details component is projected.
     *
     * Returns `true` when `<c8y-sv-details>` is present in the template.
     * Returns `false` when `<c8y-sv-details>` is not present.
     *
     * @internal Used by the template to determine layout mode
     */
    get hasProjectedDetails(): boolean;
    /**
     * Determines if the resizable grid should be active.
     *
     * Returns `true` when all conditions are met:
     * - `isResizable` is `true`
     * - Current viewport width is above `resizableBreakpoint`
     * - Details component is projected
     *
     * When `false`, falls back to CSS-based responsive layout.
     *
     * @internal Used by the template to conditionally render resizable grid
     */
    get shouldUseResizableGrid(): boolean;
    /**
     * Returns the effective resizable configuration with all defaults applied.
     * The configuration is memoized and updated only when inputs change.
     *
     * @internal Used by the template to pass config to resizable-grid component
     */
    get effectiveResizableConfig(): Required<ResizableGridConfig>;
    /**
     * Returns CSS classes for the split view container element.
     *
     * Always includes: `['card', 'content-fullpage', 'grid__row--1']`
     *
     * Conditionally adds `'split-view--5-7'` when:
     * - Details component is projected
     * - Resizable grid is not active (below breakpoint or disabled)
     *
     * @returns Array of CSS class names
     */
    getContainerClasses(): string[];
    private _checkViewportWidth;
    private updateMemoizedResizableConfig;
    static ɵfac: i0.ɵɵFactoryDeclaration<SplitViewComponent<any>, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<SplitViewComponent<any>, "c8y-sv", never, { "showDefaultRouterOutlet": { "alias": "showDefaultRouterOutlet"; "required": false; }; "isResizable": { "alias": "isResizable"; "required": false; }; "initialSelection": { "alias": "initialSelection"; "required": false; }; "resizableBreakpoint": { "alias": "resizableBreakpoint"; "required": false; }; "resizableConfig": { "alias": "resizableConfig"; "required": false; }; }, { "selectionChange": "selectionChange"; }, ["_detailsComp"], [":not(c8y-sv-details)", "c8y-sv-details"], true, never>;
}

/**
 * Marker component for alert content in split-view lists.
 * Provides a named slot for displaying alerts above the list items.
 *
 * The parent split-view-list component detects this component via @ContentChild
 * and conditionally renders the alert section when present.
 *
 * This is a purely structural component with no logic or styling - all content
 * is projected and styled by the consumer.
 *
 * @example
 * ```html
 * <c8y-sv-list [title]="'Alarms'">
 *   <c8y-sv-alerts>
 *     @if (hasWarning) {
 *       <div class="alert alert-warning" role="alert">
 *         The selected item is not currently in the list.
 *       </div>
 *     }
 *   </c8y-sv-alerts>
 *   <!-- list items -->
 *   @for (item of items; track item.id) {
 *     <c8y-li>{{ item.name }}</c8y-li>
 *   }
 * </c8y-sv-list>
 * ```
 *
 * @example Multiple alerts
 * ```html
 * <c8y-sv-list [title]="'Items'">
 *   <c8y-sv-alerts>
 *     @if (hasInfo) {
 *       <div class="alert alert-info" role="alert">
 *         Information message
 *       </div>
 *     }
 *     @if (hasWarning) {
 *       <div class="alert alert-warning" role="alert">
 *         Warning message
 *       </div>
 *     }
 *   </c8y-sv-alerts>
 *   <!-- list content -->
 * </c8y-sv-list>
 * ```
 */
declare class SplitViewAlertsComponent {
    static ɵfac: i0.ɵɵFactoryDeclaration<SplitViewAlertsComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<SplitViewAlertsComponent, "c8y-sv-alerts", never, {}, {}, never, ["*"], true, never>;
}

declare class SplitViewListComponent {
    /**
     * Optional parent split view component.
     * Used to determine if a details panel is present for automatic background styling.
     */
    private readonly parentSplitView;
    /**
     * Title for the list section.
     * Also used as aria-label if provided.
     */
    title: string;
    /**
     * Whether the list is currently loading
     */
    loading: boolean;
    /**
     * Whether to show empty state
     */
    showEmptyState: boolean;
    /**
     * Custom empty state icon
     */
    emptyStateIcon: string;
    /**
     * Custom empty state title
     */
    emptyStateTitle: string;
    /**
     * Custom empty state subtitle
     */
    emptyStateSubtitle?: string;
    /**
     * Documentation URL to display in the empty state.
     * When provided, a link to the documentation will be shown.
     */
    docsUrl?: string;
    /**
     * Whether to show the title in the list header.
     * If not provided, automatically detected based on parent split view presence:
     * - Inside `<c8y-sv>`: shows the title (full page context)
     * - Outside `<c8y-sv>`: hides the title (widget context where widget provides its own title bar)
     */
    showTitle?: boolean;
    /**
     * Opacity for the list content (CSS opacity: 0-1 scale).
     *
     * Use this to dim the list during loading states while showing a loading indicator.
     * Defaults to 1 (fully opaque).
     *
     * @example
     * ```html
     * <!-- Dim list to 20% opacity during initial load -->
     * <c8y-sv-list [listOpacity]="isLoading ? 0.2 : 1">
     * ```
     */
    listOpacity: number;
    /**
     * Reference to the inner scroll div element.
     * Available after `ngAfterViewInit` lifecycle hook.
     */
    innerScrollDiv?: ElementRef<HTMLDivElement>;
    readonly alertsComp?: SplitViewAlertsComponent;
    get hasAlerts(): boolean;
    /**
     * Computed property that determines if the title should be shown.
     * Uses the explicit `showTitle` input if provided, otherwise falls back to automatic detection.
     *
     * Automatic detection logic:
     * - Inside `<c8y-sv>`: shows the title (full page context)
     * - Outside `<c8y-sv>`: hides the title (widget context where widget provides its own title bar)
     */
    get shouldShowTitle(): boolean;
    /**
     * Determines if split view layout styles should be applied based on the presence of a details panel.
     *
     * When a details panel (`<c8y-sv-details>`) is present alongside the list:
     * - Returns `true` → applies `split-view__list bg-level-1` classes (lighter background for contrast)
     *
     * When no details panel is present (single column or widget usage):
     * - Returns `false` → applies `bg-component` class (standard component background)
     *
     * This detection is automatic and based on the actual layout structure.
     */
    get isSplitView(): boolean;
    static ɵfac: i0.ɵɵFactoryDeclaration<SplitViewListComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<SplitViewListComponent, "c8y-sv-list", never, { "title": { "alias": "title"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "showEmptyState": { "alias": "showEmptyState"; "required": false; }; "emptyStateIcon": { "alias": "emptyStateIcon"; "required": false; }; "emptyStateTitle": { "alias": "emptyStateTitle"; "required": false; }; "emptyStateSubtitle": { "alias": "emptyStateSubtitle"; "required": false; }; "docsUrl": { "alias": "docsUrl"; "required": false; }; "showTitle": { "alias": "showTitle"; "required": false; }; "listOpacity": { "alias": "listOpacity"; "required": false; }; }, {}, ["alertsComp"], ["c8y-sv-header-actions", "c8y-sv-alerts", "*", "c8y-sv-footer"], true, never>;
}

/**
 * Split View Details Component
 *
 * Displays the details panel of a split-view layout.
 *
 * ## Basic Usage
 *
 * ```html
 * <c8y-sv-details
 *   emptyStateIcon="c8y-devices"
 *   emptyStateTitle="No device selected"
 *   emptyStateSubtitle="Select a device to view details">
 *
 *   @if (selectedItem) {
 *     <c8y-sv-extra-header>
 *       <c8y-icon-panel [sections]="sections"></c8y-icon-panel>
 *     </c8y-sv-extra-header>
 *   }
 *
 *   @if (selectedItem) {
 *     <h3>{{ selectedItem.name }}</h3>
 *     <p>{{ selectedItem.description }}</p>
 *   }
 * </c8y-sv-details>
 * ```
 *
 * ## Router-Outlet Integration
 *
 * ```html
 * <c8y-sv-details (backClick)="handleBackClick()">
 *   <router-outlet></router-outlet>
 * </c8y-sv-details>
 * ```
 *
 * ```typescript
 * async handleBackClick(): Promise<void> {
 *   await this.alarmsViewService.closeDetailsView(this.activatedRoute);
 * }
 * ```
 */
declare class SplitViewDetailsComponent implements AfterViewInit, OnDestroy {
    selectionService: SplitViewSelectionService<unknown> | null;
    private readonly location?;
    private readonly cdr?;
    private readonly destroyRef;
    private _routerOutletActivated;
    /**
     * Title for the details section
     */
    title?: string;
    /**
     * Aria label for the details panel region.
     */
    ariaLabel: string;
    /**
     * Custom CSS classes
     */
    cssClass: string;
    /**
     * Empty state icon when nothing is selected
     */
    emptyStateIcon: string;
    /**
     * Empty state title when nothing is selected
     */
    emptyStateTitle: string;
    /**
     * Empty state subtitle when nothing is selected
     */
    emptyStateSubtitle: string;
    /**
     * Emits when the back button is clicked.
     * Allows parent components to handle custom navigation logic.
     * If not handled, default behavior (location.back or clearSelection) is used.
     */
    backClick: EventEmitter<void>;
    private readonly extraHeaderComponent?;
    private readonly actionsComponent?;
    private readonly footerComponent?;
    private readonly routerOutlet?;
    constructor(selectionService: SplitViewSelectionService<unknown> | null, location?: Location, cdr?: ChangeDetectorRef);
    ngAfterViewInit(): void;
    ngOnDestroy(): void;
    get hasExtraHeader(): boolean;
    get hasActions(): boolean;
    get hasFooter(): boolean;
    /**
     * Check if an item is selected or if router-outlet is activated
     */
    get hasSelection(): boolean;
    /**
     * Clear the current selection (back button handler).
     * Emits backClick event for parent to handle, or uses default behavior:
     * - Router-outlet: navigates back using browser history
     * - Selection service: clears the selection
     */
    clearSelection(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<SplitViewDetailsComponent, [{ optional: true; }, { optional: true; }, null]>;
    static ɵcmp: i0.ɵɵComponentDeclaration<SplitViewDetailsComponent, "c8y-sv-details", never, { "title": { "alias": "title"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "cssClass": { "alias": "cssClass"; "required": false; }; "emptyStateIcon": { "alias": "emptyStateIcon"; "required": false; }; "emptyStateTitle": { "alias": "emptyStateTitle"; "required": false; }; "emptyStateSubtitle": { "alias": "emptyStateSubtitle"; "required": false; }; }, { "backClick": "backClick"; }, ["extraHeaderComponent", "actionsComponent", "footerComponent", "routerOutlet"], ["c8y-sv-header-actions", "c8y-sv-extra-header", ":not(c8y-sv-extra-header):not(c8y-sv-details-actions):not(c8y-sv-footer):not(c8y-sv-header-actions)", "c8y-sv-details-actions", "c8y-sv-footer"], true, never>;
}

/**
 * Configuration for a single action button in the details panel.
 * Used to display action buttons with icons, labels, and optional analytics tracking.
 */
interface SplitViewAction {
    /** Unique identifier for the action (used for tracking in loops) */
    id: string;
    /** Display label for the button (will be translated) */
    label: string;
    /** Icon name to display (c8y icon identifier) */
    icon: string;
    /** Optional CSS classes for the icon (e.g., 'icon-spin'). Default: empty string */
    iconClass?: string;
    /** Optional CSS classes for the button (e.g., 'btn btn-primary'). Default: empty string */
    class?: string;
    /** Whether the button is disabled. Default: false */
    disabled?: boolean;
    /** Whether the button is visible. Default: true */
    visible?: boolean;
    /** Function to execute when button is clicked */
    action: () => void;
    /** Optional data-cy attribute for E2E testing */
    dataCy?: string;
    /** Optional tooltip text (will be translated) */
    title?: string;
    /** Optional product experience tracking configuration */
    productExperience?: {
        /** Action name for analytics */
        actionName: string;
        /** Additional data to track with the action */
        actionData?: Record<string, unknown>;
    };
}
/**
 * Displays a row of action buttons in the split view details panel.
 * Renders buttons based on the provided action configurations with support for:
 * - Icons and translatable labels
 * - Disabled and visibility states
 * - Product experience analytics tracking
 * - Custom tooltips and styling
 *
 * @example
 * ```html
 * <c8y-sv-details-actions [actions]="detailActions"></c8y-sv-details-actions>
 * ```
 *
 * @example
 * ```typescript
 * detailActions: SplitViewAction[] = [
 *   {
 *     id: 'edit',
 *     label: 'Edit',
 *     icon: 'pencil',
 *     class: 'btn btn-primary',
 *     action: () => this.editItem(),
 *     title: 'Edit this item'
 *   },
 *   {
 *     id: 'delete',
 *     label: 'Delete',
 *     icon: 'trash',
 *     class: 'btn btn-danger',
 *     action: () => this.deleteItem(),
 *     productExperience: {
 *       actionName: 'delete_item',
 *       actionData: { itemType: 'device' }
 *     }
 *   }
 * ];
 * ```
 */
declare class SplitViewDetailsActionsComponent {
    /**
     * Array of action configurations to display as buttons.
     * Buttons are rendered in the order provided.
     */
    actions: SplitViewAction[];
    static ɵfac: i0.ɵɵFactoryDeclaration<SplitViewDetailsActionsComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<SplitViewDetailsActionsComponent, "c8y-sv-details-actions", never, { "actions": { "alias": "actions"; "required": false; }; }, {}, never, ["*"], true, never>;
}

/**
 * Extra header component for split view details.
 * Provides a flexible content projection area below the main header.
 *
 * Use this component to add custom content like metadata, status information,
 * or any other details you want to display at the top of the details panel.
 *
 * @example
 * ```html
 * <c8y-sv-details>
 *   <c8y-sv-extra-header>
 *     <div class="row p-16">
 *       <div class="col-sm-6">
 *         <label>Device ID:</label>
 *         <span>{{ device.id }}</span>
 *       </div>
 *       <div class="col-sm-6">
 *         <label>Status:</label>
 *         <span>{{ device.status }}</span>
 *       </div>
 *     </div>
 *   </c8y-sv-extra-header>
 * </c8y-sv-details>
 * ```
 */
declare class SplitViewExtraHeaderComponent {
    static ɵfac: i0.ɵɵFactoryDeclaration<SplitViewExtraHeaderComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<SplitViewExtraHeaderComponent, "c8y-sv-extra-header", never, {}, {}, never, ["*"], true, never>;
}

declare class SplitViewHeaderActionsComponent {
    /**
     * Parent list component reference to automatically detect if title is shown.
     * This allows automatic adjustment of spacing based on parent's showTitle setting.
     */
    private readonly parentList;
    /**
     * Whether the parent list shows a title.
     * Automatically inherited from parent, used to adjust spacing.
     */
    get showTitle(): boolean;
    static ɵfac: i0.ɵɵFactoryDeclaration<SplitViewHeaderActionsComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<SplitViewHeaderActionsComponent, "c8y-sv-header-actions", never, {}, {}, never, ["*"], true, never>;
}

declare class SplitViewFooterComponent {
    cssClass: string;
    static ɵfac: i0.ɵɵFactoryDeclaration<SplitViewFooterComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<SplitViewFooterComponent, "c8y-sv-footer", never, { "cssClass": { "alias": "cssClass"; "required": false; }; }, {}, never, ["*"], true, never>;
}

/**
 * Directive to handle item selection in split-view list.
 * Automatically selects the item on click and applies the 'active' class.
 *
 * Usage:
 * ```html
 * @for (device of devices; track device.id) {
 *   <c8y-li [c8ySvListItem]="device">
 *     {{ device.name }}
 *   </c8y-li>
 * }
 * ```
 */
declare class SplitViewListItemDirective<T = unknown> {
    private readonly selectionService;
    /**
     * The item data to be selected.
     * Can be set via the directive attribute: [c8ySvListItem]="item"
     */
    item?: T;
    constructor(selectionService: SplitViewSelectionService<T> | null);
    get isActive(): boolean;
    get role(): string;
    onClick(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<SplitViewListItemDirective<any>, [{ optional: true; }]>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<SplitViewListItemDirective<any>, "[c8ySvListItem]", never, { "item": { "alias": "c8ySvListItem"; "required": false; }; }, {}, never, never, true, never>;
}

declare class FeedbackFormComponent implements OnChanges {
    private fb;
    private gainsightService;
    featureKey: string;
    featurePreviewName: string;
    feedbackMessageTpl: "We want to hear from you. Share your feedback on the <strong>{{featurePreviewName}}</strong> feature preview to help us improve Cumulocity.";
    feedbackForm: ReturnType<FeedbackFormComponent['initForm']>;
    stars: number[];
    hoveredRating: number;
    ratingLockOnHover: boolean;
    submitted: Record<string, boolean>;
    constructor(fb: FormBuilder, gainsightService: GainsightService);
    ngOnChanges(changes: SimpleChanges): void;
    setRating(star: number): void;
    onMouseDown(star: number): void;
    onMouseEnter(star: number): void;
    onMouseLeave(): void;
    onSubmit(): void;
    private initForm;
    static ɵfac: i0.ɵɵFactoryDeclaration<FeedbackFormComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<FeedbackFormComponent, "c8y-feedback-form", never, { "featureKey": { "alias": "featureKey"; "required": false; }; "featurePreviewName": { "alias": "featurePreviewName"; "required": false; }; }, {}, never, never, true, never>;
}

export { ACTIONS_STEPPER, AGGREGATIONS, AGGREGATION_ICONS, AGGREGATION_LABELS, AGGREGATION_LIMITS, AGGREGATION_TEXTS, AGGREGATION_VALUES, AGGREGATION_VALUES_ARR, ARRAY_VALIDATION_PREFIX, ASSET_PATH, AbstractConfigurationStrategy, ActionBarComponent, ActionBarItemComponent, ActionBarModule, ActionBarService, ActionComponent, ActionControlsExtensionService, ActionModule, ActionOutletComponent, ActionService, AggregationPickerComponent, AggregationService, AlarmRealtimeService, AlarmWithChildrenRealtimeService, AlertComponent, AlertDetailsComponent, AlertModule, AlertOutletBase, AlertOutletComponent, AlertService, AlertTextComponent, AppHrefPipe, AppIconComponent, AppStateService, AppSwitcherComponent, AppSwitcherInlineComponent, AppSwitcherService, ApplicationModule, ApplicationPluginStatus, ApplyRangeClassPipe, AssetDefinitionsService, AssetHierarchyService, AssetLinkPipe, AssetPropertyService, AssetTypesRealtimeService, AssetTypesService, AuditLogComponent, AuditLogModule, AuthenticationModule, BackendVersionFactory, BaseColumn, BaseFilteringFormRendererComponent, BooleanFilterMapper, BootstrapComponent, BootstrapModule, BottomDrawerComponent, BottomDrawerRef, BottomDrawerService, BreadcrumbComponent, BreadcrumbItemComponent, BreadcrumbModule, BreadcrumbOutletComponent, BreadcrumbService, BuiltInActionType, BytesPipe, C8Y_PLUGIN_CONTEXT_PATH, C8Y_PLUGIN_NAME, C8yComponentOutlet, C8yJSONSchema, C8yStepper, C8yStepperButtons, C8yStepperIcon, C8yStepperProgress, C8yTranslateDirective, C8yTranslateModule, C8yTranslatePipe, C8yTranslationCache, C8yTranslationLoader, C8yValidators, CUSTOM, CachedLocaleDictionaryService, CellRendererComponent, CellRendererContext, CellRendererDefDirective, ChangeCurrentUserPasswordService, ChangeIconComponent, ClickEventSource, ClipboardModule, ClipboardService, ColorInputComponent, ColorService, ColumnDataRecordClassName, ColumnDataType, ColumnDirective, CommonModule, ConditionalTabsOutletComponent, ConfigureCustomColumnComponent, ConfirmModalComponent, ContextRouteComponent, ContextRouteGuard, ContextRouteService, CookieBannerComponent, CopyDashboardDisabledReason, CoreModule, CoreSearchModule, CountdownIntervalComponent, CountdownIntervalModule, CurrentPasswordModalComponent, CustomColumn, CustomTranslateService, CustomTranslateStore, DATA_GRID_CONFIGURATION_CONTEXT, DATA_GRID_CONFIGURATION_CONTEXT_PROVIDER, DATA_GRID_CONFIGURATION_STRATEGY, DEFAULT_INTERVAL_STATE, DEFAULT_INTERVAL_VALUE, DEFAULT_INTERVAL_VALUES, DRAWER_ANIMATION_TIME, DashboardChildActionComponent, DashboardChildChange, DashboardChildComponent, DashboardChildTitleComponent, DashboardComponent, DashboardModule, DataGridComponent, DataGridModule, DataGridService, DatapointLibraryValidationErrors, DatapointSyncService, DateContextQueryParamNames, DateFilterMapper, DateFormatService, DatePickerComponent, DatePickerModule, DatePipe, DateTimePickerComponent, DateTimePickerModule, DefaultValidationDirective, DeviceBootstrapRealtimeService, DeviceService, DeviceStatusComponent, DeviceStatusModule, DismissAlertStrategy, DocsModule, DocsService, DrawerModule, DrawerOutletComponent, DrawerService, DropAreaComponent, DropAreaModule, DropdownDirectionDirective, DropdownFocusTrapDirective, DynamicBulkDetailsResolver, DynamicBulkIIdentifiedResolver, DynamicComponentAlert, DynamicComponentAlertAggregator, DynamicComponentAlertsComponent, DynamicComponentComponent, DynamicComponentErrorStrategy, DynamicComponentModule, DynamicComponentService, DynamicDatapointsResolver, DynamicFormsModule, DynamicManagedObjectResolver, DynamicResolverService, ES_MAX_TIME_MILLISECONDS, EmailsValidatorDirective, EmptyComponent, EmptyStateComponent, EmptyStateContextDirective, EventRealtimeService, ExpandableRowDirective, ExtensionPointForPlugins, ExtensionPointWithoutStateForPlugins, ExtractArrayValidationErrorsPipe, FeatureCacheService, FeedbackFormComponent, FilePickerComponent, FilePickerFormControlComponent, FilePickerFormControlModule, FilePickerModule, FilesService, FilterByPipe, FilterInputComponent, FilterMapperFactory, FilterMapperModule, FilterMapperPipe, FilterMapperService, FilterNonArrayValidationErrorsPipe, FilteringActionType, FilteringFormRendererComponent, FilteringFormRendererContext, FilteringFormRendererDefDirective, ForOfDirective, FormGroupComponent, FormsModule, GENERIC_FILE_TYPE, GLOBAL_CONTEXT_AUTO_REFRESH, GainsightService, GenericFileIconPipe, GeoService, GetGroupIconPipe, GlobalConfigService, GridDataSource, GroupFragment, GroupService, GroupedFilterChips, GuideDocsComponent, GuideHrefDirective, HOOK_ACTION, HOOK_ACTION_BAR, HOOK_BREADCRUMB, HOOK_COMPONENTS, HOOK_CURRENT_APPLICATION, HOOK_CURRENT_TENANT, HOOK_CURRENT_USER, HOOK_DOCS, HOOK_DYNAMIC_PROVIDER_CONFIG, HOOK_NAVIGATOR_NODES, HOOK_OPTIONS, HOOK_PATTERN_MESSAGES, HOOK_PLUGIN, HOOK_PREVIEW, HOOK_QUERY_PARAM, HOOK_QUERY_PARAM_BOTTOM_DRAWER, HOOK_QUERY_PARAM_MODAL, HOOK_ROUTE, HOOK_SEARCH, HOOK_STEPPER, HOOK_TABS, HOOK_VERSION, HOOK_WIZARD, HeaderBarComponent, HeaderCellRendererDefDirective, HeaderModule, HeaderService, HelpComponent, HelpModule, HighlightComponent, HookProviderTypes, HumanizeAppNamePipe, HumanizePipe, HumanizeValidationMessagePipe, I18nModule, INTERVAL_OPTIONS, IconDirective, IconPanelComponent, IfAllowedDirective, InjectionType, InputGroupEditableComponent, InputGroupListComponent, InputGroupListContainerDirective, InterAppService, IntervalBasedReload, InventorySearchService, IpRangeInputListComponent, JsonValidationPrettifierDirective, LANGUAGES, LAST_DAY, LAST_HOUR, LAST_MINUTE, LAST_MONTH, LAST_WEEK, LOCALE_PATH, LegacyGridConfigMapperService, LegendFieldWrapper, ListDisplaySwitchComponent, ListDisplaySwitchModule, ListGroupComponent, ListGroupModule, ListItemActionComponent, ListItemBodyComponent, ListItemCheckboxComponent, ListItemCollapseComponent, ListItemComponent, ListItemDragHandleComponent, ListItemFooterComponent, ListItemIconComponent, ListItemRadioComponent, ListItemTimelineComponent, LoadMoreComponent, LoadingComponent, MAX_PAGE_SIZE, MESSAGES_CORE_I18N, MOChunkLoaderService, ManagedObjectRealtimeService, ManagedObjectType, MapFunctionPipe, MarkdownToHtmlPipe, MaxValidationDirective, MeasurementRealtimeService, MessageBannerService, MessageDirective, MessagesComponent, MinValidationDirective, MissingTranslationCustomHandler, MoNamePipe, ModalComponent, ModalModule, ModalSelectionMode, ModalService, NEEDED_ROLE_FOR_SETUP, NEW_DASHBOARD_ROUTER_STATE_PROP, NULL_VALUE_PLACEHOLDER, NUMBER_FORMAT_REGEXP, NameTransformPipe, NavigatorBottomModule, NavigatorIconComponent, NavigatorModule, NavigatorNode, NavigatorNodeComponent, NavigatorNodeRoot, NavigatorOutletComponent, NavigatorService, NavigatorTopModule, NewPasswordComponent, NumberPipe, OperationBulkRealtimeService, OperationRealtimeService, OperationResultComponent, OptionsService, OutletDirective, PREVIEW_FEATURE_PROVIDERS, PRODUCT_EXPERIENCE_EVENT_SOURCE, PX_ACTIONS, PX_EVENT_NAME, PackageType, PasswordCheckListComponent, PasswordConfirm, PasswordConfirmModalComponent, PasswordInputComponent, PasswordService, PasswordStrengthCheckerService, PasswordStrengthComponent, PasswordStrengthService, PasswordValidationDirective, PasswordValidationService, PatternMessagesService, Permissions, PhoneValidationDirective, PlatformDetailsService, PluginLoadedPipe, PluginsExportScopes, PluginsLoaderService, PluginsModule, PluginsResolveService, PluginsService, PopoverConfirmComponent, PreviewFeatureButtonComponent, PreviewFeatureShowNotification, PreviewService, ProductExperienceDirective, ProductExperienceModule, ProgressBarComponent, PropertiesListComponent, PropertiesListModule, PropertyValueTransformService, ProviderConfigurationComponent, ProviderConfigurationModule, ProviderConfigurationNodeFactory, ProviderConfigurationRouteFactory, ProviderConfigurationService, ProviderDefinitionsService, PushStatus, PushStatusLabels, QUERY_PARAM_HANDLER_PROVIDERS, QueryParamBottomDrawerFactory, QueryParamBottomDrawerStateService, QueryParamHandlerService, QueryParamModalFactory, QueryParamModalStateService, QuickLinkComponent, QuickLinkModule, RESOLVING_COMPONENT_WAIT_TIME, RadioFilterMapper, RangeComponent, RangeDirective, RangeDisplayComponent, RangeDisplayModule, RealtimeButtonComponent, RealtimeControlComponent, RealtimeMessage, RealtimeModule, RealtimeService, RealtimeSubjectService, RelativeTimePipe, RequiredInputPlaceholderDirective, ResizableGridComponent, ResolverServerError, RouterModule, RouterService, RouterTabsResolver, SETUP_FINISHED_STEP_ID, SHOW_PREVIEW_FEATURES, SearchComponent, SearchFilters, SearchInputComponent, SearchOutletComponent, SearchResultEmptyComponent, SearchService, SelectComponent, SelectFilterMapper, SelectItemDirective, SelectKeyboardService, SelectLegacyComponent, SelectModalComponent, SelectModalFilterPipe, SelectModalModule, SelectModule, SelectedItemsComponent, SelectedItemsDirective, SendStatus, SendStatusLabels, ServiceRegistry, SetupCompletedComponent, SetupComponent, SetupModule, SetupService, SetupState, SetupStepperFactory, ShortenUserNamePipe, ShouldShowMoPipe, ShowIfFilterPipe, SimpleJsonPathValidatorDirective, SimplifiedAuthService, SkipLinkDirective, SortOrderModifier, SpecialColumnName, SplitViewAlertsComponent, SplitViewComponent, SplitViewDetailsActionsComponent, SplitViewDetailsComponent, SplitViewExtraHeaderComponent, SplitViewFooterComponent, SplitViewHeaderActionsComponent, SplitViewListComponent, SplitViewListItemDirective, SplitViewSelectionService, StateService, Status, StepperModule, StepperOutletComponent, StepperService, Steppers, StringFilterMapper, StringifyObjectPipe, StripHtmlPipe, SupportedApps, TabComponent, TabsModule, TabsOutletComponent, TabsService, TabsetAriaDirective, TenantUiService, TextAreaRowHeightDirective, TextareaAutoresizeDirective, ThemeSwitcherService, TimeIntervalComponent, TimePickerComponent, TimePickerModule, TitleComponent, TitleOutletComponent, TotpChallengeComponent, TotpSetupComponent, TranslateService, TreeNodeCellRendererComponent, TreeNodeColumn, TreeNodeHeaderCellRendererComponent, TypeaheadComponent, TypeaheadFilterMapper, UiSettingsComponent, UiSettingsModule, UniqueInCollectionByPathValidationDirective, UserEditComponent, UserEditModalComponent, UserEngagementsService, UserMenuItemComponent, UserMenuOutletComponent, UserMenuService, UserModule, UserNameInitialsPipe, UserPreferencesConfigurationStrategy, UserPreferencesService, UserPreferencesStorageInventory, UserPreferencesStorageLocal, UserTotpRevokeComponent, UserTotpSetupComponent, VERSION_MODULE_CONFIG, ValidationPattern, VersionListComponent, VersionModule, VersionService, ViewContext, ViewContextServices, VirtualScrollListenerDirective, VirtualScrollWindowDirective, VirtualScrollWindowStrategy, VirtualScrollerWrapperComponent, VisibleControlsPipe, WIDGET_CONFIGURATION_GRID_SIZE, WIDGET_TYPE_VALUES, WILDCARD_SEARCH_FEATURE_KEY, WebSDKVersionFactory, WidgetActionWrapperComponent, WidgetGlobalAutoRefreshService, WidgetTimeContextActionBarPriority, WidgetTimeContextComponent, WidgetTimeContextDateRangeService, WidgetTimeContextMediatorService, WidgetsDashboardComponent, WidgetsDashboardEventService, WizardBodyComponent, WizardComponent, WizardFooterComponent, WizardHeaderComponent, WizardModalService, WizardModule, WizardOutletComponent, WizardService, ZipService, _virtualScrollWindowStrategyFactory, alertOnError, allEntriesAreEqual, asyncValidateArrayElements, colorValidator, deviceAvailabilityIconMap, extraRoutes, fromFactories, fromTrigger, fromTriggerOnce, getActivatedRoute, getAngularLocalesLanguageString, getBasicInputArrayFormFieldConfig, getDictionaryWithTrimmedKeys, getInjectedHooks, gettext, globalAutoRefreshLoading, hookAction, hookActionBar, hookBreadcrumb, hookComponent, hookCurrentApplication, hookCurrentTenant, hookCurrentUser, hookDataGridActionControls, hookDocs, hookDrawer, hookDynamicProviderConfig, hookFilterMapper, hookGeneric, hookNavigator, hookOptions, hookPatternMessages, hookPlugin, hookPreview, hookQueryParam, hookQueryParamBottomDrawer, hookQueryParamModal, hookRoute, hookSearch, hookService, hookStepper, hookTab, hookUserMenu, hookVersion, hookWidget, hookWizard, internalApps, isEagerDynamicComponents, isExtensionFactory, isLazyDynamicComponents, isPromise, languagesFactory, loadLocale, localeId, localePathFactory, memoize, minColumnGridTrackSize, operationStatusClasses, operationStatusIcons, provideBootstrapMetadata, provideCommonPipes, provideCommonServices, provideDefaultOptionsAppInitializer, provideI18n, provideLanguageSelectorAppInitializer, providePluginsLoaderServiceAppInitializer, provideTranslationServiceInstance, ratiosByColumnTypes, removeContextIndicators, removeDuplicatesIds, resolveInjectedFactories, retryWithDelay, simpleJsonPathValidator, sortByPriority, stateToFactory, statusAlert, statusClasses, statusIcons, throttle, toObservable, toObservableOfArrays, tooltips, trimTranslationKey, uniqueInCollectionByPathValidator, validateArrayElements, validateInternationalPhoneNumber, viewContextRoutes, wrapperLegendFieldConfig };
export type { Action, ActionBarExtension, ActionBarFactory, ActionBarItem, ActionBarItemWithComponent, ActionBarItemWithTemplate, ActionControl, ActionControlFactory, ActionControlHook, ActionExtension, ActionFactory, ActionWithComponent, ActionWithLabelAndFunction, ActionWithTemplate, Aggregation, AggregationOption, AggregationOptionStatus, Alert, AlertGroupData, AlertType, AngularJSWidgetSettings, ApplicationPlugin, ArrayValidationErrorValue, ArrayValidationErrors, AssetColumnOperationType, AssetDefinition, AssetPropertyDefinition, AssetPropertyDefinitionResponse, AssetPropertyFilter, AssetTableExtendedColumn, BaseDrawerItem, BasePreviewFeature, Breadcrumb, BreadcrumbExtension, BreadcrumbFactory, BreadcrumbItem, BreadcrumbItemWithComponent, BreadcrumbItemWithLabel, BreadcrumbItemWithTemplate, BulkActionControl, C8yJsonSchema, C8yJsonSchemaProperty, C8yPropertyType, CanEditConfig, CellRendererDef, CellRendererSpec, CleanedVersion, ClickOptions, ColorRangeBoundaries, Column, ColumnConfig, ColumnSortingConfig, ComputedConfig, ConfirmOption, ConfirmOptions, ContextData, CustomColumnConfig, CustomColumnType, DashboardChange, DashboardChildArrangement, DashboardChildDimension, DashboardChildResizeDimension, DashboardCopyPermission, DashboardSettings, DataGrid, DataGridConfigurationStrategy, DataSourceModifier, DataSourceStats, DateAndTimeOptions, DateRangePickerConfig, DateTimeContext, DateType, DefinitionBase, DisplayOptions, DocLink, DocLinkExtension, DocLinkWithComponent, DocLinkWithLabel, DrawerHost, DrawerItem, DrawerOptions, DrawerPositions, DroppedFile, DynamicBulkRetrievalError, DynamicComponent, DynamicComponentDefinition, DynamicComponentDefinitionBase, DynamicComponentExtension, DynamicComponents, DynamicDetailsResolver, DynamicProviderConfig, DynamicProviderEndpointConfig, DynamicProviderLayoutConfig, DynamicProviderNavigationConfig, DynamicProviderTabsConfig, DynamicWidgetDefinition, DynamicWidgetDefinitionBase, EagerDynamicComponents, Endpoint, ExtensionFactory, ExtensionPoint, Filter, FilterChip, FilterMapper, FilterMapperExtension, FilterPredicateFunction, FilteringFormRendererSpec, FilteringModifier, ForOfFilterPipe, ForOfRealtimeOptions, FormGroupConfig, FormlyColumnFilteringConfig, GenericHookOptions, GenericHookType, GlobalAutoRefreshQueryParam, GlobalAutoRefreshWidgetConfig, GlobalTimeContextWidgetConfig, GridConfig, GridConfigContext, GridConfigContextProvider, GridConfigFilter, GridConfigPart, GridEventType, Header, HeaderActionControl, HeaderTemplates, HookValueType, IFetchWithProgress, IRealtimeDeviceBootstrap, ISelectModalBodyPart, ISelectModalObject, ISelectModalOption, IUpdateItemEvent, IconConfigComparison, IconConfigItem, IconPanelSection, IndexedStep, InputDateContextQueryParams, Item, JsonSchema, LazyDynamicComponents, LeftDrawerItem, LegacyWidget, LoadMoreMode, ManagedObjectTypeForConfig, MessageLike, ModalLabels, NavigatorNodeData, NavigatorNodeFactory, NewPassword, NotificationService, OnBeforeSave, OutputDateContextQueryParams, Pagination, PartialFilterChipGenerationType, PartialFilterChipRemovalType, PasswordErrorKey, PasswordStrengthColor, PasswordStrengthSettings, PasswordValidationResult, PathSortingConfig, PatternMessages, PickedDates, PickedFiles, PluginsConfig, PopoverConfirmButtons, PreviewFeature, PreviewFeatureCustom, PreviewFeatureDefault, ProductExperienceEvent, ProductExperienceEventSource, PropertiesListItem, ProviderDefinition, ProviderProperties, PxEventData, QueryParamBottomDrawerConfig, QueryParamConfig, QueryParamModalConfig, QueryParamModalConfigBase, QueryParamModalConfigEager, QueryParamModalConfigLazy, RangeDisplay, RealtimeAction, RemoteModuleWithMetadata, ResizableGridConfig, RevertChangeType, RightDrawerItem, Route, RouteDefault, RouteExtension, RouteFactory, RouteWithComponent, RouteWithTab, Row, SchemaNode, Search, SearchFactory, SelectableItem, SelectableItemTemplate, ServerSideDataCallback, ServerSideDataResult, SetupStep, SortOrder, SplitViewAction, StatusType, Step, StepperButtonsVisibility, StepperExtension, SupportedAppKey, Tab, TabExtension, TabFactory, TabOrientation, TabWithComponent, TabWithTemplate, ThemeOptions, ThemePreferenceOptions, TimeContextEvent, TimeInterval, TimeIntervalOption, TreeNode, User, UserMenuItem, UserPreference, UserPreferencesGridConfigContext, ValidationRules, Version, VersionModuleConfig, ViewContexServiceConfig, ViewContextRootRoute, Widget, WidgetChange, WidgetChangeEvent, WidgetChangeEventType, WidgetDataType, WidgetDisplaySettings, WidgetImportExportInjectorOptions, WidgetSettings, WidgetTimeContext, WidgetTimeContextState, Wizard, WizardConfig, WizardEntry, WizardExtension, ZipEntry, selectedFunction, selectedLabelFunction };
//# sourceMappingURL=index.d.ts.map
