{
    "$id": "http://glue42.com/gd/application.json",
    "$schema": "http://json-schema.org/draft-06/schema#",
    "title": "ApplicationConfigSet",
    "description": "Schema describing the set of configurations for applications running in **io.Connect Desktop**.",
    "type": "array",
    "items": {
        "$ref": "#/definitions/application"
    },
    "definitions": {
        "application": {
            "title": "ApplicationConfig",
            "type": "object",
            "description": "Schema describing the configuration for an application running in **io.Connect Desktop**.",
            "required": [
                "type",
                "name",
                "details"
            ],
            "additionalProperties": true,
            "properties": {
                "type": {
                    "description": "Type of the application.",
                    "enum": [
                        "window",
                        "activity",
                        "exe",
                        "node",
                        "workspaces",
                        "webGroup",
                        "clickonce",
                        "citrix",
                        "childWindow"
                    ]
                },
                "details": {
                    "description": "Detailed configuration based on the application type.",
                    "oneOf": [
                        {
                            "$ref": "#/definitions/window"
                        },
                        {
                            "$ref": "#/definitions/activity"
                        },
                        {
                            "$ref": "#/definitions/exe"
                        },
                        {
                            "$ref": "#/definitions/node"
                        },
                        {
                            "$ref": "#/definitions/workspaces"
                        },
                        {
                            "$ref": "#/definitions/webGroup"
                        },
                        {
                            "$ref": "#/definitions/clickonce"
                        },
                        {
                            "$ref": "#/definitions/citrix"
                        },
                        {
                            "$ref": "#/definitions/childWindow"
                        }
                    ]
                },
                "name": {
                    "description": "Name of the application. Should be unique.",
                    "type": "string"
                },
                "version": {
                    "description": "Version of the application.",
                    "type": "string"
                },
                "title": {
                    "description": "Title used when visualizing the application.",
                    "type": "string"
                },
                "caption": {
                    "description": "User friendly (longer) description that can be used by the **io.Connect Desktop** clients to show more detailed application information.",
                    "type": "string"
                },
                "configMode": {
                    "description": "Specifies in which **io.Connect Desktop** configuration mode these applications will be available.",
                    "enum": [
                        "All",
                        "File",
                        "CM"
                    ],
                    "default": "All"
                },
                "tooltip": {
                    "description": "Tooltip (extended description) that will be used when visualizing the application.",
                    "type": "string"
                },
                "autoStart": {
                    "description": "If `true`, the application will auto start.",
                    "type": "boolean",
                    "default": false
                },
                "runPriority": {
                    "description": "Determines the priority with which the app will be started. If not set, the app will be considered with lowest priority. Use a number if you want to set the start priority of an end user app. Use an object if you want to set the start priority of system apps.",
                    "oneOf": [
                        {
                            "description": "If the `runPriority` property is missing or is zero, the application is considered to be low priority, i.e. all current applications will be low priority until someone changes/sets their `runPriority` configurations.",
                            "type": "number",
                            "default": 0
                        },
                        {
                            "$ref": "#/definitions/runPriority"
                        }
                    ]
                },
                "requiresSSO": {
                    "description": "This option is valid for system and auto start applications and if it is `true`, they will auto start after a successful SSO login. Note that user applications are always initialized (and this way auto started) after SSO login, so this option is useless for them.",
                    "type": "boolean",
                    "default": false
                },
                "shell": {
                    "description": "This option is valid for system applications and if `true`, the application will start after **io.Connect Desktop** initialization. Usually, this is a container based web UI application which acts as an **io.Connect Desktop** client.",
                    "type": "boolean",
                    "default": false
                },
                "ignoreSavedLayout": {
                    "description": "If `true`, the application default layout will not be auto saved when it is closed and on the next start, if the layout exists, it will be ignored.",
                    "type": "boolean",
                    "default": false
                },
                "ignoreSaveOnClose": {
                    "description": "Deprecated. Use `ignoreSavedLayout` instead.",
                    "type": "boolean",
                    "default": false
                },
                "closeOnHibernate": {
                    "description": "Whether to close the application when it is part of a hibernating layout.",
                    "type": "boolean"
                },
                "shutdownApplicationName": {
                    "description": "Specify another application to be started in order to shut down the current application instances.",
                    "type": "string"
                },
                "activityTarget": {
                    "$ref": "#/definitions/activityTarget"
                },
                "icon": {
                    "description": "URL or the Base64 encoding (only the data part from the URI scheme) of the icon used as a taskbar icon for the application.",
                    "type": "string"
                },
                "disabled": {
                    "description": "If `true`, the application will be disabled.",
                    "type": "boolean",
                    "default": false
                },
                "hidden": {
                    "description": "If `true`, the application will not be visible in the App Manager.",
                    "type": "boolean",
                    "default": false
                },
                "allowMultiple": {
                    "description": "If `true`, multiple instances of the application can be started.",
                    "type": "boolean",
                    "default": true
                },
                "allowCapture": {
                    "description": "If `true`, this app will be allowed to capture display/window/group screenshots through the 'glue.displays' API",
                    "type": "boolean",
                    "default": false
                },
                "allowLogging": {
                    "description": "If `true`, this app will be allowed to log in a custom file in 'UserData/logs/application' through the 'glue.log' API",
                    "type": "boolean",
                    "default": false
                },
                "ignoreFromLayouts": {
                    "description": "If `true`, this app will not be saved when saving a layout, nor closed or restored when restoring a layout.",
                    "type": "boolean",
                    "default": false
                },
                "sortOrder": {
                    "description": "Defines the (ascending) order used by **io.Connect Desktop** when sending the user applications list to its clients.",
                    "type": "integer",
                    "default": 1000
                },
                "saveMultipleInstances": {
                    "description": "When `false`, only the last application (or activity) instance will be saved in the default (startup) layout. When `true`, all instances will be saved.",
                    "type": "boolean"
                },
                "service": {
                    "description": "If `true`, the application will not be closed when saving and restoring a layout.",
                    "type": "boolean",
                    "default": false
                },
                "customProperties": {
                    "description": "These name/value pairs are sent to the **io.Connect Desktop** clients. The Application Manager API exposes them as well, allowing custom UIs to interpret and use the values.",
                    "type": "object"
                },
                "keywords": {
                    "description": "An array of keywords that can help discovering the application easier",
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "noDelayedRestore": {
                    "description": "If `true`, the application will always be restored directly when restoring workspaces (no delayed or lazy restore for this app).",
                    "type": "boolean",
                    "default": false
                },
                "intents": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/intent"
                    }
                },
                "fdc3": {
                    "type": "object",
                    "description": "The original FDC3 app definition as retrieved from an FDC3 App Directory. When **io.Connect Desktop** is configured to retrieve app definitions from a REST store that is an FDC3 App Directory, the FDC3 definitions are converted to io.Connect definitions and this property is added automatically to each one of them."
                },
                "suspendMetrics": {
                    "description": "If `true`, the application won't publish any metrics.",
                    "type": "boolean",
                    "default": false
                },
                "shortcut": {
                    "description": "Will be registered as global shortcut and will start the app or focus it.",
                    "type": "string"
                },
                "launcherApp": {
                    "description": "Name of the application to be used to launch this app.",
                    "type": "string"
                },
                "allowRegisteringWorkspaceShortcuts": {
                    "description": "Will allow registering shortcuts in any workspace.",
                    "type": "boolean",
                    "default": false
                },
                "allowCookiesManipulation": {
                    "description": "If `true`, the app can query and modify the session cookies.",
                    "type": "boolean"
                },
                "allowCLAAccess": {
                    "description": "If `true`, the app will be able to access the command line arguments with which **io.Connect Desktop** is started.",
                    "type": "boolean"
                },
                "allowWorkspaceDrop": {
                    "description": "If `false`, the user won't be able to drop the app in a Workspace.",
                    "type": "boolean",
                    "default": true
                },
                "reuseInLayouts": {
                    "description": "If `true` and the app is part of a hibernated Layout, one or more of its available instances will be reused when resuming another Layout that contains the same app.",
                    "type": "boolean",
                    "default": false
                },
                "supportEmails": {
                    "description": "Emails of the owners of the application",
                    "type": "array",
                    "items": {
                        "type": "string",
                        "description": "Single email address."
                    }
                },
                "asset": {
                    "description": "Configuration for an archived app that will be downloaded and extracted at a specified location. The default location is `%LocalAppData%/Tick42/UserData/%GLUE-ENV%-%GLUE-REGION%/remoteApps/<app-name>` where `<app-name>` is the name of the app as defined in its configuration. The default location can be changed using the `\"userData\"` property of the `\"folders\"` top-level key in the `system.json` configuration file of **io.Connect Desktop**. You can also use the `$ASSET_LOCATION$` macro pointing to the default location of the extracted app when defining the `\"path\"` or the `\"url\"` property of your app.",
                    "properties": {
                        "src": {
                            "description": "URL pointing to the location of the archived app that will be downloaded and extracted.",
                            "type": "string"
                        },
                        "headers": {
                            "description": "Headers that will be added to the request for downloading the archived app.",
                            "type": "array",
                            "items": {
                                "type": "object",
                                "properties": {
                                    "name": {
                                        "description": "Header name.",
                                        "type": "string"
                                    },
                                    "value": {
                                        "description": "Header value.",
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "name",
                                    "value"
                                ],
                                "additionalProperties": false
                            }
                        },
                        "noCache": {
                            "description": "If `true`, the `Cache-Control: no-cache` header will be added.",
                            "type": "boolean",
                            "default": false
                        }
                    }
                },
                "allowHeadersManipulation": {
                    "description": "If `true`, the app can query and modify the request headers.",
                    "type": "boolean",
                    "default": false
                },
                "allowAutoArrange": {
                    "description": "If `true`, it will be possible to auto arrange the app window programmatically. Defaults to `true`.",
                    "type": "boolean",
                    "default": true
                },
                "childrenInheritChannel": {
                    "description": "If set, child windows spawned by this app will be joined to its current Channel. You can enable this setting for all child windows of this app, or only for a list of specific ones. If the app definition of the child contains a `\"channelId\"` property, it will be joined to the Channel specified in its definition and not to the current Channel of the parent.",
                    "oneOf": [
                        {
                            "description": "If `true`, all child windows spawned by this app will be joined to its current Channel.",
                            "type": "boolean"
                        },
                        {
                            "type": "array",
                            "description": "List of apps that when spawned by this app will be joined to its current Channel.",
                            "items": {
                                "type": "string",
                                "description": "App names as specified in the respective app definitions."
                            }
                        }
                    ]
                },
                "allowScriptExecution": {
                    "description": "If `true`, the current window will be able to execute code in its own context, or in the context of other windows, by invoking the `executeCode()` method on an io.Connect Window object.",
                    "type": "boolean",
                    "default": false
                },
                "critical": {
                    "description": "If `true`, the app will be considered critical for the platform and **io.Connect Desktop** will shut down and display an error message if the app fails to load.",
                    "type": "boolean",
                    "default": false
                },
                "reuseHiddenInstances": {
                    "description": "If `true`, an already existing hidden instance of the app will be reused (if available) when a new instance of the same app has been requested. The reused instance will be made visible, will be focused, and its context will be updated.",
                    "type": "boolean",
                    "default": false
                }
            }
        },
        "window": {
            "title": "WindowConfig",
            "type": "object",
            "description": "Single window application.",
            "additionalProperties": true,
            "properties": {
                "urlLoadOptions": {
                    "description": "Describes the options for loading a window URL.",
                    "type": "object",
                    "properties": {
                        "baseURLForDataURL": {
                            "description": "Base URL for files loaded by a data URL. Must end with a trailing path separator. This property is necessary only when the loaded URL is a data URL.",
                            "type": "string"
                        },
                        "extraHeaders": {
                            "description": "A string with extra headers for the request. Separate the headers with a `\\n`.",
                            "type": "string"
                        },
                        "httpReferrer": {
                            "anyOf": [
                                {
                                    "$ref": "#/definitions/referrer"
                                },
                                {
                                    "type": "string"
                                }
                            ],
                            "description": "URL for the `Referer` request header or a `Referrer` object specifying a URL and a policy for the `Referrer-Policy` request header."
                        },
                        "postData": {
                            "description": "Data for the POST request. Either an `UploadFile` object describing the location and other properties of the file to upload, or an `UploadBase64Data` object containing data encoded as a Base64 string.",
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/uploadFile"
                                    },
                                    {
                                        "$ref": "#/definitions/uploadBase64Data"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        "userAgent": {
                            "description": "A user agent originating the request.",
                            "type": "string"
                        },
                        "queryString": {
                            "type": "string",
                            "description": "Query string that will be appended to the URL when starting the app. If the string doesn't start with a `?`, one will be prepended to it. Note that the query string must be URL encoded."
                        }
                    }
                },
                "url": {
                    "description": "Required. URL pointing to the location of the window application.",
                    "type": "string"
                },
                "saveCurrentUrlInLayout": {
                    "description": "If `true`, the current URL of the web app will be saved and loaded when the app is restored in a Layout.",
                    "oneOf": [
                        {
                            "description": "If `true`, the URL will be saved for all Layout types - Application Default, Workspace and Global.",
                            "type": "boolean"
                        },
                        {
                            "type": "array",
                            "description": "List of Layout types for which the URL will be saved.",
                            "items": {
                                "type": "string",
                                "description": "Layout type",
                                "enum": [
                                    "Global",
                                    "ApplicationDefault",
                                    "Workspace"
                                ]
                            }
                        }
                    ]
                },
                "saveCurrentTitleInLayout": {
                    "description": "If `true`, the current title of the web app will be saved and restored when the app is restored in a Layout.",
                    "oneOf": [
                        {
                            "description": "If `true`, the application title will be saved for all Layout types - Application Default, Workspace and Global.",
                            "type": "boolean"
                        },
                        {
                            "type": "array",
                            "description": "List of Layout types for which the application title will be saved.",
                            "items": {
                                "type": "string",
                                "description": "Layout type",
                                "enum": [
                                    "Global",
                                    "ApplicationDefault",
                                    "Workspace"
                                ]
                            }
                        }
                    ]
                },
                "userAgent": {
                    "$ref": "system.json#/definitions/userAgentConfig"
                },
                "name": {
                    "description": "Name of the window",
                    "type": "string"
                },
                "windowName": {
                    "description": "Deprecated. Name of the window",
                    "type": "string"
                },
                "isSticky": {
                    "description": "If `true`, the newly created window will participate in io.Connect Window operations (stick, unstick, etc.).",
                    "type": "boolean"
                },
                "snapToScreenEdges": {
                    "$ref": "#/definitions/snapToScreenEdges"
                },
                "left": {
                    "description": "Position (in pixels) of the top-left window corner relative to the left edge of the display.",
                    "type": "integer",
                    "default": 0
                },
                "top": {
                    "description": "Position (in pixels) of the top-left window corner, relative to the top edge of the display.",
                    "type": "integer",
                    "default": 0
                },
                "width": {
                    "description": "Width of the app window.",
                    "type": "integer",
                    "default": 400
                },
                "height": {
                    "description": "Height of the app window.",
                    "type": "integer",
                    "default": 400
                },
                "allowClose": {
                    "description": "If `false`, the window will not contain a close button.",
                    "type": "boolean",
                    "default": true
                },
                "allowTabClose": {
                    "description": "If `false`, the tab header will not contain a close button.",
                    "type": "boolean",
                    "default": true
                },
                "allowCollapse": {
                    "description": "If `false`, the window will not contain a collapse button.",
                    "type": "boolean",
                    "default": false
                },
                "allowForward": {
                    "description": "If `false`, the window will not contain an activity related forward button.",
                    "type": "boolean",
                    "default": true
                },
                "allowMaximize": {
                    "description": "If `false`, the window will not contain a maximize button.",
                    "type": "boolean",
                    "default": true
                },
                "allowMinimize": {
                    "description": "If `false`,the window will not contain a minimize button.",
                    "type": "boolean",
                    "default": true
                },
                "allowUnstick": {
                    "description": "If `false`, the window will remain stuck to other windows.",
                    "type": "boolean",
                    "default": true
                },
                "allowChannels": {
                    "description": "Deprecated. Use `\"channelSelector\"` instead.",
                    "type": "boolean"
                },
                "readOnlyChannelSelector": {
                    "description": "Deprecated. Use `\"channelSelector\"` instead.",
                    "type": "boolean"
                },
                "allowLockUnlock": {
                    "description": "If `false`, the window will not contain a lock/unlock button.",
                    "type": "boolean",
                    "default": false
                },
                "allowExtract": {
                    "description": "If `false`, the window will not contain an extract button.",
                    "type": "boolean"
                },
                "showStickyButton": {
                    "description": "If `false`, the window will not contain a sticky button.",
                    "type": "boolean"
                },
                "showFeedbackButton": {
                    "description": "If `false`, the window will not contain a feedback button.",
                    "type": "boolean"
                },
                "showCloneButton": {
                    "description": "If `false`, the window will not contain a clone button.",
                    "type": "boolean"
                },
                "maximizable": {
                    "description": "If `false`, the window will not be able to maximize via buttons and/or windows gestures.",
                    "type": "boolean",
                    "default": true
                },
                "minimizable": {
                    "description": "If `false`, the window will not be able to minimize via buttons and/or windows gestures.",
                    "type": "boolean",
                    "default": true
                },
                "disableTransitions": {
                    "description": "If `true`, disables transition animations applied when showing a hidden window or changing its state during minimize/restore/maximize.",
                    "type": "boolean",
                    "default": false
                },
                "autoSnap": {
                    "description": "If `true`, when the move operation ends, the window will snap to one of the approaching edges of another window (if any of the approaching edges are marked with red).",
                    "type": "boolean",
                    "default": true
                },
                "autoAlign": {
                    "description": "When `true`, a snapped window will adjust its bounds in order to have equal width/height and/or to occupy the space between other windows (if any).",
                    "type": "boolean"
                },
                "icon": {
                    "description": "URL or the Base64 encoding (only the data part from the URI scheme) of the icon used as a taskbar icon for the window. If not specified, it will use the icon from the application configuration.",
                    "type": "string"
                },
                "borderColor": {
                    "description": "Can be a color name, such as \"red\", or a hex-encoded RGB or ARGB value.",
                    "type": "string"
                },
                "backgroundColor": {
                    "description": "Background color of the Electron window. Can be a color in Hex, RGB, RGBA, HSL, HSLA or named CSS color format. The alpha channel is optional for the hex type.",
                    "type": [
                        "string",
                        "boolean"
                    ]
                },
                "collapseHeight": {
                    "description": "Defines the height of the window when collapsed.",
                    "type": "number",
                    "default": -1
                },
                "devToolsEnable": {
                    "description": "If `true`, allows opening a developer console (using `F12`) for the new window.",
                    "type": "boolean",
                    "default": true
                },
                "downloadSettings": {
                    "$ref": "system.json#/definitions/downloadConfig"
                },
                "isCollapsed": {
                    "description": "If `true`, the window will start collapsed.",
                    "type": "boolean",
                    "default": false
                },
                "isPopup": {
                    "description": "Deprecated, use `isChild` instead. If `true`, the window will open as a pop-up, sharing the lifetime and environment of the opener.",
                    "type": "boolean",
                    "default": false
                },
                "isChild": {
                    "description": "If `true`, the window will be created as a child window of the application/window creating it. This means that it will share the lifetime and environment of the opener.",
                    "type": "boolean",
                    "default": false
                },
                "focus": {
                    "description": "If `false`, the window will not take focus when created.",
                    "type": "boolean",
                    "default": true
                },
                "hasMoveAreas": {
                    "description": "If `false`, a window in HTML mode can not be moved.",
                    "type": "boolean",
                    "default": true
                },
                "hasSizeAreas": {
                    "description": "If `false`, the window won't have resizing areas and the user won't be able to resize it by dragging its borders. Defaults to `true` for the io.Connect HTML, flat and tab windows. Defaults to `false` for the io.Connect frameless windows.",
                    "type": "boolean"
                },
                "hidden": {
                    "description": "If `true`, the window will start as a hidden window.",
                    "type": "boolean",
                    "default": false
                },
                "historyNavigationEnabled": {
                    "description": "If `true`, will allow users to navigate back (`CTRL+Left`) and forward (`CTRL+Right`) through the web page history.",
                    "type": "boolean"
                },
                "injectionIntegration": {
                    "description": "Deprecated - use allowExtensions - Whether to allow a web application hosted in **io.Connect Desktop** to be accessible by external scripts injected in the window",
                    "type": "boolean",
                    "default": false
                },
                "maxHeight": {
                    "description": "Specify the maximum window height.",
                    "type": "number"
                },
                "maxWidth": {
                    "description": "Specify the maximum window width.",
                    "type": "number"
                },
                "minHeight": {
                    "description": "Specify the minimum window height.",
                    "type": "number",
                    "default": 30
                },
                "minWidth": {
                    "description": "Specify the minimum window width.",
                    "type": "number",
                    "default": 50
                },
                "mode": {
                    "description": "io.Connect Window type. Possible values are `flat`, `html`, `tab`.",
                    "enum": [
                        "flat",
                        "tab",
                        "html",
                        "frameless"
                    ],
                    "type": "string",
                    "default": "flat"
                },
                "serviceWindow": {
                    "description": "A legacy setting which indicates whether the app should be hidden (also provides other relevant settings). Currently not used.",
                    "type": "boolean",
                    "default": false
                },
                "printToPdfSettings": {
                    "$ref": "system.json#/definitions/printToPdfConfig"
                },
                "print": {
                    "$ref": "system.json#/definitions/printConfig"
                },
                "moveAreaThickness": {
                    "description": "How much of the outer window area is to be considered as a moving area (meaning you can move the window using it). The string value corresponds to the left, top, right and bottom borders.",
                    "type": "string",
                    "default": "0, 12, 0, 0",
                    "pattern": "^(?:[0-9 ]+,)*[0-9 ]+$"
                },
                "moveAreaLeftMargin": {
                    "description": "The io.Connect Window can contain a move area thickness left margin. The margin is related to the left border of `moveAreaThickness` only. The string value corresponds to the left, top, right and bottom.",
                    "type": "string",
                    "default": "0, 0, 0, 0",
                    "pattern": "^(?:[0-9 ]+,)*[0-9 ]+$"
                },
                "moveAreaTopMargin": {
                    "description": "The io.Connect Window can contain a move area thickness top margin. The margin is related to the top border of `moveAreaThickness` only. The string value corresponds to the left, top, right and bottom.",
                    "type": "string",
                    "default": "0, 0, 0, 0",
                    "pattern": "^(?:[0-9 ]+,)*[0-9 ]+$"
                },
                "moveAreaRightMargin": {
                    "description": "The io.Connect Window can contain a move area thickness right margin. The margin is related to the right border of `moveAreaThickness` only. The string value corresponds to the left, top, right and bottom.",
                    "type": "string",
                    "default": "0, 0, 0, 0",
                    "pattern": "^(?:[0-9 ]+,)*[0-9 ]+$"
                },
                "moveAreaBottomMargin": {
                    "description": "The io.Connect Window can contain a move area thickness bottom margin. The margin is related to the bottom border of `moveAreaThickness` only. The string value corresponds to the left, top, right and bottom.",
                    "type": "string",
                    "default": "0, 0, 0, 0",
                    "pattern": "^(?:[0-9 ]+,)*[0-9 ]+$"
                },
                "moveAreaPassThroughMouseHover": {
                    "description": "If `true`, mouse hover events which are over move area will be passed to the underlying Electron window.",
                    "type": "boolean",
                    "default": false
                },
                "onTop": {
                    "description": "Setting that allows the app window to be on top of the Z-order, in front of all other windows, even when it isn't on focus. Note that because each io.Connect app window is in fact in an io.Connect Window group container (even though being a single window), the `onTop` setting actually determines the Z-order of the group container at the moment of its creation. Snapping an io.Connect Window to another io.Connect Window in reality destroys the group container of the snapped window and that window joins the group container of the window to which it is being snapped. Therefore, when joining a window with a specified `onTop` setting to another window or a window group, its initial `onTop` value will be overwritten - either permanently (when set to `true`), or temporarily (when set to `always`).",
                    "default": false,
                    "oneOf": [
                        {
                            "description": "If `true`, the window will be on top of the Z-order. This, however, will last only until the window is visible and not joined to an io.Connect Window group. If the window is hidden programmatically or the user snaps it to another io.Connect Window or window group, it will no longer be on top of the Z-order when it becomes visible or when the user tears it off from the group.",
                            "type": "boolean",
                            "default": false
                        },
                        {
                            "description": "If set to `always`, the window will remain permanently on top of the Z-order, regardless of changes to its visibility or whether it joins or leaves an io.Connect Window group. If you join a window that is set to always be on top to a window or a group of windows which aren't, it will temporarily lose its always on top setting. When the window is extracted from the group, it will again be always on top.",
                            "type": "string",
                            "enum": [
                                "always"
                            ]
                        }
                    ]
                },
                "relativeTo": {
                    "description": "The window ID of the window that will be used to relatively position the new window. Can be combined with `relativeDirection`.",
                    "type": "string"
                },
                "relativeDirection": {
                    "description": "Direction (`bottom`, `top`, `left`, `right`) for positioning the window relatively to the `relativeTo` window. Considered only if `relativeTo` is supplied.",
                    "type": "string",
                    "default": "right"
                },
                "showInTaskbar": {
                    "description": "If `false`, the window will not appear in the taskbar.",
                    "type": "boolean",
                    "default": true
                },
                "showTitleBar": {
                    "description": "Whether the window will have a window title bar.",
                    "type": "boolean",
                    "default": true
                },
                "sizeAreaThickness": {
                    "description": "How much of the outer window area is to be considered as a sizing area (meaning you can resize the window using it). The string value corresponds to the left, top, right and bottom borders.",
                    "type": "string",
                    "default": "5, 5, 5, 5",
                    "pattern": "^(?:[0-9 ]+,)*[0-9 ]+$"
                },
                "sizeAreaPassThroughMouseHover": {
                    "description": "If `true`, mouse hover events which are over size area will be passed to the underlying Electron window.",
                    "type": "boolean",
                    "default": false
                },
                "snappingEdges": {
                    "description": "Specifies the active io.Connect Window snapping edges. Possible combinations are: `top`, `left`, `right`, `bottom`, `all` and any combination of them (e.g. `left, right`).",
                    "type": "string",
                    "default": "all"
                },
                "startLocation": {
                    "description": "Window startup location.",
                    "oneOf": [
                        {
                            "type": "string",
                            "enum": [
                                "center",
                                "topCenter",
                                "bottomCenter",
                                "leftCenter",
                                "rightCenter",
                                "full",
                                "topFull",
                                "bottomFull",
                                "leftFull",
                                "rightFull"
                            ]
                        },
                        {
                            "type": "object",
                            "properties": {
                                "location": {
                                    "type": "string",
                                    "enum": [
                                        "center",
                                        "topCenter",
                                        "bottomCenter",
                                        "leftCenter",
                                        "rightCenter",
                                        "full",
                                        "topFull",
                                        "bottomFull",
                                        "leftFull",
                                        "rightFull"
                                    ]
                                },
                                "stuck": {
                                    "description": "Identifies whether an application has to be stuck to particular location",
                                    "type": "boolean"
                                },
                                "width": {
                                    "description": "Specifies the window width",
                                    "type": "number"
                                },
                                "height": {
                                    "description": "Specifies the window height",
                                    "type": "number"
                                },
                                "sizeMode": {
                                    "type": "string",
                                    "description": "Defines the window width or height in pixels or percents of the containing monitor",
                                    "enum": [
                                        "pixels",
                                        "percents"
                                    ]
                                },
                                "display": {
                                    "description": "The identifying number of the monitor (e.g., 1, 2, 3 or \"main\")",
                                    "type": "string"
                                }
                            },
                            "additionalProperties": false
                        }
                    ]
                },
                "frameColor": {
                    "description": "Specifies the io.Connect Window frame color. Accepts hex color as a string (e.g., `#666666`) or named HTML colors (e.g., `red`)",
                    "type": "string"
                },
                "stickyFrameColor": {
                    "description": "Specifies the color that indicates on which side the windows will stick.",
                    "type": "string",
                    "default": "#5b8dc9"
                },
                "stickyGroup": {
                    "description": "If set, the io.Connect Window can only stick to windows that belong to the same group.",
                    "type": "string",
                    "default": "Any"
                },
                "tabGroupId": {
                    "description": "Specifies the tab group ID. If two or more tab windows are defined with the same ID, they will be hosted in the same tab window.",
                    "type": "string"
                },
                "tabIndex": {
                    "description": "Specifies the tab position index. Tab windows in the same tab group are ordered by their position index. Use negative index to make the tab active.",
                    "type": "number"
                },
                "tabSelected": {
                    "description": "Whether the application tab to be on focus when the app is opened as a tab window in a tab group.",
                    "type": "boolean",
                    "default": true
                },
                "tabTitle": {
                    "description": "Deprecated. Use 'title' instead.",
                    "type": "string"
                },
                "tabWidth": {
                    "description": "Specifies the tab width.",
                    "type": "number",
                    "default": 0
                },
                "hideTabHeader": {
                    "description": "Hides the tab header.",
                    "type": "boolean",
                    "default": false
                },
                "tabToolTip": {
                    "description": "Deprecated. Use 'tabTooltip' instead.",
                    "type": "string",
                    "default": ""
                },
                "tabTooltip": {
                    "description": "Tab tooltip.",
                    "type": "string",
                    "default": ""
                },
                "hideGroupHeader": {
                    "description": "Hides the group header when a window joins this windows group",
                    "type": "boolean"
                },
                "title": {
                    "description": "Sets the window title. To work properly, there should be a title HTML tag in the page.",
                    "type": "string"
                },
                "loader": {
                    "description": "Object that defines loader behavior.",
                    "type": "object",
                    "additionalProperties": false,
                    "default": {},
                    "properties": {
                        "enabled": {
                            "description": "If `true`, enables page loaders.",
                            "type": "boolean",
                            "default": true
                        },
                        "type": {
                            "description": "The loader animation type. Check the \"Loader Animations\" for possible options.",
                            "type": "string",
                            "default": "DoubleBounce"
                        },
                        "background": {
                            "description": "Changes the background of the loader page. Accepts hex color as a string (e.g., `#666666`) or named HTML colors (e.g., `red`).",
                            "type": "string",
                            "default": "#1C2D3B"
                        },
                        "speed": {
                            "description": "Changes the animation speed. A bigger number means faster animation.",
                            "type": "number",
                            "default": 1
                        },
                        "size": {
                            "description": "Use this to set an absolute size to the loader animation in pixels. Note that not all loader types support that setting.",
                            "type": "number",
                            "default": 1
                        },
                        "sizeFactor": {
                            "description": "Use this to set the size of the loader animation as a factor of the window size.",
                            "type": "number",
                            "default": 0.3
                        },
                        "hideOnLoad": {
                            "description": "Use this to hide the loader once the page is loaded.",
                            "type": "boolean",
                            "default": true
                        },
                        "text": {
                            "description": "Use this to display text on the loading page.",
                            "type": "string",
                            "default": "Loading"
                        },
                        "textSize": {
                            "description": "Use this to set loader text font size.",
                            "type": "number",
                            "default": 12
                        },
                        "textColor": {
                            "description": "Use this to set loader text color. Accepts hex color as a string (e.g., `#666666`) or named HTML colors (e.g., `red`).",
                            "type": "string",
                            "default": "#F1F1F1"
                        }
                    }
                },
                "useRandomFrameColor": {
                    "description": "If `true`, will set a random (from a predefined list of colors) frame color to the new window.",
                    "type": "boolean",
                    "default": false
                },
                "windowState": {
                    "description": "If set, the window will start in the specified state (maximized, minimized, normal).",
                    "type": "string",
                    "default": "normal"
                },
                "autoInjectAPI": {
                    "description": "Specifies if the io.Connect JavaScript API will be auto injected in the window context. The `Glue()` factory function becomes available without referencing a `desktop.js` file.",
                    "type": "object",
                    "required": [
                        "enabled"
                    ],
                    "additionalProperties": false,
                    "properties": {
                        "enabled": {
                            "description": "If `true`, will enable auto injection of the io.Connect JavaScript library.",
                            "type": "boolean"
                        },
                        "autoInit": {
                            "description": "If set, will auto initialize the injected io.Connect JavaScript library.",
                            "oneOf": [
                                {
                                    "description": "Whether to enable auto initialization of the io.Connect JavaScript library.",
                                    "type": "boolean"
                                },
                                {
                                    "description": "Initialization options you can specify if you want to auto initialize the injected io.Connect JavaScript library.",
                                    "type": "object",
                                    "additionalProperties": true
                                }
                            ]
                        }
                    }
                },
                "autoInjectFdc3": {
                    "description": "Specifies if the glue-fdc3 JavaScript API will be auto injected in the window context. The api becomes available without referencing any JS file.",
                    "type": "object",
                    "required": [
                        "enabled"
                    ],
                    "properties": {
                        "enabled": {
                            "description": "If `true`, will enable auto injection of the glue-fdc3 JavaScript library.",
                            "type": "boolean",
                            "default": false
                        },
                        "library": {
                            "description": "Settings for the `@interopio/fdc3` library to be injected.",
                            "properties": {
                                "source": {
                                    "description": "URL pointing to a locally or remotely hosted `@interopio/fdc3` library, or a string specifying the version of the `@interopio/fdc3` library to be used from the locally available packages in the `%LocalAppData%/interop.io/io.Connect Desktop/Desktop/assets` folder.",
                                    "type": "string"
                                },
                                "fallback": {
                                    "description": "Fallback location of the `@interopio/fdc3` library in case the one specified in the `\"source\"` property doesn't load. Accepts a URL pointing to a locally or remotely hosted `@interopio/fdc3` library, or a string specifying the version of the `@interopio/fdc3` library to be used from the locally available packages in the `%LocalAppData%/interop.io/io.Connect Desktop/Desktop/assets` folder.",
                                    "type": "string"
                                },
                                "timeout": {
                                    "description": "Interval in milliseconds to wait for loading the `@interopio/fdc3` library.",
                                    "type": "number"
                                }
                            }
                        },
                        "autoInit": {
                            "default": false,
                            "description": "Reserved.",
                            "oneOf": [
                                {
                                    "description": "Whether to enable auto initialization of the glue-fdc3 JavaScript library.",
                                    "type": "boolean"
                                },
                                {
                                    "description": "Initialization options you can specify if you want to auto initialize the injected glue-fdc3 JavaScript library.",
                                    "type": "object",
                                    "additionalProperties": true
                                }
                            ]
                        }
                    }
                },
                "context": {
                    "description": "Custom context object associated with the window.",
                    "type": "object"
                },
                "autoOpenDevTools": {
                    "description": "If set, DevTools will start automatically.",
                    "type": "boolean",
                    "default": false
                },
                "processAffinity": {
                    "oneOf": [
                        {
                            "$ref": "#/definitions/applicationProcessAffinity"
                        },
                        {
                            "type": "string"
                        }
                    ]
                },
                "sfMode": {
                    "description": "Set to `true` to run the window in Salesforce mode (resolving the issues preventing Salesforce to run in a desktop container).",
                    "type": "boolean",
                    "default": false
                },
                "registerHtmlContainer": {
                    "description": "Whether to inject the `htmlContainer` object. This is used for legacy applications.",
                    "type": "boolean",
                    "default": false
                },
                "channelId": {
                    "description": "Deprecated. Use `\"channelSelector\"` instead.",
                    "type": "string"
                },
                "contextMenu": {
                    "$ref": "#/definitions/contextMenuConfig"
                },
                "contextMenuEnabled": {
                    "description": "Deprecated. Use `\"contextMenu\"` instead.",
                    "type": "boolean"
                },
                "contextMenuMode": {
                    "description": "Deprecated. Use `\"contextMenu\"` instead.",
                    "type": "string"
                },
                "security": {
                    "$ref": "system.json#/definitions/securityConfig"
                },
                "refreshHandlers": {
                    "description": "Configuration for the refresh handlers.",
                    "type": "object",
                    "properties": {
                        "enabled": {
                            "description": "If `true`, will enable refresh handlers.",
                            "type": "boolean"
                        },
                        "timeout": {
                            "description": "The maximum amount of time (ms) that a refresh handler will have to complete its operation.",
                            "type": "number"
                        }
                    },
                    "additionalProperties": false
                },
                "closeHandlers": {
                    "description": "Configuration for close handlers.",
                    "type": "object",
                    "properties": {
                        "enabled": {
                            "description": "If `true`, will enable close handlers.",
                            "type": "boolean"
                        },
                        "timeout": {
                            "description": "The maximum amount of time (ms) that a close handler will have to complete its operation.",
                            "type": "number"
                        }
                    },
                    "additionalProperties": false
                },
                "injectSIDtoContext": {
                    "description": "Whether to inject the SID in the window context after successful SSO authentication.",
                    "type": "boolean",
                    "default": false
                },
                "zoom": {
                    "$ref": "system.json#/definitions/zoomConfig"
                },
                "visibleAreas": {
                    "description": "Which parts of the opened window to be visible. The window itself will not be resized. The parts of the window outside the specified areas will remain intact but will be invisible.",
                    "type": "array",
                    "items": {
                        "properties": {
                            "left": {
                                "description": "Coordinate on the horizontal axis.",
                                "type": "integer"
                            },
                            "top": {
                                "description": "Coordinate on the vertical axis.",
                                "type": "integer"
                            },
                            "width": {
                                "description": "Width of the app window.",
                                "type": "integer"
                            },
                            "height": {
                                "description": "Height of the app window.",
                                "type": "integer"
                            }
                        },
                        "additionalProperties": false
                    }
                },
                "cascade": {
                    "$ref": "system.json#/definitions/cascadeConfig"
                },
                "allowExtensions": {
                    "description": "If `true`, this app can host chrome extensions. Extensions must be enabled in system config.",
                    "type": "boolean",
                    "default": false
                },
                "consoleLogLevel": {
                    "type": "string"
                },
                "syncTitleWithDocumentTitle": {
                    "anyOf": [
                        {
                            "description": "If `true`, the window title will be synchronized with the document title when it's updated.",
                            "type": "boolean"
                        },
                        {
                            "description": "If set to `\"preserveCustomTitle\"`, the window title will be synchronized with the document title until the moment the user or the API sets a custom title for the window. After that, the custom title will be preserved and the window title won't be synchronized with the document title.",
                            "type": "string",
                            "enum": [
                                "preserveCustomTitle"
                            ]
                        }
                    ]
                },
                "nativeWindowOpen": {
                    "$ref": "system.json#/definitions/windowsConfig/properties/nativeWindowOpen"
                },
                "nativeWindowOpenOptions": {
                    "$ref": "system.json#/definitions/windowsConfig/properties/nativeWindowOpenOptions"
                },
                "pagePerformanceMetric": {
                    "description": "Enabling this will allow this application to publish performance metrics extracted from the underlying Chromium browser.",
                    "type": "object",
                    "properties": {
                        "enabled": {
                            "description": "Enable or disable the Page Performance metric for this application.",
                            "type": "boolean"
                        },
                        "publishInterval": {
                            "description": "The interval (in ms) in which page performance data will be published",
                            "type": "number"
                        },
                        "initialPublishTimeout": {
                            "description": "The time (in ms) after which the initial data will be published",
                            "type": "number"
                        }
                    },
                    "required": [
                        "enabled"
                    ],
                    "additionalProperties": false
                },
                "search": {
                    "$ref": "system.json#/definitions/searchConfig"
                },
                "docking": {
                    "description": "Settings for docking an app at one of the screen edges - e.g., a toolbar app that may start docked at one of the screen edges and the user can undock it, move it, and dock at another screen edge.",
                    "type": "object",
                    "properties": {
                        "enabled": {
                            "description": "If `true`, docking will be enabled for the app.",
                            "type": "boolean"
                        },
                        "claimScreenArea": {
                            "description": "If `true`, the app will claim the area it occupies on the screen when docked, in effect, reducing the working area of the screen.",
                            "type": "boolean"
                        },
                        "initialPosition": {
                            "description": "Initial docking position for the app. Available positions are `\"top\"`, `\"bottom\"`, `\"left\"`, and `\"right\"`.",
                            "enum": [
                                "top",
                                "bottom",
                                "left",
                                "right"
                            ]
                        },
                        "allowedPositions": {
                            "description": "Allowed positions for docking the app.",
                            "type": "array",
                            "items": {
                                "enum": [
                                    "top",
                                    "bottom",
                                    "left",
                                    "right"
                                ]
                            },
                            "default": [
                                "top"
                            ]
                        },
                        "width": {
                            "description": "Width in pixels for the app when docked at the left or the right screen edge.",
                            "type": "number"
                        },
                        "height": {
                            "description": "Height in pixels for the app when docked at the top or the bottom screen edge.",
                            "type": "number"
                        }
                    },
                    "default": {
                        "enabled": false
                    }
                },
                "placement": {
                    "description": "Specifies the window position relative to the screen",
                    "type": "object",
                    "properties": {
                        "snapped": {
                            "description": "If `true`, the io.Connect Window will remain snapped to the specified screen position even in cases of resolution changes, window visibility changes or when the application virtualization window hosting the io.Connect Window has been resized. However, this doesn't include any API calls or manual user interaction which affect the window placement or bounds. If `false`, the window will be positioned at the specified screen location only once when created",
                            "type": "boolean"
                        },
                        "verticalAlignment": {
                            "description": "Defines a vertical alignment configuration. If `horizontalAlignment` is set, then `verticalAlignment` will default to \"stretch\"",
                            "type": "string",
                            "enum": [
                                "top",
                                "bottom",
                                "center",
                                "stretch"
                            ]
                        },
                        "horizontalAlignment": {
                            "description": "Defines a horizontal alignment configuration. If `verticalAlignment` is set, then `horizontalAlignment` will default to \"stretch\"",
                            "type": "string",
                            "enum": [
                                "left",
                                "right",
                                "center",
                                "stretch"
                            ]
                        },
                        "top": {
                            "description": "Top margin for the placed window. Use a `number` to define the value in pixels, or use a `string` to define the value in pixels or in percentage of the screen - e.g., `\"10px\"` or `\"10%\"`.",
                            "type": [
                                "number",
                                "string"
                            ]
                        },
                        "right": {
                            "description": "Right margin for the placed window. Use a `number` to define the value in pixels, or use a `string` to define the value in pixels or in percentage of the screen - e.g., `\"10px\"` or `\"10%\"`.",
                            "type": [
                                "number",
                                "string"
                            ]
                        },
                        "bottom": {
                            "description": "Bottom margin for the placed window. Use a `number` to define the value in pixels, or use a `string` to define the value in pixels or in percentage of the screen - e.g., `\"10px\"` or `\"10%\"`.",
                            "type": [
                                "number",
                                "string"
                            ]
                        },
                        "left": {
                            "description": "Left margin for the placed window. Use a `number` to define the value in pixels, or use a `string` to define the value in pixels or in percentage of the screen - e.g., `\"10px\"` or `\"10%\"`.",
                            "type": [
                                "number",
                                "string"
                            ]
                        },
                        "width": {
                            "description": "Width for the placed window. Use a `number` to define the value in pixels, or use a `string` to define the value in pixels or in percentage of the screen - e.g., `\"10px\"` or `\"10%\"`.",
                            "type": [
                                "number",
                                "string"
                            ]
                        },
                        "height": {
                            "description": "Height for the placed window. Use a `number` to define the value in pixels, or use a `string` to define the value in pixels or in percentage of the screen - e.g., `\"10px\"` or `\"10%\"`.",
                            "type": [
                                "number",
                                "string"
                            ]
                        },
                        "display": {
                            "description": "The identifying number of the monitor (e.g., 1, 2, 3 or \"main\")",
                            "type": "string"
                        }
                    },
                    "required": [
                        "snapped"
                    ],
                    "additionalProperties": false
                },
                "fdc3InitsGlue": {
                    "type": "boolean",
                    "default": false
                },
                "buttonsVisibility": {
                    "description": "Determines the conditions under which the window buttons will be visible. Valid only for io.Connect Windows in `html` mode.",
                    "type": "string",
                    "enum": [
                        "off",
                        "onDemand",
                        "always",
                        "onFocus"
                    ],
                    "default": "onDemand"
                },
                "disableRefreshOnF5": {
                    "description": "If `true`, the user cannot refresh the window.",
                    "type": "boolean"
                },
                "taskbar": {
                    "description": "Taskbar specific configuration.",
                    "type": "object",
                    "properties": {
                        "allowPin": {
                            "description": "If `true`, will allow pinning shell applications to the taskbar.",
                            "type": "boolean",
                            "default": false
                        },
                        "appId": {
                            "description": "Deprecated. Specify a unique application ID necessary for selecting the correct icon for the pinned application in the taskbar. Defaults to `appName-env-region`.",
                            "type": "string"
                        },
                        "displayName": {
                            "description": "The name that will be shown on right click on the application pinned to the taskbar. Defaults to configured build name or **io.Connect Desktop**.",
                            "type": "string"
                        },
                        "command": {
                            "description": "Specify the command (and all arguments needed) for relaunching the application. Defaults to the current **io.Connect Desktop** executable with its starting arguments.",
                            "type": "string"
                        },
                        "commandEnvVar": {
                            "description": "Specify the environment variable used for storing the command (and all arguments needed) for application relaunch. Defaults to `GLUE_START_CMD` and is ignored if `command` is set.",
                            "type": "string",
                            "default": "GLUE_START_CMD"
                        },
                        "iconPath": {
                            "description": "Specify the path to the icon that will be used for the pinned to the taskbar application. Defaults to the application icon or the default one. It is strongly recommended to explicitly specify an icon here and to use an icon persisted on the machine.",
                            "type": "string"
                        },
                        "iconIndex": {
                            "description": "Index of the icon specified in `iconPath`. Ignored when `iconPath` is not set. Defaults to 0.",
                            "type": "number",
                            "default": 0
                        },
                        "combineIcons": {
                            "description": "Determines how the taskbar icons of the app instances will be combined with each other and with icons of other io.Connect apps when the Windows taskbar is set to combine icons. Can be `sameIcon`, `sameApp` or `never`. Set to `sameIcon` to combine the icons of the app instances with each other and with all other io.Connect apps that use the same icon. Set to `sameApp` to combine the icons only of the app instances. Set to `never` to prevent the icons of the app instances from combining with each other or with other io.Connect apps that use the same icon. Defaults to `sameIcon`.",
                            "type": "string",
                            "default": "sameIcon",
                            "enum": [
                                "sameIcon",
                                "sameApp",
                                "never"
                            ]
                        }
                    },
                    "additionalProperties": false
                },
                "jumpList": {
                    "$ref": "system.json#/definitions/jumpListConfig"
                },
                "allowOSInfo": {
                    "description": "If `true`, the app can retrieve OS information.",
                    "type": "boolean",
                    "default": false
                },
                "allowAuthInfo": {
                    "description": "If `true`, the app can retrieve authentication information about the current user.",
                    "type": "boolean",
                    "default": false
                },
                "allowProxySettingManipulation": {
                    "description": "If `true`, the app can modify the proxy configuration.",
                    "type": "boolean"
                },
                "allowClearingCache": {
                    "description": "If `true`, the application can clear session and host cache.",
                    "type": "boolean",
                    "default": false
                },
                "allowOverrides": {
                    "description": "Settings for overriding app definition properties when starting the current app programmatically via the io.Connect APIs.",
                    "type": "object",
                    "properties": {
                        "url": {
                            "description": "If `true`, will allow overriding the URL specified in the current app definition when launching this app programmatically via the io.Connect APIs.",
                            "type": "boolean"
                        }
                    },
                    "default": {
                        "url": false
                    }
                },
                "preloadScripts": {
                    "description": "A list of preload scripts (URLs) that will be loaded and executed before the actual page is executed",
                    "oneOf": [
                        {
                            "type": "array",
                            "items": {
                                "type": "string"
                            }
                        },
                        {
                            "$ref": "system.json#/definitions/preloadScriptsConfig"
                        }
                    ]
                },
                "injectedStyles": {
                    "description": "Settings for injecting CSS files in web apps. The CSS files will be injected after the page has been loaded.",
                    "$ref": "system.json#/definitions/injectedStylesConfig"
                },
                "allowCookiesManipulation": {
                    "description": "If `true`, the app can query and modify the session cookies.",
                    "type": "boolean",
                    "default": false
                },
                "allowEnvVars": {
                    "description": "If `true`, the app will be able to access the environment variables for the io.Connect process by using the `env` property of the `iodesktop` object.",
                    "type": "boolean",
                    "default": false
                },
                "backgroundThrottling": {
                    "description": "If `true` (default), animations and timers will be throttled when the web app is in the background. Set to `false` to disable background throttling.",
                    "type": "boolean"
                },
                "navigation": {
                    "description": "Settings for web page navigation.",
                    "type": "object",
                    "properties": {
                        "allowed": {
                            "description": "Regular expression that will be matched against the URL when the window navigates. If the new URL doesn't match the expression, navigation will be blocked.",
                            "type": "string"
                        },
                        "trackInPageNavigation": {
                            "description": "If `true`, the current URL will be updated when the user navigates within the current page.",
                            "type": "boolean",
                            "default": false
                        }
                    }
                },
                "windowOpen": {
                    "description": "Settings for opening new windows from the current app.",
                    "type": "object",
                    "properties": {
                        "allowed": {
                            "description": "Regular expression that will be matched against the URL when opening a new window from the current app. If the URL doesn't match the expression, opening the new window will be blocked.",
                            "type": "string"
                        }
                    }
                },
                "saveInLayout": {
                    "description": "Specifies properties to be persisted when the app is saved in a Layout.",
                    "type": "object",
                    "properties": {
                        "url": {
                            "description": "Settings for persisting the current URL of the web app when a Layout is saved.",
                            "oneOf": [
                                {
                                    "description": "If `true`, the current URL of the web app will be persisted in all Layout types - Application Default, Workspace, and Global.",
                                    "type": "boolean"
                                },
                                {
                                    "type": "array",
                                    "description": "List of Layout types in which the current URL of the web app will be persisted.",
                                    "items": {
                                        "type": "string",
                                        "description": "Layout type.",
                                        "enum": [
                                            "Global",
                                            "ApplicationDefault",
                                            "Workspace"
                                        ]
                                    }
                                }
                            ]
                        },
                        "title": {
                            "description": "Settings for persisting the current title of the app when a Layout is saved.",
                            "oneOf": [
                                {
                                    "description": "If `true`, the app title will be persisted in all Layout types - Application Default, Workspace, and Global.",
                                    "type": "boolean"
                                },
                                {
                                    "type": "array",
                                    "description": "List of Layout types in which the app title will be persisted.",
                                    "items": {
                                        "type": "string",
                                        "description": "Layout type.",
                                        "enum": [
                                            "Global",
                                            "ApplicationDefault",
                                            "Workspace"
                                        ]
                                    }
                                }
                            ]
                        }
                    }
                },
                "reloadOptions": {
                    "description": "Options for reloading current window when it fails to load.",
                    "type": "object",
                    "properties": {
                        "timeout": {
                            "description": "Interval in milliseconds at which to attempt to reload the window.",
                            "type": "number"
                        },
                        "maxAttempts": {
                            "description": "Maximum number of times to attempt reloading the window.",
                            "type": "number"
                        }
                    }
                },
                "channelSelector": {
                    "description": "Settings for the Channel Selector UI.",
                    "type": "object",
                    "properties": {
                        "type": {
                            "description": "Type of the Channel Selector to show on the io.Connect Windows. The single Channel Selector (default) allows the window to join a single Channel to which it can subscribe and publish data unrestrictedly. The directional single Channel Selector allows the window to join a single Channel, but also enables the user to restrict the window from publishing or from subscribing to the current Channel. The multi Channel Selector allows the window to join multiple Channels simultaneously to which it can subscribe and publish data unrestrictedly. The directional multi Channel Selector allows the window to join multiple Channels, but also enables the user to restrict the window from publishing or from subscribing to the currently joined Channels.",
                            "type": "string",
                            "enum": [
                                "single",
                                "directionalSingle",
                                "multi",
                                "directionalMulti"
                            ]
                        },
                        "enabled": {
                            "description": "If `true`, will allow showing the Channel Selector.",
                            "type": "boolean"
                        },
                        "readOnly": {
                            "description": "If `true`, the Channel Selector will be visible, but the user won't be able to switch between Channels from it.",
                            "type": "boolean"
                        },
                        "channelId": {
                            "description": "Name of the Channel to which the window will be joined by default when it's started.",
                            "type": "string"
                        },
                        "preventModifyingRestrictionsFor": {
                            "description": "By default, users are able to modify the read and write restrictions for all Channels via the Channel Selector UI. Apps can also modify the Channel restrictions programmatically. To prevent the users and the app from being able to modify a Channel restriction, use this property. Provide a list of objects, each containing a Channel name and the Channel restrictions that you want to prevent the users and the app from modifying.",
                            "type": "array",
                            "items": {
                                "description": "Specifies a Channel by name and whether the app will be able to modify the Channel restrictions for publishing and subscribing for data. Provide the Channel name and at least one of the Channel restrictions that you want to prevent the users and the app from modifying.",
                                "type": "object",
                                "properties": {
                                    "name": {
                                        "description": "Name of the Channel.",
                                        "type": "string"
                                    },
                                    "read": {
                                        "description": "If `true`, the users and the app won't be able to modify the Channel restriction for subscribing for data (manually from the Channel Selector or programmatically via the Channels API).",
                                        "type": "boolean"
                                    },
                                    "write": {
                                        "description": "If `true`, the users and the app won't be able to modify the Channel restriction for publishing data (manually from the Channel Selector or programmatically via the Channels API).",
                                        "type": "boolean"
                                    }
                                }
                            }
                        }
                    }
                },
                "transparent": {
                    "description": "If `true`, frameless windows will be transparent.",
                    "default": true,
                    "type": "boolean"
                },
                "roundedCorners": {
                    "description": "If `true`, frameless windows will have rounded corners. Defaults to `true` in the default platform mode and to `false` in the advanced platform mode. In Windows versions older than Windows 11 build 22000 this property won't have any effect and frameless windows won't have rounded corners.",
                    "type": "boolean"
                },
                "isPinned": {
                    "description": "If `true`, the window tab will be pinned. Pinned tabs are placed before the regular tab windows and they contain only the window title. Pinned tab windows don't have a \"Close\" button, effectively preventing the user from closing them. Available only for tab windows in web groups.",
                    "default": false,
                    "type": "boolean"
                },
                "responseHeaders": {
                    "description": "Settings for manipulating the response headers received by the platform from external servers. It's possible to remove an entire header, or to modify its directives. Use this property to define the response headers you want to remove or modify as key/value pairs. The key must be the header name (e.g., `Content-Security-Policy`) and the value must be an object holding the desired settings.",
                    "type": "object",
                    "additionalProperties": {
                        "description": "Object describing the settings for removing a response header or modifying its directives.",
                        "type": "object",
                        "properties": {
                            "remove": {
                                "description": "If `true`, the entire response header will be removed.",
                                "type": "boolean"
                            },
                            "directives": {
                                "description": "List of response header directives to be modified. It's possible to remove a directive, to replace its value, or to append a value to its current value.",
                                "type": "array",
                                "items": {
                                    "description": "Object with settings for modifying a response header directive.",
                                    "type": "object",
                                    "properties": {
                                        "name": {
                                            "description": "Name of the directive to modify.",
                                            "type": "string"
                                        },
                                        "value": {
                                            "description": "New value for the directive. Required when replacing or appending a directive value.",
                                            "type": "string"
                                        },
                                        "action": {
                                            "description": "Action to be performed on the directive. Set to `\"remove\"` to remove the directive. Set to `\"replace\"` to replace the current value. Set to `\"append\"` to append a value to the current value. When replacing or appending a value, it's required to specify a new value.",
                                            "type": "string",
                                            "enum": [
                                                "append",
                                                "remove",
                                                "replace"
                                            ]
                                        }
                                    },
                                    "required": [
                                        "name",
                                        "action"
                                    ]
                                }
                            }
                        }
                    }
                },
                "logging": {
                    "description": "Settings for capturing console messages and network request errors for the app and logging them in the `application.log` file of **io.Connect Desktop**.",
                    "anyOf": [
                        {
                            "description": "If `true`, will enable capturing the console messages and network request errors for the app and logging them in the `application.log` file of **io.Connect Desktop**.",
                            "type": "boolean"
                        },
                        {
                            "description": "Settings for configuring which items to capture and log in the `application.log` file of **io.Connect Desktop**.",
                            "type": "object",
                            "properties": {
                                "consoleMessages": {
                                    "description": "Settings for capturing console messages.",
                                    "type": "object",
                                    "properties": {
                                        "enabled": {
                                            "description": "If `true`, will allow capturing all console messages.",
                                            "type": "boolean"
                                        },
                                        "level": {
                                            "description": "Sets the level at which to capture console messages. The platform will capture all console messages at the specified level and above.",
                                            "enum": [
                                                "debug",
                                                "info",
                                                "warn",
                                                "error"
                                            ],
                                            "default": "debug"
                                        }
                                    }
                                },
                                "networkRequestErrors": {
                                    "description": "Settings for capturing network request errors.",
                                    "type": "object",
                                    "properties": {
                                        "enabled": {
                                            "description": "If `true`, will allow capturing all network request errors.",
                                            "type": "boolean"
                                        }
                                    }
                                },
                                "unhandledErrors": {
                                    "description": "Settings for capturing unhandled errors (e.g., unhandled `Promise` rejections, errors not logged in the console).",
                                    "type": "object",
                                    "properties": {
                                        "enabled": {
                                            "description": "If `true`, will allow capturing all unhandled errors.",
                                            "type": "boolean"
                                        }
                                    }
                                }
                            }
                        }
                    ],
                    "default": false
                }
            },
            "required": [
                "url"
            ]
        },
        "activity": {
            "title": "activityConfig",
            "type": "object",
            "description": "Defines an activity as a set of activity window types. Also defines the other activity related parameters (like layout and initial context).",
            "additionalProperties": true,
            "properties": {
                "activityType": {
                    "type": "string"
                },
                "owner": {
                    "$ref": "#/definitions/activityWindow"
                },
                "windows": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/activityWindow"
                    }
                },
                "layout": {
                    "$ref": "#/definitions/activityLayout"
                },
                "initialContext": {
                    "description": "Initial activity context in a JSON format (not parsed for now and used as is).",
                    "type": "object"
                },
                "hideGroupHeader": {
                    "description": "If `true`, there will be no header for any window groups that are in the activity window.",
                    "type": "boolean"
                },
                "autoSaveContext": {
                    "description": "Activity context can be saved as part of a saved layout. The activity owner window can register a callback to describe the members of the context that should be saved. If no handler is registered, then by default no activity context will be saved. By using this option and setting its value to `true`, the user has an option to save activity context for legacy applications (i.e., these that haven't registered such callbacks).",
                    "type": "boolean"
                },
                "saveOwnerOnly": {
                    "description": "When an activity application is saved, by default only the activity owner window information will be stored. This will \"work out of the box\" for legacy activities that don’t support saving/restoring layouts and contexts. When this is `false`, all activity windows (or the ones configured using the options below) will be saved.",
                    "type": "boolean",
                    "default": true
                },
                "includeTypesToLayout": {
                    "description": "Comma separated list of window types which should be included in the activity application auto saved layout.",
                    "type": "string"
                },
                "ignoreTypesFromLayout": {
                    "description": "Comma separated list of window types which should be excluded from the activity application auto saved layout. Note that `ignoreTypesFromLayout` has priority, i.e. if a window type is defined in both lists, it will be excluded. Also, if `includeTypesToLayout` is specified but not `ignoreTypesFromLayout`, then the types in the `includeTypesToLayout` list will be included in the layout and the rest will be excluded and vice versa.",
                    "type": "string"
                }
            },
            "required": [
                "owner"
            ]
        },
        "exe": {
            "title": "EXEConfig",
            "type": "object",
            "description": "Executable application. Could be anything that the OS can execute via the appropriate system calls.",
            "additionalProperties": true,
            "properties": {
                "instanceIdOverride": {
                    "description": "If specified, will override the system-generated instance id for this application.",
                    "type": "string"
                },
                "showConsole": {
                    "description": "If `true`, the console will be visible.",
                    "type": "boolean",
                    "default": false
                },
                "useShellExecute": {
                    "description": "If `true`, `path` is not used (and must be empty) and the specified command can contain a well known resource type (like URL) which will be executed via the \"shell execute\" option, i.e. using the associated application.",
                    "type": "boolean",
                    "default": false
                },
                "path": {
                    "description": "This is the working directory of the target application/script and could either be relative to the **io.Connect Desktop** startup directory, or an absolute path. The path must exist and will be combined with the command parameter, if it doesn’t contain a root drive. Required, if `shellExecute` is false, otherwise must be empty.",
                    "type": "string"
                },
                "command": {
                    "description": "This is the target application/script that will be executed (when `useShellExecute=false`) or a resource that will be opened via an associated application if `useShellExecute=true`. When `useShellExecute=false`, a command target file must exist. It could contain relative (to the **io.Connect Desktop** startup folder) or an absolute file path.",
                    "type": "string"
                },
                "allowOverrides": {
                    "description": "Settings for overriding app definition properties when starting the current app programmatically via the io.Connect APIs.",
                    "type": "object",
                    "properties": {
                        "command": {
                            "description": "If `true`, will allow overriding the command specified in the current app definition when launching this app programmatically via the io.Connect APIs.",
                            "type": "boolean"
                        }
                    },
                    "default": {
                        "command": false
                    }
                },
                "parameters": {
                    "description": "Optional parameters that will be used when starting the target application/script or opening the resource. The content is used as is, no checks performed.",
                    "type": "string"
                },
                "windowStyle": {
                    "description": "Specifies the target's main window style (if supported).",
                    "enum": [
                        "Normal",
                        "Hidden",
                        "Minimized",
                        "Maximized"
                    ],
                    "default": "Normal"
                },
                "trackingType": {
                    "description": "Specifies how to track the lifetime of the target application process , i.e. to determine when it is started and stopped.",
                    "enum": [
                        "None",
                        "Process",
                        "AGM"
                    ],
                    "default": "Process"
                },
                "agmTrackingLaunchTimeout": {
                    "description": "Time in seconds to wait for AGM tracked instance to connect. Use 0 to wait indefinitely.",
                    "type": "number",
                    "default": 120
                },
                "startingContextMode": {
                    "description": "Specifies how to pass application starting context to the client application.",
                    "enum": [
                        "environment",
                        "interop",
                        "interopCmdLine",
                        "none"
                    ],
                    "default": "environment"
                },
                "passGlueToken": {
                    "description": "This option is valid for external user applications and if it is `true`, when they are started a valid GW3 token will be sent.",
                    "type": "boolean",
                    "default": false
                },
                "glueTokenArgument": {
                    "description": "The name of the token argument.",
                    "type": "string",
                    "default": "--token"
                },
                "left": {
                    "description": "Position (in pixels) of the left window border, relative to the left edge of the display.",
                    "type": "integer",
                    "default": 0
                },
                "top": {
                    "description": "Position (in pixels) of the top window border, relative to the top edge of the display.",
                    "type": "integer",
                    "default": 0
                },
                "width": {
                    "description": "Width of the app window.",
                    "type": "integer",
                    "default": 400
                },
                "height": {
                    "description": "Height of the app window.",
                    "type": "integer",
                    "default": 400
                },
                "maxHeight": {
                    "description": "Specify the maximum window height.",
                    "type": "number"
                },
                "maxWidth": {
                    "description": "Specify the maximum window width.",
                    "type": "number"
                },
                "minHeight": {
                    "description": "Specify the minimum window height.",
                    "type": "number",
                    "default": 30
                },
                "minWidth": {
                    "description": "Specify the minimum window width.",
                    "type": "number",
                    "default": 50
                },
                "hasSizeAreas": {
                    "description": "If `false`, the window won't have resizing areas and the user won't be able to resize it by dragging its borders.",
                    "type": "boolean",
                    "default": true
                },
                "tabGroupId": {
                    "description": "Specifies the tab group ID. If two or more tab windows are defined with same ID, they will be hosted in the same tab window.",
                    "type": "string"
                },
                "mode": {
                    "description": "io.Connect Window type. Possible values are `flat`, `html`, `tab`.",
                    "enum": [
                        "flat",
                        "tab",
                        "html",
                        "frameless"
                    ],
                    "type": "string",
                    "default": "flat"
                },
                "frameColor": {
                    "description": "Specifies the io.Connect Window frame color. Accepts hex color as a string (e.g., `#666666`) or named HTML colors (e.g., `red`)",
                    "type": "string"
                },
                "tabIndex": {
                    "description": "Specifies the tab position index. Tab windows in the same tab group are ordered by their position index. Use negative index to make the tab active.",
                    "type": "number"
                },
                "relativeTo": {
                    "description": "The window ID of the window that will be used to relatively position the new window. Can be combined with `relativeDirection`",
                    "type": "string"
                },
                "relativeDirection": {
                    "description": "Direction (`bottom`, `top`, `left`, `right`) of positioning the window relatively to the `relativeTo` window. Considered only if `relativeTo` is supplied.",
                    "type": "string",
                    "default": "right"
                },
                "allowClose": {
                    "description": "If `false`, the window will not contain a close button.",
                    "type": "boolean",
                    "default": true
                },
                "allowTabClose": {
                    "description": "If `false`, the tab header will not contain a close button.",
                    "type": "boolean",
                    "default": true
                },
                "allowCollapse": {
                    "description": "If `false`, the window will not contain a collapse button.",
                    "type": "boolean",
                    "default": false
                },
                "allowMaximize": {
                    "description": "If `false`, the window will not contain a maximize button.",
                    "type": "boolean",
                    "default": true
                },
                "allowMinimize": {
                    "description": "If `false`,the window will not contain a minimize button.",
                    "type": "boolean",
                    "default": true
                },
                "allowExtract": {
                    "description": "If `false`, the window will not contain an extract button.",
                    "type": "boolean"
                },
                "showStickyButton": {
                    "description": "If `false`, the window will not contain a sticky button.",
                    "type": "boolean"
                },
                "showFeedbackButton": {
                    "description": "If `false`, the window will not contain a feedback button.",
                    "type": "boolean"
                },
                "showCloneButton": {
                    "description": "If `false`, the window will not contain a clone button.",
                    "type": "boolean"
                },
                "allowUnstick": {
                    "description": "If `false`, the window will remain stuck to other windows.",
                    "type": "boolean",
                    "default": true
                },
                "allowChannels": {
                    "description": "Deprecated. Use `\"channelSelector\"` instead.",
                    "type": "boolean"
                },
                "readOnlyChannelSelector": {
                    "description": "Deprecated. Use `\"channelSelector\"` instead.",
                    "type": "boolean"
                },
                "channelId": {
                    "description": "Deprecated. Use `\"channelSelector\"` instead.",
                    "type": "string"
                },
                "allowLockUnlock": {
                    "description": "If `false`, the window will not contain a lock/unlock button.",
                    "type": "boolean",
                    "default": false
                },
                "maximizable": {
                    "description": "If `false`, the window will not be able to maximize via buttons and/or windows gestures.",
                    "type": "boolean",
                    "default": true
                },
                "minimizable": {
                    "description": "If `false`, the window will not be able to minimize via buttons and/or windows gestures.",
                    "type": "boolean",
                    "default": true
                },
                "disableTransitions": {
                    "description": "If `true`, disables transition animations which are applied when showing a hidden window, minimize, restore, maximize, etc.",
                    "type": "boolean",
                    "default": false
                },
                "showInTaskbar": {
                    "description": "If `false`, the window will not appear in the taskbar.",
                    "type": "boolean",
                    "default": true
                },
                "isSticky": {
                    "description": "If `true`, the newly created window will participate in io.Connect Window operations (stick, unstick, etc.).",
                    "type": "boolean"
                },
                "onTop": {
                    "description": "Setting that allows the app window to be on top of the Z-order, in front of all other windows, even when it isn't on focus. Note that because each io.Connect app window is in fact in an io.Connect Window group container (even though being a single window), the `onTop` setting actually determines the Z-order of the group container at the moment of its creation. Snapping an io.Connect Window to another io.Connect Window in reality destroys the group container of the snapped window and that window joins the group container of the window to which it is being snapped. Therefore, when joining a window with a specified `onTop` setting to another window or a window group, its initial `onTop` value will be overwritten - either permanently (when set to `true`), or temporarily (when set to `always`).",
                    "default": false,
                    "oneOf": [
                        {
                            "description": "If `true`, the window will be on top of the Z-order. This, however, will last only until the window is visible and not joined to an io.Connect Window group. If the window is hidden programmatically or the user snaps it to another io.Connect Window or window group, it will no longer be on top of the Z-order when it becomes visible or when the user tears it off from the group.",
                            "type": "boolean",
                            "default": false
                        },
                        {
                            "description": "If set to `always`, the window will remain permanently on top of the Z-order, regardless of changes to its visibility or whether it joins or leaves an io.Connect Window group. If you join a window that is set to always be on top to a window or a group of windows which aren't, it will temporarily lose its always on top setting. When the window is extracted from the group, it will again be always on top.",
                            "type": "string",
                            "enum": [
                                "always"
                            ]
                        }
                    ]
                },
                "compatibility": {
                    "$ref": "#/definitions/nativeAppCompatibility"
                },
                "logging": {
                    "description": "If `true`, the `stdout` and `stderr` will be saved in the log folder under the `application` folder with the name of the application.",
                    "type": "boolean",
                    "default": false
                },
                "startFailedMessage": {
                    "description": "Error message that should be displayed to users if the `exe` fails to start.",
                    "type": "string"
                },
                "cascade": {
                    "$ref": "system.json#/definitions/cascadeConfig"
                },
                "terminateOnShutdown": {
                    "description": "If `true`, the app will be stopped when the platform shuts down.",
                    "type": "boolean",
                    "default": true
                },
                "placement": {
                    "description": "Specifies the window position relative to the screen",
                    "type": "object",
                    "properties": {
                        "snapped": {
                            "description": "If `true`, the io.Connect Window will remain snapped to the specified screen position even in cases of resolution changes, window visibility changes or when the application virtualization window hosting the io.Connect Window has been resized. However, this doesn't include any API calls or manual user interaction which affect the window placement or bounds. If `false`, the window will be positioned at the specified screen location only once when created",
                            "type": "boolean"
                        },
                        "verticalAlignment": {
                            "description": "Defines a vertical alignment configuration. If `horizontalAlignment` is set, then `verticalAlignment` will default to \"stretch\"",
                            "type": "string",
                            "enum": [
                                "top",
                                "bottom",
                                "center",
                                "stretch"
                            ]
                        },
                        "horizontalAlignment": {
                            "description": "Defines a horizontal alignment configuration. If `verticalAlignment` is set, then `horizontalAlignment` will default to \"stretch\"",
                            "type": "string",
                            "enum": [
                                "left",
                                "right",
                                "center",
                                "stretch"
                            ]
                        },
                        "top": {
                            "description": "Top margin for the placed window. Use a `number` to define the value in pixels, or use a `string` to define the value in pixels or in percentage of the screen - e.g., `\"10px\"` or `\"10%\"`.",
                            "type": [
                                "number",
                                "string"
                            ]
                        },
                        "right": {
                            "description": "Right margin for the placed window. Use a `number` to define the value in pixels, or use a `string` to define the value in pixels or in percentage of the screen - e.g., `\"10px\"` or `\"10%\"`.",
                            "type": [
                                "number",
                                "string"
                            ]
                        },
                        "bottom": {
                            "description": "Bottom margin for the placed window. Use a `number` to define the value in pixels, or use a `string` to define the value in pixels or in percentage of the screen - e.g., `\"10px\"` or `\"10%\"`.",
                            "type": [
                                "number",
                                "string"
                            ]
                        },
                        "left": {
                            "description": "Left margin for the placed window. Use a `number` to define the value in pixels, or use a `string` to define the value in pixels or in percentage of the screen - e.g., `\"10px\"` or `\"10%\"`.",
                            "type": [
                                "number",
                                "string"
                            ]
                        },
                        "width": {
                            "description": "Width for the placed window. Use a `number` to define the value in pixels, or use a `string` to define the value in pixels or in percentage of the screen - e.g., `\"10px\"` or `\"10%\"`.",
                            "type": [
                                "number",
                                "string"
                            ]
                        },
                        "height": {
                            "description": "Height for the placed window. Use a `number` to define the value in pixels, or use a `string` to define the value in pixels or in percentage of the screen - e.g., `\"10px\"` or `\"10%\"`.",
                            "type": [
                                "number",
                                "string"
                            ]
                        },
                        "display": {
                            "description": "The identifying number of the monitor (e.g., 1, 2, 3 or \"main\")",
                            "type": "string"
                        }
                    },
                    "required": [
                        "snapped"
                    ],
                    "additionalProperties": false
                },
                "timeout": {
                    "description": "Starting timeout in seconds.",
                    "type": "number"
                },
                "jumpList": {
                    "$ref": "system.json#/definitions/jumpListConfig"
                },
                "saveInLayout": {
                    "description": "Specifies properties to be persisted when the app is saved in a Layout.",
                    "type": "object",
                    "properties": {
                        "command": {
                            "description": "If `true`, when the app is saved in a Layout, the command with which it was started will be persisted. If the value of the `\"command\"` property in the app definition is changed, when the Layout is restored, the app will be started with the previously persisted command, and not the one in the current app definition.",
                            "type": "boolean"
                        },
                        "parameters": {
                            "description": "If `true`, when the app is saved in a Layout, the parameters with which it was started will be persisted. If the value of the `\"parameters\"` property in the app definition is changed, when the Layout is restored, the app will be started with the previously persisted parameters, and not the ones in the current app definition.",
                            "type": "boolean"
                        },
                        "env": {
                            "description": "If `true`, when the app is saved in a Layout, the environment options with which it was started will be persisted. If the value of the `\"env\"` property in the app definition is changed, when the Layout is restored, the app will be started with the previously persisted environment options, and not the ones in the current app definition.",
                            "type": "boolean"
                        },
                        "title": {
                            "description": "Settings for persisting the current title of the app when a Layout is saved.",
                            "oneOf": [
                                {
                                    "description": "If `true`, the app title will be persisted in all Layout types - Application Default, Workspace, and Global.",
                                    "type": "boolean"
                                },
                                {
                                    "type": "array",
                                    "description": "List of Layout types in which the app title will be persisted.",
                                    "items": {
                                        "type": "string",
                                        "description": "Layout type.",
                                        "enum": [
                                            "Global",
                                            "ApplicationDefault",
                                            "Workspace"
                                        ]
                                    }
                                }
                            ]
                        }
                    }
                },
                "env": {
                    "description": "Key/value pairs that will be merged with the `process.env` object when spawning a new process for an executable app from the Node.js environment.",
                    "type": "object",
                    "additionalProperties": {
                        "type": "string"
                    }
                },
                "channelSelector": {
                    "description": "Settings for the Channel Selector UI.",
                    "type": "object",
                    "properties": {
                        "type": {
                            "description": "Type of the Channel Selector to show on the io.Connect Windows. The single Channel Selector (default) allows the window to join a single Channel to which it can subscribe and publish data unrestrictedly. The directional single Channel Selector allows the window to join a single Channel, but also enables the user to restrict the window from publishing or from subscribing to the current Channel. The multi Channel Selector allows the window to join multiple Channels simultaneously to which it can subscribe and publish data unrestrictedly. The directional multi Channel Selector allows the window to join multiple Channels, but also enables the user to restrict the window from publishing or from subscribing to the currently joined Channels.",
                            "type": "string",
                            "enum": [
                                "single",
                                "directionalSingle",
                                "multi",
                                "directionalMulti"
                            ]
                        },
                        "enabled": {
                            "description": "If `true`, will allow showing the Channel Selector.",
                            "type": "boolean"
                        },
                        "readOnly": {
                            "description": "If `true`, the Channel Selector will be visible, but the user won't be able to switch between Channels from it.",
                            "type": "boolean"
                        },
                        "channelId": {
                            "description": "Name of the Channel to which the window will be joined by default when it's started.",
                            "type": "string"
                        },
                        "preventModifyingRestrictionsFor": {
                            "description": "By default, users are able to modify the read and write restrictions for all Channels via the Channel Selector UI. Apps can also modify the Channel restrictions programmatically. To prevent the users and the app from being able to modify a Channel restriction, use this property. Provide a list of objects, each containing a Channel name and the Channel restrictions that you want to prevent the users and the app from modifying.",
                            "type": "array",
                            "items": {
                                "description": "Specifies a Channel by name and whether the app will be able to modify the Channel restrictions for publishing and subscribing for data. Provide the Channel name and at least one of the Channel restrictions that you want to prevent the users and the app from modifying.",
                                "type": "object",
                                "properties": {
                                    "name": {
                                        "description": "Name of the Channel.",
                                        "type": "string"
                                    },
                                    "read": {
                                        "description": "Set to `false` to prevent the users and the app from modifying the Channel restriction for subscribing for data.",
                                        "type": "boolean"
                                    },
                                    "write": {
                                        "description": "Set to `false` to prevent the users and the app from modifying the Channel restriction for publishing data.",
                                        "type": "boolean"
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        "clickonce": {
            "title": "ClickOnceConfig",
            "type": "object",
            "description": "ClickOnce applications",
            "properties": {
                "url": {
                    "description": "URL to web server address associated with directory, which contains the ClickOnce application.",
                    "type": "string"
                },
                "windowStyle": {
                    "description": "Specifies the target's main window style (if supported).",
                    "enum": [
                        "Normal",
                        "Hidden",
                        "Minimized",
                        "Maximized"
                    ],
                    "default": "Normal"
                },
                "left": {
                    "description": "Position (in pixels) of the left window border, relative to the left edge of the display.",
                    "type": "integer",
                    "default": 0
                },
                "top": {
                    "description": "Position (in pixels) of the top window border, relative to the top edge of the display.",
                    "type": "integer",
                    "default": 0
                },
                "width": {
                    "description": "Width of the app window.",
                    "type": "integer",
                    "default": 400
                },
                "height": {
                    "description": "Height of the app window.",
                    "type": "integer",
                    "default": 400
                },
                "maxHeight": {
                    "description": "Specify the maximum window height.",
                    "type": "number"
                },
                "maxWidth": {
                    "description": "Specify the maximum window width.",
                    "type": "number"
                },
                "minHeight": {
                    "description": "Specify the minimum window height.",
                    "type": "number",
                    "default": 30
                },
                "minWidth": {
                    "description": "Specify the minimum window width.",
                    "type": "number",
                    "default": 50
                },
                "hasSizeAreas": {
                    "description": "If `false`, the window won't have resizing areas and the user won't be able to resize it by dragging its borders.",
                    "type": "boolean",
                    "default": true
                },
                "tabGroupId": {
                    "description": "Specifies the tab group ID. If two or more tab windows are defined with same ID, they will be hosted in the same tab window.",
                    "type": "string"
                },
                "mode": {
                    "description": "io.Connect Window type. Possible values are `flat`, `html`, `tab`.",
                    "enum": [
                        "flat",
                        "tab",
                        "html",
                        "frameless"
                    ],
                    "type": "string",
                    "default": "flat"
                },
                "frameColor": {
                    "description": "Specifies the io.Connect Window frame color. Accepts hex color as a string (e.g., `#666666`) or named HTML colors (e.g., `red`)",
                    "type": "string"
                },
                "tabIndex": {
                    "description": "Specifies the tab position index. Tab windows in the same tab group are ordered by their position index. Use negative index to make the tab active.",
                    "type": "number"
                },
                "onTop": {
                    "description": "Setting that allows the app window to be on top of the Z-order, in front of all other windows, even when it isn't on focus. Note that because each io.Connect app window is in fact in an io.Connect Window group container (even though being a single window), the `onTop` setting actually determines the Z-order of the group container at the moment of its creation. Snapping an io.Connect Window to another io.Connect Window in reality destroys the group container of the snapped window and that window joins the group container of the window to which it is being snapped. Therefore, when joining a window with a specified `onTop` setting to another window or a window group, its initial `onTop` value will be overwritten - either permanently (when set to `true`), or temporarily (when set to `always`).",
                    "default": false,
                    "oneOf": [
                        {
                            "description": "If `true`, the window will be on top of the Z-order. This, however, will last only until the window is visible and not joined to an io.Connect Window group. If the window is hidden programmatically or the user snaps it to another io.Connect Window or window group, it will no longer be on top of the Z-order when it becomes visible or when the user tears it off from the group.",
                            "type": "boolean",
                            "default": false
                        },
                        {
                            "description": "If set to `always`, the window will remain permanently on top of the Z-order, regardless of changes to its visibility or whether it joins or leaves an io.Connect Window group. If you join a window that is set to always be on top to a window or a group of windows which aren't, it will temporarily lose its always on top setting. When the window is extracted from the group, it will again be always on top.",
                            "type": "string",
                            "enum": [
                                "always"
                            ]
                        }
                    ]
                },
                "relativeTo": {
                    "description": "The window ID of the window that will be used to relatively position the new window. Can be combined with `relativeDirection`",
                    "type": "string"
                },
                "relativeDirection": {
                    "description": "Direction (`bottom`, `top`, `left`, `right`) of positioning the window relatively to the `relativeTo` window. Considered only if `relativeTo` is supplied.",
                    "type": "string",
                    "default": "right"
                },
                "allowClose": {
                    "description": "If `false`, the window will not contain a close button.",
                    "type": "boolean",
                    "default": true
                },
                "allowTabClose": {
                    "description": "If `false`, the tab header will not contain a close button.",
                    "type": "boolean",
                    "default": true
                },
                "allowCollapse": {
                    "description": "If `false`, the window will not contain a collapse button.",
                    "type": "boolean",
                    "default": false
                },
                "allowMaximize": {
                    "description": "If `false`, the window will not contain a maximize button.",
                    "type": "boolean",
                    "default": true
                },
                "allowMinimize": {
                    "description": "If `false`,the window will not contain a minimize button.",
                    "type": "boolean",
                    "default": true
                },
                "allowExtract": {
                    "description": "If `false`, the window will not contain an extract button.",
                    "type": "boolean"
                },
                "showStickyButton": {
                    "description": "If `false`, the window will not contain a sticky button.",
                    "type": "boolean"
                },
                "showFeedbackButton": {
                    "description": "If `false`, the window will not contain a feedback button.",
                    "type": "boolean"
                },
                "showCloneButton": {
                    "description": "If `false`, the window will not contain a clone button.",
                    "type": "boolean"
                },
                "allowUnstick": {
                    "description": "If `false`, the window will remain stuck to other windows.",
                    "type": "boolean",
                    "default": true
                },
                "allowChannels": {
                    "description": "Deprecated. Use `\"channelSelector\"` instead.",
                    "type": "boolean"
                },
                "readOnlyChannelSelector": {
                    "description": "Deprecated. Use `\"channelSelector\"` instead.",
                    "type": "boolean"
                },
                "channelId": {
                    "description": "Deprecated. Use `\"channelSelector\"` instead.",
                    "type": "string"
                },
                "allowLockUnlock": {
                    "description": "If `false`, the window will not contain a lock/unlock button.",
                    "type": "boolean",
                    "default": false
                },
                "maximizable": {
                    "description": "If `false`, the window will not be able to maximize via buttons and/or windows gestures.",
                    "type": "boolean",
                    "default": true
                },
                "minimizable": {
                    "description": "If `false`, the window will not be able to minimize via buttons and/or windows gestures.",
                    "type": "boolean",
                    "default": true
                },
                "disableTransitions": {
                    "description": "If `true`, disables transition animations which are applied when showing a hidden window, minimize, restore, maximize, etc.",
                    "type": "boolean",
                    "default": false
                },
                "showInTaskbar": {
                    "description": "If `false`, the window will not appear in the taskbar.",
                    "type": "boolean",
                    "default": true
                },
                "isSticky": {
                    "description": "If `true`, the newly created window will participate in io.Connect Window operations (stick, unstick, etc.).",
                    "type": "boolean"
                },
                "logging": {
                    "description": "If `true`, the `stdout` and `stderr` will be saved in the log folder under the `application` folder with the name of the application.",
                    "type": "boolean",
                    "default": false
                },
                "startFailedMessage": {
                    "description": "Error message that should be displayed to users if the `clickonce` fails to start.",
                    "type": "string"
                },
                "timeout": {
                    "description": "Starting timeout in seconds.",
                    "type": "number"
                },
                "trackingType": {
                    "description": "Specifies how to track the lifetime of the target application process , i.e. to determine when it is started and stopped.",
                    "enum": [
                        "None",
                        "Process",
                        "AGM"
                    ],
                    "default": "AGM"
                },
                "agmTrackingLaunchTimeout": {
                    "description": "Time in seconds to wait for AGM tracked instance to connect. Use 0 to wait indefinitely.",
                    "type": "number",
                    "default": 120
                },
                "startingContextMode": {
                    "description": "Specifies how to pass application starting context to the client application.",
                    "enum": [
                        "environment",
                        "interop",
                        "interopCmdLine",
                        "none"
                    ],
                    "default": "interop"
                },
                "cascade": {
                    "$ref": "system.json#/definitions/cascadeConfig"
                },
                "terminateOnShutdown": {
                    "description": "If `true`, the app will be stopped when the platform shuts down.",
                    "type": "boolean",
                    "default": true
                },
                "jumpList": {
                    "$ref": "system.json#/definitions/jumpListConfig"
                },
                "saveInLayout": {
                    "description": "Specifies properties to be persisted when the app is saved in a Layout.",
                    "type": "object",
                    "properties": {
                        "command": {
                            "description": "If `true`, when the app is saved in a Layout, the command with which it was started will be persisted. If the value of the `\"command\"` property in the app definition is changed, when the Layout is restored, the app will be started with the previously persisted command, and not the one in the current app definition.",
                            "type": "boolean"
                        },
                        "parameters": {
                            "description": "If `true`, when the app is saved in a Layout, the parameters with which it was started will be persisted. If the value of the `\"parameters\"` property in the app definition is changed, when the Layout is restored, the app will be started with the previously persisted parameters, and not the ones in the current app definition.",
                            "type": "boolean"
                        },
                        "title": {
                            "description": "Settings for persisting the current title of the app when a Layout is saved.",
                            "oneOf": [
                                {
                                    "description": "If `true`, the app title will be persisted in all Layout types - Application Default, Workspace, and Global.",
                                    "type": "boolean"
                                },
                                {
                                    "type": "array",
                                    "description": "List of Layout types in which the app title will be persisted.",
                                    "items": {
                                        "type": "string",
                                        "description": "Layout type.",
                                        "enum": [
                                            "Global",
                                            "ApplicationDefault",
                                            "Workspace"
                                        ]
                                    }
                                }
                            ]
                        }
                    }
                },
                "channelSelector": {
                    "description": "Settings for the Channel Selector UI.",
                    "type": "object",
                    "properties": {
                        "type": {
                            "description": "Type of the Channel Selector to show on the io.Connect Windows. The single Channel Selector (default) allows the window to join a single Channel to which it can subscribe and publish data unrestrictedly. The directional single Channel Selector allows the window to join a single Channel, but also enables the user to restrict the window from publishing or from subscribing to the current Channel. The multi Channel Selector allows the window to join multiple Channels simultaneously to which it can subscribe and publish data unrestrictedly. The directional multi Channel Selector allows the window to join multiple Channels, but also enables the user to restrict the window from publishing or from subscribing to the currently joined Channels.",
                            "type": "string",
                            "enum": [
                                "single",
                                "directionalSingle",
                                "multi",
                                "directionalMulti"
                            ]
                        },
                        "enabled": {
                            "description": "If `true`, will allow showing the Channel Selector.",
                            "type": "boolean"
                        },
                        "readOnly": {
                            "description": "If `true`, the Channel Selector will be visible, but the user won't be able to switch between Channels from it.",
                            "type": "boolean"
                        },
                        "channelId": {
                            "description": "Name of the Channel to which the window will be joined by default when it's started.",
                            "type": "string"
                        },
                        "preventModifyingRestrictionsFor": {
                            "description": "By default, users are able to modify the read and write restrictions for all Channels via the Channel Selector UI. Apps can also modify the Channel restrictions programmatically. To prevent the users and the app from being able to modify a Channel restriction, use this property. Provide a list of objects, each containing a Channel name and the Channel restrictions that you want to prevent the users and the app from modifying.",
                            "type": "array",
                            "items": {
                                "description": "Specifies a Channel by name and whether the app will be able to modify the Channel restrictions for publishing and subscribing for data. Provide the Channel name and at least one of the Channel restrictions that you want to prevent the users and the app from modifying.",
                                "type": "object",
                                "properties": {
                                    "name": {
                                        "description": "Name of the Channel.",
                                        "type": "string"
                                    },
                                    "read": {
                                        "description": "Set to `false` to prevent the users and the app from modifying the Channel restriction for subscribing for data.",
                                        "type": "boolean"
                                    },
                                    "write": {
                                        "description": "Set to `false` to prevent the users and the app from modifying the Channel restriction for publishing data.",
                                        "type": "boolean"
                                    }
                                }
                            }
                        }
                    }
                },
                "appParameters": {
                    "description": "Object containing key/value pairs of command line parameter names and values to be passed to the ClickOnce app.",
                    "type": "object"
                }
            }
        },
        "citrix": {
            "title": "CitrixConfig",
            "type": "object",
            "description": "Citrix applications",
            "properties": {
                "name": {
                    "description": "Published Citrix application name.",
                    "type": "string"
                },
                "parameters": {
                    "description": "Optional parameters that will be used when starting the target Citrix application. The content is used as is, no checks performed.",
                    "type": "string"
                },
                "instanceIdOverride": {
                    "description": "If specified, will override the system-generated instance id for this application.",
                    "type": "string"
                },
                "windowStyle": {
                    "description": "Specifies the target's main window style (if supported).",
                    "enum": [
                        "Normal",
                        "Hidden",
                        "Minimized",
                        "Maximized"
                    ],
                    "default": "Normal"
                },
                "left": {
                    "description": "Position (in pixels) of the left window border, relative to the left edge of the display.",
                    "type": "integer",
                    "default": 0
                },
                "top": {
                    "description": "Position (in pixels) of the top window border, relative to the top edge of the display.",
                    "type": "integer",
                    "default": 0
                },
                "width": {
                    "description": "Width of the app window.",
                    "type": "integer",
                    "default": 400
                },
                "height": {
                    "description": "Height of the app window.",
                    "type": "integer",
                    "default": 400
                },
                "maxHeight": {
                    "description": "Specify the maximum window height.",
                    "type": "number"
                },
                "maxWidth": {
                    "description": "Specify the maximum window width.",
                    "type": "number"
                },
                "minHeight": {
                    "description": "Specify the minimum window height.",
                    "type": "number",
                    "default": 30
                },
                "minWidth": {
                    "description": "Specify the minimum window width.",
                    "type": "number",
                    "default": 50
                },
                "hasSizeAreas": {
                    "description": "If `false`, the window won't have resizing areas and the user won't be able to resize it by dragging its borders.",
                    "type": "boolean",
                    "default": true
                },
                "tabGroupId": {
                    "description": "Specifies the tab group ID. If two or more tab windows are defined with same ID, they will be hosted in the same tab window.",
                    "type": "string"
                },
                "mode": {
                    "description": "io.Connect Window type. Possible values are `flat`, `html`, `tab`.",
                    "enum": [
                        "flat",
                        "tab",
                        "html",
                        "frameless"
                    ],
                    "type": "string",
                    "default": "flat"
                },
                "frameColor": {
                    "description": "Specifies the io.Connect Window frame color. Accepts hex color as a string (e.g., `#666666`) or named HTML colors (e.g., `red`)",
                    "type": "string"
                },
                "tabIndex": {
                    "description": "Specifies the tab position index. Tab windows in the same tab group are ordered by their position index. Use negative index to make the tab active.",
                    "type": "number"
                },
                "relativeTo": {
                    "description": "The window ID of the window that will be used to relatively position the new window. Can be combined with `relativeDirection`",
                    "type": "string"
                },
                "relativeDirection": {
                    "description": "Direction (`bottom`, `top`, `left`, `right`) of positioning the window relatively to the `relativeTo` window. Considered only if `relativeTo` is supplied.",
                    "type": "string",
                    "default": "right"
                },
                "allowClose": {
                    "description": "If `false`, the window will not contain a close button.",
                    "type": "boolean",
                    "default": true
                },
                "allowTabClose": {
                    "description": "If `false`, the tab header will not contain a close button.",
                    "type": "boolean",
                    "default": true
                },
                "allowCollapse": {
                    "description": "If `false`, the window will not contain a collapse button.",
                    "type": "boolean",
                    "default": false
                },
                "allowMaximize": {
                    "description": "If `false`, the window will not contain a maximize button.",
                    "type": "boolean",
                    "default": true
                },
                "allowMinimize": {
                    "description": "If `false`,the window will not contain a minimize button.",
                    "type": "boolean",
                    "default": true
                },
                "allowExtract": {
                    "description": "If `false`, the window will not contain an extract button.",
                    "type": "boolean"
                },
                "showStickyButton": {
                    "description": "If `false`, the window will not contain a sticky button.",
                    "type": "boolean"
                },
                "showFeedbackButton": {
                    "description": "If `false`, the window will not contain a feedback button.",
                    "type": "boolean"
                },
                "showCloneButton": {
                    "description": "If `false`, the window will not contain a clone button.",
                    "type": "boolean"
                },
                "allowUnstick": {
                    "description": "If `false`, the window will remain stuck to other windows.",
                    "type": "boolean",
                    "default": true
                },
                "allowChannels": {
                    "description": "Deprecated. Use `\"channelSelector\"` instead.",
                    "type": "boolean"
                },
                "readOnlyChannelSelector": {
                    "description": "Deprecated. Use `\"channelSelector\"` instead.",
                    "type": "boolean"
                },
                "channelId": {
                    "description": "Deprecated. Use `\"channelSelector\"` instead.",
                    "type": "string"
                },
                "allowLockUnlock": {
                    "description": "If `false`, the window will not contain a lock/unlock button.",
                    "type": "boolean",
                    "default": false
                },
                "maximizable": {
                    "description": "If `false`, the window will not be able to maximize via buttons and/or windows gestures.",
                    "type": "boolean",
                    "default": true
                },
                "minimizable": {
                    "description": "If `false`, the window will not be able to minimize via buttons and/or windows gestures.",
                    "type": "boolean",
                    "default": true
                },
                "disableTransitions": {
                    "description": "If `true`, disables transition animations which are applied when showing a hidden window, minimize, restore, maximize, etc.",
                    "type": "boolean",
                    "default": false
                },
                "showInTaskbar": {
                    "description": "If `false`, the window will not appear in the taskbar.",
                    "type": "boolean",
                    "default": true
                },
                "isSticky": {
                    "description": "If `true`, the newly created window will participate in io.Connect Window operations (stick, unstick, etc.).",
                    "type": "boolean"
                },
                "logging": {
                    "description": "If `true`, the `stdout` and `stderr` will be saved in the log folder under the `application` folder with the name of the application.",
                    "type": "boolean",
                    "default": false
                },
                "startFailedMessage": {
                    "description": "Error message that should be displayed to users if the `citrix` application fails to start.",
                    "type": "string"
                },
                "timeout": {
                    "description": "Starting timeout in seconds.",
                    "type": "number"
                },
                "trackingType": {
                    "description": "Specifies how to track the lifetime of the target application process , i.e. to determine when it is started and stopped.",
                    "enum": [
                        "None",
                        "Process",
                        "AGM"
                    ],
                    "default": "AGM"
                },
                "agmTrackingLaunchTimeout": {
                    "description": "Time in seconds to wait for AGM tracked instance to connect. Use 0 to wait indefinitely.",
                    "type": "number",
                    "default": 120
                },
                "startingContextMode": {
                    "description": "Specifies how to pass application starting context to the client application.",
                    "enum": [
                        "environment",
                        "interop",
                        "interopCmdLine",
                        "none"
                    ],
                    "default": "interopCmdLine"
                },
                "dontReplaceLocalhost": {
                    "description": "By default the list of command-line arguments will be processed to replace localhost and 127.0.0.1 addresses with the machine's network IP. Set this argument to true to suppress this behavior.",
                    "type": "boolean",
                    "default": false
                },
                "cascade": {
                    "$ref": "system.json#/definitions/cascadeConfig"
                },
                "terminateOnShutdown": {
                    "description": "If `true`, the app will be stopped when the platform shuts down.",
                    "type": "boolean",
                    "default": true
                },
                "saveInLayout": {
                    "description": "Specifies properties to be persisted when the app is saved in a Layout.",
                    "type": "object",
                    "properties": {
                        "command": {
                            "description": "If `true`, when the app is saved in a Layout, the command with which it was started will be persisted. If the value of the `\"command\"` property in the app definition is changed, when the Layout is restored, the app will be started with the previously persisted command, and not the one in the current app definition.",
                            "type": "boolean"
                        },
                        "parameters": {
                            "description": "If `true`, when the app is saved in a Layout, the parameters with which it was started will be persisted. If the value of the `\"parameters\"` property in the app definition is changed, when the Layout is restored, the app will be started with the previously persisted parameters, and not the ones in the current app definition.",
                            "type": "boolean"
                        },
                        "title": {
                            "description": "Settings for persisting the current title of the app when a Layout is saved.",
                            "oneOf": [
                                {
                                    "description": "If `true`, the app title will be persisted in all Layout types - Application Default, Workspace, and Global.",
                                    "type": "boolean"
                                },
                                {
                                    "type": "array",
                                    "description": "List of Layout types in which the app title will be persisted.",
                                    "items": {
                                        "type": "string",
                                        "description": "Layout type.",
                                        "enum": [
                                            "Global",
                                            "ApplicationDefault",
                                            "Workspace"
                                        ]
                                    }
                                }
                            ]
                        }
                    }
                },
                "channelSelector": {
                    "description": "Settings for the Channel Selector UI.",
                    "type": "object",
                    "properties": {
                        "type": {
                            "description": "Type of the Channel Selector to show on the io.Connect Windows. The single Channel Selector (default) allows the window to join a single Channel to which it can subscribe and publish data unrestrictedly. The directional single Channel Selector allows the window to join a single Channel, but also enables the user to restrict the window from publishing or from subscribing to the current Channel. The multi Channel Selector allows the window to join multiple Channels simultaneously to which it can subscribe and publish data unrestrictedly. The directional multi Channel Selector allows the window to join multiple Channels, but also enables the user to restrict the window from publishing or from subscribing to the currently joined Channels.",
                            "type": "string",
                            "enum": [
                                "single",
                                "directionalSingle",
                                "multi",
                                "directionalMulti"
                            ]
                        },
                        "enabled": {
                            "description": "If `true`, will allow showing the Channel Selector.",
                            "type": "boolean"
                        },
                        "readOnly": {
                            "description": "If `true`, the Channel Selector will be visible, but the user won't be able to switch between Channels from it.",
                            "type": "boolean"
                        },
                        "channelId": {
                            "description": "Name of the Channel to which the window will be joined by default when it's started.",
                            "type": "string"
                        },
                        "preventModifyingRestrictionsFor": {
                            "description": "By default, users are able to modify the read and write restrictions for all Channels via the Channel Selector UI. Apps can also modify the Channel restrictions programmatically. To prevent the users and the app from being able to modify a Channel restriction, use this property. Provide a list of objects, each containing a Channel name and the Channel restrictions that you want to prevent the users and the app from modifying.",
                            "type": "array",
                            "items": {
                                "description": "Specifies a Channel by name and whether the app will be able to modify the Channel restrictions for publishing and subscribing for data. Provide the Channel name and at least one of the Channel restrictions that you want to prevent the users and the app from modifying.",
                                "type": "object",
                                "properties": {
                                    "name": {
                                        "description": "Name of the Channel.",
                                        "type": "string"
                                    },
                                    "read": {
                                        "description": "Set to `false` to prevent the users and the app from modifying the Channel restriction for subscribing for data.",
                                        "type": "boolean"
                                    },
                                    "write": {
                                        "description": "Set to `false` to prevent the users and the app from modifying the Channel restriction for publishing data.",
                                        "type": "boolean"
                                    }
                                }
                            }
                        }
                    }
                },
                "useVirtualChannel": {
                    "type": "boolean",
                    "description": "If `true`, the application will attempt to connect to the io.Connect Desktop Gateway via a Citrix Virtual Channel. If `false`, it will try to connect directly to the IP address of the client machine.",
                    "default": false
                }
            }
        },
        "node": {
            "title": "NodeConfig",
            "type": "object",
            "description": "Node application",
            "additionalProperties": true,
            "properties": {
                "showConsole": {
                    "description": "If `true`, the console of the Node.js script will be visible.",
                    "type": "boolean",
                    "default": false
                },
                "path": {
                    "description": "This is the path to the JavaScript file to be executed in `Node.js`.",
                    "type": "string"
                },
                "remote": {
                    "properties": {
                        "url": {
                            "description": "This is the URL to the JavaScript file to be executed in `Node.js`.",
                            "type": "string"
                        },
                        "headers": {
                            "description": "Set of headers that will be added to the request for downloading the script file.",
                            "type": "array",
                            "items": {
                                "type": "object",
                                "properties": {
                                    "name": {
                                        "description": "Header name.",
                                        "type": "string"
                                    },
                                    "value": {
                                        "description": "Header value.",
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "name",
                                    "value"
                                ],
                                "additionalProperties": false
                            }
                        },
                        "noCache": {
                            "description": "If `true`, the `Cache-Control: no-cache` header will be added.",
                            "type": "boolean",
                            "default": false
                        }
                    },
                    "additionalProperties": false
                },
                "passGlueToken": {
                    "description": "If `true`, when the app is started, a valid GW3 token will be set as an environment variable - `gwToken`.",
                    "type": "boolean",
                    "default": false
                },
                "debug": {
                    "description": "Enable debugging. Same as inspect.",
                    "default": false,
                    "oneOf": [
                        {
                            "description": "Enable debugging on the default port 9229.",
                            "type": "boolean"
                        },
                        {
                            "description": "Enable debugging on port.",
                            "type": "string",
                            "additionalProperties": false
                        }
                    ],
                    "additionalProperties": false
                },
                "inspect": {
                    "description": "Enable the inspector agent. If `boolean`, listens on the default address and port (127.0.0.1:9229). If `number`, listens on the port number.",
                    "default": false,
                    "oneOf": [
                        {
                            "description": "Enable debugging on the default port 9229.",
                            "type": "boolean"
                        },
                        {
                            "description": "Enable debugging on port.",
                            "type": "number",
                            "additionalProperties": false
                        }
                    ],
                    "additionalProperties": false
                },
                "inspectBrk": {
                    "description": "Enable the inspector agent and break before the user code starts. If `boolean`, listens on the default address and port (127.0.0.1:9229). If `number`, listens on the port number.",
                    "default": false,
                    "oneOf": [
                        {
                            "description": "Enable debugging on the default port 9229.",
                            "type": "boolean"
                        },
                        {
                            "description": "Enable debugging on port.",
                            "type": "number",
                            "additionalProperties": false
                        }
                    ],
                    "additionalProperties": false
                },
                "parameters": {
                    "description": "Optional parameters that will be used when starting the application/script.",
                    "type": "string"
                },
                "timeout": {
                    "description": "Starting timeout in seconds.",
                    "type": "number"
                },
                "nodeVersion": {
                    "description": "The Node.JS version",
                    "type": "string"
                },
                "logging": {
                    "description": "If `true`, the `stdout` and `stderr` will be saved in the log folder under the `application` folder with the name of the application.",
                    "type": "boolean",
                    "default": false
                },
                "nodeCLIOptions": {
                    "description": "CLI options for the Node.js environment.",
                    "default": "--dns-result-order=ipv4first",
                    "type": "string"
                },
                "terminateOnShutdown": {
                    "description": "If `true`, the app will be stopped when the platform shuts down.",
                    "type": "boolean",
                    "default": true
                }
            }
        },
        "childWindow": {
            "title": "ChildWindowConfig",
            "type": "object",
            "description": "Child-window application",
            "additionalProperties": true,
            "properties": {
                "owner": {
                    "description": "The host application name",
                    "type": "string"
                },
                "windowStyle": {
                    "description": "Specifies the target's main window style (if supported).",
                    "enum": [
                        "Normal",
                        "Hidden",
                        "Minimized",
                        "Maximized"
                    ],
                    "default": "Normal"
                },
                "left": {
                    "description": "Position (in pixels) of the left window border, relative to the left edge of the display.",
                    "type": "integer",
                    "default": 0
                },
                "top": {
                    "description": "Position (in pixels) of the top window border, relative to the top edge of the display.",
                    "type": "integer",
                    "default": 0
                },
                "width": {
                    "description": "Width of the app window.",
                    "type": "integer",
                    "default": 400
                },
                "height": {
                    "description": "Height of the app window.",
                    "type": "integer",
                    "default": 400
                },
                "maxHeight": {
                    "description": "Specify the maximum window height.",
                    "type": "number"
                },
                "maxWidth": {
                    "description": "Specify the maximum window width.",
                    "type": "number"
                },
                "minHeight": {
                    "description": "Specify the minimum window height.",
                    "type": "number",
                    "default": 30
                },
                "minWidth": {
                    "description": "Specify the minimum window width.",
                    "type": "number",
                    "default": 50
                },
                "hasSizeAreas": {
                    "description": "If `false`, the window won't have resizing areas and the user won't be able to resize it by dragging its borders.",
                    "type": "boolean",
                    "default": true
                },
                "tabGroupId": {
                    "description": "Specifies the tab group ID. If two or more tab windows are defined with same ID, they will be hosted in the same tab window.",
                    "type": "string"
                },
                "mode": {
                    "description": "io.Connect Window type. Possible values are `flat`, `html`, `tab`.",
                    "enum": [
                        "flat",
                        "tab",
                        "html",
                        "frameless"
                    ],
                    "type": "string",
                    "default": "flat"
                },
                "frameColor": {
                    "description": "Specifies the io.Connect Window frame color. Accepts hex color as a string (e.g., `#666666`) or named HTML colors (e.g., `red`)",
                    "type": "string"
                },
                "tabIndex": {
                    "description": "Specifies the tab position index. Tab windows in the same tab group are ordered by their position index. Use negative index to make the tab active.",
                    "type": "number"
                },
                "relativeTo": {
                    "description": "The window ID of the window that will be used to relatively position the new window. Can be combined with `relativeDirection`",
                    "type": "string"
                },
                "relativeDirection": {
                    "description": "Direction (`bottom`, `top`, `left`, `right`) of positioning the window relatively to the `relativeTo` window. Considered only if `relativeTo` is supplied.",
                    "type": "string",
                    "default": "right"
                },
                "allowClose": {
                    "description": "If `false`, the window will not contain a close button.",
                    "type": "boolean",
                    "default": true
                },
                "allowTabClose": {
                    "description": "If `false`, the tab header will not contain a close button.",
                    "type": "boolean",
                    "default": true
                },
                "allowCollapse": {
                    "description": "If `false`, the window will not contain a collapse button.",
                    "type": "boolean",
                    "default": false
                },
                "allowMaximize": {
                    "description": "If `false`, the window will not contain a maximize button.",
                    "type": "boolean",
                    "default": true
                },
                "allowMinimize": {
                    "description": "If `false`,the window will not contain a minimize button.",
                    "type": "boolean",
                    "default": true
                },
                "allowExtract": {
                    "description": "If `false`, the window will not contain an extract button.",
                    "type": "boolean"
                },
                "showStickyButton": {
                    "description": "If `false`, the window will not contain a sticky button.",
                    "type": "boolean"
                },
                "showFeedbackButton": {
                    "description": "If `false`, the window will not contain a feedback button.",
                    "type": "boolean"
                },
                "showCloneButton": {
                    "description": "If `false`, the window will not contain a clone button.",
                    "type": "boolean"
                },
                "allowUnstick": {
                    "description": "If `false`, the window will remain stuck to other windows.",
                    "type": "boolean",
                    "default": true
                },
                "allowChannels": {
                    "description": "Deprecated. Use `\"channelSelector\"` instead.",
                    "type": "boolean"
                },
                "readOnlyChannelSelector": {
                    "description": "Deprecated. Use `\"channelSelector\"` instead.",
                    "type": "boolean"
                },
                "channelId": {
                    "description": "Deprecated. Use `\"channelSelector\"` instead.",
                    "type": "string"
                },
                "allowLockUnlock": {
                    "description": "If `false`, the window will not contain a lock/unlock button.",
                    "type": "boolean",
                    "default": false
                },
                "maximizable": {
                    "description": "If `false`, the window will not be able to maximize via buttons and/or windows gestures.",
                    "type": "boolean",
                    "default": true
                },
                "minimizable": {
                    "description": "If `false`, the window will not be able to minimize via buttons and/or windows gestures.",
                    "type": "boolean",
                    "default": true
                },
                "disableTransitions": {
                    "description": "If `true`, disables transition animations which are applied when showing a hidden window, minimize, restore, maximize, etc.",
                    "type": "boolean",
                    "default": false
                },
                "showInTaskbar": {
                    "description": "If `false`, the window will not appear in the taskbar.",
                    "type": "boolean",
                    "default": true
                },
                "isSticky": {
                    "description": "If `true`, the newly created window will participate in io.Connect Window operations (stick, unstick, etc.).",
                    "type": "boolean"
                },
                "compatibility": {
                    "$ref": "#/definitions/nativeAppCompatibility"
                },
                "cascade": {
                    "$ref": "system.json#/definitions/cascadeConfig"
                },
                "terminateOnShutdown": {
                    "description": "If `true`, the app will be stopped when the platform shuts down.",
                    "type": "boolean",
                    "default": true
                },
                "timeout": {
                    "description": "Starting timeout in seconds.",
                    "type": "number"
                },
                "jumpList": {
                    "$ref": "system.json#/definitions/jumpListConfig"
                },
                "onTop": {
                    "description": "Setting that allows the app window to be on top of the Z-order, in front of all other windows, even when it isn't on focus. Note that because each io.Connect app window is in fact in an io.Connect Window group container (even though being a single window), the `onTop` setting actually determines the Z-order of the group container at the moment of its creation. Snapping an io.Connect Window to another io.Connect Window in reality destroys the group container of the snapped window and that window joins the group container of the window to which it is being snapped. Therefore, when joining a window with a specified `onTop` setting to another window or a window group, its initial `onTop` value will be overwritten - either permanently (when set to `true`), or temporarily (when set to `always`).",
                    "default": false,
                    "oneOf": [
                        {
                            "description": "If `true`, the window will be on top of the Z-order. This, however, will last only until the window is visible and not joined to an io.Connect Window group. If the window is hidden programmatically or the user snaps it to another io.Connect Window or window group, it will no longer be on top of the Z-order when it becomes visible or when the user tears it off from the group.",
                            "type": "boolean",
                            "default": false
                        },
                        {
                            "description": "If set to `always`, the window will remain permanently on top of the Z-order, regardless of changes to its visibility or whether it joins or leaves an io.Connect Window group. If you join a window that is set to always be on top to a window or a group of windows which aren't, it will temporarily lose its always on top setting. When the window is extracted from the group, it will again be always on top.",
                            "type": "string",
                            "enum": [
                                "always"
                            ]
                        }
                    ]
                },
                "channelSelector": {
                    "description": "Settings for the Channel Selector UI.",
                    "type": "object",
                    "properties": {
                        "type": {
                            "description": "Type of the Channel Selector to show on the io.Connect Windows. The single Channel Selector (default) allows the window to join a single Channel to which it can subscribe and publish data unrestrictedly. The directional single Channel Selector allows the window to join a single Channel, but also enables the user to restrict the window from publishing or from subscribing to the current Channel. The multi Channel Selector allows the window to join multiple Channels simultaneously to which it can subscribe and publish data unrestrictedly. The directional multi Channel Selector allows the window to join multiple Channels, but also enables the user to restrict the window from publishing or from subscribing to the currently joined Channels.",
                            "type": "string",
                            "enum": [
                                "single",
                                "directionalSingle",
                                "multi",
                                "directionalMulti"
                            ]
                        },
                        "enabled": {
                            "description": "If `true`, will allow showing the Channel Selector.",
                            "type": "boolean"
                        },
                        "readOnly": {
                            "description": "If `true`, the Channel Selector will be visible, but the user won't be able to switch between Channels from it.",
                            "type": "boolean"
                        },
                        "channelId": {
                            "description": "Name of the Channel to which the window will be joined by default when it's started.",
                            "type": "string"
                        },
                        "preventModifyingRestrictionsFor": {
                            "description": "By default, users are able to modify the read and write restrictions for all Channels via the Channel Selector UI. Apps can also modify the Channel restrictions programmatically. To prevent the users and the app from being able to modify a Channel restriction, use this property. Provide a list of objects, each containing a Channel name and the Channel restrictions that you want to prevent the users and the app from modifying.",
                            "type": "array",
                            "items": {
                                "description": "Specifies a Channel by name and whether the app will be able to modify the Channel restrictions for publishing and subscribing for data. Provide the Channel name and at least one of the Channel restrictions that you want to prevent the users and the app from modifying.",
                                "type": "object",
                                "properties": {
                                    "name": {
                                        "description": "Name of the Channel.",
                                        "type": "string"
                                    },
                                    "read": {
                                        "description": "Set to `false` to prevent the users and the app from modifying the Channel restriction for subscribing for data.",
                                        "type": "boolean"
                                    },
                                    "write": {
                                        "description": "Set to `false` to prevent the users and the app from modifying the Channel restriction for publishing data.",
                                        "type": "boolean"
                                    }
                                }
                            }
                        }
                    }
                }
            },
            "required": [
                "owner"
            ]
        },
        "nativeAppCompatibility": {
            "title": "nativeAppCompatibilityConfig",
            "type": "object",
            "description": "Compatibility options for native apps (excluding Citrix apps).",
            "additionalProperties": true,
            "properties": {
                "emulateDPIChangedMessage": {
                    "description": "If `true`, the native window will receive the `WM_DPICHNAGED` message when the effective DPI resolution for it has changed. This will allow the native window to handle the resolution changes properly.",
                    "type": "boolean",
                    "default": false
                }
            }
        },
        "activityWindow": {
            "title": "activityWindow",
            "type": "object",
            "description": "A window which takes part in an activity and may or may not be the owner.",
            "additionalProperties": true,
            "properties": {
                "type": {
                    "description": "The application identifier.",
                    "type": "string"
                },
                "name": {
                    "description": "The name of the application.",
                    "type": "string"
                },
                "left": {
                    "description": "Position (in pixels) of the left window border, relative to the left edge of the display.",
                    "type": "integer"
                },
                "top": {
                    "description": "Position (in pixels) of the top window border, relative to the top edge of the display.",
                    "type": "integer"
                },
                "width": {
                    "description": "Width of the app window.",
                    "type": "integer",
                    "default": 400
                },
                "height": {
                    "description": "Height of the app window.",
                    "type": "integer",
                    "default": 400
                }
            },
            "required": [
                "type",
                "name",
                "left",
                "top",
                "width",
                "height"
            ]
        },
        "activityLayout": {
            "title": "activityLayout",
            "type": "object",
            "description": "Specifies the `mode` and `cellSize` of the layout.",
            "additionalProperties": false,
            "properties": {
                "mode": {
                    "description": "Whether the activity window dimensions are in absolute (pixels) or relative (percents) tp the screen.",
                    "enum": [
                        "pixels",
                        "percents"
                    ],
                    "default": "pixels"
                },
                "cellSize": {
                    "description": "Size modifier for each activity cell in the activity grid.",
                    "type": "integer"
                },
                "cellWidth": {
                    "description": "Size modifier for the width of each activity cell in the activity grid.",
                    "type": "integer"
                },
                "cellHeight": {
                    "description": "Size modifier for the height of each activity cell in the activity grid.",
                    "type": "integer"
                },
                "screen": {
                    "default": "main",
                    "type": [
                        "string",
                        "integer"
                    ],
                    "description": "Can specify the target screen by index or \"main\" to indicate the primary display device."
                }
            }
        },
        "activityTarget": {
            "title": "activityTarget",
            "type": "object",
            "description": "Specifies how this application will be registered as an activity window.",
            "additionalProperties": true,
            "properties": {
                "enabled": {
                    "description": "Whether to register the application as an activity window.",
                    "type": "boolean",
                    "default": false
                },
                "windowType": {
                    "description": "Specifies the activity window type that will be associated with this application, i.e. when there is a request from the activity manager to create this type, an application instance is started. Defaults to the application name.",
                    "type": "string"
                },
                "isIndependent": {
                    "description": "Deprecated. Whether this activity window type can act as an independent window, i.e. to belong to any activity.",
                    "type": "boolean",
                    "default": false
                }
            },
            "required": [
                "enabled"
            ]
        },
        "workspaces": {
            "title": "workspacesConfig",
            "type": "object",
            "description": "Defines a workspace config.",
            "additionalProperties": true,
            "properties": {
                "default": {
                    "type": "boolean",
                    "description": "If true the application will act as default workspace application (will be used if no workspace app is specified or the specified one is missing)."
                },
                "saveWorkspaceApp": {
                    "type": "string"
                },
                "restoreWorkspaceApp": {
                    "type": "string"
                },
                "addApplicationApp": {
                    "type": "string"
                },
                "url": {
                    "type": "string"
                },
                "bounds": {
                    "type": "object",
                    "additionalProperties": false,
                    "default": {},
                    "properties": {
                        "left": {
                            "description": "Position (in pixels) of the left window border, relative to the left edge of the display.",
                            "type": "integer",
                            "default": 0
                        },
                        "top": {
                            "description": "Position (in pixels) of the top window border, relative to the top edge of the display.",
                            "type": "integer",
                            "default": 0
                        },
                        "width": {
                            "description": "Width of the app window.",
                            "type": "integer",
                            "default": 600
                        },
                        "height": {
                            "description": "Height of the app window.",
                            "type": "integer",
                            "default": 600
                        }
                    }
                },
                "windowState": {
                    "description": "If set, the window will start in the specified state (maximized, minimized, normal)",
                    "enum": [
                        "maximized",
                        "minimized",
                        "normal"
                    ],
                    "default": "maximized"
                },
                "frameStartLocation": {
                    "type": "string"
                },
                "activateFrame": {
                    "type": "boolean"
                },
                "hidden": {
                    "type": "boolean",
                    "default": false
                },
                "updateFrameConstraints": {
                    "type": "boolean",
                    "description": "When enabled GD applies the min max constraints to the Workspaces Frame window",
                    "default": true
                },
                "layout": {
                    "$ref": "#/definitions/workspaceLayout"
                },
                "layouts": {
                    "description": "Workspaces to be loaded when a new frame is loaded",
                    "type": "array",
                    "items": {
                        "oneOf": [
                            {
                                "$ref": "#/definitions/workspaceLayout"
                            },
                            {
                                "$ref": "#/definitions/workspaceRestoreConfig"
                            }
                        ]
                    }
                },
                "loading": {
                    "$ref": "#/definitions/loadingConfig"
                },
                "hibernation": {
                    "$ref": "system.json#/definitions/hibernationConfig"
                },
                "framePool": {
                    "type": "number",
                    "description": "Controls the count of cached frames, which will be used for workspace extract. The higher the number the higher the consumed memory, the lower the number the chance for workspace extract rejection, because the pool is empty will be higher.",
                    "default": 2
                },
                "allowOSInfo": {
                    "description": "If `true`, the app can retrieve OS information.",
                    "type": "boolean",
                    "default": false
                },
                "allowAuthInfo": {
                    "description": "If `true`, the app can retrieve authentication information about the current user.",
                    "type": "boolean",
                    "default": false
                },
                "allowProxySettingManipulation": {
                    "description": "If `true`, the app can modify the proxy configuration.",
                    "type": "boolean"
                },
                "syncTitleWithDocumentTitle": {
                    "anyOf": [
                        {
                            "description": "If `true`, the window title will be synchronized with the document title when it's updated.",
                            "type": "boolean"
                        },
                        {
                            "description": "If set to `\"preserveCustomTitle\"`, the window title will be synchronized with the document title until the moment the user or the API sets a custom title for the window. After that, the custom title will be preserved and the window title won't be synchronized with the document title.",
                            "type": "string",
                            "enum": [
                                "preserveCustomTitle"
                            ]
                        }
                    ]
                },
                "restrictWindowDropByOrigin": {
                    "description": "If `true` only applications opened in the workspace will be allowed to be dropped inside of it and all other apps won't be",
                    "type": "boolean",
                    "default": false
                },
                "allowWorkspaceTabExtract": {
                    "description": "If `false`, the user won't be able to extract any of the Workspace tabs in the Workspaces App. This will override the Workspaces API locking configuration.",
                    "type": "boolean"
                },
                "security": {
                    "$ref": "system.json#/definitions/securityConfig"
                },
                "minWidth": {
                    "description": "Specifies the minimum width in pixels for the Workspaces App.",
                    "default": 380,
                    "type": "number"
                },
                "minHeight": {
                    "description": "Specifies the minimum height in pixels for the Workspaces App.",
                    "default": 85,
                    "type": "number"
                },
                "maxWidth": {
                    "description": "Specifies the maximum width in pixels for the Workspaces App.",
                    "type": "number"
                },
                "maxHeight": {
                    "description": "Specifies the maximum height in pixels for the Workspaces App.",
                    "type": "number"
                },
                "workspaceLoadingAnimation": {
                    "description": "Configuration for the Workspace loading animation.",
                    "type": "object",
                    "additionalProperties": false,
                    "default": {},
                    "properties": {
                        "enabled": {
                            "description": "If `true`, will enable showing a loading animation while a Workspace is being loaded.",
                            "type": "boolean",
                            "default": false
                        },
                        "hideOnLoad": {
                            "description": "If `true` (default), will hide the Workspace loader once all visible windows in the Workspace have been loaded.",
                            "type": "boolean",
                            "default": true
                        }
                    }
                },
                "autoInjectAPI": {
                    "description": "Specifies if the io.Connect JavaScript API will be auto injected in the window context. The `Glue()` factory function becomes available without referencing a `desktop.js` file.",
                    "type": "object",
                    "required": [
                        "enabled"
                    ],
                    "additionalProperties": false,
                    "properties": {
                        "enabled": {
                            "description": "If `true`, will enable auto injection of the io.Connect JavaScript library.",
                            "type": "boolean",
                            "default": false
                        }
                    }
                },
                "autoOpenDevTools": {
                    "description": "If `true`, the Chrome Dev Tools for the workspace page will start automatically. Suitable for debugging purposes, in case your workspace page contains an error and can't start properly.",
                    "type": "boolean",
                    "default": false
                },
                "jumpList": {
                    "$ref": "system.json#/definitions/jumpListConfig"
                },
                "contextMenu": {
                    "$ref": "#/definitions/contextMenuConfig"
                },
                "contextMenuEnabled": {
                    "description": "Deprecated. Use `\"contextMenu\"` instead.",
                    "type": "boolean"
                },
                "contextMenuMode": {
                    "description": "Deprecated. Use `\"contextMenu\"` instead.",
                    "type": "string"
                },
                "autoRequestFocusInIframes": {
                    "description": "When set to `true` all iframes in the Workspaces frame will receive focus when clicked",
                    "type": "boolean",
                    "default": true
                },
                "allowEnvVars": {
                    "description": "If `true`, the app will be able to access the environment variables for the io.Connect process by using the `env` property of the `iodesktop` object.",
                    "type": "boolean",
                    "default": false
                },
                "zoom": {
                    "$ref": "system.json#/definitions/zoomConfig"
                },
                "preloadScripts": {
                    "description": "A list of preload scripts (URLs) that will be loaded and executed before the actual page is executed",
                    "oneOf": [
                        {
                            "type": "array",
                            "items": {
                                "type": "string"
                            }
                        },
                        {
                            "$ref": "system.json#/definitions/preloadScriptsConfig"
                        }
                    ]
                },
                "nativeWindowOpen": {
                    "$ref": "system.json#/definitions/windowsConfig/properties/nativeWindowOpen"
                },
                "nativeWindowOpenOptions": {
                    "$ref": "system.json#/definitions/windowsConfig/properties/nativeWindowOpenOptions"
                },
                "restoreWorkspacesByReference": {
                    "description": "If `true`, Workspaces saved in a Global Layout will be restored in their original (unmodified) state when the Global Layout is restored. If `false`, Workspaces will be restored in the exact state in which they were when the Global Layout was saved.",
                    "type": "boolean",
                    "default": false
                },
                "injectedStyles": {
                    "description": "Settings for injecting CSS files in web apps. The CSS files will be injected after the page has been loaded.",
                    "$ref": "system.json#/definitions/injectedStylesConfig"
                },
                "windowDragMode": {
                    "description": "Mode for dragging the windows that are part of a Workspace. If set to `\"autoEject\"`, when the user drags a Workspace window, it will be ejected from the Workspace during the dragging operation and the user will be able to drop it back inside the Workspace, or out of the Workspace. If set to `\"keepInside\"`, the window won't be ejected from the Workspace when being dragged and the user will be able to drop it only inside the Workspace.",
                    "type": "string",
                    "default": "keepInside",
                    "enum": [
                        "keepInside",
                        "autoEject"
                    ]
                },
                "logging": {
                    "description": "Settings for capturing console messages and network request errors for the app and logging them in the `application.log` file of **io.Connect Desktop**.",
                    "anyOf": [
                        {
                            "description": "If `true`, will enable capturing the console messages and network request errors for the app and logging them in the `application.log` file of **io.Connect Desktop**.",
                            "type": "boolean"
                        },
                        {
                            "description": "Settings for configuring which items to capture and log in the `application.log` file of **io.Connect Desktop**.",
                            "type": "object",
                            "properties": {
                                "consoleMessages": {
                                    "description": "Settings for capturing console messages.",
                                    "type": "object",
                                    "properties": {
                                        "enabled": {
                                            "description": "If `true`, will allow capturing all console messages.",
                                            "type": "boolean"
                                        },
                                        "level": {
                                            "description": "Sets the level at which to capture console messages. The platform will capture all console messages at the specified level and above.",
                                            "enum": [
                                                "debug",
                                                "info",
                                                "warn",
                                                "error"
                                            ],
                                            "default": "debug"
                                        }
                                    }
                                },
                                "networkRequestErrors": {
                                    "description": "Settings for capturing network request errors.",
                                    "type": "object",
                                    "properties": {
                                        "enabled": {
                                            "description": "If `true`, will allow capturing all network request errors.",
                                            "type": "boolean"
                                        }
                                    }
                                },
                                "unhandledErrors": {
                                    "description": "Settings for capturing unhandled errors (e.g., unhandled `Promise` rejections, errors not logged in the console).",
                                    "type": "object",
                                    "properties": {
                                        "enabled": {
                                            "description": "If `true`, will allow capturing all unhandled errors.",
                                            "type": "boolean"
                                        }
                                    }
                                }
                            }
                        }
                    ],
                    "default": false
                },
                "dialogs": {
                    "$ref": "#/definitions/workspacesDialogsConfig"
                },
                "userAgent": {
                    "$ref": "system.json#/definitions/userAgentConfig"
                }
            },
            "required": []
        },
        "webGroup": {
            "title": "webGroupConfig",
            "type": "object",
            "description": "Configuration for the Web Group App used in **io.Connect Desktop** for web-based io.Connect Window groups.",
            "additionalProperties": true,
            "properties": {
                "url": {
                    "description": "URL pointing to the location of the Web Group App.",
                    "type": "string"
                },
                "preloadScripts": {
                    "description": "A list of preload scripts (URLs) that will be loaded and executed before the actual page is executed",
                    "oneOf": [
                        {
                            "type": "array",
                            "items": {
                                "type": "string"
                            }
                        },
                        {
                            "$ref": "system.json#/definitions/preloadScriptsConfig"
                        }
                    ]
                },
                "nativeWindowOpen": {
                    "$ref": "system.json#/definitions/windowsConfig/properties/nativeWindowOpen"
                },
                "nativeWindowOpenOptions": {
                    "$ref": "system.json#/definitions/windowsConfig/properties/nativeWindowOpenOptions"
                },
                "useOSSystemButtons": {
                    "description": "If `true`, the Web Group App will use the OS system buttons for minimize, maximize, restore, and close. If `false`, the Web Group App will use its own buttons for minimize, maximize, restore, and close. Available only for web groups in the default platform mode.",
                    "type": "boolean",
                    "default": false
                },
                "autoOpenDevTools": {
                    "description": "If `true`, the Chrome Dev Tools for the web group page will start automatically. Suitable for debugging purposes, in case your web group page contains an error and can't start properly.",
                    "type": "boolean",
                    "default": false
                },
                "captureErrors": {
                    "description": "If `true`, errors from web group pages will be captured and written in the application log.",
                    "type": "boolean",
                    "default": false
                },
                "pool": {
                    "$ref": "#/definitions/webGroupPoolConfig"
                },
                "timeout": {
                    "description": "In seconds to wait for the app to become ready after the initial navigation completes.",
                    "type": "number",
                    "default": 30
                },
                "navigationResponseTimeoutSeconds": {
                    "description": "Maximum time in seconds to wait for the page to begin responding (TTFB or between response chunks). This timeout applies only to network responsiveness and does not limit total page load time.",
                    "type": "number",
                    "default": 300
                },
                "retryCount": {
                    "description": "Incremental intervals. The application waits a short time before the first retry, and then incrementally increasing time between each subsequent retry. For example, it may retry the operation after 1*500, 2*500, 3*500, and so on.",
                    "type": "number",
                    "default": 5
                },
                "retryInterval": {
                    "description": "retryAfter",
                    "type": "number",
                    "default": 1000
                },
                "retryFailedMessage": {
                    "description": "retryFailedMessage",
                    "type": "string"
                },
                "security": {
                    "$ref": "system.json#/definitions/securityConfig"
                },
                "contextMenu": {
                    "$ref": "#/definitions/contextMenuConfig"
                },
                "contextMenuEnabled": {
                    "description": "Deprecated. Use `\"contextMenu\"` instead.",
                    "type": "boolean"
                },
                "contextMenuMode": {
                    "description": "Deprecated. Use `\"contextMenu\"` instead.",
                    "type": "string"
                },
                "zoom": {
                    "$ref": "system.json#/definitions/zoomConfig"
                },
                "injectedStyles": {
                    "description": "Settings for injecting CSS files in web apps. The CSS files will be injected after the page has been loaded.",
                    "$ref": "system.json#/definitions/injectedStylesConfig"
                },
                "logging": {
                    "description": "Settings for capturing console messages and network request errors for the app and logging them in the `application.log` file of **io.Connect Desktop**.",
                    "anyOf": [
                        {
                            "description": "If `true`, will enable capturing the console messages and network request errors for the app and logging them in the `application.log` file of **io.Connect Desktop**.",
                            "type": "boolean"
                        },
                        {
                            "description": "Settings for configuring which items to capture and log in the `application.log` file of **io.Connect Desktop**.",
                            "type": "object",
                            "properties": {
                                "consoleMessages": {
                                    "description": "Settings for capturing console messages.",
                                    "type": "object",
                                    "properties": {
                                        "enabled": {
                                            "description": "If `true`, will allow capturing all console messages.",
                                            "type": "boolean"
                                        },
                                        "level": {
                                            "description": "Sets the level at which to capture console messages. The platform will capture all console messages at the specified level and above.",
                                            "enum": [
                                                "debug",
                                                "info",
                                                "warn",
                                                "error"
                                            ],
                                            "default": "debug"
                                        }
                                    }
                                },
                                "networkRequestErrors": {
                                    "description": "Settings for capturing network request errors.",
                                    "type": "object",
                                    "properties": {
                                        "enabled": {
                                            "description": "If `true`, will allow capturing all network request errors.",
                                            "type": "boolean"
                                        }
                                    }
                                },
                                "unhandledErrors": {
                                    "description": "Settings for capturing unhandled errors (e.g., unhandled `Promise` rejections, errors not logged in the console).",
                                    "type": "object",
                                    "properties": {
                                        "enabled": {
                                            "description": "If `true`, will allow capturing all unhandled errors.",
                                            "type": "boolean"
                                        }
                                    }
                                }
                            }
                        }
                    ],
                    "default": false
                },
                "userAgent": {
                    "$ref": "system.json#/definitions/userAgentConfig"
                }
            },
            "required": [
                "url"
            ]
        },
        "webGroupPoolConfig": {
            "title": "webGroupPoolConfig",
            "type": "object",
            "description": "Configuration for the pool of cached Web Group App instances that will be used for various operations - open, extract, unstick, etc.",
            "additionalProperties": true,
            "properties": {
                "min": {
                    "type": "number",
                    "description": "The minimum number of cached Web Group App instances. The higher the number, the more memory will be consumed; the lower the number, the higher the chance to experience delay during web group operations.",
                    "default": 3,
                    "min": 3
                },
                "max": {
                    "type": "number",
                    "description": "Reserved for future use.",
                    "default": 10,
                    "min": 3
                }
            }
        },
        "applicationProcessAffinity": {
            "type": "object",
            "description": "Deprecated. Defines configuration for application process affinity config",
            "additionalProperties": false,
            "properties": {
                "affinity": {
                    "description": "Deprecated. Set this to override the default grouping logic configured in system.json. If set will group the app only with apps with the same affinity.",
                    "type": "string"
                },
                "dedicatedProcess": {
                    "description": "Deprecated. If true will keep the app in separate process.",
                    "type": "boolean",
                    "default": false
                }
            }
        },
        "intent": {
            "title": "Intent",
            "type": "object",
            "description": "Intent definition",
            "additionalProperties": false,
            "required": [
                "name"
            ],
            "properties": {
                "name": {
                    "description": "Name of the intent",
                    "type": "string"
                },
                "displayName": {
                    "description": "Display name used to visualize the intent",
                    "type": "string"
                },
                "contexts": {
                    "description": "The type of predefined data structures with which the app can work",
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "resultType": {
                    "description": "Metadata describing the return type of the callback which handles the intent",
                    "type": "string"
                },
                "customConfig": {
                    "description": "Object containing custom configuration for the Intent handler provided via the app definition.",
                    "type": "object"
                }
            }
        },
        "workspaceLayout": {
            "type": "object",
            "properties": {
                "children": {
                    "type": "array",
                    "items": {
                        "oneOf": [
                            {
                                "$ref": "#/definitions/rowWorkspaceChild"
                            },
                            {
                                "$ref": "#/definitions/columnWorkspaceChild"
                            },
                            {
                                "$ref": "#/definitions/groupWorkspaceChild"
                            },
                            {
                                "$ref": "#/definitions/windowWorkspaceChild"
                            }
                        ]
                    }
                }
            },
            "required": [
                "children"
            ]
        },
        "rowWorkspaceChild": {
            "type": "object",
            "properties": {
                "type": {
                    "enum": [
                        "row"
                    ]
                },
                "children": {
                    "type": "array",
                    "items": {
                        "oneOf": [
                            {
                                "$ref": "#/definitions/columnWorkspaceChild"
                            },
                            {
                                "$ref": "#/definitions/windowWorkspaceChild"
                            },
                            {
                                "$ref": "#/definitions/groupWorkspaceChild"
                            }
                        ]
                    }
                }
            },
            "required": [
                "children",
                "type"
            ]
        },
        "columnWorkspaceChild": {
            "type": "object",
            "properties": {
                "type": {
                    "enum": [
                        "column"
                    ]
                },
                "children": {
                    "type": "array",
                    "items": {
                        "oneOf": [
                            {
                                "$ref": "#/definitions/rowWorkspaceChild"
                            },
                            {
                                "$ref": "#/definitions/windowWorkspaceChild"
                            },
                            {
                                "$ref": "#/definitions/groupWorkspaceChild"
                            }
                        ]
                    }
                }
            },
            "required": [
                "children",
                "type"
            ]
        },
        "groupWorkspaceChild": {
            "type": "object",
            "properties": {
                "type": {
                    "enum": [
                        "group"
                    ]
                },
                "children": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/windowWorkspaceChild"
                    }
                }
            },
            "required": [
                "children",
                "type"
            ]
        },
        "windowWorkspaceChild": {
            "type": "object",
            "properties": {
                "type": {
                    "enum": [
                        "window"
                    ]
                },
                "appName": {
                    "type": "string"
                }
            },
            "required": [
                "appName",
                "type"
            ]
        },
        "workspaceRestoreConfig": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "layoutName": {
                    "type": "string"
                },
                "restoreConfig": {
                    "type": "object",
                    "properties": {
                        "noTabHeader": {
                            "type": "boolean"
                        },
                        "context": {
                            "type": "object"
                        }
                    }
                }
            },
            "required": [
                "layoutName"
            ]
        },
        "snapToScreenEdges": {
            "description": "Settings for snapping windows to the edges of the screen.",
            "type": "object",
            "properties": {
                "enabled": {
                    "description": "If `true`, will enable snapping windows to the screen edges when the user moves them within the specified distance from the screen edge.",
                    "type": "boolean",
                    "default": false
                },
                "distance": {
                    "description": "Distance in pixels from the screen edge at which the window will snap to it.",
                    "type": "number",
                    "minimum": 5,
                    "maximum": 30,
                    "default": 20
                }
            },
            "default": {
                "enabled": false,
                "distance": 20
            },
            "additionalProperties": false
        },
        "loadingConfig": {
            "description": "Configuration for the loading of applications when opening Workspaces.",
            "type": "object",
            "default": {
                "initialOffsetInterval": 1000,
                "interval": 5000,
                "batch": 1
            },
            "properties": {
                "loadingStrategy": {
                    "type": "string",
                    "description": "Default loading strategy when opening Workspaces.",
                    "enum": [
                        "direct",
                        "delayed",
                        "lazy"
                    ]
                },
                "initialOffsetInterval": {
                    "type": "number",
                    "description": "Valid only in `delayed` mode. Initial period after which to start loading applications in batches.",
                    "default": 1000
                },
                "interval": {
                    "type": "number",
                    "description": "Valid only in `delayed` mode. Interval in minutes at which to load the application batches.",
                    "default": 5000
                },
                "batch": {
                    "type": "number",
                    "description": "Valid only in `delayed` mode. Number of applications in a batch to be loaded at each interval.",
                    "default": 1
                },
                "showDelayedIndicator": {
                    "type": "boolean",
                    "description": "Visual indicator `Zzz` on tabs of apps which are not loaded yet. Useful for developing and testing purposes.",
                    "default": false
                },
                "persistCurrentStrategy": {
                    "description": "If `true`, the current loading strategy associated with the Workspace will be used for restoring it and resuming it if hibernated. Workspaces created programmatically may have loading strategies different from the default one specified in `\"loadingStrategy\"`. This property allows you to determine whether the current or the default strategy will be applied when the user hibernates and resumes or saves and restores the programmatically created Workspace.",
                    "type": "boolean",
                    "default": false
                }
            },
            "additionalProperties": false
        },
        "referrer": {
            "description": "Describes the values that will be used for the `Referer` and the `Referrer-Policy` request headers. ",
            "properties": {
                "policy": {
                    "description": " Value for the `Referrer-Policy` request header. For more details, see the [`Referrer-Policy` request header documentation](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy).",
                    "enum": [
                        "default",
                        "no-referrer",
                        "no-referrer-when-downgrade",
                        "origin",
                        "same-origin",
                        "strict-origin",
                        "strict-origin-when-cross-origin",
                        "unsafe-url"
                    ],
                    "type": "string"
                },
                "url": {
                    "description": "URL for the `Referer` request header.",
                    "type": "string"
                }
            },
            "required": [
                "policy",
                "url"
            ],
            "type": "object"
        },
        "uploadFile": {
            "description": "Describes a file to upload.",
            "properties": {
                "filePath": {
                    "description": "Path to the file to upload.",
                    "type": "string"
                },
                "length": {
                    "description": "Number of bytes to read starting from the value set in `offset`.",
                    "default": 0,
                    "type": "number"
                },
                "modificationTime": {
                    "description": "The time the file was last modified expressed as a number of seconds since the UNIX epoch.",
                    "type": "number"
                },
                "offset": {
                    "description": "Position of the first byte to read.",
                    "default": 0,
                    "type": "number"
                },
                "type": {
                    "description": "Type of the uploaded data. Must be set to `file`.",
                    "enum": [
                        "file"
                    ],
                    "type": "string"
                }
            },
            "required": [
                "filePath",
                "length",
                "modificationTime",
                "offset",
                "type"
            ],
            "type": "object"
        },
        "uploadBase64Data": {
            "description": "Describes data to upload encoded as a Base64 string.",
            "properties": {
                "data": {
                    "description": "The data to upload encoded as a Base64 string.",
                    "type": "string"
                },
                "type": {
                    "description": "Type of the uploaded data. Must be set to `base64`.",
                    "enum": [
                        "base64"
                    ],
                    "type": "string"
                }
            },
            "type": "object"
        },
        "runPriority": {
            "type": "object",
            "description": "Settings for the priority with which an app will be started in the boot sequence of the platform. You can define at which stage of the boot sequence to start the app, specify whether the platform must wait for the app to initialize, and set a timeout for the app initialization.",
            "properties": {
                "stage": {
                    "description": "The name of the boot sequence stage at which the app will be started.",
                    "type": "string",
                    "enum": [
                        "core",
                        "pre-sso",
                        "post-sso",
                        "user"
                    ]
                },
                "priority": {
                    "description": "Number determining the priority with which the app will be started at the specified stage of the boot sequence of the platform. The greater the number, the greater the priority of the app. Set to `0` for lowest priority.",
                    "type": "number"
                },
                "waitForInitialization": {
                    "description": "Specifies whether the platform must wait for the app to initialize before continuing the boot sequence and the signaling mechanism that will be used to indicate the initialization completion.",
                    "oneOf": [
                        {
                            "description": "If `true`, the platform will wait for the app to initialize and send an explicit signal when ready before continuing the boot sequence.",
                            "type": "boolean",
                            "default": false
                        },
                        {
                            "type": "string",
                            "description": "Specifies the type of the signal that the app will send to the platform, indicating that the boot sequence may continue. If set to `\"interopReady\"`, the platform will be automatically signaled when the Interop library has been fully initialized. If set to `\"appSignal\"`, the app must explicitly send a signal to the platform that the necessary initialization has been completed. If set to `\"no\"`, the platform won't wait for the app to initialize before continuing the boot sequence. The default for apps defined in a system app store is `\"no\"`, and for the ones defined in a regular app store is `\"interopReady\"`.",
                            "enum": [
                                "interopReady",
                                "appSignal",
                                "no"
                            ]
                        }
                    ]
                },
                "timeout": {
                    "description": "Interval in milliseconds to wait for the app to initialize.",
                    "type": "number"
                }
            },
            "additionalProperties": false
        },
        "contextMenuConfig": {
            "description": "Settings for the context menu of io.Connect Windows.",
            "type": "object",
            "properties": {
                "enabled": {
                    "description": "If `true`, will enable the context menu for io.Connect Windows.",
                    "type": "boolean",
                    "default": false
                },
                "mode": {
                    "description": "Mode for the context menu. Set to `\"native\"` to use the standard built-in context menu. Set to `\"custom\"` to use your own implementation for a context menu.",
                    "type": "string",
                    "enum": [
                        "native",
                        "custom"
                    ],
                    "default": "native"
                }
            },
            "additionalProperties": false
        },
        "workspacesDialogsConfig": {
            "description": "Configuration for the dialogs used in the Workspaces App.",
            "type": "object",
            "properties": {
                "enableDefaultDialogs": {
                    "description": "Enable or disable the default io.Connect dialog messages.",
                    "type": "object",
                    "properties": {
                        "preventClose": {
                            "description": "If `true`, will enable the dialog message that appears when the user tries to close an io.Connect Workspaces Frame that is programmatically prevented from closing. This dialog will appear also when such Frame participates in a Layout that is being closed.",
                            "type": "boolean",
                            "default": true
                        }
                    }
                }
            }
        }
    }
}