@c8y/ngx-components 1018.0.75 → 1018.0.77

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-auth-configuration.mjs","sources":["../../auth-configuration/basic-settings/basic-settings.model.ts","../../auth-configuration/basic-settings/basic-auth-settings.component.ts","../../auth-configuration/basic-settings/basic-auth-settings.component.html","../../auth-configuration/auth-configuration.guard.ts","../../auth-configuration/basic-settings/typed-option.ts","../../auth-configuration/basic-settings/tenant-login-option.mapper.ts","../../auth-configuration/basic-settings/auth-configuration.service.ts","../../auth-configuration/basic-settings/session-configuration.component.ts","../../auth-configuration/basic-settings/session-configuration.component.html","../../auth-configuration/basic-settings/login-settings.component.ts","../../auth-configuration/basic-settings/login-settings.component.html","../../auth-configuration/basic-settings/tfa-settings.component.ts","../../auth-configuration/basic-settings/tfa-settings.component.html","../../auth-configuration/basic-settings/auth-configuration.component.ts","../../auth-configuration/basic-settings/auth-configuration.component.html","../../auth-configuration/basic-settings/basic-settings.module.ts","../../auth-configuration/sso-configuration/sso-configuration.model.ts","../../auth-configuration/sso-configuration/sso-configuration.service.ts","../../auth-configuration/sso-configuration/templates/sso-configuration.mapper.ts","../../auth-configuration/sso-configuration/templates/template.component.ts","../../auth-configuration/sso-configuration/template-parts/request-configuration.model.ts","../../auth-configuration/sso-configuration/template-parts/signature-configuration.model.ts","../../auth-configuration/sso-configuration/template-parts/external-token-config.model.ts","../../auth-configuration/sso-configuration/templates/custom-configuration-mapper.ts","../../auth-configuration/sso-configuration/template-parts/basic-configuration.component.ts","../../auth-configuration/sso-configuration/template-parts/basic-configuration.component.html","../../auth-configuration/sso-configuration/template-parts/request-configuration.component.ts","../../auth-configuration/sso-configuration/template-parts/request-configuration.component.html","../../auth-configuration/sso-configuration/template-parts/user-id-configuration.component.ts","../../auth-configuration/sso-configuration/template-parts/user-id-configuration.component.html","../../auth-configuration/sso-configuration/template-parts/user-data-mapping.component.ts","../../auth-configuration/sso-configuration/template-parts/user-data-mapping.component.html","../../auth-configuration/sso-configuration/template-parts/access-mapping/dynamic-accesss-mapping-relations.model.ts","../../auth-configuration/sso-configuration/template-parts/access-mapping/child-predicates.component.ts","../../auth-configuration/sso-configuration/template-parts/access-mapping/child-predicates.component.html","../../auth-configuration/sso-configuration/template-parts/access-mapping/dynamic-access-mapping.component.ts","../../auth-configuration/sso-configuration/template-parts/access-mapping/dynamic-access-mapping.component.html","../../auth-configuration/sso-configuration/template-parts/access-mapping/inventory-roles-modal.component.ts","../../auth-configuration/sso-configuration/template-parts/access-mapping/inventory-roles-modal.component.html","../../auth-configuration/sso-configuration/template-parts/access-mapping/inventory-roles-mapping.component.ts","../../auth-configuration/sso-configuration/template-parts/access-mapping/inventory-roles-mapping.component.html","../../auth-configuration/sso-configuration/template-parts/access-mapping/access-mapping.component.ts","../../auth-configuration/sso-configuration/template-parts/access-mapping/access-mapping.component.html","../../auth-configuration/sso-configuration/template-parts/signature-configuration.component.ts","../../auth-configuration/sso-configuration/template-parts/signature-configuration.component.html","../../auth-configuration/sso-configuration/template-parts/external-token-config.component.ts","../../auth-configuration/sso-configuration/template-parts/external-token-config.component.html","../../auth-configuration/sso-configuration/templates/custom-template.component.ts","../../auth-configuration/sso-configuration/templates/custom-template.component.html","../../auth-configuration/sso-configuration/templates/key-cloak-configuration-mapper.ts","../../auth-configuration/sso-configuration/templates/key-cloak-template.component.ts","../../auth-configuration/sso-configuration/templates/key-cloak-template.component.html","../../auth-configuration/sso-configuration/templates/aad-configuration-mapper.ts","../../auth-configuration/sso-configuration/template-parts/logout-configuration.component.ts","../../auth-configuration/sso-configuration/template-parts/logout-configuration.component.html","../../auth-configuration/sso-configuration/templates/aad-template.component.ts","../../auth-configuration/sso-configuration/templates/aad-template.component.html","../../auth-configuration/sso-configuration/sso-configuration.component.ts","../../auth-configuration/sso-configuration/sso-configuration.component.html","../../auth-configuration/sso-configuration/sso-configuration.guard.ts","../../auth-configuration/sso-configuration/sso-configuration.module.ts","../../auth-configuration/factories/tabs.factory.ts","../../auth-configuration/factories/navigation.factory.ts","../../auth-configuration/auth-configuration.module.ts","../../auth-configuration/c8y-ngx-components-auth-configuration.ts"],"sourcesContent":["import {\n IAuthenticationRestrictions,\n ITenantLoginOption,\n TenantLoginOptionType\n} from '@c8y/client';\n\nexport interface TenantLoginOption\n extends Omit<\n ITenantLoginOption,\n | 'authenticationRestrictions'\n | 'self'\n | 'strengthValidity'\n | 'tfaStrategy'\n | 'greenMinLength'\n | 'enforceStrength'\n | 'strengthValidity'\n | '_type'\n > {\n authenticationRestrictions?: AuthenticationRestrictions;\n}\n\nexport interface AuthenticationRestrictions\n extends Omit<IAuthenticationRestrictions, 'trustedUserAgents' | 'forbiddenUserAgents'> {\n trustedUserAgents: UserAgent[];\n forbiddenUserAgents: UserAgent[];\n}\n\nexport class UserAgent {\n readonly _id: string;\n value: string;\n\n constructor(value: string) {\n this._id = this.uniqueId();\n this.value = value;\n }\n\n get id() {\n return this._id;\n }\n\n private uniqueId() {\n const dateString = Date.now().toString(36);\n const randomString = Math.random().toString(36).substr(2);\n return dateString + randomString;\n }\n}\n\nexport function isOauthInternal(tenantLoginOption: TenantLoginOption) {\n return tenantLoginOption.type === TenantLoginOptionType.OAUTH2_INTERNAL;\n}\n\nexport function isBasic(tenantLoginOption: TenantLoginOption) {\n return tenantLoginOption.type === TenantLoginOptionType.BASIC;\n}\n","import { Component, Input, SimpleChanges } from '@angular/core';\nimport { TenantLoginOptionType } from '@c8y/client';\nimport { AuthConfiguration } from './auth-configuration.model';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { UserAgent, AuthenticationRestrictions, isBasic } from './basic-settings.model';\n\n@Component({\n selector: 'c8y-basic-auth-settings',\n templateUrl: './basic-auth-settings.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class BasicAuthSettingsComponent {\n @Input()\n authConfiguration: AuthConfiguration;\n\n preferredLoginOptionType: TenantLoginOptionType = TenantLoginOptionType.BASIC;\n\n tenantLoginOptionTypeEnum = TenantLoginOptionType;\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.authConfiguration && changes.authConfiguration.currentValue) {\n this.preferredLoginOptionType =\n changes.authConfiguration.currentValue.preferredLoginOptionType;\n }\n }\n\n ngDoCheck() {\n if (this.preferredLoginOptionType !== this.authConfiguration.preferredLoginOptionType) {\n this.preferredLoginOptionType = this.authConfiguration.preferredLoginOptionType;\n if (this.preferredLoginOptionType === TenantLoginOptionType.BASIC) {\n this.forbiddenWebBrowsers = false;\n }\n }\n }\n\n get forbiddenWebBrowsers() {\n return this.authenticationRestrictions.forbiddenClients.includes('WEB_BROWSERS');\n }\n\n set forbiddenWebBrowsers(value: boolean) {\n this.authenticationRestrictions.forbiddenClients = value ? ['WEB_BROWSERS'] : [];\n }\n\n forbiddenUserAgentsRemove(id) {\n this.authenticationRestrictions.forbiddenUserAgents = this.remove(\n this.authenticationRestrictions.forbiddenUserAgents,\n id\n );\n }\n\n trustedUserAgentsRemove(id) {\n this.authenticationRestrictions.trustedUserAgents = this.remove(\n this.authenticationRestrictions.trustedUserAgents,\n id\n );\n }\n\n get authenticationRestrictions(): AuthenticationRestrictions {\n return this.authConfiguration.loginOptions.find(isBasic).authenticationRestrictions;\n }\n\n add(collection) {\n collection.push(new UserAgent(''));\n }\n\n private remove(collection, id) {\n const newArray = collection.filter(obj => obj.id !== id);\n if (!newArray.length) {\n newArray.push(new UserAgent(''));\n }\n return newArray;\n }\n}\n","<div\n class=\"card-block separator-top\"\n *ngIf=\"authConfiguration.preferredLoginOptionType !== 'BASIC'\"\n>\n <div class=\"col-sm-2\">\n <div class=\"h4 text-normal text-right text-left-xs\">\n {{ 'Basic Auth restrictions' | translate }}\n </div>\n </div>\n\n <div class=\"col-sm-9\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"c8y-switch\" title=\"{{ 'Forbidden for web browsers' | translate }}\">\n <input type=\"checkbox\" name=\"forbiddenWebBrowsers\" [(ngModel)]=\"forbiddenWebBrowsers\" />\n <span></span>\n <span>{{ 'Forbidden for web browsers' | translate }}</span>\n </label>\n <div\n class=\"alert alert-warning\"\n *ngIf=\"\n preferredLoginOptionType === tenantLoginOptionTypeEnum.BASIC && forbiddenWebBrowsers\n \"\n >\n {{\n 'You are about to forbid browsers from using Basic authentication. This will prevent users from using web applications on your tenant because you are going to set Basic authentication as the preferred login mode.'\n | translate\n }}\n </div>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <label title=\"{{ 'Forbidden user agents' | translate }}\">\n {{ 'Forbidden user agents' | translate }}\n </label>\n <div\n class=\"input-group m-t-8\"\n *ngFor=\"\n let forbiddenUserAgent of authenticationRestrictions.forbiddenUserAgents;\n last as isLast;\n first as isFirst\n \"\n >\n <input\n type=\"text\"\n [name]=\"'forbiddenUserAgent' + forbiddenUserAgent.id\"\n [(ngModel)]=\"forbiddenUserAgent.value\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} forbidden-agent\"\n />\n <div class=\"input-group-btn col-sm-2\">\n <button\n *ngIf=\"!(isFirst && isLast && forbiddenUserAgent.value === '')\"\n title=\"{{ 'Remove' | translate }}\"\n [name]=\"'forbiddenUserAgentRemove' + forbiddenUserAgent.id\"\n type=\"button\"\n class=\"btn btn-dot text-primary\"\n (click)=\"forbiddenUserAgentsRemove(forbiddenUserAgent.id)\"\n >\n <i class=\"dlt-c8y-icon-minus-circle text-danger\"></i>\n </button>\n <button\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n class=\"btn btn-dot text-primary\"\n (click)=\"add(authenticationRestrictions.forbiddenUserAgents)\"\n *ngIf=\"isLast\"\n >\n <i class=\"dlt-c8y-icon-plus-circle\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <label title=\"{{ 'Trusted user agents' | translate }}\">\n {{ 'Trusted user agents' | translate }}\n </label>\n <div\n class=\"input-group m-t-8\"\n *ngFor=\"\n let trustedUserAgent of authenticationRestrictions.trustedUserAgents;\n last as isLast;\n first as isFirst\n \"\n >\n <input\n type=\"text\"\n [name]=\"'trustedUserAgent' + trustedUserAgent.id\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} trusted-agent\"\n [(ngModel)]=\"trustedUserAgent.value\"\n />\n <div class=\"input-group-btn col-sm-2\">\n <button\n *ngIf=\"!(isFirst && isLast && trustedUserAgent.value === '')\"\n title=\"{{ 'Remove' | translate }}\"\n [name]=\"'trustedUserAgentRemove' + trustedUserAgent.id\"\n type=\"button\"\n class=\"btn btn-dot btn-dot--danger text-primary\"\n (click)=\"trustedUserAgentsRemove(trustedUserAgent.id)\"\n >\n <i class=\"dlt-c8y-icon-minus-circle\"></i>\n </button>\n <button\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n (click)=\"add(authenticationRestrictions.trustedUserAgents)\"\n class=\"btn btn-dot text-primary\"\n *ngIf=\"isLast\"\n >\n <i class=\"dlt-c8y-icon-plus-circle\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { CanActivate } from '@angular/router';\nimport { Permissions } from '@c8y/ngx-components';\n\n@Injectable()\nexport class AuthConfigurationGuard implements CanActivate {\n constructor(private permissions: Permissions) {}\n\n canActivate(): boolean {\n return this.permissions.hasAnyRole(['ROLE_TENANT_ADMIN', 'ROLE_TENANT_MANAGEMENT_ADMIN']);\n }\n}\n","import { ISystemOption, ITenantOption } from '@c8y/client';\nimport { isString } from 'lodash-es';\n\nexport class TypedOption implements ISystemOption, ITenantOption {\n constructor(\n public category: string,\n public key: string,\n public type: 'string' | 'boolean' | 'number',\n public defaultValue?: string | boolean | number,\n public value?: string\n ) {}\n\n apply(option: ISystemOption | ITenantOption) {\n this.category = option.category;\n this.key = option.key;\n this.value = option.value;\n }\n\n getValue() {\n try {\n return this.getValueByType();\n } catch (ex) {\n return this.defaultValue;\n }\n }\n\n private getValueByType() {\n switch (this.type) {\n case 'boolean':\n return this.value.toLowerCase() === 'true';\n case 'number':\n return this.parseNumberValue(this.value);\n case 'string':\n return this.parseStringValue(this.value);\n default:\n throw new TypeError();\n }\n }\n\n private parseNumberValue(stringValue: string) {\n const value = Number.parseInt(stringValue, 10);\n if (typeof value !== 'number' || isNaN(value)) {\n throw new Error();\n }\n return value;\n }\n\n private parseStringValue(value: string) {\n if (!isString(value)) {\n throw new Error();\n }\n return value;\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n UserAgent,\n AuthenticationRestrictions,\n TenantLoginOption,\n isBasic,\n isOauthInternal\n} from './basic-settings.model';\nimport { ITenantLoginOption, IAuthenticationRestrictions } from '@c8y/client';\nimport { defaults, isEmpty, omitBy, omit } from 'lodash-es';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TenantLoginOptionMapper {\n mapTo(tenantLoginOption: ITenantLoginOption): TenantLoginOption {\n const loginOption: TenantLoginOption = omit(\n this.prapareTenantLoginOption(tenantLoginOption),\n 'authenticationRestrictions'\n );\n if (isBasic(loginOption)) {\n loginOption.authenticationRestrictions = this.mapAuthenticationRestrictionsTo(\n tenantLoginOption.authenticationRestrictions\n );\n }\n return loginOption;\n }\n\n mapFrom(\n originalLoginOption: TenantLoginOption,\n newLoginOption: TenantLoginOption\n ): ITenantLoginOption {\n if (isBasic(originalLoginOption)) {\n return this.mapBasicLoginOption(originalLoginOption, newLoginOption);\n }\n if (isOauthInternal(originalLoginOption)) {\n return this.mapOauthInternalLoginOption(originalLoginOption, newLoginOption);\n }\n throw new Error(\n `TenantLoginOptionMapper: The tenant login option cannot be mapped. Login option with type: ${originalLoginOption.type} is not supported.`\n );\n }\n\n private mapAuthenticationRestrictionsTo(\n authenticationRestrictions: IAuthenticationRestrictions\n ): AuthenticationRestrictions {\n const restrictions = defaults({}, omitBy(authenticationRestrictions, isEmpty), {\n forbiddenUserAgents: [''],\n trustedUserAgents: [''],\n forbiddenClients: []\n });\n restrictions.forbiddenUserAgents = restrictions.forbiddenUserAgents.map(\n val => new UserAgent(val)\n );\n restrictions.trustedUserAgents = restrictions.trustedUserAgents.map(val => new UserAgent(val));\n return restrictions;\n }\n\n private mapBasicLoginOption(\n originalLoginOption: TenantLoginOption,\n newLoginOption: TenantLoginOption\n ) {\n const loginOption = omit(originalLoginOption, ['sessionConfiguration']);\n loginOption.authenticationRestrictions = this.mapAuthenticationRestrictionsFrom(\n newLoginOption.authenticationRestrictions\n );\n return loginOption;\n }\n\n private mapOauthInternalLoginOption(\n originalLoginOption: TenantLoginOption,\n newLoginOption: TenantLoginOption\n ) {\n const loginOption = omit(originalLoginOption, ['authenticationRestrictions']);\n newLoginOption.sessionConfiguration !== null\n ? (loginOption.sessionConfiguration = newLoginOption.sessionConfiguration)\n : delete loginOption.sessionConfiguration;\n return loginOption;\n }\n\n private mapAuthenticationRestrictionsFrom(\n authenticationRestrictions: AuthenticationRestrictions\n ): IAuthenticationRestrictions {\n return {\n trustedUserAgents: authenticationRestrictions.trustedUserAgents\n .filter(({ value }) => value)\n .map(({ value }) => value),\n forbiddenUserAgents: authenticationRestrictions.forbiddenUserAgents\n .filter(({ value }) => value)\n .map(({ value }) => value),\n forbiddenClients: authenticationRestrictions.forbiddenClients.filter(value => value)\n };\n }\n\n private prapareTenantLoginOption(tenantLoginOption: ITenantLoginOption): TenantLoginOption {\n return omit(tenantLoginOption, [\n 'self',\n 'strengthValidity',\n 'tfaStrategy',\n 'greenMinLength',\n 'enforceStrength',\n 'strengthValidity',\n '_type'\n ]);\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n GrantType,\n IResult,\n ITenantLoginOption,\n ITenantOption,\n SystemOptionsService,\n TenantLoginOptionsService,\n TenantLoginOptionType,\n TenantOptionsService,\n UserManagementSource,\n TenantService\n} from '@c8y/client';\nimport { catchError, map } from 'rxjs/operators';\nimport { forkJoin, from, Observable, of } from 'rxjs';\nimport { defaults } from 'lodash-es';\nimport { AuthConfiguration, Options } from './auth-configuration.model';\nimport { AppStateService, TenantUiService } from '@c8y/ngx-components';\nimport { TypedOption } from './typed-option';\nimport { TenantLoginOption } from './basic-settings.model';\nimport { TenantLoginOptionMapper } from './tenant-login-option.mapper';\n\n@Injectable()\nexport class AuthConfigurationService {\n private systemOptionsWithDefaultValue: TypedOption[] = [\n new TypedOption('password', 'limit.validity', 'number', null),\n new TypedOption('password', 'enforce.strength', 'boolean', false),\n new TypedOption('two-factor-authentication', 'tenant-scope-settings.enabled', 'boolean', false),\n new TypedOption('two-factor-authentication', 'enabled', 'boolean', false),\n // note: this definition is inconsistent with backend and is overridden in getSystemOptions$\n new TypedOption('two-factor-authentication', 'enforced', 'boolean', false),\n new TypedOption('two-factor-authentication', 'enforced.group', 'string', '')\n ];\n\n private tenantOptionsWithDefaultValue: TypedOption[] = [\n new TypedOption('password', 'limit.validity', 'number', 0),\n new TypedOption('password', 'strength.validity', 'boolean', false),\n new TypedOption('two-factor-authentication', 'enabled', 'boolean', false),\n new TypedOption('two-factor-authentication', 'token.validity', 'number', 43200), // 30 days\n new TypedOption('two-factor-authentication', 'pin.validity', 'number', 30),\n new TypedOption('two-factor-authentication', 'enforced', 'boolean', false),\n new TypedOption('two-factor-authentication', 'strategy', 'string', 'SMS'),\n new TypedOption('oauth.internal', 'basic-token.lifespan.seconds', 'number', null)\n ];\n\n constructor(\n private tenantLoginOptionsService: TenantLoginOptionsService,\n private tenantOptionsService: TenantOptionsService,\n private systemOptionsService: SystemOptionsService,\n private appState: AppStateService,\n private tenantUiService: TenantUiService,\n private tenantLoginOptionMapper: TenantLoginOptionMapper,\n private tenantService: TenantService\n ) {}\n\n getAuthConfiguration$(): Observable<AuthConfiguration> {\n const loginOptions$ = this.getLoginOptions$();\n return forkJoin({\n loginOptions: this.map(loginOptions$),\n tenantOptions: this.getTenantOptions$(),\n systemOptions: this.getSystemOptions$(),\n smsGatewayAvailable: this.isSmsApplicationAvailable$(),\n preferredLoginOptionType: this.getPreferredLoginOptionType$(loginOptions$)\n });\n }\n\n save(newAuthConfiguration: AuthConfiguration, previousAuthConfiguration: AuthConfiguration) {\n const tenantOptions = this.prepareTenantOptions(\n newAuthConfiguration,\n previousAuthConfiguration\n );\n const updateTenantOptions = tenantOptions.map(tenantOption =>\n this.tenantOptionsService.create(tenantOption)\n );\n const basicLoginOption = this.prepareBasicLoginOption(\n newAuthConfiguration,\n previousAuthConfiguration\n );\n const oauthInternalLoginOption = this.prepareOauthInternalLoginOption(\n newAuthConfiguration,\n previousAuthConfiguration\n );\n\n return Promise.all([\n this.saveOrUpdateLoginOption(basicLoginOption),\n this.saveOrUpdateLoginOption(oauthInternalLoginOption),\n updateTenantOptions\n ]);\n }\n\n private map(loginOptions$: Observable<ITenantLoginOption[]>): Observable<TenantLoginOption[]> {\n return loginOptions$.pipe(\n map(loginOptions =>\n loginOptions.map(loginOption => this.tenantLoginOptionMapper.mapTo(loginOption))\n )\n );\n }\n\n private saveOrUpdateLoginOption(\n loginOption: ITenantLoginOption\n ): Promise<IResult<ITenantLoginOption>> {\n return loginOption.id\n ? this.tenantLoginOptionsService.update(loginOption)\n : this.tenantLoginOptionsService.create(loginOption);\n }\n\n private prepareBasicLoginOption(\n newAuthConfiguration: AuthConfiguration,\n previousAuthConfiguration: AuthConfiguration\n ): ITenantLoginOption {\n const basicLoginOption = this.originalLoginOptionWithDefaults(\n previousAuthConfiguration,\n TenantLoginOptionType.BASIC\n );\n basicLoginOption.visibleOnLoginPage = this.visibleOnLoginPage(\n newAuthConfiguration,\n TenantLoginOptionType.BASIC\n );\n return this.tenantLoginOptionMapper.mapFrom(\n basicLoginOption,\n this.getLoginOptionFromAuthConfiguration(newAuthConfiguration, TenantLoginOptionType.BASIC)\n );\n }\n\n private prepareOauthInternalLoginOption(\n newAuthConfiguration: AuthConfiguration,\n previousAuthConfiguration: AuthConfiguration\n ): ITenantLoginOption {\n const oauthInternalLoginOption = this.originalLoginOptionWithDefaults(\n previousAuthConfiguration,\n TenantLoginOptionType.OAUTH2_INTERNAL\n );\n oauthInternalLoginOption.visibleOnLoginPage = this.visibleOnLoginPage(\n newAuthConfiguration,\n TenantLoginOptionType.OAUTH2_INTERNAL\n );\n return this.tenantLoginOptionMapper.mapFrom(\n oauthInternalLoginOption,\n this.getLoginOptionFromAuthConfiguration(\n newAuthConfiguration,\n TenantLoginOptionType.OAUTH2_INTERNAL\n )\n );\n }\n\n private originalLoginOptionWithDefaults(\n previousAuthConfiguration: AuthConfiguration,\n loginOptionType: TenantLoginOptionType\n ): TenantLoginOption {\n return defaults(\n {},\n this.getLoginOptionFromAuthConfiguration(previousAuthConfiguration, loginOptionType),\n this.getDefaultLoginOption(loginOptionType)\n );\n }\n\n private getLoginOptionFromAuthConfiguration(\n authConfiguration: AuthConfiguration,\n loginOptionType: TenantLoginOptionType\n ) {\n return authConfiguration.loginOptions.find(loginOption => loginOption.type === loginOptionType);\n }\n\n private visibleOnLoginPage(\n authConfiguration: AuthConfiguration,\n loginOptionType: TenantLoginOptionType\n ): boolean {\n return authConfiguration.preferredLoginOptionType === loginOptionType;\n }\n\n private prepareTenantOptions(\n newAuthConfiguration: AuthConfiguration,\n previousAuthConfiguration: AuthConfiguration\n ): ITenantOption[] {\n const getValue = (authCfg, tenantOption) =>\n authCfg.tenantOptions[tenantOption.category][tenantOption.key];\n const hasChanged = tenantOption =>\n getValue(newAuthConfiguration, tenantOption) !==\n getValue(previousAuthConfiguration, tenantOption);\n\n return this.tenantOptionsWithDefaultValue\n .filter(tenantOption => getValue(newAuthConfiguration, tenantOption) !== null)\n .filter(tenantOption => hasChanged(tenantOption))\n .map(tenantOption => ({\n category: tenantOption.category,\n key: tenantOption.key,\n value: getValue(newAuthConfiguration, tenantOption).toString()\n }));\n }\n\n private getLoginOptions$(): Observable<ITenantLoginOption[]> {\n return from(this.tenantLoginOptionsService.listForCurrentTenant()).pipe(\n map(res => res.data),\n map(loginOptions => this.addDefaultLoginOptions(loginOptions))\n );\n }\n\n private getPreferredLoginOptionType$(\n loginOptions$: Observable<ITenantLoginOption[]>\n ): Observable<TenantLoginOptionType> {\n return loginOptions$.pipe(\n map(loginOptions => {\n return this.tenantUiService.getPreferredLoginOption(loginOptions).type;\n })\n );\n }\n\n private addDefaultLoginOptions(loginOptions: ITenantLoginOption[]) {\n if (!loginOptions.find(this.tenantUiService.isBasic)) {\n loginOptions.push(this.getDefaultLoginOption(TenantLoginOptionType.BASIC));\n }\n if (!loginOptions.find(this.tenantUiService.isOauthInternal)) {\n loginOptions.push(this.getDefaultLoginOption(TenantLoginOptionType.OAUTH2_INTERNAL));\n }\n return loginOptions;\n }\n\n private getTenantOptions$(): Observable<Options> {\n return forkJoin(\n this.tenantOptionsWithDefaultValue.map((option: TypedOption) =>\n from(this.tenantOptionsService.detail(option)).pipe(\n map(res => {\n option.apply(res.data);\n return option;\n }),\n catchError(() => of(option))\n )\n )\n ).pipe(map(options => this.getOptionsObject(options)));\n }\n\n private getSystemOptions$(): Observable<Options> {\n return forkJoin(\n this.systemOptionsWithDefaultValue.map((option: TypedOption) => {\n const fixedOption = this.fixTfaEnforcedSystemOption(option);\n if (fixedOption) {\n return fixedOption;\n }\n\n return from(this.systemOptionsService.detail(option)).pipe(\n map(res => {\n option.apply(res.data);\n return option;\n }),\n catchError(() => of(option))\n );\n })\n ).pipe(map(options => this.getOptionsObject(options)));\n }\n\n /**\n * Returns an observable with fixed `two-factor-authentication.enforced` system option or null.\n * This method fixes problem with inconsistent value. System option `two-factor-authentication.enforced` is list of tenants when UI using boolean value.\n * This part will be removed after implementing new endpoint in MTM-50490.\n */\n private fixTfaEnforcedSystemOption(option: TypedOption): Observable<TypedOption> {\n if (option.category === 'two-factor-authentication' && option.key === 'enforced') {\n return from(this.tenantService.getTfaSettings(this.tenantUiService.currentTenant)).pipe(\n map(tfaSettings => {\n option.value = tfaSettings.enforcedOnSystemLevel.toString();\n return option;\n })\n );\n }\n return null;\n }\n\n private isSmsApplicationAvailable$(): Observable<boolean> {\n return from(this.appState.isApplicationAvailable('sms-gateway'));\n }\n\n private getOptionsObject(options: TypedOption[]) {\n return options.reduce((optionsObject, option) => {\n optionsObject[option.category] = optionsObject[option.category] || {};\n optionsObject[option.category][option.key] = option.getValue();\n return optionsObject;\n }, {});\n }\n\n private getDefaultLoginOption(tenantLoginOptionType: TenantLoginOptionType): ITenantLoginOption {\n return {\n userManagementSource: UserManagementSource.INTERNAL,\n grantType: GrantType.PASSWORD,\n providerName: 'Cumulocity',\n visibleOnLoginPage: false,\n type: tenantLoginOptionType\n };\n }\n}\n","import { Component, Input, SimpleChanges } from '@angular/core';\nimport { ISessionConfiguration, TenantLoginOptionType } from '@c8y/client';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { defaults, cloneDeep, isFinite } from 'lodash-es';\nimport { gettext, TenantUiService } from '@c8y/ngx-components';\nimport { AuthConfiguration } from './auth-configuration.model';\nimport { TranslateService } from '@ngx-translate/core';\nimport { isOauthInternal } from './basic-settings.model';\n\n@Component({\n selector: 'c8y-session-configuration',\n templateUrl: './session-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class SessionConfigurationComponent {\n @Input()\n authConfiguration: AuthConfiguration;\n tenantLoginOptionTypeEnum = TenantLoginOptionType;\n ABSOLUTE_TIMEOUT_VALIDATION_MESSAGE = gettext(\n 'The value must be greater than \"Token lifespan\" and not less than {{ minAbsoluteTimeout }}.'\n );\n RENEWAL_TIMEOUT_VALIDATION_MESSAGE = gettext('The value must be less than \"Token lifespan\".');\n MAX_TOKEN_LIFESPAN_VALIDATION_MESSAGE = gettext(\n 'The value must be less than \"Session absolute timeout\".'\n );\n MIN_TOKEN_LIFESPAN_VALIDATION_MESSAGE = gettext(\n 'The value must be greater than \"Session renewal timeout\".'\n );\n\n USER_AGENT_VALIDATION_REQUIRED_POPOVER = gettext(\n 'If selected, then every request needs to use the same \"User-Agent\" header as the first request which initiated the session.'\n );\n\n private MIN_ABSOLUTE_TIMEOUT: number = 15 * 60;\n private originalSessionConfiguration;\n private previousTokenLifespan;\n\n constructor(\n private tenantUiService: TenantUiService,\n private translateService: TranslateService\n ) {\n this.ABSOLUTE_TIMEOUT_VALIDATION_MESSAGE = this.translateService.instant(\n this.ABSOLUTE_TIMEOUT_VALIDATION_MESSAGE,\n { minAbsoluteTimeout: this.MIN_ABSOLUTE_TIMEOUT }\n );\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.authConfiguration && changes.authConfiguration.currentValue) {\n const oauthInternal =\n changes.authConfiguration.currentValue.loginOptions.find(isOauthInternal) || {};\n this.originalSessionConfiguration = cloneDeep(oauthInternal.sessionConfiguration);\n this.sessionConfiguration = oauthInternal.sessionConfiguration;\n this.previousTokenLifespan =\n this.authConfiguration.tenantOptions['oauth.internal']['basic-token.lifespan.seconds'];\n }\n }\n\n get renewalTimeoutSeconds(): number {\n const sessionConfiguration = this.sessionConfiguration;\n return this.convertToSeconds(sessionConfiguration.renewalTimeoutMillis);\n }\n\n set renewalTimeoutSeconds(value: number) {\n this.sessionConfiguration.renewalTimeoutMillis = this.convertToMillis(value);\n }\n\n get absoluteTimeoutSeconds(): number {\n const sessionConfiguration = this.sessionConfiguration;\n return this.convertToSeconds(sessionConfiguration.absoluteTimeoutMillis);\n }\n\n set absoluteTimeoutSeconds(value: number) {\n this.sessionConfiguration.absoluteTimeoutMillis = this.convertToMillis(value);\n }\n\n get maximumNumberOfParallelSessions(): number {\n return this.sessionConfiguration.maximumNumberOfParallelSessions;\n }\n\n set maximumNumberOfParallelSessions(value: number) {\n this.sessionConfiguration.maximumNumberOfParallelSessions = value;\n }\n\n get userAgentValidationRequired(): boolean {\n return this.sessionConfiguration.userAgentValidationRequired;\n }\n\n set userAgentValidationRequired(value: boolean) {\n this.sessionConfiguration.userAgentValidationRequired = value;\n }\n\n get basicTokenLifespan() {\n return this.authConfiguration.tenantOptions['oauth.internal']['basic-token.lifespan.seconds'];\n }\n\n set basicTokenLifespan(value) {\n this.authConfiguration.tenantOptions['oauth.internal']['basic-token.lifespan.seconds'] = value;\n }\n\n get useSessionConfiguration() {\n return !!this.sessionConfiguration;\n }\n\n set useSessionConfiguration(value) {\n this.sessionConfiguration = value\n ? defaults({}, this.originalSessionConfiguration, {\n absoluteTimeoutMillis: 1209600000, // 14 days\n renewalTimeoutMillis: 86400000, // 1 day\n maximumNumberOfParallelSessions: 5,\n userAgentValidationRequired: false\n })\n : null;\n this.basicTokenLifespan = this.previousTokenLifespan || 172800; // 2 days\n }\n\n get absoluteTimeoutConstraints() {\n return {\n min: Math.max(this.MIN_ABSOLUTE_TIMEOUT, this.basicTokenLifespan + 1)\n };\n }\n\n get renewalTimeoutConstraints() {\n return {\n min: this.MIN_ABSOLUTE_TIMEOUT / 2,\n max: this.basicTokenLifespan ? this.basicTokenLifespan - 1 : null\n };\n }\n\n get basicTokenLifespanConstraints() {\n return {\n min: this.renewalTimeoutSeconds ? this.renewalTimeoutSeconds + 1 : null,\n max: this.absoluteTimeoutSeconds ? this.absoluteTimeoutSeconds - 1 : null\n };\n }\n\n get sessionConfiguration(): ISessionConfiguration {\n return this.authConfiguration.loginOptions.find(isOauthInternal).sessionConfiguration;\n }\n\n set sessionConfiguration(value: ISessionConfiguration) {\n this.authConfiguration.loginOptions.find(isOauthInternal).sessionConfiguration = value;\n }\n\n private convertToMillis(seconds: number): number {\n return isFinite(seconds) ? seconds * 1000 : null;\n }\n\n private convertToSeconds(milliseconds: number): number {\n return isFinite(milliseconds) ? Math.ceil(milliseconds / 1000) : null;\n }\n}\n","<div\n class=\"card-block separator-top overflow-auto\"\n *ngIf=\"authConfiguration.preferredLoginOptionType === tenantLoginOptionTypeEnum.OAUTH2_INTERNAL\"\n>\n <div class=\"col-sm-2\">\n <div class=\"h4 text-normal text-right text-left-xs\">\n {{ 'OAI-Secure session configuration' | translate }}\n </div>\n </div>\n\n <div class=\"col-sm-9\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"c8y-switch\" title=\"{{ 'Use session configuration' | translate }}\">\n <input\n type=\"checkbox\"\n name=\"useSessionConfiguration\"\n [(ngModel)]=\"useSessionConfiguration\"\n />\n <span></span>\n <span>{{ 'Use session configuration' | translate }}</span>\n </label>\n </c8y-form-group>\n </div>\n </div>\n\n <fieldset *ngIf=\"sessionConfiguration\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"c8y-switch\" title=\"{{ 'User agent validation required' | translate }}\">\n <input\n type=\"checkbox\"\n name=\"userAgentValidationRequired\"\n [(ngModel)]=\"userAgentValidationRequired\"\n />\n <span></span>\n <span>{{ 'User agent validation required' | translate }}</span>\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ USER_AGENT_VALIDATION_REQUIRED_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label title=\"{{ 'Session absolute timeout' | translate }}\">\n {{ 'Session absolute timeout' | translate }}\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n name=\"absoluteTimeoutSeconds\"\n class=\"form-control text-right\"\n [(ngModel)]=\"absoluteTimeoutSeconds\"\n [required]=\"useSessionConfiguration\"\n [min]=\"absoluteTimeoutConstraints.min\"\n step=\"1\"\n />\n <span class=\"input-group-addon\" translate>seconds</span>\n </div>\n <c8y-messages>\n <c8y-message\n name=\"min\"\n text=\"{{ ABSOLUTE_TIMEOUT_VALIDATION_MESSAGE | translate }}\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label title=\"{{ 'Session renewal timeout' | translate }}\">\n {{ 'Session renewal timeout' | translate }}\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n name=\"renewalTimeoutSeconds\"\n class=\"form-control text-right\"\n [(ngModel)]=\"renewalTimeoutSeconds\"\n [required]=\"useSessionConfiguration\"\n [max]=\"renewalTimeoutConstraints.max\"\n [min]=\"renewalTimeoutConstraints.min\"\n step=\"1\"\n />\n <span class=\"input-group-addon\" translate>seconds</span>\n </div>\n <c8y-messages>\n <c8y-message\n name=\"max\"\n text=\"{{ RENEWAL_TIMEOUT_VALIDATION_MESSAGE | translate }}\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label title=\"{{ 'Maximum parallel sessions per user' | translate }}\">\n {{ 'Maximum parallel sessions per user' | translate }}\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n name=\"maximumNumberOfParallelSessions\"\n class=\"form-control text-right\"\n [(ngModel)]=\"maximumNumberOfParallelSessions\"\n [required]=\"useSessionConfiguration\"\n [min]=\"1\"\n step=\"1\"\n />\n <span class=\"input-group-addon\" translate>sessions</span>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label title=\"{{ 'Token lifespan' | translate }}\">\n {{ 'Token lifespan' | translate }}\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n name=\"basicTokenLifespan\"\n class=\"form-control text-right\"\n [(ngModel)]=\"basicTokenLifespan\"\n [required]=\"useSessionConfiguration\"\n [max]=\"basicTokenLifespanConstraints.max\"\n [min]=\"basicTokenLifespanConstraints.min\"\n step=\"1\"\n />\n <span class=\"input-group-addon\" translate>seconds</span>\n </div>\n <c8y-messages>\n <c8y-message\n name=\"max\"\n text=\"{{ MAX_TOKEN_LIFESPAN_VALIDATION_MESSAGE | translate }}\"\n ></c8y-message>\n <c8y-message\n name=\"min\"\n text=\"{{ MIN_TOKEN_LIFESPAN_VALIDATION_MESSAGE | translate }}\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n </div>\n</div>\n","import { Component, Input, SimpleChanges } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { AuthConfiguration } from './auth-configuration.model';\nimport { TenantUiService } from '@c8y/ngx-components';\nimport { TenantLoginOptionType } from '@c8y/client';\n\n@Component({\n selector: 'c8y-login-settings',\n templateUrl: './login-settings.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class LoginSettingsComponent {\n PREFERRED_LOGIN_MODE_POPOVER = gettext(\n 'Main difference is the storage of the authentication information. With Basic Auth, it is saved in a session storage and with OAI-Secure in a HttpOnly cookie. OAI-Secure grant is recommended as the authentication information is not accessible via JavaScript. Single sign-on redirect allows a user to login with a single 3rd-party authorization server using the OAuth2 protocol.'\n );\n ENFORCED_BY_PLATFORM_POPOVER = gettext('The setting is enforced on the platform level.');\n\n @Input()\n authConfiguration: AuthConfiguration;\n\n isOauth2: boolean;\n tenantLoginOptionTypeEnum = TenantLoginOptionType;\n\n private PASSWORD_CATEGORY = 'password';\n private LIMIT_VALIDITY_KEY = 'limit.validity';\n private TENANT_STRENGTH_VALIDITY_KEY = 'strength.validity';\n private SYSTEM_STRENGTH_VALIDITY_KEY = 'enforce.strength';\n\n constructor(private tenantUiService: TenantUiService) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.authConfiguration && changes.authConfiguration.currentValue) {\n this.isOauth2 = !!changes.authConfiguration.currentValue.loginOptions.find(\n this.tenantUiService.isOauth2\n );\n }\n }\n\n get systemPasswordLimitValidity() {\n return this.authConfiguration.systemOptions[this.PASSWORD_CATEGORY][this.LIMIT_VALIDITY_KEY];\n }\n\n get passwordLimitValidity() {\n return this.systemPasswordLimitValidity !== null\n ? this.systemPasswordLimitValidity\n : this.authConfiguration.tenantOptions[this.PASSWORD_CATEGORY][this.LIMIT_VALIDITY_KEY];\n }\n\n set passwordLimitValidity(value) {\n if (this.systemPasswordLimitValidity === null) {\n this.authConfiguration.tenantOptions[this.PASSWORD_CATEGORY][this.LIMIT_VALIDITY_KEY] = value;\n }\n }\n\n get systemPasswordEnforceStrength() {\n return this.authConfiguration.systemOptions[this.PASSWORD_CATEGORY][\n this.SYSTEM_STRENGTH_VALIDITY_KEY\n ];\n }\n\n get passwordEnforceStrength() {\n return this.systemPasswordEnforceStrength\n ? this.systemPasswordEnforceStrength\n : this.authConfiguration.tenantOptions[this.PASSWORD_CATEGORY][\n this.TENANT_STRENGTH_VALIDITY_KEY\n ];\n }\n\n set passwordEnforceStrength(value) {\n if (!this.systemPasswordEnforceStrength) {\n this.authConfiguration.tenantOptions[this.PASSWORD_CATEGORY][\n this.TENANT_STRENGTH_VALIDITY_KEY\n ] = value;\n }\n }\n}\n","<div class=\"card-block separator-top overflow-auto\" *ngIf=\"authConfiguration\">\n <div class=\"col-sm-2\">\n <div class=\"h4 text-normal text-right text-left-xs\">{{ 'Login settings' | translate }}</div>\n </div>\n\n <div class=\"col-sm-9\">\n <div class=\"row m-b-8\">\n <c8y-form-group class=\"col-sm-6\">\n <label>\n {{ 'Preferred login mode' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ PREFERRED_LOGIN_MODE_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n [attr.aria-label]=\"'Auth type' | translate\"\n class=\"form-control\"\n id=\"preferredLoginOptionType\"\n name=\"preferredLoginOptionType\"\n [(ngModel)]=\"authConfiguration.preferredLoginOptionType\"\n >\n <option value=\"{{ tenantLoginOptionTypeEnum.BASIC }}\" translate>Basic Auth</option>\n <option value=\"{{ tenantLoginOptionTypeEnum.OAUTH2_INTERNAL }}\" translate>\n OAI-Secure\n </option>\n <option value=\"{{ tenantLoginOptionTypeEnum.OAUTH2 }}\" [disabled]=\"!isOauth2\" translate>\n Single sign-on redirect\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label title=\"{{ 'Password validity limit' | translate }}\">\n {{ 'Password validity limit' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ ENFORCED_BY_PLATFORM_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n *ngIf=\"systemPasswordLimitValidity\"\n ></button>\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n name=\"passwordLimitValidity\"\n class=\"form-control text-right\"\n [(ngModel)]=\"passwordLimitValidity\"\n min=\"0\"\n max=\"999999\"\n step=\"1\"\n required\n [disabled]=\"systemPasswordLimitValidity\"\n />\n <span class=\"input-group-addon\" translate>days</span>\n </div>\n <p class=\"help-block\">\n {{ 'Default: 0 (unlimited validity)' | translate }}\n </p>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label title=\"{{ 'Password strength' | translate }}\">\n {{ 'Password strength' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ ENFORCED_BY_PLATFORM_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n *ngIf=\"systemPasswordEnforceStrength\"\n ></button>\n </label>\n <div>\n <label\n title=\"{{ 'Enforce that all passwords are strong (green)' | translate }}\"\n class=\"c8y-switch\"\n >\n <input\n type=\"checkbox\"\n name=\"passwordEnforceStrength\"\n [(ngModel)]=\"passwordEnforceStrength\"\n [disabled]=\"systemPasswordEnforceStrength\"\n />\n <span></span>\n <span>{{ 'Enforce strong passwords (green)' | translate }}</span>\n </label>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n</div>\n","// tslint:disable:no-string-literal\nimport { Component, Input, SimpleChanges } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components';\nimport { isEmpty } from 'lodash-es';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { TfaStrategy, TenantLoginOptionType } from '@c8y/client';\nimport { AuthConfiguration } from './auth-configuration.model';\n\nenum TfaStateEnum {\n TFA_UNDEFINED_BY_SYSTEM,\n TFA_ENFORCED_FOR_GROUP,\n TFA_ENABLED_BY_SYSTEM,\n TFA_ENFORCED_BY_SYSTEM\n}\n\n@Component({\n selector: 'c8y-auth-tfa',\n templateUrl: './tfa-settings.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class TfaSettingsComponent {\n @Input()\n authConfiguration: AuthConfiguration;\n\n preferredLoginOptionType: TenantLoginOptionType = TenantLoginOptionType.BASIC;\n\n smsGatewayAvailable: boolean;\n\n tfaStateEnum = TfaStateEnum;\n tfaStrategyEnum = TfaStrategy;\n tenantLoginOptionTypeEnum = TenantLoginOptionType;\n\n TOTP_REQUIRES_OAUTH_POPOVER = gettext('TOTP requires OAI-Secure login mode.');\n SMS_APP_NOT_SUBSCRIBED_POPOVER = gettext(\n 'SMS strategy requires messaging application to be subscribed.'\n );\n\n TFA_IS_ENFORCED_BY_SYSTEM_POPOVER = gettext('The setting is enforced on the platform level.');\n TFA_IS_ENABLED_BY_SYSTEM_POPOVER = gettext('The setting is enabled on the platform level.');\n TOKEN_VALIDITY_DETERMINED_BY_JWT_POPOVER = gettext(\n \"In OAI-Secure login mode, the token's validity limit is determined by the JWT token and cannot be edited here.\"\n );\n TFA_IS_ENABLED_BY_ENFORCE_FOR_GROUP_POPOVER = gettext(\n 'The setting is enabled on the platform level because it is enforced for particular roles.'\n );\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.authConfiguration && changes.authConfiguration.currentValue) {\n this.smsGatewayAvailable = changes.authConfiguration.currentValue.smsGatewayAvailable;\n this.preferredLoginOptionType =\n changes.authConfiguration.currentValue.preferredLoginOptionType;\n }\n }\n\n ngDoCheck() {\n if (this.preferredLoginOptionType !== this.authConfiguration.preferredLoginOptionType) {\n this.preferredLoginOptionType = this.authConfiguration.preferredLoginOptionType;\n this.tenantTfaStrategy = this.tfaBySmsCanBeSet ? TfaStrategy.SMS : TfaStrategy.TOTP;\n }\n }\n\n get tenantTfaTokenValidity() {\n return this.authConfiguration.tenantOptions['two-factor-authentication']['token.validity'];\n }\n\n set tenantTfaTokenValidity(value) {\n this.authConfiguration.tenantOptions['two-factor-authentication']['token.validity'] = value;\n }\n\n get tenantTfaPinValidity() {\n return this.authConfiguration.tenantOptions['two-factor-authentication']['pin.validity'];\n }\n\n set tenantTfaPinValidity(value) {\n this.authConfiguration.tenantOptions['two-factor-authentication']['pin.validity'] = value;\n }\n\n get tenantTfaEnabled() {\n return this.authConfiguration.tenantOptions['two-factor-authentication']['enabled'];\n }\n\n set tenantTfaEnabled(value) {\n this.authConfiguration.tenantOptions['two-factor-authentication']['enabled'] = value;\n }\n\n get tenantTfaEnforced() {\n return this.authConfiguration.tenantOptions['two-factor-authentication']['enforced'];\n }\n\n set tenantTfaEnforced(value) {\n this.authConfiguration.tenantOptions['two-factor-authentication']['enforced'] = value;\n }\n\n get tenantTfaStrategy() {\n return this.authConfiguration.tenantOptions['two-factor-authentication']['strategy'];\n }\n\n set tenantTfaStrategy(value) {\n this.authConfiguration.tenantOptions['two-factor-authentication']['strategy'] = value;\n }\n\n get systemTfaEnforcedGroup() {\n return this.authConfiguration.systemOptions['two-factor-authentication']['enforced.group'];\n }\n\n get systemTfaTenantScopeSettingEnabled() {\n return this.authConfiguration.systemOptions['two-factor-authentication'][\n 'tenant-scope-settings.enabled'\n ];\n }\n\n get systemTfaEnabled() {\n return this.authConfiguration.systemOptions['two-factor-authentication']['enabled'];\n }\n\n get systemTfaEnforced() {\n return this.authConfiguration.systemOptions['two-factor-authentication']['enforced'];\n }\n\n get tfaState() {\n if (this.systemTfaEnforced) {\n return this.tfaStateEnum.TFA_ENFORCED_BY_SYSTEM;\n }\n if (!isEmpty(this.systemTfaEnforcedGroup)) {\n return this.tfaStateEnum.TFA_ENFORCED_FOR_GROUP;\n }\n if (this.systemTfaEnabled) {\n return this.tfaStateEnum.TFA_ENABLED_BY_SYSTEM;\n }\n return this.tfaStateEnum.TFA_UNDEFINED_BY_SYSTEM;\n }\n\n get tfaBySmsCanBeSet() {\n return (\n (this.tfaState !== this.tfaStateEnum.TFA_UNDEFINED_BY_SYSTEM || this.tenantTfaEnabled) &&\n this.smsGatewayAvailable\n );\n }\n\n get tfaByTotpCanBeSet() {\n return (\n (this.tfaState !== this.tfaStateEnum.TFA_UNDEFINED_BY_SYSTEM || this.tenantTfaEnabled) &&\n this.preferredLoginOptionType === TenantLoginOptionType.OAUTH2_INTERNAL\n );\n }\n}\n","<div\n class=\"card-block separator-top\"\n *ngIf=\"preferredLoginOptionType !== tenantLoginOptionTypeEnum.OAUTH2\"\n>\n <div class=\"col-sm-2\">\n <div class=\"h4 text-normal text-right text-left-xs\">\n {{ 'Two-factor authentication' | translate }}\n </div>\n </div>\n\n <div class=\"col-sm-9\">\n <c8y-form-group>\n <label\n class=\"c8y-switch\"\n title=\"{{ 'Enable two-factor authentication' | translate }}\"\n *ngIf=\"\n tfaState === tfaStateEnum.TFA_UNDEFINED_BY_SYSTEM;\n else enabledOrEnforcedOnSystemLevelTemplate\n \"\n >\n <input type=\"checkbox\" [(ngModel)]=\"tenantTfaEnabled\" name=\"tenantTfaEnabled\" />\n <span></span>\n <span>{{ 'Enable' | translate }}</span>\n </label>\n\n <ng-template #enabledOrEnforcedOnSystemLevelTemplate>\n <div [ngSwitch]=\"tfaState\">\n <span *ngSwitchCase=\"tfaStateEnum.TFA_ENABLED_BY_SYSTEM\">\n {{ 'Two-factor authentication is enabled on all users' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TFA_IS_ENABLED_BY_SYSTEM_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n ></button>\n </span>\n <div *ngSwitchCase=\"tfaStateEnum.TFA_ENFORCED_BY_SYSTEM\">\n <span>\n {{ 'Two-factor authentication is enforced on all users' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TFA_IS_ENFORCED_BY_SYSTEM_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n ></button>\n </span>\n </div>\n <div *ngSwitchCase=\"tfaStateEnum.TFA_ENFORCED_FOR_GROUP\">\n <span>\n <span translate [translateParams]=\"{ role: systemTfaEnforcedGroup }\" ngNonBindable>\n Two-factor authentication is enabled on all users and enforced on users with role\n {{ role }}.\n </span>\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TFA_IS_ENABLED_BY_ENFORCE_FOR_GROUP_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n ></button>\n </span>\n </div>\n </div>\n </ng-template>\n </c8y-form-group>\n\n <fieldset *ngIf=\"tfaBySmsCanBeSet || tfaByTotpCanBeSet\">\n <div class=\"row\">\n <c8y-form-group class=\"col-sm-6\">\n <label title=\"{{ 'TFA strategy' | translate }}\">\n {{ 'TFA strategy' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ SMS_APP_NOT_SUBSCRIBED_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n *ngIf=\"!tfaBySmsCanBeSet\"\n ></button>\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TOTP_REQUIRES_OAUTH_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n *ngIf=\"!tfaByTotpCanBeSet\"\n ></button>\n </label>\n\n <div class=\"c8y-select-wrapper\">\n <select\n [attr.aria-label]=\"'TFA' | translate\"\n class=\"form-control\"\n [(ngModel)]=\"tenantTfaStrategy\"\n name=\"tenantTfaStrategy\"\n >\n <option value=\"{{ tfaStrategyEnum.SMS }}\" translate [disabled]=\"!tfaBySmsCanBeSet\">\n SMS based\n </option>\n <option value=\"{{ tfaStrategyEnum.TOTP }}\" translate [disabled]=\"!tfaByTotpCanBeSet\">\n TOTP\n </option>\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n </div>\n\n <div\n class=\"row\"\n *ngIf=\"\n tenantTfaStrategy === tfaStrategyEnum.TOTP &&\n tfaState !== tfaStateEnum.TFA_ENFORCED_BY_SYSTEM\n \"\n >\n <label title=\"{{ 'Enforcement' | translate }}\">{{ 'Enforcement' | translate }}</label>\n <div class=\"form-control-static\">\n <label\n title=\"{{ 'Enforce two-factor authentication on all users' | translate }}\"\n class=\"c8y-switch\"\n >\n <input type=\"checkbox\" name=\"tenantTfaEnforced\" [(ngModel)]=\"tenantTfaEnforced\" />\n <span></span>\n <span>{{ 'Enforce two-factor authentication on all users' | translate }}</span>\n </label>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"tenantTfaStrategy === tfaStrategyEnum.SMS\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label title=\"{{ 'Token validity limit' | translate }}\">\n {{ 'Token validity limit' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TFA_IS_ENFORCED_BY_SYSTEM_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n *ngIf=\"!systemTfaTenantScopeSettingEnabled\"\n ></button>\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TOKEN_VALIDITY_DETERMINED_BY_JWT_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n *ngIf=\"\n systemTfaTenantScopeSettingEnabled &&\n preferredLoginOptionType === tenantLoginOptionTypeEnum.OAUTH2_INTERNAL\n \"\n ></button>\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n class=\"form-control text-right\"\n name=\"tenantTfaTokenValidity\"\n [(ngModel)]=\"tenantTfaTokenValidity\"\n [disabled]=\"\n !systemTfaTenantScopeSettingEnabled ||\n preferredLoginOptionType === tenantLoginOptionTypeEnum.OAUTH2_INTERNAL\n \"\n [required]=\"systemTfaTenantScopeSettingEnabled\"\n [max]=\"999999\"\n [min]=\"0\"\n />\n <span class=\"input-group-addon\" translate>minutes</span>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label title=\"{{ 'Verification code validity limit' | translate }}\">\n {{ 'Verification code validity limit' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TFA_IS_ENFORCED_BY_SYSTEM_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n *ngIf=\"!systemTfaTenantScopeSettingEnabled\"\n ></button>\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n class=\"form-control text-right\"\n name=\"tenantTfaPinValidity\"\n [(ngModel)]=\"tenantTfaPinValidity\"\n [disabled]=\"!systemTfaTenantScopeSettingEnabled\"\n [required]=\"systemTfaTenantScopeSettingEnabled\"\n [max]=\"999999\"\n [min]=\"0\"\n />\n <span class=\"input-group-addon\" translate>minutes</span>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n <div\n *ngIf=\"\n preferredLoginOptionType !== tenantLoginOptionTypeEnum.OAUTH2_INTERNAL &&\n !smsGatewayAvailable\n \"\n >\n <div class=\"alert alert-warning\">\n <strong>{{ 'None of TFA strategy can be set.' | translate }}</strong>\n <br />\n {{ SMS_APP_NOT_SUBSCRIBED_POPOVER | translate }}\n <br />\n {{ TOTP_REQUIRES_OAUTH_POPOVER | translate }}\n </div>\n </div>\n </div>\n</div>\n","import { Component, OnInit, EventEmitter } from '@angular/core';\nimport { AuthConfigurationService } from './auth-configuration.service';\nimport { AlertService, LoginService, ModalService } from '@c8y/ngx-components';\nimport { TenantLoginOptionsService } from '@c8y/client';\nimport { cloneDeep } from 'lodash-es';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { tap, switchMap, shareReplay } from 'rxjs/operators';\nimport { AuthConfiguration } from './auth-configuration.model';\n\n@Component({\n selector: 'c8y-auth-configuration',\n templateUrl: './auth-configuration.component.html'\n})\nexport class AuthConfigurationComponent implements OnInit {\n reloading$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n reload: EventEmitter<void> = new EventEmitter();\n authConfiguration: AuthConfiguration;\n\n private authConfiguration$: Observable<AuthConfiguration> = this.reload.pipe(\n tap(() => this.reloading$.next(true)),\n switchMap(() => this.authConfigurationService.getAuthConfiguration$()),\n tap(() => this.reloading$.next(false)),\n shareReplay(1)\n );\n private previousAuthConfiguration: AuthConfiguration;\n private authConfigurationSubscription: Subscription;\n\n constructor(\n private authConfigurationService: AuthConfigurationService,\n private tenantLoginOptionsService: TenantLoginOptionsService,\n private modalService: ModalService,\n private loginService: LoginService,\n private alertService: AlertService\n ) {}\n\n ngOnInit() {\n this.authConfigurationSubscription = this.authConfiguration$.subscribe(\n (authConfiguration: AuthConfiguration) => {\n this.authConfiguration = authConfiguration;\n this.previousAuthConfiguration = cloneDeep(this.authConfiguration);\n }\n );\n this.loadAuthConfig();\n }\n\n loadAuthConfig() {\n this.reload.next();\n }\n\n ngOnDestroy(): void {\n this.authConfigurationSubscription.unsubscribe();\n }\n\n async save() {\n try {\n await this.modalService.confirmLogout();\n await this.authConfigurationService.save(\n this.authConfiguration,\n this.previousAuthConfiguration\n );\n await this.loginService.logout(true);\n } catch (ex) {\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n}\n","<c8y-title>{{ 'Authentication' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [label]=\"'Settings' | translate\"\n [icon]=\"'cog'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'cog'\"\n [label]=\"'Authentication' | translate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button title=\"{{ 'Reload' | translate }}\" class=\"btn btn-link\" (click)=\"loadAuthConfig()\">\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading$ | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/administration/#authentication\"></c8y-help>\n\n<form class=\"card card--fullpage\" #authConfigurationForm=\"ngForm\" novalidate>\n <div class=\"card-header separator\">\n <div class=\"card-title\">\n {{ 'Authentication' | translate }}\n </div>\n </div>\n <div class=\"inner-scroll\" *ngIf=\"authConfiguration\">\n <c8y-login-settings [authConfiguration]=\"authConfiguration\"></c8y-login-settings>\n <c8y-basic-auth-settings [authConfiguration]=\"authConfiguration\"></c8y-basic-auth-settings>\n <c8y-session-configuration [authConfiguration]=\"authConfiguration\"></c8y-session-configuration>\n <c8y-auth-tfa [authConfiguration]=\"authConfiguration\"></c8y-auth-tfa>\n </div>\n <div class=\"card-footer separator\">\n <button\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"!authConfigurationForm.form.valid || authConfigurationForm.form.pristine\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n","import { NgModule } from '@angular/core';\nimport { CoreModule, hookRoute } from '@c8y/ngx-components';\nimport { BasicAuthSettingsComponent } from './basic-auth-settings.component';\nimport { AuthConfigurationGuard } from '../auth-configuration.guard';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { AuthConfigurationService } from './auth-configuration.service';\nimport { AuthConfigurationComponent } from './auth-configuration.component';\nimport { TfaSettingsComponent } from './tfa-settings.component';\nimport { SessionConfigurationComponent } from './session-configuration.component';\nimport { LoginSettingsComponent } from './login-settings.component';\nimport { TenantLoginOptionMapper } from './tenant-login-option.mapper';\n\n@NgModule({\n declarations: [\n SessionConfigurationComponent,\n LoginSettingsComponent,\n BasicAuthSettingsComponent,\n AuthConfigurationComponent,\n TfaSettingsComponent\n ],\n exports: [],\n imports: [CoreModule, PopoverModule],\n providers: [\n AuthConfigurationService,\n TenantLoginOptionMapper,\n hookRoute({\n path: 'auth-configuration/basic_settings',\n component: AuthConfigurationComponent,\n canActivate: [AuthConfigurationGuard]\n })\n ]\n})\nexport class BasicSettingsModule {}\n","import { ITenantLoginOption } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components';\n\nexport enum TemplateType {\n CUSTOM = 'CUSTOM',\n AZURE = 'AZURE',\n KEYCLOAK = 'KEYCLOAK'\n}\n\nexport const templateTypeConfig = {\n [TemplateType.CUSTOM]: {\n name: 'CUSTOM',\n value: 'CUSTOM',\n label: gettext('Custom')\n },\n [TemplateType.AZURE]: {\n name: 'AZURE',\n value: 'AZURE',\n label: gettext('Azure AD')\n },\n [TemplateType.KEYCLOAK]: {\n name: 'KEYCLOAK',\n value: 'KEYCLOAK',\n label: gettext('Keycloak')\n }\n};\n\nexport enum ValidationMethod {\n USERINFO = 'USERINFO',\n INTROSPECTION = 'INTROSPECTION'\n}\n\nexport interface AccessTokenToUserDataMappings {\n firstNameClaimName?: string;\n lastNameClaimName?: string;\n emailClaimName?: string;\n phoneNumberClaimName?: string;\n}\n\nexport interface RequestParams {\n [key: string]: string;\n}\n\nexport interface Headers {\n [key: string]: string;\n}\n\nexport interface OnNewUser {\n dynamicMapping: DynamicMapping;\n}\n\nexport interface Configuration {\n mapRolesOnlyForNewUser: boolean;\n manageRolesOnlyFromAccessMapping: boolean;\n}\n\nexport interface ChildPredicate {\n operator: 'EQ' | 'NEQ' | 'GT' | 'LT' | 'GTE' | 'LTE' | 'IN';\n parameterPath: string;\n value: string;\n}\n\nexport interface WhenItemsAreMapped {\n childPredicates: ChildPredicate[];\n operator: 'AND';\n}\n\nexport interface AccessMapping {\n thenApplications: number[];\n thenGroups: number[];\n when: WhenItemsAreMapped;\n}\n\nexport interface DynamicMapping {\n configuration?: Configuration;\n mappings: AccessMapping[];\n inventoryMappings: InventoryMapping[];\n}\n\nexport interface InventoryMapping {\n when: WhenItemsAreMapped;\n thenInventoryRoles: InventoryRole[];\n}\n\nexport interface InventoryRole {\n roleIds: number[];\n managedObject: string;\n}\n\nexport interface MapRolesOnlyForNewUser {\n configuration: Configuration;\n}\n\nexport interface CustomSignatureVerificationConfig {\n certIdFromField: boolean;\n certIdField?: string;\n certificates?: {\n [certIdValue: string]: Certificate;\n };\n}\n\nexport interface Certificate {\n alg: 'PCKS' | 'RSA';\n publicKey: string;\n validFrom?: Date;\n validTill?: Date;\n}\n\nexport interface AadSignatureVerificationConfig {\n publicKeyDiscoveryUrl: string;\n}\n\nexport interface JwksSignatureVerificationConfig {\n jwksUri: string;\n}\n\nexport interface AdfsSignatureVerificationConfig {\n manifestUrl: string;\n}\n\nexport interface SignatureVerificationConfig {\n manual?: CustomSignatureVerificationConfig;\n aad?: AadSignatureVerificationConfig;\n jwks?: JwksSignatureVerificationConfig;\n adfsManifest?: AdfsSignatureVerificationConfig;\n template?: string;\n}\n\nexport interface Request {\n body?: string;\n headers: Headers;\n method: string;\n operation: string;\n requestParams: RequestParams;\n url?: string;\n}\n\nexport interface UserIdConfig {\n jwtField?: string;\n constantValue?: string;\n useConstantValue: boolean;\n}\n\nexport interface ExternalTokenConfig {\n enabled: boolean;\n userOrAppIdConfig?: UserIdConfig;\n validationMethod?: ValidationMethod;\n validationRequired?: boolean;\n tokenValidationRequest?: Request;\n accessTokenValidityCheckIntervalInMinutes?: number;\n}\n\nexport interface SsoConfiguration extends ITenantLoginOption {\n accessTokenToUserDataMappings: AccessTokenToUserDataMappings;\n audience: string;\n authorizationRequest: Request;\n buttonName: string;\n clientId: string;\n id?: string;\n issuer: string;\n logoutRequest: Request;\n onNewUser: OnNewUser;\n providerName: string;\n redirectToPlatform: string;\n refreshRequest: Request;\n self?: string;\n signatureVerificationConfig: SignatureVerificationConfig;\n template: TemplateType;\n tokenRequest: Request;\n userIdConfig: UserIdConfig;\n visibleOnLoginPage: boolean;\n externalTokenConfig?: ExternalTokenConfig;\n}\n","import { Injectable } from '@angular/core';\nimport {\n GrantType,\n ITenantLoginOption,\n TenantLoginOptionsService,\n TenantLoginOptionType,\n UserManagementSource\n} from '@c8y/client';\nimport { SsoConfiguration, TemplateType } from './sso-configuration.model';\nimport { defer, Observable, of, throwError } from 'rxjs';\nimport { catchError, map, publishReplay, refCount, take } from 'rxjs/operators';\nimport { HttpStatusCode } from '@angular/common/http';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SsoConfigurationService {\n private ssoConfiguration$: Observable<ITenantLoginOption> = defer(() =>\n this.loginOptionsService.detail(TenantLoginOptionType.OAUTH2)\n ).pipe(\n map(res => res.data),\n catchError(({ res }) => {\n if (res.status === HttpStatusCode.Forbidden) return throwError(new Error());\n else return of(this.defaultConfiguration);\n }),\n publishReplay(1, 1000),\n refCount(),\n take(1)\n );\n\n private defaultConfiguration: SsoConfiguration = {\n authorizationRequest: {\n body: '',\n headers: {},\n method: 'GET',\n operation: 'REDIRECT',\n requestParams: {\n response_type: 'token',\n client_id: '${clientId}',\n redirect_uri: '${redirectUri}',\n scope: ''\n }\n },\n tokenRequest: {\n body: 'grant_type=authorization_code&code=${code}&redirect_uri=${redirectUri}&client_id=${clientId}',\n headers: {},\n method: 'POST',\n operation: 'EXECUTE',\n requestParams: {\n response_type: 'code',\n client_id: '${clientId}',\n redirect_uri: '${redirectUri}',\n scope: ''\n }\n },\n refreshRequest: {\n body: 'grant_type=refresh_token&refresh_token=${refreshToken}&client_id=${clientId}',\n headers: {\n Authorization: ''\n },\n method: 'POST',\n operation: 'EXECUTE',\n requestParams: {\n response_type: 'refresh',\n client_id: '${clientId}'\n }\n },\n logoutRequest: {\n headers: {},\n method: 'POST',\n operation: 'REDIRECT',\n requestParams: {}\n },\n type: TenantLoginOptionType.OAUTH2,\n grantType: GrantType.AUTHORIZATION_CODE,\n userManagementSource: UserManagementSource.REMOTE,\n onNewUser: {\n dynamicMapping: {\n mappings: [],\n inventoryMappings: [],\n configuration: {\n mapRolesOnlyForNewUser: false,\n manageRolesOnlyFromAccessMapping: false\n }\n }\n },\n userIdConfig: {\n jwtField: '',\n useConstantValue: true\n },\n signatureVerificationConfig: {\n manual: {\n certIdFromField: false\n }\n },\n template: TemplateType.CUSTOM,\n clientId: '',\n audience: '',\n issuer: '',\n buttonName: '',\n redirectToPlatform: '',\n providerName: '',\n visibleOnLoginPage: true,\n accessTokenToUserDataMappings: {},\n externalTokenConfig: {\n enabled: false\n }\n };\n\n constructor(private loginOptionsService: TenantLoginOptionsService) {}\n\n getSsoConfiguration$(): Observable<ITenantLoginOption> {\n return this.ssoConfiguration$;\n }\n\n save(ssoConfiguration: SsoConfiguration) {\n return this.loginOptionsService.save(ssoConfiguration);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { SsoConfiguration } from '../sso-configuration.model';\n\n@Injectable({ providedIn: 'root' })\nexport abstract class SsoConfigurationMapper<T> {\n abstract mapTo: (ssoConfiguration: SsoConfiguration) => T;\n abstract mapFrom: (templateModel: T) => SsoConfiguration;\n}\n","import { Input, Output, EventEmitter, Component, SimpleChanges } from '@angular/core';\nimport { SsoConfigurationMapper } from './sso-configuration.mapper';\nimport { SsoConfiguration } from '../sso-configuration.model';\nimport { Observable, Subscription } from 'rxjs';\nimport { IApplication, IIdentified, IUserGroup } from '@c8y/client';\n\n@Component({\n template: ''\n})\nexport abstract class TemplateComponent<T> {\n templateModel: T;\n @Input() apps: IApplication[];\n @Input() groups: IUserGroup[];\n @Input() inventoryRoles: IIdentified[];\n @Input() ssoConfiguration: SsoConfiguration;\n @Input() ssoConfigurationChangeTrigger: Observable<void>;\n @Output() ssoConfigurationChange = new EventEmitter<SsoConfiguration>();\n\n triggerSubscription: Subscription;\n\n protected constructor(protected configurationMapper: SsoConfigurationMapper<T>) {}\n\n ngOnInit() {\n this.triggerSubscription = this.ssoConfigurationChangeTrigger.subscribe(() => {\n this.emitSsoConfiguration();\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.ssoConfiguration && changes.ssoConfiguration.currentValue) {\n this.mapSsoConfiguration(changes.ssoConfiguration.currentValue);\n }\n }\n\n ngOnDestroy() {\n this.triggerSubscription.unsubscribe();\n }\n\n private mapSsoConfiguration(ssoConfiguration) {\n this.templateModel = this.configurationMapper.mapTo(ssoConfiguration) as T;\n }\n\n private emitSsoConfiguration() {\n const ssoConfiguration = this.configurationMapper.mapFrom(this.templateModel);\n if (this.ssoConfiguration.id) {\n ssoConfiguration.id = this.ssoConfiguration.id;\n }\n this.ssoConfigurationChange.emit(ssoConfiguration);\n }\n}\n","import { RequestParams, Headers, Request } from '../sso-configuration.model';\nimport { map, pickBy, identity } from 'lodash-es';\n\nexport class RequestConfiguration {\n body?: string;\n headers: RequestConfigurationDynamicArray;\n method: string;\n operation: string;\n requestParams: RequestConfigurationDynamicArray;\n url?: string;\n\n constructor(requestConfiguration: Request) {\n this.headers = new RequestConfigurationDynamicArray(requestConfiguration.headers);\n this.method = requestConfiguration.method;\n this.operation = requestConfiguration.operation;\n this.requestParams = new RequestConfigurationDynamicArray(requestConfiguration.requestParams);\n this.body = requestConfiguration.body;\n this.url = requestConfiguration.url;\n }\n\n toRequest(): Request {\n return pickBy(\n {\n body: this.method === 'GET' ? '' : this.body,\n headers: this.headers.toObject(),\n method: this.method,\n operation: this.operation,\n requestParams: this.requestParams.toObject(),\n url: this.url\n },\n identity\n ) as Request;\n }\n}\n\n// tslint:disable-next-line:max-classes-per-file\nexport class RequestConfigurationDynamicArray extends Array {\n constructor(obj: RequestParams | Headers) {\n super();\n this.push(\n ...map(obj, (value, key) => ({\n key,\n value\n }))\n );\n }\n\n toObject(): { [key: string]: string } {\n return this.reduce((obj, element) => {\n obj[element.key] = element.value;\n return obj;\n }, {});\n }\n}\n","import {\n AadSignatureVerificationConfig,\n AdfsSignatureVerificationConfig,\n CustomSignatureVerificationConfig,\n JwksSignatureVerificationConfig,\n SignatureVerificationConfig\n} from '../sso-configuration.model';\nimport { pick, findKey, get, has, reduce, map, omit } from 'lodash-es';\nimport { gettext } from '@c8y/ngx-components';\n\nexport enum AlgorithmType {\n PCKS = 'PCKS',\n RSA = 'RSA'\n}\n\nexport const algorithmTypeConfig = {\n [AlgorithmType.PCKS]: {\n name: 'PCKS',\n value: 'PCKS',\n label: gettext('X.509 certificate (PEM format)')\n },\n [AlgorithmType.RSA]: {\n name: 'RSA',\n value: 'RSA',\n label: gettext('RSA public key (X.509 Subject Public Key Info)')\n }\n};\n\nexport enum CertificateType {\n CUSTOM = 'CUSTOM',\n AZURE = 'AZURE',\n ADFS = 'ADFS',\n JWKS = 'JWKS'\n}\n\nexport const certificateTypeConfig = {\n [CertificateType.CUSTOM]: {\n name: 'CUSTOM',\n label: gettext('Custom'),\n value: 'CUSTOM',\n signatureVerificationConfigFragment: 'manual',\n ordinal: 0\n },\n [CertificateType.AZURE]: {\n name: 'AZURE',\n label: 'Azure',\n value: 'AZURE',\n signatureVerificationConfigFragment: 'aad',\n ordinal: 1\n },\n [CertificateType.ADFS]: {\n name: 'ADFS',\n label: gettext('ADFS manifest'),\n value: 'ADFS',\n signatureVerificationConfigFragment: 'adfsManifest',\n ordinal: 2\n },\n [CertificateType.JWKS]: {\n name: 'JWKS',\n label: 'JWKS',\n value: 'JWKS',\n signatureVerificationConfigFragment: 'jwks',\n ordinal: 3\n }\n};\n\nexport interface CustomCertificate {\n alg: AlgorithmType;\n key: string;\n publicKey: string;\n validFrom?: Date;\n validTill?: Date;\n}\n\nexport class SignatureConfiguration {\n manual?: CustomSignatureVerification;\n aad?: AadSignatureVerificationConfig;\n jwks?: JwksSignatureVerificationConfig;\n adfsManifest?: AdfsSignatureVerificationConfig;\n certificateTypeChosen: CertificateType;\n\n constructor(signatureVerificationConfig: SignatureVerificationConfig) {\n this.manual = new CustomSignatureVerification(\n signatureVerificationConfig.manual || { certIdFromField: false }\n );\n this.aad = signatureVerificationConfig.aad || { publicKeyDiscoveryUrl: '' };\n this.jwks = signatureVerificationConfig.jwks || { jwksUri: '' };\n this.adfsManifest = signatureVerificationConfig.adfsManifest || { manifestUrl: '' };\n this.certificateTypeChosen = this.getCertificateType(signatureVerificationConfig);\n }\n\n toSignatureVerificationConfig(): SignatureVerificationConfig {\n const result = {\n manual: this.manual.toManual(),\n aad: this.aad,\n jwks: this.jwks,\n adfsManifest: this.adfsManifest\n };\n return pick(\n result,\n certificateTypeConfig[this.certificateTypeChosen].signatureVerificationConfigFragment\n );\n }\n\n getCertificateType(signatureVerificationConfig: SignatureVerificationConfig): CertificateType {\n const templateCertificateType = findKey(certificateTypeConfig, certificateType =>\n has(signatureVerificationConfig, certificateType.signatureVerificationConfigFragment)\n );\n return templateCertificateType || CertificateType.CUSTOM;\n }\n}\n\n// tslint:disable-next-line:max-classes-per-file\nclass CustomSignatureVerification {\n certIdFromField: boolean;\n certIdField: string;\n customCertificates: CustomCertificate[] = [];\n\n constructor(manual: CustomSignatureVerificationConfig) {\n this.certIdFromField = manual.certIdFromField;\n this.certIdField = manual.certIdField;\n this.customCertificates = this.getCustomCertificates(manual);\n }\n\n getCustomCertificates(manual: CustomSignatureVerificationConfig) {\n const certificates = get(manual, 'certificates', []);\n const customCertificates = map(certificates, (certificate, key) => ({\n ...certificate,\n key,\n validFrom: new Date(certificate.validFrom),\n validTill: new Date(certificate.validTill)\n }));\n if (customCertificates.length === 0) {\n const newCustomCertificate = { alg: 'RSA' };\n customCertificates.push(newCustomCertificate);\n }\n return customCertificates;\n }\n\n addCustomCertificate() {\n const newCustomCertificate = { alg: AlgorithmType.RSA, key: '', publicKey: '' };\n this.customCertificates.push(newCustomCertificate);\n }\n\n removeCustomCertificate(customCertificate: CustomCertificate) {\n const indexOfCustomCertificate = this.customCertificates.indexOf(customCertificate);\n this.customCertificates.splice(indexOfCustomCertificate, 1);\n }\n\n toManual(): CustomSignatureVerificationConfig {\n const manual: CustomSignatureVerificationConfig = this.getManualSignatureVerificationConfig();\n manual.certificates = this.getSignatureCertificates();\n return manual;\n }\n\n getSignatureCertificates() {\n if (this.customCertificates.length < 2) {\n this.customCertificates[0].key = 'default';\n }\n return reduce(\n this.customCertificates,\n (signatureCertificates, customCertificate) => ({\n ...signatureCertificates,\n [customCertificate.key]: {\n alg: customCertificate.alg,\n publicKey: customCertificate.publicKey,\n validFrom: customCertificate.validFrom,\n validTill: customCertificate.validTill\n }\n }),\n {}\n );\n }\n\n getManualSignatureVerificationConfig() {\n let manual = {\n certIdFromField: this.customCertificates.length > 1,\n certIdField: this.certIdField\n };\n if (!manual.certIdFromField) {\n manual = omit(manual, 'certIdField');\n }\n return manual;\n }\n}\n","import {\n ExternalTokenConfig,\n Request,\n UserIdConfig,\n ValidationMethod\n} from '../sso-configuration.model';\nimport { gettext } from '@c8y/ngx-components';\nimport { RequestConfiguration } from './request-configuration.model';\n\nexport const validationMethodConfig = {\n [ValidationMethod.INTROSPECTION]: {\n name: 'INTROSPECTION',\n value: 'INTROSPECTION',\n label: gettext('Introspection`Method of validating access token from external IAM system`'),\n defaults: {\n method: 'POST',\n body: 'token=${accessToken}&client_id=${clientId}&client_secret=',\n url: '',\n headers: {},\n operation: 'EXECUTE',\n requestParams: {}\n }\n },\n [ValidationMethod.USERINFO]: {\n name: 'USERINFO',\n value: 'USERINFO',\n label: gettext('User info`Method of validating access token from external IAM system`'),\n defaults: {\n url: '',\n method: 'GET',\n body: '',\n headers: { Authorization: 'Bearer ${accessToken}' },\n operation: 'EXECUTE',\n requestParams: {}\n }\n }\n};\n\nconst defaultTokenValidationRequest: Request = {\n body: 'token=${accessToken}&client_id=${clientId}&client_secret=',\n url: '',\n headers: {},\n method: 'POST',\n operation: 'EXECUTE',\n requestParams: {}\n};\n\nconst defaultUserIdConfig: UserIdConfig = {\n jwtField: '',\n useConstantValue: true\n};\n\nexport class ExternalToken {\n userOrAppIdConfig: UserIdConfig;\n validationMethod: ValidationMethod;\n validationRequired: boolean;\n enabled: boolean;\n tokenValidationRequest: RequestConfiguration;\n accessTokenValidityCheckIntervalInMinutes: number;\n\n constructor(externalTokenConfig: ExternalTokenConfig) {\n const _externalTokenConfig = Object.assign({ enabled: false }, externalTokenConfig);\n this.userOrAppIdConfig = _externalTokenConfig.userOrAppIdConfig || defaultUserIdConfig;\n this.validationMethod = _externalTokenConfig.validationMethod || ValidationMethod.INTROSPECTION;\n this.validationRequired = _externalTokenConfig.validationRequired;\n this.enabled = _externalTokenConfig.enabled;\n this.tokenValidationRequest = new RequestConfiguration(\n _externalTokenConfig.tokenValidationRequest || defaultTokenValidationRequest\n );\n this.accessTokenValidityCheckIntervalInMinutes =\n _externalTokenConfig.accessTokenValidityCheckIntervalInMinutes || 1;\n }\n\n toExternalTokenConfig(): ExternalTokenConfig {\n if (!this.enabled) {\n return { enabled: this.enabled };\n }\n const externalTokenConfig: ExternalTokenConfig = {\n userOrAppIdConfig: this.userOrAppIdConfig,\n validationRequired: this.validationRequired,\n enabled: this.enabled\n };\n if (this.validationRequired) {\n externalTokenConfig.validationMethod = this.validationMethod;\n externalTokenConfig.tokenValidationRequest = this.tokenValidationRequest.toRequest();\n externalTokenConfig.accessTokenValidityCheckIntervalInMinutes =\n this.accessTokenValidityCheckIntervalInMinutes;\n }\n return externalTokenConfig;\n }\n}\n","import { SsoConfiguration, TemplateType } from '../sso-configuration.model';\nimport { SsoConfigurationMapper } from './sso-configuration.mapper';\nimport { GrantType, TenantLoginOptionType } from '@c8y/client';\nimport { CustomSsoConfiguration } from './custom.model';\nimport { RequestConfiguration } from '../template-parts/request-configuration.model';\nimport {\n CertificateType,\n SignatureConfiguration\n} from '../template-parts/signature-configuration.model';\nimport { Injectable } from '@angular/core';\nimport { ExternalToken } from '../template-parts/external-token-config.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CustomConfigurationMapper implements SsoConfigurationMapper<CustomSsoConfiguration> {\n mapFrom(templateModel: CustomSsoConfiguration): SsoConfiguration {\n const ssoConfiguration: SsoConfiguration = {\n accessTokenToUserDataMappings: templateModel.accessTokenToUserDataMappings,\n audience: templateModel.audience,\n authorizationRequest: templateModel.authorizationRequest.toRequest(),\n buttonName: templateModel.buttonName,\n clientId: templateModel.clientId,\n issuer: templateModel.issuer,\n logoutRequest: templateModel.logoutRequest.toRequest(),\n onNewUser: templateModel.onNewUser,\n providerName: templateModel.providerName,\n redirectToPlatform: templateModel.redirectToPlatform,\n refreshRequest: templateModel.refreshRequest.toRequest(),\n signatureVerificationConfig:\n templateModel.signatureVerificationConfig.toSignatureVerificationConfig(),\n template: TemplateType.CUSTOM,\n tokenRequest: templateModel.tokenRequest.toRequest(),\n userIdConfig: templateModel.userIdConfig,\n userManagementSource: templateModel.userManagementSource,\n visibleOnLoginPage: templateModel.visibleOnLoginPage,\n type: TenantLoginOptionType.OAUTH2,\n grantType: GrantType.AUTHORIZATION_CODE,\n externalTokenConfig: templateModel.externalTokenConfig.toExternalTokenConfig()\n };\n return ssoConfiguration;\n }\n\n mapTo(ssoConfiguration: SsoConfiguration): CustomSsoConfiguration {\n return {\n accessTokenToUserDataMappings: ssoConfiguration.accessTokenToUserDataMappings,\n audience: ssoConfiguration.audience,\n authorizationRequest: new RequestConfiguration(ssoConfiguration.authorizationRequest),\n buttonName: ssoConfiguration.buttonName,\n clientId: ssoConfiguration.clientId,\n issuer: ssoConfiguration.issuer,\n logoutRequest: new RequestConfiguration(ssoConfiguration.logoutRequest),\n onNewUser: ssoConfiguration.onNewUser,\n providerName: ssoConfiguration.providerName,\n redirectToPlatform: ssoConfiguration.redirectToPlatform,\n refreshRequest: new RequestConfiguration(ssoConfiguration.refreshRequest),\n signatureVerificationConfig: new SignatureConfiguration(\n ssoConfiguration.signatureVerificationConfig\n ),\n template: TemplateType.CUSTOM,\n tokenRequest: new RequestConfiguration(ssoConfiguration.tokenRequest),\n userIdConfig: ssoConfiguration.userIdConfig,\n userManagementSource: ssoConfiguration.userManagementSource,\n visibleOnLoginPage: ssoConfiguration.visibleOnLoginPage,\n certificateType: CertificateType.CUSTOM,\n externalTokenConfig: new ExternalToken(ssoConfiguration.externalTokenConfig)\n };\n }\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { memoize } from '@c8y/ngx-components';\nimport { TenantService } from '@c8y/client';\nimport { defaults } from 'lodash-es';\n\n@Component({\n selector: 'c8y-basic-configuration',\n templateUrl: './basic-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class BasicConfigurationComponent implements OnInit {\n @Input() templateModel;\n\n redirectToPlatformWarningParams: { defaultRedirectUrl: string; host?: string };\n\n constructor(private tenantService: TenantService) {}\n\n @memoize()\n shouldShow(field: string) {\n return field in this.templateModel;\n }\n\n async ngOnInit() {\n const currentTenant = (await this.tenantService.current()).data;\n const { domainName } = currentTenant;\n this.redirectToPlatformWarningParams = {\n host: `https://${domainName}`,\n defaultRedirectUrl: `https://${domainName}/tenant/oauth`\n };\n defaults(this.templateModel, {\n redirectToPlatform: this.redirectToPlatformWarningParams.defaultRedirectUrl\n });\n }\n}\n","<div class=\"col-md-12 p-t-24\">\n <div class=\"row m-l-8 m-r-8\">\n <div class=\"col-xs-12 col-sm-3 col-md-2\">\n <h4 class=\"text-right text-left-xs\" translate>Basic</h4>\n </div>\n\n <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\" *ngIf=\"templateModel\">\n <div class=\"row\" *ngIf=\"shouldShow('keyCloakAddress')\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"keyCloakAddress\" class=\"control-label\" translate>Keycloak address</label>\n <input\n class=\"form-control\"\n type=\"url\"\n id=\"keyCloakAddress\"\n name=\"keyCloakAddress\"\n [(ngModel)]=\"templateModel.keyCloakAddress\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'https://example.de' }\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"shouldShow('aadAddress')\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"aadAddress\" class=\"control-label\" translate>Azure AD address</label>\n <input\n class=\"form-control\"\n type=\"url\"\n id=\"aadAddress\"\n name=\"aadAddress\"\n [(ngModel)]=\"templateModel.aadAddress\"\n [placeholder]=\"\n 'e.g. {{ example }}' | translate: { example: 'https://login.microsoftonline.de' }\n \"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"shouldShow('tenant')\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"tenant\" class=\"control-label\" translate>Tenant</label>\n <input\n class=\"form-control\"\n id=\"tenant\"\n name=\"tenant\"\n [(ngModel)]=\"templateModel.tenant\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y.onmicrosoft.de' }\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"shouldShow('applicationId')\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"applicationId\" class=\"control-label\" translate>Application ID</label>\n <input\n class=\"form-control\"\n required\n id=\"applicationId\"\n name=\"applicationId\"\n [(ngModel)]=\"templateModel.applicationId\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"shouldShow('realmName')\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"realmName\" class=\"control-label\" translate>Realm name</label>\n <input\n class=\"form-control\"\n required\n id=\"realmName\"\n name=\"realmName\"\n [(ngModel)]=\"templateModel.realmName\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"shouldShow('redirectToPlatform')\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"redirectToPlatform\" class=\"control-label\" translate>Redirect URL</label>\n <input\n type=\"url\"\n class=\"form-control\"\n id=\"redirectToPlatform\"\n name=\"redirectToPlatform\"\n [(ngModel)]=\"templateModel.redirectToPlatform\"\n [placeholder]=\"\n 'e.g. {{ example }}'\n | translate\n : {\n example:\n redirectToPlatformWarningParams?.defaultRedirectUrl ||\n 'https://tenant.domain.com'\n }\n \"\n required\n />\n </c8y-form-group>\n\n <div\n *ngIf=\"\n redirectToPlatformWarningParams &&\n templateModel.redirectToPlatform != redirectToPlatformWarningParams.defaultRedirectUrl\n \"\n >\n <div\n class=\"alert alert-warning max-width-100 m-b-32\"\n ngNonBindable\n translate\n [translateParams]=\"redirectToPlatformWarningParams\"\n >\n For correct application behavior you can use only {{ defaultRedirectUrl }} or\n {{ host }} values, it is advised to use the first one.\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\" *ngIf=\"shouldShow('clientSecret')\">\n <c8y-form-group>\n <label for=\"clientSecret\" class=\"control-label\" translate>Client secret</label>\n <input\n class=\"form-control\"\n required\n id=\"clientSecret\"\n name=\"clientSecret\"\n [(ngModel)]=\"templateModel.clientSecret\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\" *ngIf=\"shouldShow('clientId')\">\n <c8y-form-group>\n <label for=\"clientId\" class=\"control-label\" translate>Client ID</label>\n <input\n class=\"form-control\"\n id=\"clientId\"\n name=\"clientId\"\n [(ngModel)]=\"templateModel.clientId\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '254234981c-78a8-4588…' }\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"shouldShow('issuer')\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"issuer\" class=\"control-label\" translate>Token issuer</label>\n <input\n class=\"form-control\"\n id=\"issuer\"\n name=\"issuer\"\n [(ngModel)]=\"templateModel.issuer\"\n [placeholder]=\"\n 'e.g. {{ example }}'\n | translate: { example: 'https://login.microsoftonline.de/237652-3727' }\n \"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"shouldShow('scopeId')\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"scopeId\" class=\"control-label\" translate>Scope ID</label>\n <input\n class=\"form-control\"\n id=\"scopeId\"\n name=\"scopeId\"\n [(ngModel)]=\"templateModel.scopeId\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '237652-3727' }\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\" *ngIf=\"shouldShow('buttonName')\">\n <c8y-form-group>\n <label for=\"buttonName\" class=\"control-label\" translate>Button name</label>\n <input\n class=\"form-control\"\n id=\"buttonName\"\n name=\"buttonName\"\n [(ngModel)]=\"templateModel.buttonName\"\n [placeholder]=\"'e.g. Log in with Azure AD' | translate\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\" *ngIf=\"shouldShow('providerName')\">\n <c8y-form-group>\n <label for=\"providerName\" class=\"control-label\" translate>Provider name</label>\n <input\n class=\"form-control\"\n id=\"providerName\"\n name=\"providerName\"\n [(ngModel)]=\"templateModel.providerName\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'Azure AD' }\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"shouldShow('audience')\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"audience\" class=\"control-label\" translate>Audience</label>\n <input\n class=\"form-control\"\n id=\"audience\"\n name=\"audience\"\n [(ngModel)]=\"templateModel.audience\"\n [placeholder]=\"\n 'e.g. {{ example }}' | translate: { example: 'https://test.example.com' }\n \"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"shouldShow('visibleOnLoginPage')\">\n <div class=\"col-sm-6\">\n <label\n for=\"visibleOnLoginPage\"\n title=\"{{ 'Visible on login page' | translate }}\"\n class=\"c8y-switch\"\n >\n <input\n id=\"visibleOnLoginPage\"\n name=\"visibleOnLoginPage\"\n type=\"checkbox\"\n [(ngModel)]=\"templateModel.visibleOnLoginPage\"\n />\n <span></span>\n <span class=\"control-label\">{{ 'Visible on login page' | translate }}</span>\n </label>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { memoize } from '@c8y/ngx-components';\nimport { pull } from 'lodash-es';\nimport { ControlContainer, NgForm } from '@angular/forms';\n\n@Component({\n selector: 'c8y-request-configuration',\n templateUrl: './request-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class RequestConfigurationComponent {\n @Input() templateModel;\n @Input() requestName: string;\n @Input() requestType:\n | 'authorizationRequest'\n | 'tokenRequest'\n | 'refreshRequest'\n | 'logoutRequest'\n | 'tokenValidationRequest';\n\n constructor(private controlContainer: ControlContainer) {}\n\n @memoize()\n shouldShow(field: string) {\n return field in this.templateModel;\n }\n\n get requestConfiguration() {\n return this.templateModel[this.requestType];\n }\n\n addCustomValue(array) {\n const customValue = {\n key: '',\n value: ''\n };\n array.push(customValue);\n }\n\n removeCustomValue(array, customValue) {\n pull(array, customValue);\n this.controlContainer.control.markAsDirty();\n }\n\n get showBody() {\n return this.requestConfiguration.method === 'POST' && this.requestType !== 'logoutRequest';\n }\n}\n","<fieldset ngModelGroup=\"{{ requestName }}\" id=\"{{ requestType }}\">\n <div class=\"col-md-12 p-t-24\">\n <div class=\"row m-l-8 m-r-8\">\n <div\n class=\"col-xs-12 col-sm-3 col-md-2 m-b-xs-8\"\n *ngIf=\"requestType !== 'tokenValidationRequest'\"\n >\n <div class=\"h4 text-normal text-right text-left-xs\">\n {{ requestName }}\n </div>\n </div>\n\n <div\n [ngClass]=\"\n requestType !== 'tokenValidationRequest' ? 'col-xs-12 col-sm-9 col-md-10 col-lg-9' : ''\n \"\n *ngIf=\"templateModel\"\n >\n <div class=\"legend form-block m-t-4\" *ngIf=\"requestType === 'tokenValidationRequest'\">\n <span>{{ requestName }}</span>\n </div>\n\n <div class=\"row\">\n <div class=\"col-md-10\">\n <c8y-form-group>\n <label [for]=\"requestType + 'url'\" class=\"control-label\" translate>URL</label>\n <input\n type=\"url\"\n class=\"form-control\"\n name=\"url\"\n [id]=\"requestType + 'url'\"\n [(ngModel)]=\"requestConfiguration.url\"\n [placeholder]=\"\n 'e.g. {{ example }}' | translate: { example: 'http://www.example.com/' }\n \"\n c8yDefaultValidation=\"httpUrl\"\n [required]=\"requestType !== 'logoutRequest'\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div *ngIf=\"showBody\">\n <div class=\"col-md-10\">\n <c8y-form-group>\n <label [for]=\"requestType + 'body'\" class=\"control-label\" translate>Body</label>\n <input\n type=\"text\"\n class=\"form-control\"\n name=\"body\"\n [id]=\"requestType + 'body'\"\n [(ngModel)]=\"requestConfiguration.body\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"requestType !== 'logoutRequest'\">\n <div class=\"legend form-block\" translate>Headers</div>\n <div\n class=\"tight-grid\"\n data-cy=\"refreshRequestHeaders\"\n *ngFor=\"let header of requestConfiguration.headers; index as headerIndex\"\n >\n <div class=\"col-md-5\">\n <c8y-form-group>\n <label\n [for]=\"requestType + 'headerKey' + headerIndex\"\n class=\"visible-sm visible-xs\"\n translate\n >\n Key\n </label>\n <input\n class=\"form-control\"\n [name]=\"'headerKey' + headerIndex\"\n [id]=\"requestType + 'headerKey' + headerIndex\"\n [(ngModel)]=\"header.key\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'Authorization' }\"\n required\n />\n </c8y-form-group>\n </div>\n <div class=\"col-md-5\">\n <c8y-form-group>\n <label\n [for]=\"requestType + 'headerValue' + headerIndex\"\n class=\"visible-sm visible-xs\"\n translate\n >\n Value\n </label>\n <input\n class=\"form-control\"\n [name]=\"'headerValue' + headerIndex\"\n [id]=\"requestType + 'headerValue' + headerIndex\"\n [(ngModel)]=\"header.value\"\n [placeholder]=\"\n 'e.g. {{ example }}' | translate: { example: 'Basic USY7jW9jb2RlX2=' }\n \"\n required\n />\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\">\n <c8y-form-group>\n <button\n class=\"btn btn-link hidden-xs hidden-sm\"\n type=\"button\"\n title=\"{{ 'Remove' | translate }}\"\n (click)=\"removeCustomValue(requestConfiguration.headers, header)\"\n >\n <i c8yIcon=\"minus-circle\" class=\"text-danger\"></i>\n </button>\n <button\n class=\"btn btn-danger btn-block btn-sm visible-xs visible-sm\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n (click)=\"removeCustomValue(requestConfiguration.headers, header)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n <span translate>Remove</span>\n </button>\n </c8y-form-group>\n </div>\n </div>\n <button\n class=\"btn btn-default m-t-8 m-b-16\"\n type=\"button\"\n title=\"{{ 'Add header' | translate }}\"\n (click)=\"addCustomValue(requestConfiguration.headers)\"\n >\n <i c8yIcon=\"plus-circle\" class=\"m-r-4\"></i>\n <span translate>Add header</span>\n </button>\n </div>\n\n <div class=\"legend form-block\" translate>Request parameters</div>\n <div\n class=\"tight-grid\"\n data-cy=\"requestParam\"\n *ngFor=\"let requestParam of requestConfiguration.requestParams; index as paramIndex\"\n >\n <div class=\"col-md-5\">\n <c8y-form-group>\n <label\n [for]=\"requestType + 'paramKey' + paramIndex\"\n class=\"visible-sm visible-xs\"\n translate\n >\n Key - {{ paramIndex }}\n </label>\n <input\n class=\"form-control\"\n [name]=\"'paramKey' + paramIndex\"\n [id]=\"requestType + 'paramKey' + paramIndex\"\n [(ngModel)]=\"requestParam.key\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'client_id' }\"\n required\n />\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-5\">\n <c8y-form-group>\n <label\n [for]=\"requestType + 'paramValue' + paramIndex\"\n class=\"visible-sm visible-xs\"\n translate\n >\n Value\n </label>\n <input\n class=\"form-control\"\n [name]=\"'paramValue' + paramIndex\"\n [id]=\"requestType + 'paramValue' + paramIndex\"\n [(ngModel)]=\"requestParam.value\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '${clientId}' }\"\n required\n />\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-1\">\n <c8y-form-group>\n <button\n class=\"btn btn-link hidden-xs hidden-sm\"\n type=\"button\"\n title=\"{{ 'Remove' | translate }}\"\n (click)=\"removeCustomValue(requestConfiguration.requestParams, requestParam)\"\n >\n <i c8yIcon=\"minus-circle\" class=\"text-danger\"></i>\n </button>\n\n <button\n class=\"btn btn-danger btn-block btn-sm visible-xs visible-sm\"\n type=\"button\"\n title=\"{{ 'Remove' | translate }}\"\n (click)=\"removeCustomValue(requestConfiguration.requestParams, requestParam)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n <span translate>Remove</span>\n </button>\n </c8y-form-group>\n </div>\n </div>\n\n <button\n class=\"btn btn-default m-t-8 m-b-16\"\n type=\"button\"\n title=\"{{ 'Add request parameter' | translate }}\"\n (click)=\"addCustomValue(requestConfiguration.requestParams)\"\n >\n <i c8yIcon=\"plus-circle\" class=\"m-r-4\"></i>\n <span translate>Add request parameter</span>\n </button>\n </div>\n </div>\n </div>\n</fieldset>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { memoize } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-user-id-configuration',\n templateUrl: './user-id-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class UserIdConfigurationComponent implements OnInit {\n private static id = 0;\n\n @Input() userIdConfig;\n @Input() withHeader = true;\n\n componentId = 0;\n\n @memoize()\n shouldShow(field: string) {\n return field in this.userIdConfig;\n }\n\n ngOnInit(): void {\n this.componentId = ++UserIdConfigurationComponent.id;\n }\n}\n","<div class=\"col-md-12 p-t-16\">\n <div class=\"row m-l-8 m-r-8\">\n <div *ngIf=\"withHeader\" class=\"col-xs-12 col-sm-3 col-md-2\">\n <div class=\"h4 text-normal text-right text-left-xs\" translate>User ID</div>\n </div>\n <div [ngClass]=\"withHeader ? 'col-xs-12 col-sm-9 col-md-10 col-lg-9' : 'row'\">\n <div *ngIf=\"!withHeader\" class=\"legend form-block m-t-4\">\n <span translate>User/App ID</span>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group *ngIf=\"userIdConfig.useConstantValue\">\n <label [for]=\"'constantValue' + componentId\" class=\"control-label\" translate>\n Constant value\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n [id]=\"'constantValue' + componentId\"\n [name]=\"'constantValue' + componentId\"\n [(ngModel)]=\"userIdConfig.constantValue\"\n required\n />\n </c8y-form-group>\n <c8y-form-group *ngIf=\"!userIdConfig.useConstantValue\">\n <label [for]=\"'jwtField' + componentId\" class=\"control-label\" translate>\n JWT field\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n [id]=\"'jwtField' + componentId\"\n [name]=\"'jwtField' + componentId\"\n [(ngModel)]=\"userIdConfig.jwtField\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'upn' }\"\n required\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <div class=\"form-group\" *ngIf=\"shouldShow('useConstantValue')\">\n <label\n [for]=\"'useConstantValue' + componentId\"\n title=\"{{ 'Use constant value' | translate }}\"\n class=\"c8y-switch m-t-24\"\n >\n <input\n type=\"checkbox\"\n [name]=\"'useConstantValue' + componentId\"\n [id]=\"'useConstantValue' + componentId\"\n [(ngModel)]=\"userIdConfig.useConstantValue\"\n />\n <span></span>\n <span class=\"control-label\">{{ 'Use constant value' | translate }}</span>\n </label>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components';\nimport { ControlContainer, NgForm } from '@angular/forms';\n\n@Component({\n selector: 'c8y-sso-user-data-mapping',\n templateUrl: './user-data-mapping.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class UserDataMappingComponent {\n @Input() templateModel;\n CLAIM_NAMES = gettext('Token claims can be checked in Audit Logs under Single sign-on type.');\n\n ngAfterContentInit() {\n if (!this.templateModel.accessTokenToUserDataMappings) {\n this.templateModel.accessTokenToUserDataMappings = {};\n }\n }\n}\n","<div class=\"col-md-12 p-t-16\">\n <div class=\"row m-l-8 m-r-8\">\n <div class=\"col-xs-12 col-sm-3 col-md-2\">\n <div class=\"h4 text-normal text-right text-left-xs\" translate>User data mappings</div>\n </div>\n\n <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\">\n <div class=\"legend form-block m-t-4\">\n <span translate>Claim names</span>\n <button\n class=\"btn btn-clean\"\n type=\"button\"\n [attr.aria-label]=\"'Claim names' | translate\"\n popover=\"{{ CLAIM_NAMES | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n >\n <i [c8yIcon]=\"'question-circle-o'\" class=\"text-info\"></i>\n </button>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"firstName\" class=\"control-label\" translate>First name</label>\n <input\n class=\"form-control\"\n name=\"firstName\"\n id=\"firstName\"\n [(ngModel)]=\"templateModel.accessTokenToUserDataMappings.firstNameClaimName\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'given_name' }\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"lastName\" class=\"control-label\" translate>Last name</label>\n <input\n class=\"form-control\"\n name=\"lastName\"\n id=\"lastName\"\n [(ngModel)]=\"templateModel.accessTokenToUserDataMappings.lastNameClaimName\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'family_name' }\"\n />\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"email\" class=\"control-label\" translate>Email</label>\n <input\n class=\"form-control\"\n name=\"email\"\n id=\"email\"\n [(ngModel)]=\"templateModel.accessTokenToUserDataMappings.emailClaimName\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'email' }\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"phoneNumber\" class=\"control-label\" translate>Phone number</label>\n <input\n class=\"form-control\"\n name=\"phoneNumber\"\n id=\"phoneNumber\"\n [(ngModel)]=\"templateModel.accessTokenToUserDataMappings.phoneNumberClaimName\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'phone_number' }\"\n />\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { gettext } from '@c8y/ngx-components';\n\nexport const relations = [\n {\n name: 'EQ',\n value: 'EQ',\n label: '=',\n ordinal: 0\n },\n {\n name: 'NEQ',\n value: 'NEQ',\n label: '!=',\n ordinal: 1\n },\n {\n name: 'GT',\n value: 'GT',\n label: '>',\n ordinal: 2\n },\n {\n name: 'LT',\n value: 'LT',\n label: '<',\n ordinal: 3\n },\n {\n name: 'GTE',\n value: 'GTE',\n label: '>=',\n ordinal: 4\n },\n {\n name: 'LTE',\n value: 'LTE',\n label: '<=',\n ordinal: 5\n },\n {\n name: 'IN',\n value: 'IN',\n label: gettext('in`value-range`'),\n ordinal: 6\n }\n];\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { pull } from 'lodash-es';\nimport { relations } from './dynamic-accesss-mapping-relations.model';\nimport { ChildPredicate } from '../../sso-configuration.model';\n\n@Component({\n selector: 'c8y-sso-child-predicates',\n templateUrl: './child-predicates.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class ChildPredicatesComponent {\n @Input() childPredicates: ChildPredicate[];\n @Input() accessMappingIndex: string;\n @Output() onRemoveAllChildPredicates: EventEmitter<null> = new EventEmitter();\n\n relations = relations;\n\n constructor(private controlContainer: ControlContainer) {}\n\n removeChildPredicate(childPredicate: ChildPredicate) {\n pull(this.childPredicates, childPredicate);\n if (this.childPredicates.length === 0) {\n this.onRemoveAllChildPredicates.emit();\n }\n this.controlContainer.control.markAsDirty();\n }\n\n addChildPredicate() {\n this.childPredicates.push({\n operator: 'EQ',\n parameterPath: '',\n value: ''\n });\n }\n}\n","<div class=\"legend form-block m-t-4\" translate>When</div>\n<div class=\"tight-grid hidden-sm hidden-xs\">\n <div class=\"col-md-4\">\n <label translate>Key</label>\n </div>\n <div class=\"col-md-2\">\n <label translate>Operator`logical`</label>\n </div>\n <div class=\"col-md-4\">\n <label translate>Value</label>\n </div>\n</div>\n<div\n class=\"tight-grid\"\n *ngFor=\"\n let childPredicate of childPredicates;\n last as isLast;\n index as idx\n \"\n>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label\n [for]=\"'parameterPath' + accessMappingIndex + idx\"\n class=\"visible-sm visible-xs\"\n translate\n >\n Key\n </label>\n <input\n [name]=\"'parameterPath' + accessMappingIndex + idx\"\n [id]=\"'parameterPath' + accessMappingIndex + idx\"\n type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"childPredicate.parameterPath\"\n placeholder=\"{{ 'Key' | translate }}\"\n required\n />\n </c8y-form-group>\n </div>\n <div class=\"col-md-2\">\n <c8y-form-group>\n <label\n [for]=\"'operator' + accessMappingIndex + idx\"\n class=\"visible-sm visible-xs\"\n translate\n >\n Operator`logical`\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n [name]=\"'operator' + accessMappingIndex + idx\"\n [id]=\"'operator' + accessMappingIndex + idx\"\n [(ngModel)]=\"childPredicate.operator\"\n required\n >\n <option *ngFor=\"let relation of relations\" [ngValue]=\"relation.value\">\n {{ relation.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label [for]=\"'value' + accessMappingIndex + idx\" class=\"visible-sm visible-xs\" translate>\n Value\n </label>\n <input\n [name]=\"'value' + accessMappingIndex + idx\"\n [id]=\"'value' + accessMappingIndex + idx\"\n type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"childPredicate.value\"\n placeholder=\"{{ 'Value' | translate }}\"\n required\n />\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\">\n <c8y-form-group>\n <button\n name=\"removeButton\"\n class=\"btn btn-link hidden-xs hidden-sm\"\n (click)=\"removeChildPredicate(childPredicate)\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n >\n <i c8yIcon=\"minus-circle\" class=\"text-danger\"></i>\n </button>\n <button\n name=\"removeButton\"\n class=\"btn btn-danger btn-block btn-sm visible-xs visible-sm\"\n (click)=\"removeChildPredicate(childPredicate)\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n <span translate>Remove</span>\n </button>\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\">\n <c8y-form-group *ngIf=\"isLast\">\n <button\n title=\"{{ 'and' | translate }}\"\n class=\"btn btn-default btn-xs hidden-xs hidden-sm\"\n (click)=\"addChildPredicate()\"\n type=\"button\"\n translate\n >\n and\n </button>\n <button\n title=\"{{ 'and' | translate }}\"\n class=\"btn btn-default btn-block btn-sm visible-xs visible-sm\"\n (click)=\"addChildPredicate()\"\n type=\"button\"\n translate\n >\n and\n </button>\n </c8y-form-group>\n </div>\n</div>\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { IApplication, IUserGroup } from '@c8y/client';\nimport { AccessMapping } from '../../sso-configuration.model';\n\n@Component({\n selector: 'c8y-sso-dynamic-access-mapping',\n templateUrl: './dynamic-access-mapping.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class DynamicAccessMappingComponent {\n @Input() groups: IUserGroup[];\n selectedGroups: IUserGroup[];\n\n @Input() apps: IApplication[];\n selectedApps: IApplication[];\n\n @Input() accessMapping: AccessMapping;\n @Output() onRemoveAccessMapping: EventEmitter<AccessMapping> = new EventEmitter();\n\n @Input() accessMappingIndex: number;\n\n ngOnChanges(): void {\n if (this.accessMapping && this.apps && this.groups) {\n this.setSelectedItems();\n }\n }\n\n onRemoveAllChildPredicates() {\n this.onRemoveAccessMapping.emit(this.accessMapping);\n }\n\n getIds(selectedItems) {\n return selectedItems.map(item => parseInt(item.id, 10));\n }\n\n private setSelectedItems() {\n if (this.accessMapping) {\n if (this.accessMapping.thenGroups) {\n this.selectedGroups = this.groups.filter(item =>\n this.accessMapping.thenGroups.includes(item.id)\n );\n }\n if (this.accessMapping.thenApplications) {\n this.selectedApps = this.apps.filter(item =>\n this.accessMapping.thenApplications.includes(+item.id)\n );\n }\n }\n }\n}\n","<div class=\"card\">\n <div class=\"card-block overflow-visible\" *ngIf=\"accessMapping.when.childPredicates.length != 0\">\n <c8y-sso-child-predicates\n [childPredicates]=\"accessMapping.when.childPredicates\"\n [accessMappingIndex]=\"'am' + accessMappingIndex\"\n (onRemoveAllChildPredicates)=\"onRemoveAllChildPredicates()\"\n ></c8y-sso-child-predicates>\n\n <div class=\"legend form-block\" translate>Provide access to</div>\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <div title=\"{{ 'Default global roles' | translate }}\" class=\"form-group\">\n <label [for]=\"'groups' + accessMappingIndex\" class=\"control-label\">\n {{ 'Default global roles' | translate }}\n </label>\n <c8y-select\n [id]=\"'groups' + accessMappingIndex\"\n [items]=\"groups\"\n [selected]=\"selectedGroups\"\n [disableApplyOnNoSelection]=\"true\"\n (onChange)=\"selectedGroups = $event; accessMapping.thenGroups = getIds($event)\"\n ></c8y-select>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <div title=\"{{ 'Default applications' | translate }}\" class=\"form-group\">\n <label [for]=\"'apps' + accessMappingIndex\" class=\"control-label\">\n {{ 'Default applications' | translate }}\n </label>\n <c8y-select\n [id]=\"'apps' + accessMappingIndex\"\n [items]=\"apps\"\n [selected]=\"selectedApps\"\n [disableApplyOnNoSelection]=\"true\"\n (onChange)=\"selectedApps = $event; accessMapping.thenApplications = getIds($event)\"\n ></c8y-select>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { Component, EventEmitter } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { IIdentified } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-sso-inventory-roles-modal',\n templateUrl: './inventory-roles-modal.component.html'\n})\nexport class InventoryRolesModalComponent {\n selectedGroups: IIdentified[];\n\n resultEmitter: EventEmitter<IIdentified[]> = new EventEmitter<IIdentified[]>();\n\n label = gettext('Groups');\n\n constructor(public modal: BsModalRef) {}\n\n dismiss() {\n this.modal.hide();\n }\n\n select() {\n this.resultEmitter.emit(this.selectedGroups);\n this.modal.hide();\n }\n}\n","<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <h1 id=\"modal-title\" class=\"h3\">\n {{ 'Select group(s)' | translate }}\n </h1>\n </div>\n <div class=\"p-16 text-center separator-bottom\">\n <p class=\"text-medium text-16\" translate>Select group(s) from inventory to assign roles</p>\n </div>\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body p-t-8\" id=\"modal-body\">\n <c8y-asset-selector-miller\n [(ngModel)]=\"selectedGroups\"\n [config]=\"{\n label: label,\n showFilter: true,\n view: 'tree',\n multi: true,\n groupsSelectable: true,\n columnHeaders: true,\n singleColumn: true,\n groupsOnly: true\n }\"\n ></c8y-asset-selector-miller>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n (click)=\"dismiss()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n title=\"{{ 'Select' | translate }}\"\n (click)=\"select()\"\n >\n {{ 'Select' | translate }}\n </button>\n </div>\n</div>\n","import { Component, Output, Input, EventEmitter } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { InventoryMapping, InventoryRole } from '../../sso-configuration.model';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { InventoryRolesModalComponent } from './inventory-roles-modal.component';\nimport { take } from 'rxjs/operators';\nimport { IIdentified } from '@c8y/client';\n\n@Component({\n selector: 'c8y-sso-inventory-roles-mapping',\n templateUrl: './inventory-roles-mapping.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class InventoryRolesMappingComponent {\n @Input() inventoryMapping: InventoryMapping;\n @Input() inventoryMappingIndex: number;\n\n @Input() inventoryRoles: IIdentified[] = [];\n selectedInventoryRoles: IIdentified[] = [];\n\n @Output() onRemoveInventoryMapping: EventEmitter<InventoryMapping> = new EventEmitter();\n\n constructor(private bsModal: BsModalService) {}\n\n ngOnChanges(): void {\n this.setSelectedInventoryRoles();\n }\n\n onRemoveAllChildPredicates() {\n this.onRemoveInventoryMapping.emit(this.inventoryMapping);\n }\n\n getIds(selectedItems: IIdentified[]) {\n return selectedItems.map(item => item.id);\n }\n\n removeInventoryRole(inventoryRole: InventoryRole) {\n this.inventoryMapping.thenInventoryRoles = this.inventoryMapping.thenInventoryRoles.filter(\n value => value.managedObject !== inventoryRole.managedObject\n );\n delete this.selectedInventoryRoles[inventoryRole.managedObject];\n }\n\n addInventoryRoles() {\n const currentlySelectedGroups: IIdentified[] = this.inventoryMapping.thenInventoryRoles.map(\n inventoryRole => ({ id: inventoryRole.managedObject })\n );\n const modal = this.bsModal.show(InventoryRolesModalComponent, {\n ignoreBackdropClick: true,\n ariaLabelledBy: 'modal-title',\n initialState: {\n selectedGroups: currentlySelectedGroups\n }\n });\n modal.content.resultEmitter.pipe(take(1)).subscribe(selectedGroups => {\n const newSelectedGroups = selectedGroups.filter(\n group => !currentlySelectedGroups.some(({ id }) => id === group.id)\n );\n const newInventoryRoles: InventoryRole[] = newSelectedGroups.map(\n group => ({ managedObject: group.id, roleIds: [] } as InventoryRole)\n );\n this.inventoryMapping.thenInventoryRoles =\n this.inventoryMapping.thenInventoryRoles.concat(newInventoryRoles);\n });\n }\n\n private setSelectedInventoryRoles() {\n if (this.inventoryMapping && this.inventoryMapping.thenInventoryRoles && this.inventoryRoles) {\n this.inventoryMapping.thenInventoryRoles.forEach(inventoryRole => {\n this.selectedInventoryRoles[inventoryRole.managedObject] = this.inventoryRoles.filter(\n item => inventoryRole.roleIds.includes(+item.id)\n );\n });\n }\n }\n}\n","<div class=\"card\">\n <div\n class=\"card-block overflow-visible\"\n *ngIf=\"inventoryMapping.when.childPredicates.length !== 0\"\n >\n <c8y-sso-child-predicates\n [childPredicates]=\"inventoryMapping.when.childPredicates\"\n [accessMappingIndex]=\"'irm' + inventoryMappingIndex\"\n (onRemoveAllChildPredicates)=\"onRemoveAllChildPredicates()\"\n ></c8y-sso-child-predicates>\n\n <div class=\"legend form-block\" translate>Provide inventory roles</div>\n <div *ngIf=\"inventoryMapping.thenInventoryRoles.length !== 0\">\n <div class=\"tight-grid hidden-sm hidden-xs\">\n <div class=\"col-md-5\">\n <label translate>Groups</label>\n </div>\n <div class=\"col-md-6\">\n <label translate>Inventory roles</label>\n </div>\n </div>\n <div\n class=\"tight-grid\"\n *ngFor=\"let inventoryRole of inventoryMapping.thenInventoryRoles; index as idx\"\n >\n <div class=\"col-md-5\">\n <i class=\"c8y-icon c8y-icon-group m-r-4\"></i>\n <span>{{ inventoryRole.managedObject | moName | async }}</span>\n </div>\n <div class=\"col-md-6\">\n <div title=\"{{ 'Inventory roles' | translate }}\" class=\"form-group\">\n <c8y-select\n [id]=\"'ir' + idx + accessMappingIndex\"\n [items]=\"inventoryRoles\"\n [selected]=\"selectedInventoryRoles[inventoryRole.managedObject]\"\n [disableApplyOnNoSelection]=\"true\"\n (onChange)=\"\n selectedInventoryRoles[inventoryRole.managedObject] = $event;\n inventoryRole.roleIds = getIds($event)\n \"\n ></c8y-select>\n </div>\n </div>\n <div class=\"col-md-1\">\n <c8y-form-group>\n <button\n name=\"removeButton\"\n class=\"btn btn-link hidden-xs hidden-sm\"\n (click)=\"removeInventoryRole(inventoryRole)\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n >\n <i c8yIcon=\"minus-circle\" class=\"text-danger\"></i>\n </button>\n <button\n name=\"removeButton\"\n class=\"btn btn-danger btn-block btn-sm visible-xs visible-sm\"\n (click)=\"removeInventoryRole(inventoryRole)\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n <span translate>Remove</span>\n </button>\n </c8y-form-group>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <button\n id=\"add-inventory-roles-button\"\n class=\"btn btn-default m-b-16\"\n type=\"button\"\n title=\"{{ 'Add inventory roles' | translate }}\"\n (click)=\"addInventoryRoles()\"\n >\n <i c8yIcon=\"plus-circle\" class=\"m-r-4\"></i>\n {{ 'Add inventory roles' | translate }}\n </button>\n </div>\n </div>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components';\nimport { pull, defaultsDeep } from 'lodash-es';\nimport { IApplication, IIdentified, IUserGroup } from '@c8y/client';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { InventoryMapping, AccessMapping } from '../../sso-configuration.model';\n\n@Component({\n selector: 'c8y-sso-access-mapping',\n templateUrl: './access-mapping.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class AccessMappingComponent {\n @Input() apps: IApplication[];\n @Input() groups: IUserGroup[];\n @Input() inventoryRoles: IIdentified[];\n @Input() templateModel;\n\n USE_ACCESS_MAPPING_ON_USER_CREATION_TOOLTIP = gettext(\n 'The access mapping will be executed only once during the first login, then the administrator can edit the user roles. During the next login, these mappings will not be executed.'\n );\n USE_ACCESS_MAPPING_ON_USER_CREATION_OPTION = gettext(\n 'Use dynamic access mapping only on user creation'\n );\n\n UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_TOOLTIP = gettext(\n 'The access mapping will be executed only once during the first login, then the administrator can edit the user roles. During the next login only the roles listed in the access mappings will be updated.'\n );\n UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_OPTION = gettext(\n 'Roles selected in the rules above will be reassigned to a user on each log in and other ones will be unchanged'\n );\n\n CLEAR_AND_UPDATED_ROLES_ON_EACH_LOG_IN_TOOLTIP = gettext(\n 'The access mapping will be executed during the first login. The administrator cannot edit the SSO user roles. During the next login all the roles will be cleared and the mapping will be executed again.'\n );\n CLEAR_AND_UPDATED_ROLES_ON_EACH_LOG_IN_OPTION = gettext(\n 'Roles selected in the rules above will be reassigned to a user on each log in and other ones will be cleared'\n );\n\n constructor(private controlContainer: ControlContainer) {}\n\n ngOnChanges(): void {\n if (this.templateModel && this.apps && this.groups) {\n this.setDynamicMapping();\n }\n }\n\n addAccessMapping() {\n const emptyMapping: AccessMapping = {\n when: {\n operator: 'AND',\n childPredicates: [{ parameterPath: '', operator: 'EQ', value: '' }]\n },\n thenGroups: [],\n thenApplications: []\n };\n this.templateModel.onNewUser.dynamicMapping.mappings.push(emptyMapping);\n }\n\n addInventoryMapping() {\n const emptyInventoryMapping: InventoryMapping = {\n when: {\n operator: 'AND',\n childPredicates: [{ parameterPath: '', operator: 'EQ', value: '' }]\n },\n thenInventoryRoles: []\n };\n this.templateModel.onNewUser.dynamicMapping.inventoryMappings.push(emptyInventoryMapping);\n }\n\n onRemove(accessMapping: AccessMapping) {\n pull(this.templateModel.onNewUser.dynamicMapping.mappings, accessMapping);\n }\n\n onRemoveInventoryMapping(inventoryMapping: InventoryMapping) {\n pull(this.templateModel.onNewUser.dynamicMapping.inventoryMappings, inventoryMapping);\n }\n\n setDynamicMappingConfiguration(\n mapRolesOnlyForNewUser: boolean,\n manageRolesOnlyFromAccessMapping = false\n ) {\n this.templateModel.onNewUser.dynamicMapping.configuration = {\n mapRolesOnlyForNewUser,\n manageRolesOnlyFromAccessMapping\n };\n this.controlContainer.control.markAsDirty();\n }\n\n get mapRolesOnlyForNewUser() {\n return this.templateModel.onNewUser.dynamicMapping.configuration.mapRolesOnlyForNewUser;\n }\n\n get manageRolesOnlyFromAccessMapping() {\n return this.templateModel.onNewUser.dynamicMapping.configuration\n .manageRolesOnlyFromAccessMapping;\n }\n\n private setDynamicMapping() {\n defaultsDeep(this.templateModel.onNewUser, {\n dynamicMapping: {\n mappings: [],\n inventoryMappings: [],\n configuration: { mapRolesOnlyForNewUser: false, manageRolesOnlyFromAccessMapping: false }\n }\n });\n }\n}\n","<div class=\"col-md-12 p-t-16\">\n <div class=\"row m-l-8 m-r-8\">\n <div class=\"col-xs-12 col-sm-3 col-md-2\">\n <div class=\"h4 text-normal text-right text-left-xs\" translate>Access mapping</div>\n </div>\n\n <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\">\n <div class=\"dynamic-access\">\n <div class=\"legend form-block m-t-4\" translate>Dynamic access mapping</div>\n <c8y-form-group>\n <c8y-ui-empty-state\n *ngIf=\"templateModel.onNewUser.dynamicMapping.mappings.length === 0\"\n [icon]=\"'list'\"\n [title]=\"'No access mapping rules defined.' | translate\"\n [subtitle]=\"'Click below to add a new mapping.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n <div\n *ngFor=\"\n let accessMapping of templateModel.onNewUser.dynamicMapping.mappings;\n index as idx\n \"\n >\n <c8y-sso-dynamic-access-mapping\n [accessMapping]=\"accessMapping\"\n (onRemoveAccessMapping)=\"onRemove(accessMapping)\"\n [apps]=\"apps\"\n [groups]=\"groups\"\n [accessMappingIndex]=\"idx\"\n ></c8y-sso-dynamic-access-mapping>\n </div>\n <div class=\"scroll-column-footer\">\n <button\n id=\"add-access-mapping-button\"\n class=\"btn btn-default m-b-16\"\n type=\"button\"\n title=\"{{ 'Add access mapping' | translate }}\"\n (click)=\"addAccessMapping()\"\n >\n <i c8yIcon=\"plus-circle\" class=\"m-r-4\"></i>\n {{ 'Add access mapping' | translate }}\n </button>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"dynamic-access\">\n <div class=\"legend form-block m-t-4\" translate>Inventory roles mapping</div>\n <c8y-form-group>\n <c8y-ui-empty-state\n *ngIf=\"templateModel.onNewUser.dynamicMapping.inventoryMappings.length === 0\"\n [icon]=\"'list'\"\n [title]=\"'No inventory roles mapping rules defined.' | translate\"\n [subtitle]=\"'Click below to add a new mapping.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n <div\n *ngFor=\"\n let inventoryMapping of templateModel.onNewUser.dynamicMapping.inventoryMappings;\n index as idx\n \"\n >\n <c8y-sso-inventory-roles-mapping\n [inventoryRoles]=\"inventoryRoles\"\n [inventoryMapping]=\"inventoryMapping\"\n (onRemoveInventoryMapping)=\"onRemoveInventoryMapping(inventoryMapping)\"\n [inventoryMappingIndex]=\"idx\"\n ></c8y-sso-inventory-roles-mapping>\n </div>\n <div class=\"scroll-column-footer\">\n <button\n id=\"add-inventory-mapping-button\"\n class=\"btn btn-default m-b-16\"\n type=\"button\"\n title=\"{{ 'Add inventory roles mapping' | translate }}\"\n (click)=\"addInventoryMapping()\"\n >\n <i c8yIcon=\"plus-circle\" class=\"m-r-4\"></i>\n {{ 'Add inventory roles mapping' | translate }}\n </button>\n </div>\n </c8y-form-group>\n </div>\n <c8y-form-group>\n <label\n title=\"{{ USE_ACCESS_MAPPING_ON_USER_CREATION_OPTION | translate }}\"\n class=\"c8y-radio input-sm\"\n >\n <input\n type=\"radio\"\n name=\"dynamicAccessMappingConfiguration\"\n [checked]=\"mapRolesOnlyForNewUser\"\n (change)=\"setDynamicMappingConfiguration(true)\"\n />\n <span></span>\n <span>{{ USE_ACCESS_MAPPING_ON_USER_CREATION_OPTION | translate }}</span>\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ USE_ACCESS_MAPPING_ON_USER_CREATION_TOOLTIP | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </label>\n <label\n title=\"{{ UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_OPTION | translate }}\"\n class=\"c8y-radio input-sm\"\n >\n <input\n type=\"radio\"\n name=\"dynamicAccessMappingConfiguration\"\n [checked]=\"!mapRolesOnlyForNewUser && manageRolesOnlyFromAccessMapping\"\n (change)=\"setDynamicMappingConfiguration(false, true)\"\n />\n <span></span>\n <span>\n {{ UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_OPTION | translate }}\n </span>\n <button\n type=\"button\"\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_TOOLTIP | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </label>\n <label\n title=\"{{ CLEAR_AND_UPDATED_ROLES_ON_EACH_LOG_IN_OPTION | translate }}\"\n class=\"c8y-radio input-sm\"\n >\n <input\n type=\"radio\"\n name=\"dynamicAccessMappingConfiguration\"\n [checked]=\"!mapRolesOnlyForNewUser && !manageRolesOnlyFromAccessMapping\"\n (change)=\"setDynamicMappingConfiguration(false, false)\"\n />\n <span></span>\n <span>\n {{ CLEAR_AND_UPDATED_ROLES_ON_EACH_LOG_IN_OPTION | translate }}\n </span>\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ CLEAR_AND_UPDATED_ROLES_ON_EACH_LOG_IN_TOOLTIP | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </label>\n </c8y-form-group>\n </div>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { gettext, memoize } from '@c8y/ngx-components';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport {\n algorithmTypeConfig,\n CertificateType,\n certificateTypeConfig,\n CustomCertificate\n} from './signature-configuration.model';\n\n@Component({\n selector: 'c8y-sso-signature-configuration',\n templateUrl: './signature-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class SignatureConfigurationComponent {\n @Input() templateModel;\n\n certificateType = CertificateType;\n certificateTypes = certificateTypeConfig;\n\n algorithmTypes = algorithmTypeConfig;\n\n CERTIFICATE_ID_FIELD_POPOVER = gettext(\n 'This is the name of the field in the token whose value will be used to select one of the certificates below which has matching \"Certificate ID value\".'\n );\n\n constructor(protected controlContainer: ControlContainer) {}\n\n @memoize()\n shouldShow(field: string) {\n return field in this.templateModel;\n }\n\n removeCustomCertificate(customCertificate: CustomCertificate) {\n this.templateModel.signatureVerificationConfig.manual.removeCustomCertificate(\n customCertificate\n );\n this.controlContainer.control.markAsDirty();\n }\n}\n","<div class=\"col-md-12 p-t-16\">\n <div class=\"row m-l-8 m-r-8 m-b-8\">\n <div class=\"col-xs-12 col-sm-3 col-md-2\">\n <div class=\"h4 text-normal text-right text-left-xs\" translate>Signature verification</div>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <div *ngIf=\"shouldShow('certificateType')\" class=\"form-group p-relative\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <label for=\"certificateType\" class=\"control-label\" translate>Verifier</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"certificateType\"\n name=\"certificateType\"\n [(ngModel)]=\"templateModel.signatureVerificationConfig.certificateTypeChosen\"\n >\n <option\n *ngFor=\"let certificateType of certificateTypes | keyvalue\"\n [ngValue]=\"certificateType.key\"\n >\n {{ certificateType.value.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div\n id=\"adfs\"\n *ngIf=\"\n templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.ADFS\n \"\n >\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"adfsManifestUrl\" class=\"control-label\" translate>ADFS manifest URL</label>\n <input\n type=\"url\"\n class=\"form-control\"\n required\n [placeholder]=\"\n 'e.g. {{ example }}'\n | translate\n : {\n example:\n 'https://adfs.tenant.com/federationmetadata/federationmetadata.xml'\n }\n \"\n [(ngModel)]=\"templateModel.signatureVerificationConfig.adfsManifest.manifestUrl\"\n name=\"adfsManifestUrl\"\n id=\"adfsManifestUrl\"\n />\n </c8y-form-group>\n </div>\n </div>\n </div>\n\n <div\n id=\"add\"\n *ngIf=\"\n templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.AZURE\n \"\n >\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"publicKeyDiscoveryUrl\" class=\"control-label\" translate>\n Public key discovery URL\n </label>\n <input\n type=\"url\"\n id=\"publicKeyDiscoveryUrl\"\n class=\"form-control\"\n required\n [placeholder]=\"\n 'e.g. {{ example }}'\n | translate\n : { example: 'https://login.microsoftonline.de/tenant/discovery/keys' }\n \"\n name=\"publicKeyDiscoveryUrl\"\n [(ngModel)]=\"templateModel.signatureVerificationConfig.aad.publicKeyDiscoveryUrl\"\n />\n </c8y-form-group>\n </div>\n </div>\n </div>\n\n <div\n id=\"jwks\"\n *ngIf=\"\n templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.JWKS\n \"\n >\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"jwksPublicKeyDiscoveryUrl\" class=\"control-label\" translate>\n JWKS URL\n </label>\n <input\n type=\"url\"\n class=\"form-control\"\n id=\"jwksPublicKeyDiscoveryUrl\"\n required\n [placeholder]=\"\n 'e.g. {{ example }}' | translate: { example: 'http://www.example.com/' }\n \"\n name=\"jwksUri\"\n [(ngModel)]=\"templateModel.signatureVerificationConfig.jwks.jwksUri\"\n />\n </c8y-form-group>\n </div>\n </div>\n </div>\n\n <div\n id=\"manual\"\n *ngIf=\"\n templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.CUSTOM\n \"\n >\n <c8y-form-group\n *ngIf=\"templateModel.signatureVerificationConfig.manual.customCertificates.length > 1\"\n >\n <div class=\"legend form-block\" translate>Manual</div>\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <label for=\"certIdField\" class=\"control-label\">\n {{ 'Certificate ID field' | translate }}\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ CERTIFICATE_ID_FIELD_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n name=\"certIdField\"\n id=\"certIdField\"\n [(ngModel)]=\"templateModel.signatureVerificationConfig.manual.certIdField\"\n required\n />\n </div>\n </div>\n </c8y-form-group>\n\n <div>\n <div class=\"legend form-block\" translate>Certificates</div>\n <div\n *ngFor=\"\n let customCertificate of templateModel.signatureVerificationConfig.manual\n .customCertificates;\n index as crtIndex\n \"\n >\n <div class=\"row\">\n <div\n class=\"col-sm-6\"\n *ngIf=\"\n templateModel.signatureVerificationConfig.manual.customCertificates.length > 1\n \"\n >\n <c8y-form-group>\n <label\n [for]=\"'customCertificateValue' + crtIndex\"\n class=\"control-label\"\n translate\n >\n Certificate ID value\n </label>\n <input\n [name]=\"'customCertificateValue' + crtIndex\"\n [id]=\"'customCertificateValue' + crtIndex\"\n type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"customCertificate.key\"\n required\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Type' | translate }}\n </label>\n <label\n title=\"{{ algorithmType.value.label | translate }}\"\n class=\"c8y-radio input-sm\"\n *ngFor=\"let algorithmType of algorithmTypes | keyvalue; index as algIndex\"\n >\n <input\n type=\"radio\"\n [name]=\"'alg' + crtIndex + algIndex\"\n [value]=\"algorithmType.key\"\n [(ngModel)]=\"customCertificate.alg\"\n />\n <span></span>\n <span>{{ algorithmType.value.label | translate }}</span>\n </label>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n [for]=\"'publicKey' + crtIndex\"\n *ngIf=\"customCertificate.alg === algorithmTypes.PCKS.value\"\n translate\n >\n Certificate in PEM format\n </label>\n <label\n class=\"control-label\"\n [for]=\"'publicKey' + crtIndex\"\n *ngIf=\"customCertificate.alg === algorithmTypes.RSA.value\"\n translate\n >\n Public key in PEM format\n </label>\n <input\n [name]=\"'publicKey' + crtIndex\"\n [id]=\"'publicKey' + crtIndex\"\n type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"customCertificate.publicKey\"\n required\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-3\">\n <div class=\"form-group datepicker\">\n <c8y-form-group>\n <label [for]=\"'validFromPicker' + crtIndex\" class=\"control-label\">\n {{ 'Valid from' | translate }}\n </label>\n <input\n [name]=\"'validFromPicker' + crtIndex\"\n [id]=\"'validFromPicker' + crtIndex\"\n [(ngModel)]=\"customCertificate.validFrom\"\n class=\"form-control\"\n placeholder=\"{{ 'Date from' | translate }}\"\n [bsConfig]=\"{ customTodayClass: 'today' }\"\n [maxDate]=\"customCertificate.validTill\"\n bsDatepicker\n required\n />\n </c8y-form-group>\n </div>\n </div>\n <div class=\"col-sm-3\">\n <div class=\"form-group datepicker\">\n <c8y-form-group>\n <label [for]=\"'validTillPicker' + crtIndex\" class=\"control-label\">\n {{ 'Valid till' | translate }}\n </label>\n <input\n [name]=\"'validTillPicker' + crtIndex\"\n [id]=\"'validTillPicker' + crtIndex\"\n [(ngModel)]=\"customCertificate.validTill\"\n class=\"form-control\"\n placeholder=\"{{ 'Date to' | translate }}\"\n aria-label=\"{{ 'Date to' | translate }}\"\n [bsConfig]=\"{ customTodayClass: 'today' }\"\n bsDatepicker\n [minDate]=\"customCertificate.validFrom\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n </div>\n <div\n class=\"form-group\"\n *ngIf=\"templateModel.signatureVerificationConfig.manual.customCertificates.length > 1\"\n >\n <button\n class=\"btn btn-danger btn-sm hidden-xs\"\n type=\"button\"\n title=\"{{ 'Delete certificate' | translate }}\"\n (click)=\"removeCustomCertificate(customCertificate)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n <span>{{ 'Delete certificate' | translate }}</span>\n </button>\n\n <button\n class=\"btn btn-danger btn-block btn-sm visible-xs\"\n type=\"button\"\n title=\"{{ 'Delete certificate' | translate }}\"\n (click)=\"removeCustomCertificate(customCertificate)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n <span>{{ 'Delete certificate' | translate }}</span>\n </button>\n </div>\n <div\n class=\"separator-top p-b-24\"\n *ngIf=\"templateModel.signatureVerificationConfig.manual.customCertificates.length > 1\"\n ></div>\n </div>\n <button\n class=\"btn btn-default m-b-16 m-t-8\"\n type=\"button\"\n title=\"{{ 'Add certificate' | translate }}\"\n (click)=\"templateModel.signatureVerificationConfig.manual.addCustomCertificate()\"\n name=\"addCertificate\"\n >\n <i c8yIcon=\"plus-circle\" class=\"m-r-4\"></i>\n <span>{{ 'Add certificate' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { validationMethodConfig } from './external-token-config.model';\nimport { RequestConfiguration } from './request-configuration.model';\n\n@Component({\n selector: 'c8y-external-token-config',\n templateUrl: './external-token-config.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class ExternalTokenConfigComponent {\n @Input() templateModel;\n\n validationMethods = validationMethodConfig;\n\n get externalTokenConfig() {\n return this.templateModel.externalTokenConfig;\n }\n\n onValidationMethodChange(event) {\n this.externalTokenConfig.validationMethod = event;\n this.externalTokenConfig.tokenValidationRequest = new RequestConfiguration(\n this.validationMethods[event].defaults\n );\n }\n}\n","<div class=\"col-md-12 p-16\">\n <div class=\"row m-l-8 m-r-8\">\n <div class=\"col-xs-12 col-sm-3 col-md-2\">\n <div class=\"h4 text-normal text-right text-left-xs\" translate>\n External token configuration\n </div>\n </div>\n\n <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9 p-0\" *ngIf=\"templateModel\">\n <div class=\"row p-l-4\">\n <div class=\"col-md-8\">\n <label\n for=\"enabled\"\n title=\"{{\n 'Allow authentication with access token from external IAM system' | translate\n }}\"\n class=\"c8y-switch\"\n >\n <input\n id=\"enabled\"\n name=\"enabled\"\n type=\"checkbox\"\n [(ngModel)]=\"externalTokenConfig.enabled\"\n />\n <span></span>\n <span class=\"control-label\">\n {{ 'Allow authentication with access token from external IAM system' | translate }}\n </span>\n </label>\n </div>\n </div>\n <ng-container *ngIf=\"externalTokenConfig.enabled\">\n <c8y-user-id-configuration\n [userIdConfig]=\"externalTokenConfig.userOrAppIdConfig\"\n [withHeader]=\"false\"\n ></c8y-user-id-configuration>\n <div class=\"row p-l-4\">\n <div class=\"col-sm-6\">\n <label\n for=\"validationRequired\"\n title=\"{{ 'Validate access token' | translate }}\"\n class=\"c8y-switch\"\n >\n <input\n id=\"validationRequired\"\n name=\"validationRequired\"\n type=\"checkbox\"\n [(ngModel)]=\"externalTokenConfig.validationRequired\"\n />\n <span></span>\n <span class=\"control-label\">{{ 'Validate access token' | translate }}</span>\n </label>\n </div>\n </div>\n <ng-container *ngIf=\"externalTokenConfig.validationRequired\">\n <div class=\"row\">\n <div class=\"col-sm-6 m-t-16 m-l-8\">\n <label for=\"validationMethod\" class=\"control-label\" translate>\n Validation method\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"validationMethod\"\n name=\"validationMethod\"\n [ngModel]=\"externalTokenConfig.validationMethod\"\n (ngModelChange)=\"onValidationMethodChange($event)\"\n >\n <option\n *ngFor=\"let validationMethod of validationMethods | keyvalue\"\n [ngValue]=\"validationMethod.key\"\n >\n {{ validationMethod.value.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <c8y-request-configuration\n [templateModel]=\"externalTokenConfig\"\n [requestName]=\"'Token validation request' | translate\"\n [requestType]=\"'tokenValidationRequest'\"\n ></c8y-request-configuration>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-6 m-l-8\">\n <c8y-form-group>\n <label\n for=\"accessTokenValidityCheckIntervalInMinutes\"\n class=\"control-label\"\n translate\n >\n Access token validation frequency\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"accessTokenValidityCheckIntervalInMinutes\"\n name=\"accessTokenValidityCheckIntervalInMinutes\"\n [(ngModel)]=\"externalTokenConfig.accessTokenValidityCheckIntervalInMinutes\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '1' }\"\n step=\"1\"\n required\n [min]=\"1\"\n />\n <span class=\"input-group-addon\" translate>minutes</span>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>\n","import { Component } from '@angular/core';\nimport { CustomConfigurationMapper } from './custom-configuration-mapper';\nimport { TemplateComponent } from './template.component';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { CustomSsoConfiguration } from './custom.model';\n\n@Component({\n selector: 'c8y-custom-template',\n templateUrl: './custom-template.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class CustomTemplateComponent extends TemplateComponent<CustomSsoConfiguration> {\n constructor(private customConfigurationMapper: CustomConfigurationMapper) {\n super(customConfigurationMapper);\n }\n}\n","<div *ngIf=\"templateModel\">\n <c8y-request-configuration\n [templateModel]=\"templateModel\"\n [requestName]=\"'Authorization request' | translate\"\n [requestType]=\"'authorizationRequest'\">\n </c8y-request-configuration>\n <hr/>\n <c8y-request-configuration\n [templateModel]=\"templateModel\"\n [requestName]=\"'Token request' | translate\"\n [requestType]=\"'tokenRequest'\">\n </c8y-request-configuration>\n <hr/>\n <c8y-request-configuration\n [templateModel]=\"templateModel\"\n [requestName]=\"'Refresh request' | translate\"\n [requestType]=\"'refreshRequest'\">\n </c8y-request-configuration>\n <hr/>\n <c8y-request-configuration\n [templateModel]=\"templateModel\"\n [requestName]=\"'Logout request' | translate\"\n [requestType]=\"'logoutRequest'\">\n </c8y-request-configuration>\n <hr/>\n <c8y-external-token-config\n [templateModel]=\"templateModel\">\n </c8y-external-token-config>\n <hr/>\n <c8y-basic-configuration\n [templateModel]=\"templateModel\">\n </c8y-basic-configuration>\n <hr/>\n <c8y-sso-access-mapping\n [templateModel]=\"templateModel\"\n [apps]=\"apps\"\n [groups]=\"groups\"\n [inventoryRoles]=\"inventoryRoles\"\n >\n </c8y-sso-access-mapping>\n <hr/>\n <c8y-sso-user-data-mapping\n [templateModel]=\"templateModel\">\n </c8y-sso-user-data-mapping>\n <hr/>\n <c8y-user-id-configuration\n [userIdConfig]=\"templateModel.userIdConfig\">\n </c8y-user-id-configuration>\n <hr/>\n <c8y-sso-signature-configuration\n [templateModel]=\"templateModel\">\n </c8y-sso-signature-configuration>\n</div>\n","import { SsoConfigurationMapper } from './sso-configuration.mapper';\nimport { KeyCloakConfiguration } from './key-cloak.model';\nimport { SsoConfiguration, TemplateType } from '../sso-configuration.model';\nimport { at, get, head, isUndefined, map, reject } from 'lodash-es';\nimport { GrantType, TenantLoginOptionType, UserManagementSource } from '@c8y/client';\nimport { RequestConfiguration } from '../template-parts/request-configuration.model';\nimport { Injectable } from '@angular/core';\nimport { ExternalToken } from '../template-parts/external-token-config.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class KeyCloakConfigurationMapper implements SsoConfigurationMapper<KeyCloakConfiguration> {\n private urlPattern = /^(.+)\\/auth\\/realms\\/((.+?))$/;\n\n mapFrom(templateModel: KeyCloakConfiguration): SsoConfiguration {\n const ssoConfiguration: SsoConfiguration = {\n template: TemplateType.KEYCLOAK,\n buttonName: templateModel.buttonName,\n userIdConfig: templateModel.userIdConfig,\n userManagementSource: UserManagementSource.REMOTE,\n type: TenantLoginOptionType.OAUTH2,\n onNewUser: templateModel.onNewUser,\n issuer: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}`,\n redirectToPlatform: templateModel.redirectToPlatform,\n providerName: 'keycloak',\n audience: templateModel.audience,\n clientId: templateModel.clientId,\n logoutRequest: templateModel.logoutRequest.toRequest(),\n visibleOnLoginPage: templateModel.visibleOnLoginPage,\n signatureVerificationConfig: {\n jwks: {\n jwksUri: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}/protocol/openid-connect/certs`\n }\n },\n tokenRequest: {\n headers: {},\n method: 'POST',\n requestParams: {},\n operation: 'EXECUTE',\n url: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}/protocol/openid-connect/token`,\n body: 'grant_type=authorization_code&code=${code}&redirect_uri=${redirectUri}&client_id=${clientId}&client_secret=${client secret}'\n },\n authorizationRequest: {\n headers: {},\n method: 'GET',\n requestParams: {\n scope: templateModel.scopeId,\n client_id: '${clientId}',\n redirect_uri: '${redirectUri}',\n response_type: 'code'\n },\n operation: 'REDIRECT',\n url: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}/protocol/openid-connect/auth`,\n body: ''\n },\n refreshRequest: {\n headers: {},\n method: 'POST',\n requestParams: {\n client_id: '${clientId}',\n redirect_uri: '${redirectUri}',\n response_type: 'refresh'\n },\n operation: 'EXECUTE',\n url: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}/protocol/openid-connect/token`,\n body:\n 'grant_type=refresh_token&refresh_token=${refreshToken}&client_id=${clientId}&client_secret=' +\n templateModel.clientSecret\n },\n grantType: GrantType.AUTHORIZATION_CODE,\n accessTokenToUserDataMappings: templateModel.accessTokenToUserDataMappings,\n externalTokenConfig: templateModel.externalTokenConfig.toExternalTokenConfig()\n };\n return ssoConfiguration;\n }\n\n mapTo(ssoConfiguration: SsoConfiguration): KeyCloakConfiguration {\n return {\n keyCloakAddress: this.getKeyCloakAddressFromUrl(ssoConfiguration.issuer),\n realmName: this.getRealmName(ssoConfiguration.issuer),\n clientId: ssoConfiguration.clientId,\n clientSecret: this.getClientSecret(ssoConfiguration),\n scopeId: this.getScopeId(ssoConfiguration),\n buttonName: ssoConfiguration.buttonName,\n userIdConfig: ssoConfiguration.userIdConfig,\n onNewUser: ssoConfiguration.onNewUser,\n redirectToPlatform: ssoConfiguration.redirectToPlatform,\n audience: ssoConfiguration.audience,\n logoutRequest: new RequestConfiguration(ssoConfiguration.logoutRequest),\n visibleOnLoginPage: ssoConfiguration.visibleOnLoginPage,\n accessTokenToUserDataMappings: ssoConfiguration.accessTokenToUserDataMappings,\n externalTokenConfig: new ExternalToken(ssoConfiguration.externalTokenConfig)\n };\n }\n\n private getKeyCloakAddressFromUrl(url) {\n const [, keyCloakAddress] = (url || '').match(this.urlPattern) || [];\n return keyCloakAddress;\n }\n\n private getRealmName(url) {\n const [, , realmName] = (url || '').match(this.urlPattern) || [];\n return realmName;\n }\n\n private getClientSecret(ssoConfiguration): string {\n const bodies = at(ssoConfiguration, ['tokenRequest.body', 'refreshRequest.body']);\n const clientSecrets = map(bodies, body => this.getClientSecretFromBody(body));\n const clientSecret = this.getFirstDefined(clientSecrets);\n return clientSecret ? decodeURIComponent(clientSecret) : '';\n }\n\n private getClientSecretFromBody(body) {\n const [, clientSecret] = (body || '').match(/client_secret=([^&]+)/) || [];\n return clientSecret;\n }\n\n private getFirstDefined(values) {\n return head(reject(values, isUndefined));\n }\n\n private getScopeId(ssoConfiguration) {\n return get(ssoConfiguration, 'authorizationRequest.requestParams.scope', '');\n }\n}\n","import { Component } from '@angular/core';\nimport { KeyCloakConfiguration } from './key-cloak.model';\nimport { TemplateComponent } from './template.component';\nimport { KeyCloakConfigurationMapper } from './key-cloak-configuration-mapper';\nimport { ControlContainer, NgForm } from '@angular/forms';\n\n@Component({\n selector: 'c8y-key-cloak-template',\n templateUrl: './key-cloak-template.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class KeyCloakTemplateComponent extends TemplateComponent<KeyCloakConfiguration> {\n constructor(private keyCloakConfigurationMapper: KeyCloakConfigurationMapper) {\n super(keyCloakConfigurationMapper);\n }\n}\n","<div *ngIf=\"templateModel\">\n <c8y-basic-configuration [templateModel]=\"templateModel\"></c8y-basic-configuration>\n <hr />\n <c8y-user-id-configuration\n [userIdConfig]=\"templateModel.userIdConfig\"\n ></c8y-user-id-configuration>\n <hr />\n <c8y-request-configuration\n [templateModel]=\"templateModel\"\n [requestName]=\"'Logout request' | translate\"\n [requestType]=\"'logoutRequest'\"\n ></c8y-request-configuration>\n <hr />\n <c8y-external-token-config [templateModel]=\"templateModel\"></c8y-external-token-config>\n <hr />\n <c8y-sso-access-mapping\n [templateModel]=\"templateModel\"\n [apps]=\"apps\"\n [groups]=\"groups\"\n [inventoryRoles]=\"inventoryRoles\"\n ></c8y-sso-access-mapping>\n <hr />\n <c8y-sso-user-data-mapping [templateModel]=\"templateModel\"></c8y-sso-user-data-mapping>\n</div>\n","import { SsoConfigurationMapper } from './sso-configuration.mapper';\nimport { AadConfiguration } from './aad.model';\nimport { SsoConfiguration, TemplateType } from '../sso-configuration.model';\nimport {\n assign,\n defaults,\n set,\n at,\n map,\n defaultsDeep,\n has,\n head,\n reject,\n isUndefined\n} from 'lodash-es';\nimport { GrantType, TenantLoginOptionType, UserManagementSource } from '@c8y/client';\nimport { SignatureConfiguration } from '../template-parts/signature-configuration.model';\nimport { Injectable } from '@angular/core';\nimport { ExternalToken } from '../template-parts/external-token-config.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AadConfigurationMapper implements SsoConfigurationMapper<AadConfiguration> {\n private defaults = {\n visibleOnLoginPage: true\n };\n\n private constants = {\n providerName: 'Azure AD',\n type: 'oauth2',\n grantType: 'AUTHORIZATION_CODE'\n };\n\n private urlPattern = /^(.+)\\/((.+?)\\/oauth2\\/authorize)$/;\n\n mapFrom(templateModel: AadConfiguration): SsoConfiguration {\n const baseUrl = `${templateModel.aadAddress}/${templateModel.tenant}/oauth2`;\n\n const ssoConfiguration: SsoConfiguration = {\n audience: templateModel.applicationId,\n clientId: templateModel.applicationId,\n logoutRequest: templateModel.redirectAfterLogout\n ? {\n method: 'POST',\n url: `${baseUrl}/logout`,\n requestParams: {\n post_logout_redirect_uri: templateModel.redirectAfterLogoutUrl\n },\n headers: {},\n body: '',\n operation: 'REDIRECT'\n }\n : {\n method: 'POST',\n headers: {},\n operation: 'REDIRECT',\n requestParams: {}\n },\n authorizationRequest: {\n method: 'GET',\n url: `${baseUrl}/authorize`,\n requestParams: {\n redirect_uri: '${redirectUri}',\n client_id: '${clientId}',\n response_type: 'code'\n },\n headers: {},\n body: '',\n operation: 'REDIRECT'\n },\n tokenRequest: {\n method: 'POST',\n url: `${baseUrl}/token`,\n requestParams: {},\n headers: {},\n body: this.getQueryString({\n grant_type: 'authorization_code',\n code: '${code}',\n redirect_uri: '${redirectUri}',\n resource: '${clientId}',\n client_id: '${clientId}',\n client_secret: encodeURIComponent(templateModel.clientSecret)\n }),\n operation: 'EXECUTE'\n },\n refreshRequest: {\n method: 'POST',\n url: `${baseUrl}/token`,\n requestParams: {},\n headers: {},\n body: this.getQueryString({\n grant_type: 'refresh_token',\n refresh_token: '${refreshToken}',\n resource: '${clientId}',\n client_id: '${clientId}',\n client_secret: encodeURIComponent(templateModel.clientSecret)\n }),\n operation: 'EXECUTE'\n },\n buttonName: templateModel.buttonName,\n providerName: 'Azure AD',\n issuer: templateModel.issuer,\n onNewUser: templateModel.onNewUser,\n accessTokenToUserDataMappings: templateModel.accessTokenToUserDataMappings,\n redirectToPlatform: templateModel.redirectToPlatform,\n template: TemplateType.AZURE,\n userIdConfig: {\n useConstantValue: false,\n jwtField: templateModel.userIdConfig.jwtField\n },\n visibleOnLoginPage: templateModel.visibleOnLoginPage,\n signatureVerificationConfig:\n templateModel.signatureVerificationConfig.toSignatureVerificationConfig(),\n userManagementSource: UserManagementSource.REMOTE,\n type: TenantLoginOptionType.OAUTH2,\n grantType: GrantType.AUTHORIZATION_CODE,\n externalTokenConfig: templateModel.externalTokenConfig.toExternalTokenConfig()\n };\n return ssoConfiguration;\n }\n\n mapTo(ssoConfiguration: SsoConfiguration): AadConfiguration {\n const applicationsId = at(ssoConfiguration, ['audience', 'clientId']);\n\n this.setupDefaults(ssoConfiguration);\n this.setupConstants(ssoConfiguration);\n this.setupAadAddressAndTenant(ssoConfiguration);\n this.setupClientSecret(ssoConfiguration);\n this.setupUserIdConfig(ssoConfiguration);\n this.setupSignatureVerificationConfig(ssoConfiguration);\n\n const aadConfiguration: AadConfiguration = {\n aadAddress: this.getAadAddressFromUrl(ssoConfiguration.authorizationRequest.url),\n tenant: this.getTenantFromUrl(ssoConfiguration.authorizationRequest.url),\n applicationId: this.getFirstDefined(applicationsId),\n redirectToPlatform: ssoConfiguration.redirectToPlatform,\n clientSecret: ssoConfiguration.authorizationRequest.requestParams.client_id,\n issuer: ssoConfiguration.issuer,\n buttonName: ssoConfiguration.buttonName,\n visibleOnLoginPage: ssoConfiguration.visibleOnLoginPage,\n redirectAfterLogout: this.getRedirectAfterLogout(ssoConfiguration),\n redirectAfterLogoutUrl: this.getRedirectAfterLogoutUrl(ssoConfiguration),\n accessTokenToUserDataMappings: ssoConfiguration.accessTokenToUserDataMappings,\n userIdConfig: {\n jwtField: ssoConfiguration.userIdConfig.jwtField\n },\n publicKeyDiscoveryUrl: ssoConfiguration.signatureVerificationConfig.aad.publicKeyDiscoveryUrl,\n signatureVerificationConfig: new SignatureConfiguration(\n ssoConfiguration.signatureVerificationConfig\n ),\n onNewUser: ssoConfiguration.onNewUser,\n externalTokenConfig: new ExternalToken(ssoConfiguration.externalTokenConfig)\n };\n return aadConfiguration;\n }\n\n setupDefaults(ssoConfiguration) {\n defaults(ssoConfiguration, this.defaults);\n }\n\n setupConstants(ssoConfiguration) {\n assign(ssoConfiguration, this.constants);\n }\n\n setupAadAddressAndTenant(ssoConfiguration) {\n const urls = at(ssoConfiguration, [\n 'authorizationRequest.url',\n 'tokenRequest.url',\n 'refreshRequest.url'\n ]);\n\n const aadAddresses = map(urls, url => this.getAadAddressFromUrl(url));\n set(ssoConfiguration, 'aadAddress', this.getFirstDefined(aadAddresses));\n\n const tenants = map(urls, url => this.getTenantFromUrl(url));\n set(ssoConfiguration, 'tenant', this.getFirstDefined(tenants));\n }\n\n getAadAddressFromUrl(url) {\n const [, aadAddress] = (url || '').match(this.urlPattern) || [];\n return aadAddress;\n }\n\n getTenantFromUrl(url) {\n const [, , , tenant] = (url || '').match(this.urlPattern) || [];\n return tenant;\n }\n\n setupClientSecret(ssoConfiguration) {\n const bodies = at(ssoConfiguration, ['tokenRequest.body', 'refreshRequest.body']);\n const clientSecrets = map(bodies, body => this.getClientSecretFromBody(body));\n set(ssoConfiguration, 'clientSecret', this.getFirstDefined(clientSecrets));\n }\n\n getClientSecretFromBody(body) {\n const [, clientSecret] = (body || '').match(/client_secret=([^&]+)/) || [];\n return decodeURIComponent(clientSecret);\n }\n\n setupUserIdConfig(ssoConfiguration) {\n defaultsDeep(ssoConfiguration, { userIdConfig: { jwtField: 'upn' } });\n set(ssoConfiguration, 'userIdConfig.useConstantValue', false);\n }\n\n setupSignatureVerificationConfig(ssoConfiguration) {\n defaultsDeep(ssoConfiguration, { signatureVerificationConfig: { aad: {} } });\n }\n\n getRedirectAfterLogout(ssoConfiguration): boolean {\n return has(ssoConfiguration, 'logoutRequest.requestParams.post_logout_redirect_uri')\n ? true\n : false;\n }\n\n getRedirectAfterLogoutUrl(ssoConfiguration): string {\n return ssoConfiguration.logoutRequest.requestParams.post_logout_redirect_uri\n ? ssoConfiguration.logoutRequest.requestParams.post_logout_redirect_uri\n : null;\n }\n\n getFirstDefined(values) {\n return head(reject(values, isUndefined));\n }\n\n getQueryString(params) {\n return map(params, (value, key) => `${key}=${value}`).join('&');\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\n\n@Component({\n selector: 'c8y-sso-logout-configuration',\n templateUrl: './logout-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class LogoutConfigurationComponent {\n @Input() templateModel;\n}\n","<div class=\"col-md-12 p-t-16\">\n <div class=\"row m-l-8 m-r-8\">\n <div class=\"col-xs-12 col-sm-3 col-md-2\">\n <div class=\"h4 text-normal text-right text-left-xs\" translate>Logout configuration</div>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\">\n <c8y-form-group>\n <label\n for=\"redirectAfterLogout\"\n title=\"{{ 'Redirect after logout' | translate }}\"\n class=\"c8y-switch\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"templateModel.redirectAfterLogout\"\n name=\"redirectAfterLogout\"\n id=\"redirectAfterLogout\"\n />\n <span></span>\n <span class=\"control-label\">{{ 'Redirect after logout' | translate }}</span>\n </label>\n </c8y-form-group>\n\n <c8y-form-group *ngIf=\"templateModel.redirectAfterLogout\">\n <label for=\"redirectAfterLogoutUrl\" class=\"control-label\" translate>Redirect URL</label>\n <input\n class=\"form-control\"\n name=\"redirectAfterLogoutUrl\"\n id=\"redirectAfterLogoutUrl\"\n type=\"url\"\n [(ngModel)]=\"templateModel.redirectAfterLogoutUrl\"\n placeholder=\"{{ 'e.g. https://my-tenant.cumulocity.com/apps/cockpit' | translate }}\"\n c8yDefaultValidation=\"httpUrl\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n</div>\n","import { Component } from '@angular/core';\nimport { TemplateComponent } from './template.component';\nimport { AadConfigurationMapper } from './aad-configuration-mapper';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { AadConfiguration } from './aad.model';\n\n@Component({\n selector: 'c8y-aad-template',\n templateUrl: './aad-template.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class AadTemplateComponent extends TemplateComponent<AadConfiguration> {\n constructor(private aadConfigurationMapper: AadConfigurationMapper) {\n super(aadConfigurationMapper);\n }\n}\n","<div *ngIf=\"templateModel\">\n <c8y-basic-configuration [templateModel]=\"templateModel\"></c8y-basic-configuration>\n <hr />\n <c8y-sso-logout-configuration [templateModel]=\"templateModel\"></c8y-sso-logout-configuration>\n <hr />\n <c8y-external-token-config [templateModel]=\"templateModel\"></c8y-external-token-config>\n <hr />\n <c8y-sso-access-mapping\n [templateModel]=\"templateModel\"\n [apps]=\"apps\"\n [groups]=\"groups\"\n [inventoryRoles]=\"inventoryRoles\"\n ></c8y-sso-access-mapping>\n <hr />\n <c8y-sso-user-data-mapping [templateModel]=\"templateModel\"></c8y-sso-user-data-mapping>\n <hr />\n <c8y-user-id-configuration\n [userIdConfig]=\"templateModel.userIdConfig\"\n ></c8y-user-id-configuration>\n <hr />\n <c8y-sso-signature-configuration\n [templateModel]=\"templateModel\"\n ></c8y-sso-signature-configuration>\n</div>\n","import { Component, EventEmitter, OnInit } from '@angular/core';\nimport {\n ApplicationService,\n UserGroupService,\n IApplication,\n IUserGroup,\n TenantLoginOptionType,\n InventoryRoleService,\n IIdentified\n} from '@c8y/client';\nimport {\n gettext,\n AlertService,\n ModalService,\n Status,\n LoginService,\n AppStateService,\n TenantUiService\n} from '@c8y/ngx-components';\nimport { BehaviorSubject, forkJoin, Subscription, Subject } from 'rxjs';\nimport { shareReplay, tap, switchMap } from 'rxjs/operators';\nimport { SsoConfiguration, TemplateType, templateTypeConfig } from './sso-configuration.model';\nimport { SsoConfigurationService } from './sso-configuration.service';\n\n@Component({\n selector: 'c8y-sso-configuration',\n templateUrl: './sso-configuration.component.html'\n})\nexport class SsoConfigurationComponent implements OnInit {\n apps: IApplication[];\n groups: IUserGroup[];\n inventoryRoles: IIdentified[];\n ssoConfiguration: SsoConfiguration;\n\n templateType = TemplateType;\n templateTypeConfig = templateTypeConfig;\n\n reloading$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n reload: EventEmitter<void> = new EventEmitter();\n saveSubject: Subject<void> = new Subject();\n\n private dataSubscription: Subscription;\n\n private data$: any = this.reload.pipe(\n tap(() => this.reloading$.next(true)),\n switchMap(() =>\n forkJoin({\n ssoConfiguration: this.ssoConfigurationService.getSsoConfiguration$(),\n apps: this.getApplications(),\n groups: this.getGroups(),\n inventoryRoles: this.getInventoryRoles()\n })\n ),\n tap(() => this.reloading$.next(false)),\n shareReplay(1)\n );\n\n constructor(\n private ssoConfigurationService: SsoConfigurationService,\n private applicationService: ApplicationService,\n private userGroupService: UserGroupService,\n private inventoryRoleService: InventoryRoleService,\n private alertService: AlertService,\n private modalService: ModalService,\n private loginService: LoginService,\n private appStateService: AppStateService,\n private tenantUiService: TenantUiService\n ) {}\n\n ngOnInit(): void {\n this.dataSubscription = this.data$.subscribe(\n ({ ssoConfiguration, apps, groups, inventoryRoles }) => {\n this.apps = apps;\n this.groups = groups;\n this.inventoryRoles = inventoryRoles;\n this.ssoConfiguration = ssoConfiguration;\n }\n );\n this.loadSsoConfiguration();\n }\n\n ngOnDestroy(): void {\n this.dataSubscription.unsubscribe();\n }\n\n loadSsoConfiguration() {\n this.reload.next();\n }\n\n async save(ssoConfiguration) {\n try {\n await this.warnAboutForceUsersLogOut();\n const logoutRequired =\n this.tenantUiService.getCurrentUserLoginMode() !== TenantLoginOptionType.BASIC;\n if (logoutRequired) {\n await this.modalService.confirmLogout();\n }\n await this.ssoConfigurationService.save(ssoConfiguration);\n if (logoutRequired) {\n await this.loginService.logout(true);\n } else {\n this.alertService.success(gettext('Configuration saved.'));\n }\n } catch (ex) {\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n private getApplications(): Promise<void | IApplication[]> {\n return this.applicationService.list({ pageSize: 100 }).then(\n res => res.data,\n error => this.alertService.addServerFailure(error)\n );\n }\n\n private getGroups(): Promise<void | IUserGroup[]> {\n return this.userGroupService.list({ pageSize: 100 }).then(\n res => res.data,\n error => this.alertService.addServerFailure(error)\n );\n }\n\n private getInventoryRoles(): Promise<void | IIdentified[]> {\n return this.inventoryRoleService.list({ pageSize: 100 }).then(\n res => res.data,\n error => this.alertService.addServerFailure(error)\n );\n }\n\n private async warnAboutForceUsersLogOut() {\n const modalLabels = { ok: gettext('Update and log out users'), cancel: gettext('Cancel') };\n const modalBody = gettext(\n 'Updating SSO configuration will log out all users logged with \"OAI-Secure\" or \"Single sign-on redirect\". Do you want to proceed?'\n );\n return await this.modalService.confirm(\n gettext('Force users to log out'),\n modalBody,\n Status.WARNING,\n modalLabels\n );\n }\n}\n","<c8y-title>{{ 'Single sign-on' | translate }}</c8y-title>\n<c8y-breadcrumb>\n <c8y-breadcrumb-item [label]=\"'Settings' | translate\" [icon]=\"'cog'\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [icon]=\"'cog'\" [label]=\"'Single sign-on' | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n (click)=\"loadSsoConfiguration()\"\n >\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading$ | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form hidden-xs\">\n <div title=\"{{ 'Template' | translate }}\" class=\"form-group\">\n <label for=\"template\" class=\"control-label\">\n {{ 'Template' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n *ngIf=\"ssoConfiguration\"\n name=\"template\"\n id=\"template\"\n [(ngModel)]=\"ssoConfiguration.template\"\n >\n <option\n *ngFor=\"let templateType of templateTypeConfig | keyvalue\"\n [ngValue]=\"templateType.key\"\n >\n {{ templateType.value.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n</c8y-action-bar-item>\n\n<div class=\"row\">\n <div class=\"col-lg-12 col-lg-max\">\n <form class=\"card card--fullpage\" #ssoConfigurationForm=\"ngForm\" novalidate>\n <div class=\"card-header separator\">\n <div class=\"card-title\">\n {{ 'Single sign-on' | translate }}\n </div>\n </div>\n\n <div class=\"inner-scroll\">\n <div class=\"card-block p-0\" *ngIf=\"ssoConfiguration\">\n <c8y-custom-template\n *ngIf=\"ssoConfiguration.template === templateType.CUSTOM\"\n [ssoConfiguration]=\"ssoConfiguration\"\n [ssoConfigurationChangeTrigger]=\"saveSubject.asObservable()\"\n (ssoConfigurationChange)=\"save($event)\"\n [apps]=\"apps\"\n [groups]=\"groups\"\n [inventoryRoles]=\"inventoryRoles\"\n ></c8y-custom-template>\n\n <c8y-aad-template\n *ngIf=\"ssoConfiguration.template === templateType.AZURE\"\n [ssoConfiguration]=\"ssoConfiguration\"\n [ssoConfigurationChangeTrigger]=\"saveSubject.asObservable()\"\n (ssoConfigurationChange)=\"save($event)\"\n [apps]=\"apps\"\n [groups]=\"groups\"\n [inventoryRoles]=\"inventoryRoles\"\n ></c8y-aad-template>\n\n <c8y-key-cloak-template\n *ngIf=\"ssoConfiguration.template === templateType.KEYCLOAK\"\n [ssoConfiguration]=\"ssoConfiguration\"\n [ssoConfigurationChangeTrigger]=\"saveSubject.asObservable()\"\n (ssoConfigurationChange)=\"save($event)\"\n [apps]=\"apps\"\n [groups]=\"groups\"\n [inventoryRoles]=\"inventoryRoles\"\n ></c8y-key-cloak-template>\n </div>\n </div>\n <div class=\"card-footer separator\">\n <button\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n class=\"btn btn-primary\"\n (click)=\"saveSubject.next()\"\n [disabled]=\"!ssoConfigurationForm.form.valid || ssoConfigurationForm.form.pristine\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </form>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { CanActivate } from '@angular/router';\nimport { of, Observable } from 'rxjs';\nimport { catchError, mapTo } from 'rxjs/operators';\nimport { SsoConfigurationService } from './sso-configuration.service';\n\n@Injectable()\nexport class SsoConfigurationGuard implements CanActivate {\n constructor(private ssoConfigurationService: SsoConfigurationService) {}\n\n canActivate(): Observable<boolean> {\n return this.ssoConfigurationService.getSsoConfiguration$().pipe(\n mapTo(true),\n catchError(() => of(false))\n );\n }\n}\n","import { NgModule } from '@angular/core';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { SsoConfigurationComponent } from './sso-configuration.component';\nimport { CoreModule, hookRoute } from '@c8y/ngx-components';\nimport { SsoConfigurationService } from './sso-configuration.service';\nimport { BsDatepickerModule } from 'ngx-bootstrap/datepicker';\nimport { DatePipe } from '@angular/common';\nimport { CustomTemplateComponent } from './templates/custom-template.component';\nimport { KeyCloakTemplateComponent } from './templates/key-cloak-template.component';\nimport { BasicConfigurationComponent } from './template-parts/basic-configuration.component';\nimport { RequestConfigurationComponent } from './template-parts/request-configuration.component';\nimport { UserIdConfigurationComponent } from './template-parts/user-id-configuration.component';\nimport { UserDataMappingComponent } from './template-parts/user-data-mapping.component';\nimport { AccessMappingComponent } from './template-parts/access-mapping/access-mapping.component';\nimport { DynamicAccessMappingComponent } from './template-parts/access-mapping/dynamic-access-mapping.component';\nimport { SignatureConfigurationComponent } from './template-parts/signature-configuration.component';\nimport { AadTemplateComponent } from './templates/aad-template.component';\nimport { LogoutConfigurationComponent } from './template-parts/logout-configuration.component';\nimport { AuthConfigurationGuard } from '../auth-configuration.guard';\nimport { CustomConfigurationMapper } from './templates/custom-configuration-mapper';\nimport { KeyCloakConfigurationMapper } from './templates/key-cloak-configuration-mapper';\nimport { AadConfigurationMapper } from './templates/aad-configuration-mapper';\nimport { SsoConfigurationGuard } from './sso-configuration.guard';\nimport { ExternalTokenConfigComponent } from './template-parts/external-token-config.component';\nimport { ChildPredicatesComponent } from './template-parts/access-mapping/child-predicates.component';\nimport { InventoryRolesMappingComponent } from './template-parts/access-mapping/inventory-roles-mapping.component';\nimport { InventoryRolesModalComponent } from './template-parts/access-mapping/inventory-roles-modal.component';\nimport { AssetSelectorModule } from '@c8y/ngx-components/assets-navigator';\n\n@NgModule({\n declarations: [\n SsoConfigurationComponent,\n CustomTemplateComponent,\n KeyCloakTemplateComponent,\n AadTemplateComponent,\n BasicConfigurationComponent,\n RequestConfigurationComponent,\n UserIdConfigurationComponent,\n UserDataMappingComponent,\n AccessMappingComponent,\n DynamicAccessMappingComponent,\n SignatureConfigurationComponent,\n LogoutConfigurationComponent,\n ChildPredicatesComponent,\n InventoryRolesMappingComponent,\n InventoryRolesModalComponent,\n ExternalTokenConfigComponent\n ],\n imports: [CoreModule, TooltipModule, PopoverModule, BsDatepickerModule, AssetSelectorModule],\n exports: [SsoConfigurationComponent],\n providers: [\n SsoConfigurationGuard,\n DatePipe,\n SsoConfigurationService,\n AadConfigurationMapper,\n CustomConfigurationMapper,\n KeyCloakConfigurationMapper,\n hookRoute({\n path: 'auth-configuration/single_sign-on',\n component: SsoConfigurationComponent,\n canActivate: [AuthConfigurationGuard, SsoConfigurationGuard]\n })\n ]\n})\nexport class SsoConfigurationModule {}\n","import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { gettext, Tab, TabFactory } from '@c8y/ngx-components';\nimport { SsoConfigurationService } from '../sso-configuration/sso-configuration.service';\nimport { catchError, mapTo, mergeAll, toArray } from 'rxjs/operators';\nimport { Observable, of, EMPTY, merge } from 'rxjs';\n\n@Injectable()\nexport class TabsFactory implements TabFactory {\n constructor(public router: Router, private ssoConfigurationService: SsoConfigurationService) {}\n get(): Observable<Tab[]> {\n if (!this.router.url.match(/auth-configuration/g)) {\n return of([]);\n }\n\n const basicSettingsTab$ = of({\n path: 'auth-configuration/basic_settings',\n label: gettext('Basic settings'),\n icon: 'unlock-alt',\n priority: 1100,\n orientation: 'horizontal'\n } as Tab);\n const ssoTab$ = this.ssoConfigurationService.getSsoConfiguration$().pipe(\n mapTo({\n path: 'auth-configuration/single_sign-on',\n label: gettext('Single sign-on'),\n icon: 'sign-in',\n priority: 1050,\n orientation: 'horizontal'\n } as Tab),\n catchError(() => EMPTY)\n );\n return merge([basicSettingsTab$, ssoTab$]).pipe(mergeAll(), toArray());\n }\n}\n","import { Injectable } from '@angular/core';\nimport { gettext, NavigatorNode, NavigatorNodeFactory, Permissions } from '@c8y/ngx-components';\n\n@Injectable()\nexport class NavigationFactory implements NavigatorNodeFactory {\n navs: NavigatorNode[] = [];\n\n constructor(private permissions: Permissions) {}\n\n async get() {\n const userHasPermission = this.permissions.hasAnyRole([\n 'ROLE_TENANT_ADMIN',\n 'ROLE_TENANT_MANAGEMENT_ADMIN'\n ]);\n if (this.navs.length === 0 && userHasPermission) {\n this.navs.push(\n new NavigatorNode({\n label: gettext('Authentication'),\n icon: 'c8y-shield',\n path: '/auth-configuration',\n parent: gettext('Settings'),\n routerLinkExact: false,\n priority: 2000\n })\n );\n }\n return this.navs;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { BasicSettingsModule } from './basic-settings/basic-settings.module';\nimport { SsoConfigurationModule } from './sso-configuration/sso-configuration.module';\nimport { hookNavigator, hookRoute, hookTab } from '@c8y/ngx-components';\nimport { TabsFactory } from './factories/tabs.factory';\nimport { NavigationFactory } from './factories/navigation.factory';\nimport { AuthConfigurationGuard } from './auth-configuration.guard';\n\n@NgModule({\n imports: [BasicSettingsModule, SsoConfigurationModule],\n providers: [\n AuthConfigurationGuard,\n hookTab(TabsFactory),\n hookNavigator(NavigationFactory),\n hookRoute({\n path: 'auth-configuration',\n redirectTo: 'auth-configuration/basic_settings',\n pathMatch: 'full'\n })\n ]\n})\nexport class AuthConfigurationModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3","i3.TenantLoginOptionMapper","i4","i5","i1.AuthConfigurationService","i6.SessionConfigurationComponent","i7.LoginSettingsComponent","i8.BasicAuthSettingsComponent","i9.TfaSettingsComponent","i1.SsoConfigurationMapper","map","i3.ChildPredicatesComponent","i4.ChildPredicatesComponent","i5.DynamicAccessMappingComponent","i6.InventoryRolesMappingComponent","i4.RequestConfigurationComponent","i5.UserIdConfigurationComponent","i1.CustomConfigurationMapper","i3.BasicConfigurationComponent","i6.UserDataMappingComponent","i7.AccessMappingComponent","i8.SignatureConfigurationComponent","i9.ExternalTokenConfigComponent","i10","i1.KeyCloakConfigurationMapper","i8.ExternalTokenConfigComponent","i9","i1.AadConfigurationMapper","i4.UserIdConfigurationComponent","i5.UserDataMappingComponent","i6.AccessMappingComponent","i7.SignatureConfigurationComponent","i8.LogoutConfigurationComponent","i1.SsoConfigurationService","i6.CustomTemplateComponent","i7.KeyCloakTemplateComponent","i8.AadTemplateComponent","i2.SsoConfigurationService"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;MA2Ba,SAAS,CAAA;AAIpB,IAAA,WAAA,CAAY,KAAa,EAAA;AACvB,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;KACpB;AAED,IAAA,IAAI,EAAE,GAAA;QACJ,OAAO,IAAI,CAAC,GAAG,CAAC;KACjB;IAEO,QAAQ,GAAA;QACd,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC3C,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,UAAU,GAAG,YAAY,CAAC;KAClC;AACF,CAAA;AAEK,SAAU,eAAe,CAAC,iBAAoC,EAAA;AAClE,IAAA,OAAO,iBAAiB,CAAC,IAAI,KAAK,qBAAqB,CAAC,eAAe,CAAC;AAC1E,CAAC;AAEK,SAAU,OAAO,CAAC,iBAAoC,EAAA;AAC1D,IAAA,OAAO,iBAAiB,CAAC,IAAI,KAAK,qBAAqB,CAAC,KAAK,CAAC;AAChE;;MC1Ca,0BAA0B,CAAA;AALvC,IAAA,WAAA,GAAA;AASE,QAAA,IAAA,CAAA,wBAAwB,GAA0B,qBAAqB,CAAC,KAAK,CAAC;AAE9E,QAAA,IAAyB,CAAA,yBAAA,GAAG,qBAAqB,CAAC;KAuDnD;AArDC,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,CAAC,YAAY,EAAE;AACvE,YAAA,IAAI,CAAC,wBAAwB;AAC3B,gBAAA,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,wBAAwB,CAAC;AACnE,SAAA;KACF;IAED,SAAS,GAAA;QACP,IAAI,IAAI,CAAC,wBAAwB,KAAK,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,EAAE;YACrF,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,CAAC;AAChF,YAAA,IAAI,IAAI,CAAC,wBAAwB,KAAK,qBAAqB,CAAC,KAAK,EAAE;AACjE,gBAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;AACnC,aAAA;AACF,SAAA;KACF;AAED,IAAA,IAAI,oBAAoB,GAAA;QACtB,OAAO,IAAI,CAAC,0BAA0B,CAAC,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;KAClF;IAED,IAAI,oBAAoB,CAAC,KAAc,EAAA;AACrC,QAAA,IAAI,CAAC,0BAA0B,CAAC,gBAAgB,GAAG,KAAK,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC;KAClF;AAED,IAAA,yBAAyB,CAAC,EAAE,EAAA;AAC1B,QAAA,IAAI,CAAC,0BAA0B,CAAC,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAC/D,IAAI,CAAC,0BAA0B,CAAC,mBAAmB,EACnD,EAAE,CACH,CAAC;KACH;AAED,IAAA,uBAAuB,CAAC,EAAE,EAAA;AACxB,QAAA,IAAI,CAAC,0BAA0B,CAAC,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAC7D,IAAI,CAAC,0BAA0B,CAAC,iBAAiB,EACjD,EAAE,CACH,CAAC;KACH;AAED,IAAA,IAAI,0BAA0B,GAAA;AAC5B,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,0BAA0B,CAAC;KACrF;AAED,IAAA,GAAG,CAAC,UAAU,EAAA;QACZ,UAAU,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;KACpC;IAEO,MAAM,CAAC,UAAU,EAAE,EAAE,EAAA;AAC3B,QAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACzD,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YACpB,QAAQ,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;AAClC,SAAA;AACD,QAAA,OAAO,QAAQ,CAAC;KACjB;;uHA5DU,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA1B,0BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,0BAA0B,ECXvC,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,giJA0HA,EDjHiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,CAAA,CAAA;2FAExD,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBALtC,SAAS;+BACE,yBAAyB,EAAA,aAAA,EAEpB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,QAAA,EAAA,giJAAA,EAAA,CAAA;8BAInE,iBAAiB,EAAA,CAAA;sBADhB,KAAK;;;MEPK,sBAAsB,CAAA;AACjC,IAAA,WAAA,CAAoB,WAAwB,EAAA;AAAxB,QAAA,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;KAAI;IAEhD,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,mBAAmB,EAAE,8BAA8B,CAAC,CAAC,CAAC;KAC3F;;mHALU,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;uHAAtB,sBAAsB,EAAA,CAAA,CAAA;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBADlC,UAAU;;;MCDE,WAAW,CAAA;IACtB,WACS,CAAA,QAAgB,EAChB,GAAW,EACX,IAAqC,EACrC,YAAwC,EACxC,KAAc,EAAA;AAJd,QAAA,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAQ;AAChB,QAAA,IAAG,CAAA,GAAA,GAAH,GAAG,CAAQ;AACX,QAAA,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAiC;AACrC,QAAA,IAAY,CAAA,YAAA,GAAZ,YAAY,CAA4B;AACxC,QAAA,IAAK,CAAA,KAAA,GAAL,KAAK,CAAS;KACnB;AAEJ,IAAA,KAAK,CAAC,MAAqC,EAAA;AACzC,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAChC,QAAA,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;AACtB,QAAA,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;KAC3B;IAED,QAAQ,GAAA;QACN,IAAI;AACF,YAAA,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;AAC9B,SAAA;AAAC,QAAA,OAAO,EAAE,EAAE;YACX,OAAO,IAAI,CAAC,YAAY,CAAC;AAC1B,SAAA;KACF;IAEO,cAAc,GAAA;QACpB,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;AAC7C,YAAA,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3C,YAAA,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3C,YAAA;gBACE,MAAM,IAAI,SAAS,EAAE,CAAC;AACzB,SAAA;KACF;AAEO,IAAA,gBAAgB,CAAC,WAAmB,EAAA;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;YAC7C,MAAM,IAAI,KAAK,EAAE,CAAC;AACnB,SAAA;AACD,QAAA,OAAO,KAAK,CAAC;KACd;AAEO,IAAA,gBAAgB,CAAC,KAAa,EAAA;AACpC,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YACpB,MAAM,IAAI,KAAK,EAAE,CAAC;AACnB,SAAA;AACD,QAAA,OAAO,KAAK,CAAC;KACd;AACF;;MCvCY,uBAAuB,CAAA;AAClC,IAAA,KAAK,CAAC,iBAAqC,EAAA;AACzC,QAAA,MAAM,WAAW,GAAsB,IAAI,CACzC,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,EAChD,4BAA4B,CAC7B,CAAC;AACF,QAAA,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE;YACxB,WAAW,CAAC,0BAA0B,GAAG,IAAI,CAAC,+BAA+B,CAC3E,iBAAiB,CAAC,0BAA0B,CAC7C,CAAC;AACH,SAAA;AACD,QAAA,OAAO,WAAW,CAAC;KACpB;IAED,OAAO,CACL,mBAAsC,EACtC,cAAiC,EAAA;AAEjC,QAAA,IAAI,OAAO,CAAC,mBAAmB,CAAC,EAAE;YAChC,OAAO,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;AACtE,SAAA;AACD,QAAA,IAAI,eAAe,CAAC,mBAAmB,CAAC,EAAE;YACxC,OAAO,IAAI,CAAC,2BAA2B,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;AAC9E,SAAA;QACD,MAAM,IAAI,KAAK,CACb,CAAA,2FAAA,EAA8F,mBAAmB,CAAC,IAAI,CAAoB,kBAAA,CAAA,CAC3I,CAAC;KACH;AAEO,IAAA,+BAA+B,CACrC,0BAAuD,EAAA;AAEvD,QAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,0BAA0B,EAAE,OAAO,CAAC,EAAE;YAC7E,mBAAmB,EAAE,CAAC,EAAE,CAAC;YACzB,iBAAiB,EAAE,CAAC,EAAE,CAAC;AACvB,YAAA,gBAAgB,EAAE,EAAE;AACrB,SAAA,CAAC,CAAC;AACH,QAAA,YAAY,CAAC,mBAAmB,GAAG,YAAY,CAAC,mBAAmB,CAAC,GAAG,CACrE,GAAG,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,CAC1B,CAAC;AACF,QAAA,YAAY,CAAC,iBAAiB,GAAG,YAAY,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/F,QAAA,OAAO,YAAY,CAAC;KACrB;IAEO,mBAAmB,CACzB,mBAAsC,EACtC,cAAiC,EAAA;QAEjC,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACxE,WAAW,CAAC,0BAA0B,GAAG,IAAI,CAAC,iCAAiC,CAC7E,cAAc,CAAC,0BAA0B,CAC1C,CAAC;AACF,QAAA,OAAO,WAAW,CAAC;KACpB;IAEO,2BAA2B,CACjC,mBAAsC,EACtC,cAAiC,EAAA;QAEjC,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,4BAA4B,CAAC,CAAC,CAAC;QAC9E,cAAc,CAAC,oBAAoB,KAAK,IAAI;eACvC,WAAW,CAAC,oBAAoB,GAAG,cAAc,CAAC,oBAAoB;AACzE,cAAE,OAAO,WAAW,CAAC,oBAAoB,CAAC;AAC5C,QAAA,OAAO,WAAW,CAAC;KACpB;AAEO,IAAA,iCAAiC,CACvC,0BAAsD,EAAA;QAEtD,OAAO;YACL,iBAAiB,EAAE,0BAA0B,CAAC,iBAAiB;iBAC5D,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC;iBAC5B,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC;YAC5B,mBAAmB,EAAE,0BAA0B,CAAC,mBAAmB;iBAChE,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC;iBAC5B,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC;AAC5B,YAAA,gBAAgB,EAAE,0BAA0B,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;SACrF,CAAC;KACH;AAEO,IAAA,wBAAwB,CAAC,iBAAqC,EAAA;QACpE,OAAO,IAAI,CAAC,iBAAiB,EAAE;YAC7B,MAAM;YACN,kBAAkB;YAClB,aAAa;YACb,gBAAgB;YAChB,iBAAiB;YACjB,kBAAkB;YAClB,OAAO;AACR,SAAA,CAAC,CAAC;KACJ;;oHA1FU,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAvB,uBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA,CAAA;2FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;iBACnB,CAAA;;;MCUY,wBAAwB,CAAA;AAsBnC,IAAA,WAAA,CACU,yBAAoD,EACpD,oBAA0C,EAC1C,oBAA0C,EAC1C,QAAyB,EACzB,eAAgC,EAChC,uBAAgD,EAChD,aAA4B,EAAA;AAN5B,QAAA,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB,CAA2B;AACpD,QAAA,IAAoB,CAAA,oBAAA,GAApB,oBAAoB,CAAsB;AAC1C,QAAA,IAAoB,CAAA,oBAAA,GAApB,oBAAoB,CAAsB;AAC1C,QAAA,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAiB;AACzB,QAAA,IAAe,CAAA,eAAA,GAAf,eAAe,CAAiB;AAChC,QAAA,IAAuB,CAAA,uBAAA,GAAvB,uBAAuB,CAAyB;AAChD,QAAA,IAAa,CAAA,aAAA,GAAb,aAAa,CAAe;QA5B9B,IAAA,CAAA,6BAA6B,GAAkB;YACrD,IAAI,WAAW,CAAC,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,CAAC;YAC7D,IAAI,WAAW,CAAC,UAAU,EAAE,kBAAkB,EAAE,SAAS,EAAE,KAAK,CAAC;YACjE,IAAI,WAAW,CAAC,2BAA2B,EAAE,+BAA+B,EAAE,SAAS,EAAE,KAAK,CAAC;YAC/F,IAAI,WAAW,CAAC,2BAA2B,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC;;YAEzE,IAAI,WAAW,CAAC,2BAA2B,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC;YAC1E,IAAI,WAAW,CAAC,2BAA2B,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,CAAC;SAC7E,CAAC;QAEM,IAAA,CAAA,6BAA6B,GAAkB;YACrD,IAAI,WAAW,CAAC,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1D,IAAI,WAAW,CAAC,UAAU,EAAE,mBAAmB,EAAE,SAAS,EAAE,KAAK,CAAC;YAClE,IAAI,WAAW,CAAC,2BAA2B,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC;YACzE,IAAI,WAAW,CAAC,2BAA2B,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,CAAC;YAC/E,IAAI,WAAW,CAAC,2BAA2B,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,CAAC;YAC1E,IAAI,WAAW,CAAC,2BAA2B,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC;YAC1E,IAAI,WAAW,CAAC,2BAA2B,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC;YACzE,IAAI,WAAW,CAAC,gBAAgB,EAAE,8BAA8B,EAAE,QAAQ,EAAE,IAAI,CAAC;SAClF,CAAC;KAUE;IAEJ,qBAAqB,GAAA;AACnB,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAC9C,QAAA,OAAO,QAAQ,CAAC;AACd,YAAA,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;AACrC,YAAA,aAAa,EAAE,IAAI,CAAC,iBAAiB,EAAE;AACvC,YAAA,aAAa,EAAE,IAAI,CAAC,iBAAiB,EAAE;AACvC,YAAA,mBAAmB,EAAE,IAAI,CAAC,0BAA0B,EAAE;AACtD,YAAA,wBAAwB,EAAE,IAAI,CAAC,4BAA4B,CAAC,aAAa,CAAC;AAC3E,SAAA,CAAC,CAAC;KACJ;IAED,IAAI,CAAC,oBAAuC,EAAE,yBAA4C,EAAA;QACxF,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAC7C,oBAAoB,EACpB,yBAAyB,CAC1B,CAAC;AACF,QAAA,MAAM,mBAAmB,GAAG,aAAa,CAAC,GAAG,CAAC,YAAY,IACxD,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,YAAY,CAAC,CAC/C,CAAC;QACF,MAAM,gBAAgB,GAAG,IAAI,CAAC,uBAAuB,CACnD,oBAAoB,EACpB,yBAAyB,CAC1B,CAAC;QACF,MAAM,wBAAwB,GAAG,IAAI,CAAC,+BAA+B,CACnE,oBAAoB,EACpB,yBAAyB,CAC1B,CAAC;QAEF,OAAO,OAAO,CAAC,GAAG,CAAC;AACjB,YAAA,IAAI,CAAC,uBAAuB,CAAC,gBAAgB,CAAC;AAC9C,YAAA,IAAI,CAAC,uBAAuB,CAAC,wBAAwB,CAAC;YACtD,mBAAmB;AACpB,SAAA,CAAC,CAAC;KACJ;AAEO,IAAA,GAAG,CAAC,aAA+C,EAAA;AACzD,QAAA,OAAO,aAAa,CAAC,IAAI,CACvB,GAAG,CAAC,YAAY,IACd,YAAY,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CACjF,CACF,CAAC;KACH;AAEO,IAAA,uBAAuB,CAC7B,WAA+B,EAAA;QAE/B,OAAO,WAAW,CAAC,EAAE;cACjB,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,WAAW,CAAC;cAClD,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;KACxD;IAEO,uBAAuB,CAC7B,oBAAuC,EACvC,yBAA4C,EAAA;AAE5C,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,+BAA+B,CAC3D,yBAAyB,EACzB,qBAAqB,CAAC,KAAK,CAC5B,CAAC;AACF,QAAA,gBAAgB,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAC3D,oBAAoB,EACpB,qBAAqB,CAAC,KAAK,CAC5B,CAAC;AACF,QAAA,OAAO,IAAI,CAAC,uBAAuB,CAAC,OAAO,CACzC,gBAAgB,EAChB,IAAI,CAAC,mCAAmC,CAAC,oBAAoB,EAAE,qBAAqB,CAAC,KAAK,CAAC,CAC5F,CAAC;KACH;IAEO,+BAA+B,CACrC,oBAAuC,EACvC,yBAA4C,EAAA;AAE5C,QAAA,MAAM,wBAAwB,GAAG,IAAI,CAAC,+BAA+B,CACnE,yBAAyB,EACzB,qBAAqB,CAAC,eAAe,CACtC,CAAC;AACF,QAAA,wBAAwB,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CACnE,oBAAoB,EACpB,qBAAqB,CAAC,eAAe,CACtC,CAAC;AACF,QAAA,OAAO,IAAI,CAAC,uBAAuB,CAAC,OAAO,CACzC,wBAAwB,EACxB,IAAI,CAAC,mCAAmC,CACtC,oBAAoB,EACpB,qBAAqB,CAAC,eAAe,CACtC,CACF,CAAC;KACH;IAEO,+BAA+B,CACrC,yBAA4C,EAC5C,eAAsC,EAAA;QAEtC,OAAO,QAAQ,CACb,EAAE,EACF,IAAI,CAAC,mCAAmC,CAAC,yBAAyB,EAAE,eAAe,CAAC,EACpF,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,CAC5C,CAAC;KACH;IAEO,mCAAmC,CACzC,iBAAoC,EACpC,eAAsC,EAAA;AAEtC,QAAA,OAAO,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;KACjG;IAEO,kBAAkB,CACxB,iBAAoC,EACpC,eAAsC,EAAA;AAEtC,QAAA,OAAO,iBAAiB,CAAC,wBAAwB,KAAK,eAAe,CAAC;KACvE;IAEO,oBAAoB,CAC1B,oBAAuC,EACvC,yBAA4C,EAAA;QAE5C,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,YAAY,KACrC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,UAAU,GAAG,YAAY,IAC7B,QAAQ,CAAC,oBAAoB,EAAE,YAAY,CAAC;AAC5C,YAAA,QAAQ,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC;QAEpD,OAAO,IAAI,CAAC,6BAA6B;AACtC,aAAA,MAAM,CAAC,YAAY,IAAI,QAAQ,CAAC,oBAAoB,EAAE,YAAY,CAAC,KAAK,IAAI,CAAC;aAC7E,MAAM,CAAC,YAAY,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;AAChD,aAAA,GAAG,CAAC,YAAY,KAAK;YACpB,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,GAAG,EAAE,YAAY,CAAC,GAAG;YACrB,KAAK,EAAE,QAAQ,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC,QAAQ,EAAE;AAC/D,SAAA,CAAC,CAAC,CAAC;KACP;IAEO,gBAAgB,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,oBAAoB,EAAE,CAAC,CAAC,IAAI,CACrE,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,EACpB,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC,CAC/D,CAAC;KACH;AAEO,IAAA,4BAA4B,CAClC,aAA+C,EAAA;QAE/C,OAAO,aAAa,CAAC,IAAI,CACvB,GAAG,CAAC,YAAY,IAAG;YACjB,OAAO,IAAI,CAAC,eAAe,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC;SACxE,CAAC,CACH,CAAC;KACH;AAEO,IAAA,sBAAsB,CAAC,YAAkC,EAAA;QAC/D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE;AACpD,YAAA,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5E,SAAA;QACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,EAAE;AAC5D,YAAA,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,eAAe,CAAC,CAAC,CAAC;AACtF,SAAA;AACD,QAAA,OAAO,YAAY,CAAC;KACrB;IAEO,iBAAiB,GAAA;AACvB,QAAA,OAAO,QAAQ,CACb,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC,MAAmB,KACzD,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CACjD,GAAG,CAAC,GAAG,IAAG;AACR,YAAA,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACvB,YAAA,OAAO,MAAM,CAAC;AAChB,SAAC,CAAC,EACF,UAAU,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAC7B,CACF,CACF,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;KACxD;IAEO,iBAAiB,GAAA;QACvB,OAAO,QAAQ,CACb,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC,MAAmB,KAAI;YAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;AAC5D,YAAA,IAAI,WAAW,EAAE;AACf,gBAAA,OAAO,WAAW,CAAC;AACpB,aAAA;AAED,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CACxD,GAAG,CAAC,GAAG,IAAG;AACR,gBAAA,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACvB,gBAAA,OAAO,MAAM,CAAC;AAChB,aAAC,CAAC,EACF,UAAU,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAC7B,CAAC;AACJ,SAAC,CAAC,CACH,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;KACxD;AAED;;;;AAIG;AACK,IAAA,0BAA0B,CAAC,MAAmB,EAAA;QACpD,IAAI,MAAM,CAAC,QAAQ,KAAK,2BAA2B,IAAI,MAAM,CAAC,GAAG,KAAK,UAAU,EAAE;YAChF,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CACrF,GAAG,CAAC,WAAW,IAAG;gBAChB,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC,qBAAqB,CAAC,QAAQ,EAAE,CAAC;AAC5D,gBAAA,OAAO,MAAM,CAAC;aACf,CAAC,CACH,CAAC;AACH,SAAA;AACD,QAAA,OAAO,IAAI,CAAC;KACb;IAEO,0BAA0B,GAAA;QAChC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC,CAAC;KAClE;AAEO,IAAA,gBAAgB,CAAC,OAAsB,EAAA;QAC7C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,MAAM,KAAI;AAC9C,YAAA,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AACtE,YAAA,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC/D,YAAA,OAAO,aAAa,CAAC;SACtB,EAAE,EAAE,CAAC,CAAC;KACR;AAEO,IAAA,qBAAqB,CAAC,qBAA4C,EAAA;QACxE,OAAO;YACL,oBAAoB,EAAE,oBAAoB,CAAC,QAAQ;YACnD,SAAS,EAAE,SAAS,CAAC,QAAQ;AAC7B,YAAA,YAAY,EAAE,YAAY;AAC1B,YAAA,kBAAkB,EAAE,KAAK;AACzB,YAAA,IAAI,EAAE,qBAAqB;SAC5B,CAAC;KACH;;qHAxQU,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAF,IAAA,CAAA,yBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,EAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAE,uBAAA,EAAA,EAAA,EAAA,KAAA,EAAAH,IAAA,CAAA,aAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;yHAAxB,wBAAwB,EAAA,CAAA,CAAA;2FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,UAAU;;;MCRE,6BAA6B,CAAA;IAuBxC,WACU,CAAA,eAAgC,EAChC,gBAAkC,EAAA;AADlC,QAAA,IAAe,CAAA,eAAA,GAAf,eAAe,CAAiB;AAChC,QAAA,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;AAtB5C,QAAA,IAAyB,CAAA,yBAAA,GAAG,qBAAqB,CAAC;AAClD,QAAA,IAAA,CAAA,mCAAmC,GAAG,OAAO,CAC3C,6FAA6F,CAC9F,CAAC;AACF,QAAA,IAAA,CAAA,kCAAkC,GAAG,OAAO,CAAC,+CAA+C,CAAC,CAAC;AAC9F,QAAA,IAAA,CAAA,qCAAqC,GAAG,OAAO,CAC7C,yDAAyD,CAC1D,CAAC;AACF,QAAA,IAAA,CAAA,qCAAqC,GAAG,OAAO,CAC7C,2DAA2D,CAC5D,CAAC;AAEF,QAAA,IAAA,CAAA,sCAAsC,GAAG,OAAO,CAC9C,6HAA6H,CAC9H,CAAC;AAEM,QAAA,IAAA,CAAA,oBAAoB,GAAW,EAAE,GAAG,EAAE,CAAC;QAQ7C,IAAI,CAAC,mCAAmC,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CACtE,IAAI,CAAC,mCAAmC,EACxC,EAAE,kBAAkB,EAAE,IAAI,CAAC,oBAAoB,EAAE,CAClD,CAAC;KACH;AAED,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,CAAC,YAAY,EAAE;AACvE,YAAA,MAAM,aAAa,GACjB,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;YAClF,IAAI,CAAC,4BAA4B,GAAG,SAAS,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;AAClF,YAAA,IAAI,CAAC,oBAAoB,GAAG,aAAa,CAAC,oBAAoB,CAAC;AAC/D,YAAA,IAAI,CAAC,qBAAqB;gBACxB,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,8BAA8B,CAAC,CAAC;AAC1F,SAAA;KACF;AAED,IAAA,IAAI,qBAAqB,GAAA;AACvB,QAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC;QACvD,OAAO,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,CAAC;KACzE;IAED,IAAI,qBAAqB,CAAC,KAAa,EAAA;QACrC,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;KAC9E;AAED,IAAA,IAAI,sBAAsB,GAAA;AACxB,QAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC;QACvD,OAAO,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,CAAC;KAC1E;IAED,IAAI,sBAAsB,CAAC,KAAa,EAAA;QACtC,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;KAC/E;AAED,IAAA,IAAI,+BAA+B,GAAA;AACjC,QAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,+BAA+B,CAAC;KAClE;IAED,IAAI,+BAA+B,CAAC,KAAa,EAAA;AAC/C,QAAA,IAAI,CAAC,oBAAoB,CAAC,+BAA+B,GAAG,KAAK,CAAC;KACnE;AAED,IAAA,IAAI,2BAA2B,GAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,2BAA2B,CAAC;KAC9D;IAED,IAAI,2BAA2B,CAAC,KAAc,EAAA;AAC5C,QAAA,IAAI,CAAC,oBAAoB,CAAC,2BAA2B,GAAG,KAAK,CAAC;KAC/D;AAED,IAAA,IAAI,kBAAkB,GAAA;QACpB,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,8BAA8B,CAAC,CAAC;KAC/F;IAED,IAAI,kBAAkB,CAAC,KAAK,EAAA;AAC1B,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,8BAA8B,CAAC,GAAG,KAAK,CAAC;KAChG;AAED,IAAA,IAAI,uBAAuB,GAAA;AACzB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC;KACpC;IAED,IAAI,uBAAuB,CAAC,KAAK,EAAA;QAC/B,IAAI,CAAC,oBAAoB,GAAG,KAAK;cAC7B,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,4BAA4B,EAAE;AAC9C,gBAAA,qBAAqB,EAAE,UAAU;AACjC,gBAAA,oBAAoB,EAAE,QAAQ;AAC9B,gBAAA,+BAA+B,EAAE,CAAC;AAClC,gBAAA,2BAA2B,EAAE,KAAK;aACnC,CAAC;cACF,IAAI,CAAC;QACT,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,IAAI,MAAM,CAAC;KAChE;AAED,IAAA,IAAI,0BAA0B,GAAA;QAC5B,OAAO;AACL,YAAA,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;SACtE,CAAC;KACH;AAED,IAAA,IAAI,yBAAyB,GAAA;QAC3B,OAAO;AACL,YAAA,GAAG,EAAE,IAAI,CAAC,oBAAoB,GAAG,CAAC;AAClC,YAAA,GAAG,EAAE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,GAAG,CAAC,GAAG,IAAI;SAClE,CAAC;KACH;AAED,IAAA,IAAI,6BAA6B,GAAA;QAC/B,OAAO;AACL,YAAA,GAAG,EAAE,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,GAAG,CAAC,GAAG,IAAI;AACvE,YAAA,GAAG,EAAE,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,GAAG,CAAC,GAAG,IAAI;SAC1E,CAAC;KACH;AAED,IAAA,IAAI,oBAAoB,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC;KACvF;IAED,IAAI,oBAAoB,CAAC,KAA4B,EAAA;AACnD,QAAA,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,oBAAoB,GAAG,KAAK,CAAC;KACxF;AAEO,IAAA,eAAe,CAAC,OAAe,EAAA;AACrC,QAAA,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;KAClD;AAEO,IAAA,gBAAgB,CAAC,YAAoB,EAAA;AAC3C,QAAA,OAAO,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;KACvE;;0HAxIU,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,6BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,6BAA6B,ECd1C,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,25LAgKA,EDpJiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,CAAA,CAAA;2FAExD,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBALzC,SAAS;+BACE,2BAA2B,EAAA,aAAA,EAEtB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,QAAA,EAAA,25LAAA,EAAA,CAAA;qIAInE,iBAAiB,EAAA,CAAA;sBADhB,KAAK;;;MEHK,sBAAsB,CAAA;AAiBjC,IAAA,WAAA,CAAoB,eAAgC,EAAA;AAAhC,QAAA,IAAe,CAAA,eAAA,GAAf,eAAe,CAAiB;AAhBpD,QAAA,IAAA,CAAA,4BAA4B,GAAG,OAAO,CACpC,0XAA0X,CAC3X,CAAC;AACF,QAAA,IAAA,CAAA,4BAA4B,GAAG,OAAO,CAAC,gDAAgD,CAAC,CAAC;AAMzF,QAAA,IAAyB,CAAA,yBAAA,GAAG,qBAAqB,CAAC;AAE1C,QAAA,IAAiB,CAAA,iBAAA,GAAG,UAAU,CAAC;AAC/B,QAAA,IAAkB,CAAA,kBAAA,GAAG,gBAAgB,CAAC;AACtC,QAAA,IAA4B,CAAA,4BAAA,GAAG,mBAAmB,CAAC;AACnD,QAAA,IAA4B,CAAA,4BAAA,GAAG,kBAAkB,CAAC;KAEF;AAExD,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,CAAC,YAAY,EAAE;YACvE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,CACxE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAC9B,CAAC;AACH,SAAA;KACF;AAED,IAAA,IAAI,2BAA2B,GAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;KAC9F;AAED,IAAA,IAAI,qBAAqB,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,2BAA2B,KAAK,IAAI;cAC5C,IAAI,CAAC,2BAA2B;AAClC,cAAE,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;KAC3F;IAED,IAAI,qBAAqB,CAAC,KAAK,EAAA;AAC7B,QAAA,IAAI,IAAI,CAAC,2BAA2B,KAAK,IAAI,EAAE;AAC7C,YAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,KAAK,CAAC;AAC/F,SAAA;KACF;AAED,IAAA,IAAI,6BAA6B,GAAA;AAC/B,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CACjE,IAAI,CAAC,4BAA4B,CAClC,CAAC;KACH;AAED,IAAA,IAAI,uBAAuB,GAAA;QACzB,OAAO,IAAI,CAAC,6BAA6B;cACrC,IAAI,CAAC,6BAA6B;AACpC,cAAE,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAC1D,IAAI,CAAC,4BAA4B,CAClC,CAAC;KACP;IAED,IAAI,uBAAuB,CAAC,KAAK,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,6BAA6B,EAAE;AACvC,YAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAC1D,IAAI,CAAC,4BAA4B,CAClC,GAAG,KAAK,CAAC;AACX,SAAA;KACF;;mHA/DU,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,sBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,ECZnC,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,y9HA2GA,EDjGiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,CAAA,CAAA;2FAExD,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBALlC,SAAS;+BACE,oBAAoB,EAAA,aAAA,EAEf,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,QAAA,EAAA,y9HAAA,EAAA,CAAA;sGASnE,iBAAiB,EAAA,CAAA;sBADhB,KAAK;;;AElBR;AAQA,IAAK,YAKJ,CAAA;AALD,CAAA,UAAK,YAAY,EAAA;IACf,YAAA,CAAA,YAAA,CAAA,yBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,yBAAuB,CAAA;IACvB,YAAA,CAAA,YAAA,CAAA,wBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,wBAAsB,CAAA;IACtB,YAAA,CAAA,YAAA,CAAA,uBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,uBAAqB,CAAA;IACrB,YAAA,CAAA,YAAA,CAAA,wBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,wBAAsB,CAAA;AACxB,CAAC,EALI,YAAY,KAAZ,YAAY,GAKhB,EAAA,CAAA,CAAA,CAAA;MAOY,oBAAoB,CAAA;AALjC,IAAA,WAAA,GAAA;AASE,QAAA,IAAA,CAAA,wBAAwB,GAA0B,qBAAqB,CAAC,KAAK,CAAC;AAI9E,QAAA,IAAY,CAAA,YAAA,GAAG,YAAY,CAAC;AAC5B,QAAA,IAAe,CAAA,eAAA,GAAG,WAAW,CAAC;AAC9B,QAAA,IAAyB,CAAA,yBAAA,GAAG,qBAAqB,CAAC;AAElD,QAAA,IAAA,CAAA,2BAA2B,GAAG,OAAO,CAAC,sCAAsC,CAAC,CAAC;AAC9E,QAAA,IAAA,CAAA,8BAA8B,GAAG,OAAO,CACtC,+DAA+D,CAChE,CAAC;AAEF,QAAA,IAAA,CAAA,iCAAiC,GAAG,OAAO,CAAC,gDAAgD,CAAC,CAAC;AAC9F,QAAA,IAAA,CAAA,gCAAgC,GAAG,OAAO,CAAC,+CAA+C,CAAC,CAAC;AAC5F,QAAA,IAAA,CAAA,wCAAwC,GAAG,OAAO,CAChD,gHAAgH,CACjH,CAAC;AACF,QAAA,IAAA,CAAA,2CAA2C,GAAG,OAAO,CACnD,2FAA2F,CAC5F,CAAC;KAqGH;AAnGC,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,CAAC,YAAY,EAAE;YACvE,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,mBAAmB,CAAC;AACtF,YAAA,IAAI,CAAC,wBAAwB;AAC3B,gBAAA,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,wBAAwB,CAAC;AACnE,SAAA;KACF;IAED,SAAS,GAAA;QACP,IAAI,IAAI,CAAC,wBAAwB,KAAK,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,EAAE;YACrF,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,CAAC;AAChF,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC;AACrF,SAAA;KACF;AAED,IAAA,IAAI,sBAAsB,GAAA;QACxB,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,gBAAgB,CAAC,CAAC;KAC5F;IAED,IAAI,sBAAsB,CAAC,KAAK,EAAA;AAC9B,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC;KAC7F;AAED,IAAA,IAAI,oBAAoB,GAAA;QACtB,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,cAAc,CAAC,CAAC;KAC1F;IAED,IAAI,oBAAoB,CAAC,KAAK,EAAA;AAC5B,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC;KAC3F;AAED,IAAA,IAAI,gBAAgB,GAAA;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,SAAS,CAAC,CAAC;KACrF;IAED,IAAI,gBAAgB,CAAC,KAAK,EAAA;AACxB,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;KACtF;AAED,IAAA,IAAI,iBAAiB,GAAA;QACnB,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,UAAU,CAAC,CAAC;KACtF;IAED,IAAI,iBAAiB,CAAC,KAAK,EAAA;AACzB,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC;KACvF;AAED,IAAA,IAAI,iBAAiB,GAAA;QACnB,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,UAAU,CAAC,CAAC;KACtF;IAED,IAAI,iBAAiB,CAAC,KAAK,EAAA;AACzB,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC;KACvF;AAED,IAAA,IAAI,sBAAsB,GAAA;QACxB,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,gBAAgB,CAAC,CAAC;KAC5F;AAED,IAAA,IAAI,kCAAkC,GAAA;QACpC,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CACtE,+BAA+B,CAChC,CAAC;KACH;AAED,IAAA,IAAI,gBAAgB,GAAA;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,SAAS,CAAC,CAAC;KACrF;AAED,IAAA,IAAI,iBAAiB,GAAA;QACnB,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,UAAU,CAAC,CAAC;KACtF;AAED,IAAA,IAAI,QAAQ,GAAA;QACV,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC;AACjD,SAAA;AACD,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE;AACzC,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC;AACjD,SAAA;QACD,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC;AAChD,SAAA;AACD,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC;KAClD;AAED,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,QACE,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,CAAC,uBAAuB,IAAI,IAAI,CAAC,gBAAgB;YACrF,IAAI,CAAC,mBAAmB,EACxB;KACH;AAED,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,QACE,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,CAAC,uBAAuB,IAAI,IAAI,CAAC,gBAAgB;AACrF,YAAA,IAAI,CAAC,wBAAwB,KAAK,qBAAqB,CAAC,eAAe,EACvE;KACH;;iHA5HU,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,oBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,ECpBjC,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,4tRAmOA,EDjNiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,CAAA,CAAA;2FAExD,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBALhC,SAAS;+BACE,cAAc,EAAA,aAAA,EAET,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,QAAA,EAAA,4tRAAA,EAAA,CAAA;8BAInE,iBAAiB,EAAA,CAAA;sBADhB,KAAK;;;MERK,0BAA0B,CAAA;IAcrC,WACU,CAAA,wBAAkD,EAClD,yBAAoD,EACpD,YAA0B,EAC1B,YAA0B,EAC1B,YAA0B,EAAA;AAJ1B,QAAA,IAAwB,CAAA,wBAAA,GAAxB,wBAAwB,CAA0B;AAClD,QAAA,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB,CAA2B;AACpD,QAAA,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;AAC1B,QAAA,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;AAC1B,QAAA,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;QAlBpC,IAAA,CAAA,UAAU,GAA6B,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;AAClE,QAAA,IAAA,CAAA,MAAM,GAAuB,IAAI,YAAY,EAAE,CAAC;QAGxC,IAAkB,CAAA,kBAAA,GAAkC,IAAI,CAAC,MAAM,CAAC,IAAI,CAC1E,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EACrC,SAAS,CAAC,MAAM,IAAI,CAAC,wBAAwB,CAAC,qBAAqB,EAAE,CAAC,EACtE,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EACtC,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;KAUE;IAEJ,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CACpE,CAAC,iBAAoC,KAAI;AACvC,YAAA,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;YAC3C,IAAI,CAAC,yBAAyB,GAAG,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACrE,SAAC,CACF,CAAC;QACF,IAAI,CAAC,cAAc,EAAE,CAAC;KACvB;IAED,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;KACpB;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,6BAA6B,CAAC,WAAW,EAAE,CAAC;KAClD;IAEK,IAAI,GAAA;;YACR,IAAI;AACF,gBAAA,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;AACxC,gBAAA,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CACtC,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,yBAAyB,CAC/B,CAAC;gBACF,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACtC,aAAA;AAAC,YAAA,OAAO,EAAE,EAAE;AACX,gBAAA,IAAI,EAAE,EAAE;AACN,oBAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;AACxC,iBAAA;AACF,aAAA;SACF,CAAA,CAAA;AAAA,KAAA;;uHArDU,0BAA0B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAI,wBAAA,EAAA,EAAA,EAAA,KAAA,EAAAL,IAAA,CAAA,yBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA1B,0BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,0BAA0B,8DCbvC,qrDA8CA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,aAAA,EAAA,UAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,6BAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,sBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,0BAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,oBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAR,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA;2FDjCa,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAJtC,SAAS;+BACE,wBAAwB,EAAA,QAAA,EAAA,qrDAAA,EAAA,CAAA;;;MEsBvB,mBAAmB,CAAA;;gHAAnB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAnB,mBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,iBAlB5B,6BAA6B;QAC7B,sBAAsB;QACtB,0BAA0B;QAC1B,0BAA0B;QAC1B,oBAAoB,CAAA,EAAA,OAAA,EAAA,CAGZ,UAAU,EAAE,aAAa,CAAA,EAAA,CAAA,CAAA;AAWxB,mBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,EAVnB,SAAA,EAAA;QACT,wBAAwB;QACxB,uBAAuB;AACvB,QAAA,SAAS,CAAC;AACR,YAAA,IAAI,EAAE,mCAAmC;AACzC,YAAA,SAAS,EAAE,0BAA0B;YACrC,WAAW,EAAE,CAAC,sBAAsB,CAAC;SACtC,CAAC;KACH,EATS,OAAA,EAAA,CAAA,UAAU,EAAE,aAAa,CAAA,EAAA,CAAA,CAAA;2FAWxB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBApB/B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ,6BAA6B;wBAC7B,sBAAsB;wBACtB,0BAA0B;wBAC1B,0BAA0B;wBAC1B,oBAAoB;AACrB,qBAAA;AACD,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,OAAO,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC;AACpC,oBAAA,SAAS,EAAE;wBACT,wBAAwB;wBACxB,uBAAuB;AACvB,wBAAA,SAAS,CAAC;AACR,4BAAA,IAAI,EAAE,mCAAmC;AACzC,4BAAA,SAAS,EAAE,0BAA0B;4BACrC,WAAW,EAAE,CAAC,sBAAsB,CAAC;yBACtC,CAAC;AACH,qBAAA;iBACF,CAAA;;;AC5BD,IAAY,YAIX,CAAA;AAJD,CAAA,UAAY,YAAY,EAAA;AACtB,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,YAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACf,IAAA,YAAA,CAAA,UAAA,CAAA,GAAA,UAAqB,CAAA;AACvB,CAAC,EAJW,YAAY,KAAZ,YAAY,GAIvB,EAAA,CAAA,CAAA,CAAA;AAEM,MAAM,kBAAkB,GAAG;AAChC,IAAA,CAAC,YAAY,CAAC,MAAM,GAAG;AACrB,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,KAAK,EAAE,QAAQ;AACf,QAAA,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC;AACzB,KAAA;AACD,IAAA,CAAC,YAAY,CAAC,KAAK,GAAG;AACpB,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC;AAC3B,KAAA;AACD,IAAA,CAAC,YAAY,CAAC,QAAQ,GAAG;AACvB,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC;AAC3B,KAAA;CACF,CAAC;AAEF,IAAY,gBAGX,CAAA;AAHD,CAAA,UAAY,gBAAgB,EAAA;AAC1B,IAAA,gBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB,CAAA;AACrB,IAAA,gBAAA,CAAA,eAAA,CAAA,GAAA,eAA+B,CAAA;AACjC,CAAC,EAHW,gBAAgB,KAAhB,gBAAgB,GAG3B,EAAA,CAAA,CAAA;;MCdY,uBAAuB,CAAA;AA6FlC,IAAA,WAAA,CAAoB,mBAA8C,EAAA;AAA9C,QAAA,IAAmB,CAAA,mBAAA,GAAnB,mBAAmB,CAA2B;AA5F1D,QAAA,IAAA,CAAA,iBAAiB,GAAmC,KAAK,CAAC,MAChE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAC9D,CAAC,IAAI,CACJ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,EACpB,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,KAAI;AACrB,YAAA,IAAI,GAAG,CAAC,MAAM,KAA6B,GAAA;AAAE,gBAAA,OAAO,UAAU,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;;AACvE,gBAAA,OAAO,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AAC5C,SAAC,CAAC,EACF,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,EACtB,QAAQ,EAAE,EACV,IAAI,CAAC,CAAC,CAAC,CACR,CAAC;QAEM,IAAA,CAAA,oBAAoB,GAAqB;AAC/C,YAAA,oBAAoB,EAAE;AACpB,gBAAA,IAAI,EAAE,EAAE;AACR,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,MAAM,EAAE,KAAK;AACb,gBAAA,SAAS,EAAE,UAAU;AACrB,gBAAA,aAAa,EAAE;AACb,oBAAA,aAAa,EAAE,OAAO;AACtB,oBAAA,SAAS,EAAE,aAAa;AACxB,oBAAA,YAAY,EAAE,gBAAgB;AAC9B,oBAAA,KAAK,EAAE,EAAE;AACV,iBAAA;AACF,aAAA;AACD,YAAA,YAAY,EAAE;AACZ,gBAAA,IAAI,EAAE,8FAA8F;AACpG,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,SAAS,EAAE,SAAS;AACpB,gBAAA,aAAa,EAAE;AACb,oBAAA,aAAa,EAAE,MAAM;AACrB,oBAAA,SAAS,EAAE,aAAa;AACxB,oBAAA,YAAY,EAAE,gBAAgB;AAC9B,oBAAA,KAAK,EAAE,EAAE;AACV,iBAAA;AACF,aAAA;AACD,YAAA,cAAc,EAAE;AACd,gBAAA,IAAI,EAAE,8EAA8E;AACpF,gBAAA,OAAO,EAAE;AACP,oBAAA,aAAa,EAAE,EAAE;AAClB,iBAAA;AACD,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,SAAS,EAAE,SAAS;AACpB,gBAAA,aAAa,EAAE;AACb,oBAAA,aAAa,EAAE,SAAS;AACxB,oBAAA,SAAS,EAAE,aAAa;AACzB,iBAAA;AACF,aAAA;AACD,YAAA,aAAa,EAAE;AACb,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,SAAS,EAAE,UAAU;AACrB,gBAAA,aAAa,EAAE,EAAE;AAClB,aAAA;YACD,IAAI,EAAE,qBAAqB,CAAC,MAAM;YAClC,SAAS,EAAE,SAAS,CAAC,kBAAkB;YACvC,oBAAoB,EAAE,oBAAoB,CAAC,MAAM;AACjD,YAAA,SAAS,EAAE;AACT,gBAAA,cAAc,EAAE;AACd,oBAAA,QAAQ,EAAE,EAAE;AACZ,oBAAA,iBAAiB,EAAE,EAAE;AACrB,oBAAA,aAAa,EAAE;AACb,wBAAA,sBAAsB,EAAE,KAAK;AAC7B,wBAAA,gCAAgC,EAAE,KAAK;AACxC,qBAAA;AACF,iBAAA;AACF,aAAA;AACD,YAAA,YAAY,EAAE;AACZ,gBAAA,QAAQ,EAAE,EAAE;AACZ,gBAAA,gBAAgB,EAAE,IAAI;AACvB,aAAA;AACD,YAAA,2BAA2B,EAAE;AAC3B,gBAAA,MAAM,EAAE;AACN,oBAAA,eAAe,EAAE,KAAK;AACvB,iBAAA;AACF,aAAA;YACD,QAAQ,EAAE,YAAY,CAAC,MAAM;AAC7B,YAAA,QAAQ,EAAE,EAAE;AACZ,YAAA,QAAQ,EAAE,EAAE;AACZ,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,kBAAkB,EAAE,EAAE;AACtB,YAAA,YAAY,EAAE,EAAE;AAChB,YAAA,kBAAkB,EAAE,IAAI;AACxB,YAAA,6BAA6B,EAAE,EAAE;AACjC,YAAA,mBAAmB,EAAE;AACnB,gBAAA,OAAO,EAAE,KAAK;AACf,aAAA;SACF,CAAC;KAEoE;IAEtE,oBAAoB,GAAA;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC;KAC/B;AAED,IAAA,IAAI,CAAC,gBAAkC,EAAA;QACrC,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;KACxD;;oHArGU,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAJ,IAAA,CAAA,yBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAvB,uBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA,CAAA;2FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;iBACnB,CAAA;;;MCXqB,sBAAsB,CAAA;;mHAAtB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAtB,sBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cADlB,MAAM,EAAA,CAAA,CAAA;2FACV,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAD3C,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;MCMZ,iBAAiB,CAAA;AAWrC,IAAA,WAAA,CAAgC,mBAA8C,EAAA;AAA9C,QAAA,IAAmB,CAAA,mBAAA,GAAnB,mBAAmB,CAA2B;AAJpE,QAAA,IAAA,CAAA,sBAAsB,GAAG,IAAI,YAAY,EAAoB,CAAC;KAIU;IAElF,QAAQ,GAAA;QACN,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,6BAA6B,CAAC,SAAS,CAAC,MAAK;YAC3E,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC9B,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,CAAC,YAAY,EAAE;YACrE,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;AACjE,SAAA;KACF;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,CAAC;KACxC;AAEO,IAAA,mBAAmB,CAAC,gBAAgB,EAAA;QAC1C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,gBAAgB,CAAM,CAAC;KAC5E;IAEO,oBAAoB,GAAA;AAC1B,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAC9E,QAAA,IAAI,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE;YAC5B,gBAAgB,CAAC,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;AAChD,SAAA;AACD,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;KACpD;;8GAvCmB,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAW,sBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,iBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,4TAF3B,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,CAAA;2FAEQ,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAHtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,EAAE;iBACb,CAAA;0GAGU,IAAI,EAAA,CAAA;sBAAZ,KAAK;gBACG,MAAM,EAAA,CAAA;sBAAd,KAAK;gBACG,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBACG,gBAAgB,EAAA,CAAA;sBAAxB,KAAK;gBACG,6BAA6B,EAAA,CAAA;sBAArC,KAAK;gBACI,sBAAsB,EAAA,CAAA;sBAA/B,MAAM;;;MCbI,oBAAoB,CAAA;AAQ/B,IAAA,WAAA,CAAY,oBAA6B,EAAA;QACvC,IAAI,CAAC,OAAO,GAAG,IAAI,gCAAgC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAClF,QAAA,IAAI,CAAC,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC;AAC1C,QAAA,IAAI,CAAC,SAAS,GAAG,oBAAoB,CAAC,SAAS,CAAC;QAChD,IAAI,CAAC,aAAa,GAAG,IAAI,gCAAgC,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;AAC9F,QAAA,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC;AACtC,QAAA,IAAI,CAAC,GAAG,GAAG,oBAAoB,CAAC,GAAG,CAAC;KACrC;IAED,SAAS,GAAA;AACP,QAAA,OAAO,MAAM,CACX;AACE,YAAA,IAAI,EAAE,IAAI,CAAC,MAAM,KAAK,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI;AAC5C,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;YAChC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;AACzB,YAAA,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;YAC5C,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,EACD,QAAQ,CACE,CAAC;KACd;AACF,CAAA;AAED;AACM,MAAO,gCAAiC,SAAQ,KAAK,CAAA;AACzD,IAAA,WAAA,CAAY,GAA4B,EAAA;AACtC,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,IAAI,CAAC,IAAI,CACP,GAAGC,KAAG,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,MAAM;YAC3B,GAAG;YACH,KAAK;SACN,CAAC,CAAC,CACJ,CAAC;KACH;IAED,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,KAAI;YAClC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;AACjC,YAAA,OAAO,GAAG,CAAC;SACZ,EAAE,EAAE,CAAC,CAAC;KACR;AACF;;AC3CD,IAAY,aAGX,CAAA;AAHD,CAAA,UAAY,aAAa,EAAA;AACvB,IAAA,aAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,aAAA,CAAA,KAAA,CAAA,GAAA,KAAW,CAAA;AACb,CAAC,EAHW,aAAa,KAAb,aAAa,GAGxB,EAAA,CAAA,CAAA,CAAA;AAEM,MAAM,mBAAmB,GAAG;AACjC,IAAA,CAAC,aAAa,CAAC,IAAI,GAAG;AACpB,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,KAAK,EAAE,OAAO,CAAC,gCAAgC,CAAC;AACjD,KAAA;AACD,IAAA,CAAC,aAAa,CAAC,GAAG,GAAG;AACnB,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,KAAK,EAAE,KAAK;AACZ,QAAA,KAAK,EAAE,OAAO,CAAC,gDAAgD,CAAC;AACjE,KAAA;CACF,CAAC;AAEF,IAAY,eAKX,CAAA;AALD,CAAA,UAAY,eAAe,EAAA;AACzB,IAAA,eAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,eAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACf,IAAA,eAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,eAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACf,CAAC,EALW,eAAe,KAAf,eAAe,GAK1B,EAAA,CAAA,CAAA,CAAA;AAEM,MAAM,qBAAqB,GAAG;AACnC,IAAA,CAAC,eAAe,CAAC,MAAM,GAAG;AACxB,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC;AACxB,QAAA,KAAK,EAAE,QAAQ;AACf,QAAA,mCAAmC,EAAE,QAAQ;AAC7C,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;AACD,IAAA,CAAC,eAAe,CAAC,KAAK,GAAG;AACvB,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,mCAAmC,EAAE,KAAK;AAC1C,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;AACD,IAAA,CAAC,eAAe,CAAC,IAAI,GAAG;AACtB,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC;AAC/B,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,mCAAmC,EAAE,cAAc;AACnD,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;AACD,IAAA,CAAC,eAAe,CAAC,IAAI,GAAG;AACtB,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,mCAAmC,EAAE,MAAM;AAC3C,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;CACF,CAAC;MAUW,sBAAsB,CAAA;AAOjC,IAAA,WAAA,CAAY,2BAAwD,EAAA;AAClE,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,2BAA2B,CAC3C,2BAA2B,CAAC,MAAM,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CACjE,CAAC;AACF,QAAA,IAAI,CAAC,GAAG,GAAG,2BAA2B,CAAC,GAAG,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAE,CAAC;AAC5E,QAAA,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC,IAAI,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AAChE,QAAA,IAAI,CAAC,YAAY,GAAG,2BAA2B,CAAC,YAAY,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;QACpF,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,kBAAkB,CAAC,2BAA2B,CAAC,CAAC;KACnF;IAED,6BAA6B,GAAA;AAC3B,QAAA,MAAM,MAAM,GAAG;AACb,YAAA,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;YAC9B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC;AACF,QAAA,OAAO,IAAI,CACT,MAAM,EACN,qBAAqB,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,mCAAmC,CACtF,CAAC;KACH;AAED,IAAA,kBAAkB,CAAC,2BAAwD,EAAA;AACzE,QAAA,MAAM,uBAAuB,GAAG,OAAO,CAAC,qBAAqB,EAAE,eAAe,IAC5E,GAAG,CAAC,2BAA2B,EAAE,eAAe,CAAC,mCAAmC,CAAC,CACtF,CAAC;AACF,QAAA,OAAO,uBAAuB,IAAI,eAAe,CAAC,MAAM,CAAC;KAC1D;AACF,CAAA;AAED;AACA,MAAM,2BAA2B,CAAA;AAK/B,IAAA,WAAA,CAAY,MAAyC,EAAA;AAFrD,QAAA,IAAkB,CAAA,kBAAA,GAAwB,EAAE,CAAC;AAG3C,QAAA,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;AAC9C,QAAA,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;KAC9D;AAED,IAAA,qBAAqB,CAAC,MAAyC,EAAA;QAC7D,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;AACrD,QAAA,MAAM,kBAAkB,GAAGA,KAAG,CAAC,YAAY,EAAE,CAAC,WAAW,EAAE,GAAG,sCACzD,WAAW,CAAA,EAAA,EACd,GAAG,EACH,SAAS,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAC1C,SAAS,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAA,CAAA,CAC1C,CAAC,CAAC;AACJ,QAAA,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE;AACnC,YAAA,MAAM,oBAAoB,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AAC5C,YAAA,kBAAkB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AAC/C,SAAA;AACD,QAAA,OAAO,kBAAkB,CAAC;KAC3B;IAED,oBAAoB,GAAA;AAClB,QAAA,MAAM,oBAAoB,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AAChF,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;KACpD;AAED,IAAA,uBAAuB,CAAC,iBAAoC,EAAA;QAC1D,MAAM,wBAAwB,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACpF,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;KAC7D;IAED,QAAQ,GAAA;AACN,QAAA,MAAM,MAAM,GAAsC,IAAI,CAAC,oCAAoC,EAAE,CAAC;AAC9F,QAAA,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;AACtD,QAAA,OAAO,MAAM,CAAC;KACf;IAED,wBAAwB,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE;YACtC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC;AAC5C,SAAA;QACD,OAAO,MAAM,CACX,IAAI,CAAC,kBAAkB,EACvB,CAAC,qBAAqB,EAAE,iBAAiB,sCACpC,qBAAqB,CAAA,EAAA,EACxB,CAAC,iBAAiB,CAAC,GAAG,GAAG;gBACvB,GAAG,EAAE,iBAAiB,CAAC,GAAG;gBAC1B,SAAS,EAAE,iBAAiB,CAAC,SAAS;gBACtC,SAAS,EAAE,iBAAiB,CAAC,SAAS;gBACtC,SAAS,EAAE,iBAAiB,CAAC,SAAS;aACvC,EACD,CAAA,CAAA,EACF,EAAE,CACH,CAAC;KACH;IAED,oCAAoC,GAAA;AAClC,QAAA,IAAI,MAAM,GAAG;AACX,YAAA,eAAe,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC;YACnD,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;AACF,QAAA,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;AAC3B,YAAA,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AACtC,SAAA;AACD,QAAA,OAAO,MAAM,CAAC;KACf;AACF;;AC/KM,MAAM,sBAAsB,GAAG;AACpC,IAAA,CAAC,gBAAgB,CAAC,aAAa,GAAG;AAChC,QAAA,IAAI,EAAE,eAAe;AACrB,QAAA,KAAK,EAAE,eAAe;AACtB,QAAA,KAAK,EAAE,OAAO,CAAC,2EAA2E,CAAC;AAC3F,QAAA,QAAQ,EAAE;AACR,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,IAAI,EAAE,2DAA2D;AACjE,YAAA,GAAG,EAAE,EAAE;AACP,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,aAAa,EAAE,EAAE;AAClB,SAAA;AACF,KAAA;AACD,IAAA,CAAC,gBAAgB,CAAC,QAAQ,GAAG;AAC3B,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,KAAK,EAAE,OAAO,CAAC,uEAAuE,CAAC;AACvF,QAAA,QAAQ,EAAE;AACR,YAAA,GAAG,EAAE,EAAE;AACP,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,OAAO,EAAE,EAAE,aAAa,EAAE,uBAAuB,EAAE;AACnD,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,aAAa,EAAE,EAAE;AAClB,SAAA;AACF,KAAA;CACF,CAAC;AAEF,MAAM,6BAA6B,GAAY;AAC7C,IAAA,IAAI,EAAE,2DAA2D;AACjE,IAAA,GAAG,EAAE,EAAE;AACP,IAAA,OAAO,EAAE,EAAE;AACX,IAAA,MAAM,EAAE,MAAM;AACd,IAAA,SAAS,EAAE,SAAS;AACpB,IAAA,aAAa,EAAE,EAAE;CAClB,CAAC;AAEF,MAAM,mBAAmB,GAAiB;AACxC,IAAA,QAAQ,EAAE,EAAE;AACZ,IAAA,gBAAgB,EAAE,IAAI;CACvB,CAAC;MAEW,aAAa,CAAA;AAQxB,IAAA,WAAA,CAAY,mBAAwC,EAAA;AAClD,QAAA,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,mBAAmB,CAAC,CAAC;QACpF,IAAI,CAAC,iBAAiB,GAAG,oBAAoB,CAAC,iBAAiB,IAAI,mBAAmB,CAAC;QACvF,IAAI,CAAC,gBAAgB,GAAG,oBAAoB,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,aAAa,CAAC;AAChG,QAAA,IAAI,CAAC,kBAAkB,GAAG,oBAAoB,CAAC,kBAAkB,CAAC;AAClE,QAAA,IAAI,CAAC,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC;AAC5C,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,oBAAoB,CACpD,oBAAoB,CAAC,sBAAsB,IAAI,6BAA6B,CAC7E,CAAC;AACF,QAAA,IAAI,CAAC,yCAAyC;AAC5C,YAAA,oBAAoB,CAAC,yCAAyC,IAAI,CAAC,CAAC;KACvE;IAED,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACjB,YAAA,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AAClC,SAAA;AACD,QAAA,MAAM,mBAAmB,GAAwB;YAC/C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;QACF,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,YAAA,mBAAmB,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAC7D,mBAAmB,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,CAAC;AACrF,YAAA,mBAAmB,CAAC,yCAAyC;gBAC3D,IAAI,CAAC,yCAAyC,CAAC;AAClD,SAAA;AACD,QAAA,OAAO,mBAAmB,CAAC;KAC5B;AACF;;MC3EY,yBAAyB,CAAA;AACpC,IAAA,OAAO,CAAC,aAAqC,EAAA;AAC3C,QAAA,MAAM,gBAAgB,GAAqB;YACzC,6BAA6B,EAAE,aAAa,CAAC,6BAA6B;YAC1E,QAAQ,EAAE,aAAa,CAAC,QAAQ;AAChC,YAAA,oBAAoB,EAAE,aAAa,CAAC,oBAAoB,CAAC,SAAS,EAAE;YACpE,UAAU,EAAE,aAAa,CAAC,UAAU;YACpC,QAAQ,EAAE,aAAa,CAAC,QAAQ;YAChC,MAAM,EAAE,aAAa,CAAC,MAAM;AAC5B,YAAA,aAAa,EAAE,aAAa,CAAC,aAAa,CAAC,SAAS,EAAE;YACtD,SAAS,EAAE,aAAa,CAAC,SAAS;YAClC,YAAY,EAAE,aAAa,CAAC,YAAY;YACxC,kBAAkB,EAAE,aAAa,CAAC,kBAAkB;AACpD,YAAA,cAAc,EAAE,aAAa,CAAC,cAAc,CAAC,SAAS,EAAE;AACxD,YAAA,2BAA2B,EACzB,aAAa,CAAC,2BAA2B,CAAC,6BAA6B,EAAE;YAC3E,QAAQ,EAAE,YAAY,CAAC,MAAM;AAC7B,YAAA,YAAY,EAAE,aAAa,CAAC,YAAY,CAAC,SAAS,EAAE;YACpD,YAAY,EAAE,aAAa,CAAC,YAAY;YACxC,oBAAoB,EAAE,aAAa,CAAC,oBAAoB;YACxD,kBAAkB,EAAE,aAAa,CAAC,kBAAkB;YACpD,IAAI,EAAE,qBAAqB,CAAC,MAAM;YAClC,SAAS,EAAE,SAAS,CAAC,kBAAkB;AACvC,YAAA,mBAAmB,EAAE,aAAa,CAAC,mBAAmB,CAAC,qBAAqB,EAAE;SAC/E,CAAC;AACF,QAAA,OAAO,gBAAgB,CAAC;KACzB;AAED,IAAA,KAAK,CAAC,gBAAkC,EAAA;QACtC,OAAO;YACL,6BAA6B,EAAE,gBAAgB,CAAC,6BAA6B;YAC7E,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;AACnC,YAAA,oBAAoB,EAAE,IAAI,oBAAoB,CAAC,gBAAgB,CAAC,oBAAoB,CAAC;YACrF,UAAU,EAAE,gBAAgB,CAAC,UAAU;YACvC,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;YACnC,MAAM,EAAE,gBAAgB,CAAC,MAAM;AAC/B,YAAA,aAAa,EAAE,IAAI,oBAAoB,CAAC,gBAAgB,CAAC,aAAa,CAAC;YACvE,SAAS,EAAE,gBAAgB,CAAC,SAAS;YACrC,YAAY,EAAE,gBAAgB,CAAC,YAAY;YAC3C,kBAAkB,EAAE,gBAAgB,CAAC,kBAAkB;AACvD,YAAA,cAAc,EAAE,IAAI,oBAAoB,CAAC,gBAAgB,CAAC,cAAc,CAAC;AACzE,YAAA,2BAA2B,EAAE,IAAI,sBAAsB,CACrD,gBAAgB,CAAC,2BAA2B,CAC7C;YACD,QAAQ,EAAE,YAAY,CAAC,MAAM;AAC7B,YAAA,YAAY,EAAE,IAAI,oBAAoB,CAAC,gBAAgB,CAAC,YAAY,CAAC;YACrE,YAAY,EAAE,gBAAgB,CAAC,YAAY;YAC3C,oBAAoB,EAAE,gBAAgB,CAAC,oBAAoB;YAC3D,kBAAkB,EAAE,gBAAgB,CAAC,kBAAkB;YACvD,eAAe,EAAE,eAAe,CAAC,MAAM;AACvC,YAAA,mBAAmB,EAAE,IAAI,aAAa,CAAC,gBAAgB,CAAC,mBAAmB,CAAC;SAC7E,CAAC;KACH;;sHApDU,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAzB,yBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,cAFxB,MAAM,EAAA,CAAA,CAAA;2FAEP,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAHrC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;iBACnB,CAAA;;;MCHY,2BAA2B,CAAA;AAKtC,IAAA,WAAA,CAAoB,aAA4B,EAAA;AAA5B,QAAA,IAAa,CAAA,aAAA,GAAb,aAAa,CAAe;KAAI;AAGpD,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,OAAO,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC;KACpC;IAEK,QAAQ,GAAA;;AACZ,YAAA,MAAM,aAAa,GAAG,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC;AAChE,YAAA,MAAM,EAAE,UAAU,EAAE,GAAG,aAAa,CAAC;YACrC,IAAI,CAAC,+BAA+B,GAAG;gBACrC,IAAI,EAAE,CAAW,QAAA,EAAA,UAAU,CAAE,CAAA;gBAC7B,kBAAkB,EAAE,CAAW,QAAA,EAAA,UAAU,CAAe,aAAA,CAAA;aACzD,CAAC;AACF,YAAA,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE;AAC3B,gBAAA,kBAAkB,EAAE,IAAI,CAAC,+BAA+B,CAAC,kBAAkB;AAC5E,aAAA,CAAC,CAAC;SACJ,CAAA,CAAA;AAAA,KAAA;;wHAtBU,2BAA2B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAZ,IAAA,CAAA,aAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,2BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,2BAA2B,ECXxC,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,m4SA2QA,EDlQiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,CAAA,CAAA;AAUnE,UAAA,CAAA;AADC,IAAA,OAAO,EAAE;;;;CAGT,EAAA,2BAAA,CAAA,SAAA,EAAA,YAAA,EAAA,IAAA,CAAA,CAAA;2FAVU,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBALvC,SAAS;+BACE,yBAAyB,EAAA,aAAA,EAEpB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,QAAA,EAAA,m4SAAA,EAAA,CAAA;sGAG1D,aAAa,EAAA,CAAA;sBAArB,KAAK;gBAON,UAAU,EAAA,EAAA,EAAA,EAAA,CAAA;;METC,6BAA6B,CAAA;AAUxC,IAAA,WAAA,CAAoB,gBAAkC,EAAA;AAAlC,QAAA,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;KAAI;AAG1D,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,OAAO,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC;KACpC;AAED,IAAA,IAAI,oBAAoB,GAAA;QACtB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;KAC7C;AAED,IAAA,cAAc,CAAC,KAAK,EAAA;AAClB,QAAA,MAAM,WAAW,GAAG;AAClB,YAAA,GAAG,EAAE,EAAE;AACP,YAAA,KAAK,EAAE,EAAE;SACV,CAAC;AACF,QAAA,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;KACzB;IAED,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAA;AAClC,QAAA,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;KAC7C;AAED,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,KAAK,eAAe,CAAC;KAC5F;;0HApCU,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAD,IAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,6BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,6BAA6B,ECV1C,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,6vQA+NA,EDvNiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,CAAA,CAAA;AAenE,UAAA,CAAA;AADC,IAAA,OAAO,EAAE;;;;CAGT,EAAA,6BAAA,CAAA,SAAA,EAAA,YAAA,EAAA,IAAA,CAAA,CAAA;2FAfU,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBALzC,SAAS;+BACE,2BAA2B,EAAA,aAAA,EAEtB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,QAAA,EAAA,6vQAAA,EAAA,CAAA;yGAG1D,aAAa,EAAA,CAAA;sBAArB,KAAK;gBACG,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBACG,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBAUN,UAAU,EAAA,EAAA,EAAA,EAAA,CAAA;;MEdC,4BAA4B,CAAA;AALzC,IAAA,WAAA,GAAA;AASW,QAAA,IAAU,CAAA,UAAA,GAAG,IAAI,CAAC;AAE3B,QAAA,IAAW,CAAA,WAAA,GAAG,CAAC,CAAC;KAUjB;AAPC,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,OAAO,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC;KACnC;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,4BAA4B,CAAC,EAAE,CAAC;KACtD;;AAdc,4BAAE,CAAA,EAAA,GAAG,CAAE,CAAA;yHADX,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,4BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,4BAA4B,ECTzC,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,65EA8DA,EDvDiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,CAAA,CAAA;AAWnE,UAAA,CAAA;AADC,IAAA,OAAO,EAAE;;;;CAGT,EAAA,4BAAA,CAAA,SAAA,EAAA,YAAA,EAAA,IAAA,CAAA,CAAA;2FAXU,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBALxC,SAAS;+BACE,2BAA2B,EAAA,aAAA,EAEtB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,QAAA,EAAA,65EAAA,EAAA,CAAA;8BAK1D,YAAY,EAAA,CAAA;sBAApB,KAAK;gBACG,UAAU,EAAA,CAAA;sBAAlB,KAAK;gBAKN,UAAU,EAAA,EAAA,EAAA,EAAA,CAAA;;METC,wBAAwB,CAAA;AALrC,IAAA,WAAA,GAAA;AAOE,QAAA,IAAA,CAAA,WAAW,GAAG,OAAO,CAAC,sEAAsE,CAAC,CAAC;KAO/F;IALC,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,6BAA6B,EAAE;AACrD,YAAA,IAAI,CAAC,aAAa,CAAC,6BAA6B,GAAG,EAAE,CAAC;AACvD,SAAA;KACF;;qHARU,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,wBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,ECTrC,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,i4FA4EA,EDrEiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,CAAA,CAAA;2FAExD,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBALpC,SAAS;+BACE,2BAA2B,EAAA,aAAA,EAEtB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,QAAA,EAAA,i4FAAA,EAAA,CAAA;8BAG1D,aAAa,EAAA,CAAA;sBAArB,KAAK;;;AERD,MAAM,SAAS,GAAG;AACvB,IAAA;AACE,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,KAAK,EAAE,GAAG;AACV,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,KAAK,EAAE,KAAK;AACZ,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,KAAK,EAAE,GAAG;AACV,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,KAAK,EAAE,GAAG;AACV,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,KAAK,EAAE,KAAK;AACZ,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,KAAK,EAAE,KAAK;AACZ,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC;AACjC,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;CACF;;MClCY,wBAAwB,CAAA;AAOnC,IAAA,WAAA,CAAoB,gBAAkC,EAAA;AAAlC,QAAA,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;AAJ5C,QAAA,IAAA,CAAA,0BAA0B,GAAuB,IAAI,YAAY,EAAE,CAAC;AAE9E,QAAA,IAAS,CAAA,SAAA,GAAG,SAAS,CAAC;KAEoC;AAE1D,IAAA,oBAAoB,CAAC,cAA8B,EAAA;AACjD,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;AAC3C,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;AACrC,YAAA,IAAI,CAAC,0BAA0B,CAAC,IAAI,EAAE,CAAC;AACxC,SAAA;AACD,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;KAC7C;IAED,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACxB,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,aAAa,EAAE,EAAE;AACjB,YAAA,KAAK,EAAE,EAAE;AACV,SAAA,CAAC,CAAC;KACJ;;qHAvBU,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAF,IAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,wBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,ECXrC,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,opHA+HA,EDtHiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,CAAA,CAAA;2FAExD,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBALpC,SAAS;+BACE,0BAA0B,EAAA,aAAA,EAErB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,QAAA,EAAA,opHAAA,EAAA,CAAA;yGAG1D,eAAe,EAAA,CAAA;sBAAvB,KAAK;gBACG,kBAAkB,EAAA,CAAA;sBAA1B,KAAK;gBACI,0BAA0B,EAAA,CAAA;sBAAnC,MAAM;;;MEJI,6BAA6B,CAAA;AAL1C,IAAA,WAAA,GAAA;AAaY,QAAA,IAAA,CAAA,qBAAqB,GAAgC,IAAI,YAAY,EAAE,CAAC;KAgCnF;IA5BC,WAAW,GAAA;QACT,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;YAClD,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACzB,SAAA;KACF;IAED,0BAA0B,GAAA;QACxB,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;KACrD;AAED,IAAA,MAAM,CAAC,aAAa,EAAA;AAClB,QAAA,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;KACzD;IAEO,gBAAgB,GAAA;QACtB,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE;gBACjC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,IAC3C,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAChD,CAAC;AACH,aAAA;AACD,YAAA,IAAI,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE;gBACvC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IACvC,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CACvD,CAAC;AACH,aAAA;AACF,SAAA;KACF;;0HAvCU,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,6BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,6BAA6B,ECV1C,QAAA,EAAA,gCAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,aAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,muDAyCA,EDjCiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,EAAA,2BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAY,wBAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,4BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,CAAA,CAAA;2FAExD,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBALzC,SAAS;+BACE,gCAAgC,EAAA,aAAA,EAE3B,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,QAAA,EAAA,muDAAA,EAAA,CAAA;8BAG1D,MAAM,EAAA,CAAA;sBAAd,KAAK;gBAGG,IAAI,EAAA,CAAA;sBAAZ,KAAK;gBAGG,aAAa,EAAA,CAAA;sBAArB,KAAK;gBACI,qBAAqB,EAAA,CAAA;sBAA9B,MAAM;gBAEE,kBAAkB,EAAA,CAAA;sBAA1B,KAAK;;;MEXK,4BAA4B,CAAA;AAOvC,IAAA,WAAA,CAAmB,KAAiB,EAAA;AAAjB,QAAA,IAAK,CAAA,KAAA,GAAL,KAAK,CAAY;AAJpC,QAAA,IAAA,CAAA,aAAa,GAAgC,IAAI,YAAY,EAAiB,CAAC;AAE/E,QAAA,IAAA,CAAA,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;KAEc;IAExC,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;KACnB;IAED,MAAM,GAAA;QACJ,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAC7C,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;KACnB;;yHAhBU,4BAA4B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAb,IAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,4BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,4BAA4B,qECTzC,swCA8CA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;2FDrCa,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAJxC,SAAS;+BACE,+BAA+B,EAAA,QAAA,EAAA,swCAAA,EAAA,CAAA;;;MEO9B,8BAA8B,CAAA;AASzC,IAAA,WAAA,CAAoB,OAAuB,EAAA;AAAvB,QAAA,IAAO,CAAA,OAAA,GAAP,OAAO,CAAgB;AALlC,QAAA,IAAc,CAAA,cAAA,GAAkB,EAAE,CAAC;AAC5C,QAAA,IAAsB,CAAA,sBAAA,GAAkB,EAAE,CAAC;AAEjC,QAAA,IAAA,CAAA,wBAAwB,GAAmC,IAAI,YAAY,EAAE,CAAC;KAEzC;IAE/C,WAAW,GAAA;QACT,IAAI,CAAC,yBAAyB,EAAE,CAAC;KAClC;IAED,0BAA0B,GAAA;QACxB,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;KAC3D;AAED,IAAA,MAAM,CAAC,aAA4B,EAAA;AACjC,QAAA,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;KAC3C;AAED,IAAA,mBAAmB,CAAC,aAA4B,EAAA;QAC9C,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,MAAM,CACxF,KAAK,IAAI,KAAK,CAAC,aAAa,KAAK,aAAa,CAAC,aAAa,CAC7D,CAAC;QACF,OAAO,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;KACjE;IAED,iBAAiB,GAAA;QACf,MAAM,uBAAuB,GAAkB,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,GAAG,CACzF,aAAa,KAAK,EAAE,EAAE,EAAE,aAAa,CAAC,aAAa,EAAE,CAAC,CACvD,CAAC;QACF,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,4BAA4B,EAAE;AAC5D,YAAA,mBAAmB,EAAE,IAAI;AACzB,YAAA,cAAc,EAAE,aAAa;AAC7B,YAAA,YAAY,EAAE;AACZ,gBAAA,cAAc,EAAE,uBAAuB;AACxC,aAAA;AACF,SAAA,CAAC,CAAC;AACH,QAAA,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,IAAG;AACnE,YAAA,MAAM,iBAAiB,GAAG,cAAc,CAAC,MAAM,CAC7C,KAAK,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CACpE,CAAC;YACF,MAAM,iBAAiB,GAAoB,iBAAiB,CAAC,GAAG,CAC9D,KAAK,KAAK,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAoB,CAAA,CACrE,CAAC;YACF,IAAI,CAAC,gBAAgB,CAAC,kBAAkB;gBACtC,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;AACvE,SAAC,CAAC,CAAC;KACJ;IAEO,yBAAyB,GAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,IAAI,IAAI,CAAC,cAAc,EAAE;YAC5F,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,OAAO,CAAC,aAAa,IAAG;AAC/D,gBAAA,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CACnF,IAAI,IAAI,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CACjD,CAAC;AACJ,aAAC,CAAC,CAAC;AACJ,SAAA;KACF;;2HA7DU,8BAA8B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAD,IAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA9B,8BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,8BAA8B,ECb3C,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,wlGAoFA,EDzEiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,EAAA,2BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAa,wBAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,4BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAb,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,CAAA,CAAA;2FAExD,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAL1C,SAAS;+BACE,iCAAiC,EAAA,aAAA,EAE5B,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,QAAA,EAAA,wlGAAA,EAAA,CAAA;uGAG1D,gBAAgB,EAAA,CAAA;sBAAxB,KAAK;gBACG,qBAAqB,EAAA,CAAA;sBAA7B,KAAK;gBAEG,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBAGI,wBAAwB,EAAA,CAAA;sBAAjC,MAAM;;;MERI,sBAAsB,CAAA;AA2BjC,IAAA,WAAA,CAAoB,gBAAkC,EAAA;AAAlC,QAAA,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;AArBtD,QAAA,IAAA,CAAA,2CAA2C,GAAG,OAAO,CACnD,mLAAmL,CACpL,CAAC;AACF,QAAA,IAAA,CAAA,0CAA0C,GAAG,OAAO,CAClD,kDAAkD,CACnD,CAAC;AAEF,QAAA,IAAA,CAAA,4DAA4D,GAAG,OAAO,CACpE,2MAA2M,CAC5M,CAAC;AACF,QAAA,IAAA,CAAA,2DAA2D,GAAG,OAAO,CACnE,gHAAgH,CACjH,CAAC;AAEF,QAAA,IAAA,CAAA,8CAA8C,GAAG,OAAO,CACtD,2MAA2M,CAC5M,CAAC;AACF,QAAA,IAAA,CAAA,6CAA6C,GAAG,OAAO,CACrD,8GAA8G,CAC/G,CAAC;KAEwD;IAE1D,WAAW,GAAA;QACT,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;YAClD,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC1B,SAAA;KACF;IAED,gBAAgB,GAAA;AACd,QAAA,MAAM,YAAY,GAAkB;AAClC,YAAA,IAAI,EAAE;AACJ,gBAAA,QAAQ,EAAE,KAAK;AACf,gBAAA,eAAe,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACpE,aAAA;AACD,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,gBAAgB,EAAE,EAAE;SACrB,CAAC;AACF,QAAA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;KACzE;IAED,mBAAmB,GAAA;AACjB,QAAA,MAAM,qBAAqB,GAAqB;AAC9C,YAAA,IAAI,EAAE;AACJ,gBAAA,QAAQ,EAAE,KAAK;AACf,gBAAA,eAAe,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACpE,aAAA;AACD,YAAA,kBAAkB,EAAE,EAAE;SACvB,CAAC;AACF,QAAA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;KAC3F;AAED,IAAA,QAAQ,CAAC,aAA4B,EAAA;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;KAC3E;AAED,IAAA,wBAAwB,CAAC,gBAAkC,EAAA;AACzD,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;KACvF;AAED,IAAA,8BAA8B,CAC5B,sBAA+B,EAC/B,gCAAgC,GAAG,KAAK,EAAA;QAExC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,CAAC,aAAa,GAAG;YAC1D,sBAAsB;YACtB,gCAAgC;SACjC,CAAC;AACF,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;KAC7C;AAED,IAAA,IAAI,sBAAsB,GAAA;QACxB,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,CAAC,aAAa,CAAC,sBAAsB,CAAC;KACzF;AAED,IAAA,IAAI,gCAAgC,GAAA;QAClC,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,CAAC,aAAa;AAC7D,aAAA,gCAAgC,CAAC;KACrC;IAEO,iBAAiB,GAAA;AACvB,QAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE;AACzC,YAAA,cAAc,EAAE;AACd,gBAAA,QAAQ,EAAE,EAAE;AACZ,gBAAA,iBAAiB,EAAE,EAAE;gBACrB,aAAa,EAAE,EAAE,sBAAsB,EAAE,KAAK,EAAE,gCAAgC,EAAE,KAAK,EAAE;AAC1F,aAAA;AACF,SAAA,CAAC,CAAC;KACJ;;mHA9FU,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAD,IAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,sBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,ECZnC,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,yoMA6JA,EDnJiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAc,6BAAA,EAAA,QAAA,EAAA,gCAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,eAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,8BAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,uBAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAf,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,CAAA,CAAA;2FAExD,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBALlC,SAAS;+BACE,wBAAwB,EAAA,aAAA,EAEnB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,QAAA,EAAA,yoMAAA,EAAA,CAAA;yGAG1D,IAAI,EAAA,CAAA;sBAAZ,KAAK;gBACG,MAAM,EAAA,CAAA;sBAAd,KAAK;gBACG,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBACG,aAAa,EAAA,CAAA;sBAArB,KAAK;;;MEDK,+BAA+B,CAAA;AAY1C,IAAA,WAAA,CAAsB,gBAAkC,EAAA;AAAlC,QAAA,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;AATxD,QAAA,IAAe,CAAA,eAAA,GAAG,eAAe,CAAC;AAClC,QAAA,IAAgB,CAAA,gBAAA,GAAG,qBAAqB,CAAC;AAEzC,QAAA,IAAc,CAAA,cAAA,GAAG,mBAAmB,CAAC;AAErC,QAAA,IAAA,CAAA,4BAA4B,GAAG,OAAO,CACpC,wJAAwJ,CACzJ,CAAC;KAE0D;AAG5D,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,OAAO,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC;KACpC;AAED,IAAA,uBAAuB,CAAC,iBAAoC,EAAA;QAC1D,IAAI,CAAC,aAAa,CAAC,2BAA2B,CAAC,MAAM,CAAC,uBAAuB,CAC3E,iBAAiB,CAClB,CAAC;AACF,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;KAC7C;;4HAxBU,+BAA+B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAD,IAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA/B,+BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,+BAA+B,ECf5C,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,mtZA4UA,ED/TiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,8FAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,iBAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,cAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,cAAA,EAAA,eAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,UAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,CAAA,CAAA;AAiBnE,UAAA,CAAA;AADC,IAAA,OAAO,EAAE;;;;CAGT,EAAA,+BAAA,CAAA,SAAA,EAAA,YAAA,EAAA,IAAA,CAAA,CAAA;2FAjBU,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAL3C,SAAS;+BACE,iCAAiC,EAAA,aAAA,EAE5B,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,QAAA,EAAA,mtZAAA,EAAA,CAAA;yGAG1D,aAAa,EAAA,CAAA;sBAArB,KAAK;gBAcN,UAAU,EAAA,EAAA,EAAA,EAAA,CAAA;;MEpBC,4BAA4B,CAAA;AALzC,IAAA,WAAA,GAAA;AAQE,QAAA,IAAiB,CAAA,iBAAA,GAAG,sBAAsB,CAAC;KAY5C;AAVC,IAAA,IAAI,mBAAmB,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC;KAC/C;AAED,IAAA,wBAAwB,CAAC,KAAK,EAAA;AAC5B,QAAA,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,GAAG,KAAK,CAAC;AAClD,QAAA,IAAI,CAAC,mBAAmB,CAAC,sBAAsB,GAAG,IAAI,oBAAoB,CACxE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,QAAQ,CACvC,CAAC;KACH;;yHAdU,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,4BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,4BAA4B,ECVzC,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,g+IAsHA,ED9GiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAe,6BAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,4BAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAjB,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,UAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,CAAA,CAAA;2FAExD,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBALxC,SAAS;+BACE,2BAA2B,EAAA,aAAA,EAEtB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,QAAA,EAAA,g+IAAA,EAAA,CAAA;8BAG1D,aAAa,EAAA,CAAA;sBAArB,KAAK;;;AEAF,MAAO,uBAAwB,SAAQ,iBAAyC,CAAA;AACpF,IAAA,WAAA,CAAoB,yBAAoD,EAAA;QACtE,KAAK,CAAC,yBAAyB,CAAC,CAAC;AADf,QAAA,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB,CAA2B;KAEvE;;oHAHU,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAkB,yBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,uBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,ECXpC,QAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,2lDAqDA,ED5CiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAlB,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAmB,2BAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,6BAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,4BAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,wBAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,sBAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,+BAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,4BAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,CAAA,CAAA;2FAExD,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBALnC,SAAS;+BACE,qBAAqB,EAAA,aAAA,EAEhB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,QAAA,EAAA,2lDAAA,EAAA,CAAA;;;MEGxD,2BAA2B,CAAA;AAHxC,IAAA,WAAA,GAAA;AAIU,QAAA,IAAU,CAAA,UAAA,GAAG,+BAA+B,CAAC;KAgHtD;AA9GC,IAAA,OAAO,CAAC,aAAoC,EAAA;AAC1C,QAAA,MAAM,gBAAgB,GAAqB;YACzC,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,UAAU,EAAE,aAAa,CAAC,UAAU;YACpC,YAAY,EAAE,aAAa,CAAC,YAAY;YACxC,oBAAoB,EAAE,oBAAoB,CAAC,MAAM;YACjD,IAAI,EAAE,qBAAqB,CAAC,MAAM;YAClC,SAAS,EAAE,aAAa,CAAC,SAAS;YAClC,MAAM,EAAE,GAAG,aAAa,CAAC,eAAe,CAAgB,aAAA,EAAA,aAAa,CAAC,SAAS,CAAE,CAAA;YACjF,kBAAkB,EAAE,aAAa,CAAC,kBAAkB;AACpD,YAAA,YAAY,EAAE,UAAU;YACxB,QAAQ,EAAE,aAAa,CAAC,QAAQ;YAChC,QAAQ,EAAE,aAAa,CAAC,QAAQ;AAChC,YAAA,aAAa,EAAE,aAAa,CAAC,aAAa,CAAC,SAAS,EAAE;YACtD,kBAAkB,EAAE,aAAa,CAAC,kBAAkB;AACpD,YAAA,2BAA2B,EAAE;AAC3B,gBAAA,IAAI,EAAE;oBACJ,OAAO,EAAE,GAAG,aAAa,CAAC,eAAe,CAAgB,aAAA,EAAA,aAAa,CAAC,SAAS,CAAgC,8BAAA,CAAA;AACjH,iBAAA;AACF,aAAA;AACD,YAAA,YAAY,EAAE;AACZ,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,aAAa,EAAE,EAAE;AACjB,gBAAA,SAAS,EAAE,SAAS;gBACpB,GAAG,EAAE,GAAG,aAAa,CAAC,eAAe,CAAgB,aAAA,EAAA,aAAa,CAAC,SAAS,CAAgC,8BAAA,CAAA;AAC5G,gBAAA,IAAI,EAAE,6HAA6H;AACpI,aAAA;AACD,YAAA,oBAAoB,EAAE;AACpB,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,MAAM,EAAE,KAAK;AACb,gBAAA,aAAa,EAAE;oBACb,KAAK,EAAE,aAAa,CAAC,OAAO;AAC5B,oBAAA,SAAS,EAAE,aAAa;AACxB,oBAAA,YAAY,EAAE,gBAAgB;AAC9B,oBAAA,aAAa,EAAE,MAAM;AACtB,iBAAA;AACD,gBAAA,SAAS,EAAE,UAAU;gBACrB,GAAG,EAAE,GAAG,aAAa,CAAC,eAAe,CAAgB,aAAA,EAAA,aAAa,CAAC,SAAS,CAA+B,6BAAA,CAAA;AAC3G,gBAAA,IAAI,EAAE,EAAE;AACT,aAAA;AACD,YAAA,cAAc,EAAE;AACd,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,aAAa,EAAE;AACb,oBAAA,SAAS,EAAE,aAAa;AACxB,oBAAA,YAAY,EAAE,gBAAgB;AAC9B,oBAAA,aAAa,EAAE,SAAS;AACzB,iBAAA;AACD,gBAAA,SAAS,EAAE,SAAS;gBACpB,GAAG,EAAE,GAAG,aAAa,CAAC,eAAe,CAAgB,aAAA,EAAA,aAAa,CAAC,SAAS,CAAgC,8BAAA,CAAA;AAC5G,gBAAA,IAAI,EACF,6FAA6F;AAC7F,oBAAA,aAAa,CAAC,YAAY;AAC7B,aAAA;YACD,SAAS,EAAE,SAAS,CAAC,kBAAkB;YACvC,6BAA6B,EAAE,aAAa,CAAC,6BAA6B;AAC1E,YAAA,mBAAmB,EAAE,aAAa,CAAC,mBAAmB,CAAC,qBAAqB,EAAE;SAC/E,CAAC;AACF,QAAA,OAAO,gBAAgB,CAAC;KACzB;AAED,IAAA,KAAK,CAAC,gBAAkC,EAAA;QACtC,OAAO;YACL,eAAe,EAAE,IAAI,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,MAAM,CAAC;YACxE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,MAAM,CAAC;YACrD,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;AACnC,YAAA,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC;AACpD,YAAA,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;YAC1C,UAAU,EAAE,gBAAgB,CAAC,UAAU;YACvC,YAAY,EAAE,gBAAgB,CAAC,YAAY;YAC3C,SAAS,EAAE,gBAAgB,CAAC,SAAS;YACrC,kBAAkB,EAAE,gBAAgB,CAAC,kBAAkB;YACvD,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;AACnC,YAAA,aAAa,EAAE,IAAI,oBAAoB,CAAC,gBAAgB,CAAC,aAAa,CAAC;YACvE,kBAAkB,EAAE,gBAAgB,CAAC,kBAAkB;YACvD,6BAA6B,EAAE,gBAAgB,CAAC,6BAA6B;AAC7E,YAAA,mBAAmB,EAAE,IAAI,aAAa,CAAC,gBAAgB,CAAC,mBAAmB,CAAC;SAC7E,CAAC;KACH;AAEO,IAAA,yBAAyB,CAAC,GAAG,EAAA;AACnC,QAAA,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AACrE,QAAA,OAAO,eAAe,CAAC;KACxB;AAEO,IAAA,YAAY,CAAC,GAAG,EAAA;QACtB,MAAM,KAAK,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AACjE,QAAA,OAAO,SAAS,CAAC;KAClB;AAEO,IAAA,eAAe,CAAC,gBAAgB,EAAA;AACtC,QAAA,MAAM,MAAM,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC,CAAC;AAClF,QAAA,MAAM,aAAa,GAAGb,KAAG,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9E,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;AACzD,QAAA,OAAO,YAAY,GAAG,kBAAkB,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;KAC7D;AAEO,IAAA,uBAAuB,CAAC,IAAI,EAAA;AAClC,QAAA,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC,uBAAuB,CAAC,IAAI,EAAE,CAAC;AAC3E,QAAA,OAAO,YAAY,CAAC;KACrB;AAEO,IAAA,eAAe,CAAC,MAAM,EAAA;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;KAC1C;AAEO,IAAA,UAAU,CAAC,gBAAgB,EAAA;QACjC,OAAO,GAAG,CAAC,gBAAgB,EAAE,0CAA0C,EAAE,EAAE,CAAC,CAAC;KAC9E;;wHAhHU,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA3B,2BAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,2BAA2B,cAF1B,MAAM,EAAA,CAAA,CAAA;2FAEP,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAHvC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;iBACnB,CAAA;;;ACAK,MAAO,yBAA0B,SAAQ,iBAAwC,CAAA;AACrF,IAAA,WAAA,CAAoB,2BAAwD,EAAA;QAC1E,KAAK,CAAC,2BAA2B,CAAC,CAAC;AADjB,QAAA,IAA2B,CAAA,2BAAA,GAA3B,2BAA2B,CAA6B;KAE3E;;sHAHU,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAc,2BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,yBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,ECXtC,QAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,w1BAwBA,EDfiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAzB,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAmB,2BAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,6BAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,4BAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,wBAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,sBAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,4BAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,CAAA,CAAA;2FAExD,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBALrC,SAAS;+BACE,wBAAwB,EAAA,aAAA,EAEnB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,QAAA,EAAA,w1BAAA,EAAA,CAAA;;;MEcxD,sBAAsB,CAAA;AAHnC,IAAA,WAAA,GAAA;QAIU,IAAA,CAAA,QAAQ,GAAG;AACjB,YAAA,kBAAkB,EAAE,IAAI;SACzB,CAAC;QAEM,IAAA,CAAA,SAAS,GAAG;AAClB,YAAA,YAAY,EAAE,UAAU;AACxB,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,SAAS,EAAE,oBAAoB;SAChC,CAAC;AAEM,QAAA,IAAU,CAAA,UAAA,GAAG,oCAAoC,CAAC;KAkM3D;AAhMC,IAAA,OAAO,CAAC,aAA+B,EAAA;QACrC,MAAM,OAAO,GAAG,CAAA,EAAG,aAAa,CAAC,UAAU,CAAA,CAAA,EAAI,aAAa,CAAC,MAAM,CAAA,OAAA,CAAS,CAAC;AAE7E,QAAA,MAAM,gBAAgB,GAAqB;YACzC,QAAQ,EAAE,aAAa,CAAC,aAAa;YACrC,QAAQ,EAAE,aAAa,CAAC,aAAa;YACrC,aAAa,EAAE,aAAa,CAAC,mBAAmB;AAC9C,kBAAE;AACE,oBAAA,MAAM,EAAE,MAAM;oBACd,GAAG,EAAE,CAAG,EAAA,OAAO,CAAS,OAAA,CAAA;AACxB,oBAAA,aAAa,EAAE;wBACb,wBAAwB,EAAE,aAAa,CAAC,sBAAsB;AAC/D,qBAAA;AACD,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,IAAI,EAAE,EAAE;AACR,oBAAA,SAAS,EAAE,UAAU;AACtB,iBAAA;AACH,kBAAE;AACE,oBAAA,MAAM,EAAE,MAAM;AACd,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,SAAS,EAAE,UAAU;AACrB,oBAAA,aAAa,EAAE,EAAE;AAClB,iBAAA;AACL,YAAA,oBAAoB,EAAE;AACpB,gBAAA,MAAM,EAAE,KAAK;gBACb,GAAG,EAAE,CAAG,EAAA,OAAO,CAAY,UAAA,CAAA;AAC3B,gBAAA,aAAa,EAAE;AACb,oBAAA,YAAY,EAAE,gBAAgB;AAC9B,oBAAA,SAAS,EAAE,aAAa;AACxB,oBAAA,aAAa,EAAE,MAAM;AACtB,iBAAA;AACD,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,IAAI,EAAE,EAAE;AACR,gBAAA,SAAS,EAAE,UAAU;AACtB,aAAA;AACD,YAAA,YAAY,EAAE;AACZ,gBAAA,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,CAAG,EAAA,OAAO,CAAQ,MAAA,CAAA;AACvB,gBAAA,aAAa,EAAE,EAAE;AACjB,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC;AACxB,oBAAA,UAAU,EAAE,oBAAoB;AAChC,oBAAA,IAAI,EAAE,SAAS;AACf,oBAAA,YAAY,EAAE,gBAAgB;AAC9B,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,SAAS,EAAE,aAAa;AACxB,oBAAA,aAAa,EAAE,kBAAkB,CAAC,aAAa,CAAC,YAAY,CAAC;iBAC9D,CAAC;AACF,gBAAA,SAAS,EAAE,SAAS;AACrB,aAAA;AACD,YAAA,cAAc,EAAE;AACd,gBAAA,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,CAAG,EAAA,OAAO,CAAQ,MAAA,CAAA;AACvB,gBAAA,aAAa,EAAE,EAAE;AACjB,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC;AACxB,oBAAA,UAAU,EAAE,eAAe;AAC3B,oBAAA,aAAa,EAAE,iBAAiB;AAChC,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,SAAS,EAAE,aAAa;AACxB,oBAAA,aAAa,EAAE,kBAAkB,CAAC,aAAa,CAAC,YAAY,CAAC;iBAC9D,CAAC;AACF,gBAAA,SAAS,EAAE,SAAS;AACrB,aAAA;YACD,UAAU,EAAE,aAAa,CAAC,UAAU;AACpC,YAAA,YAAY,EAAE,UAAU;YACxB,MAAM,EAAE,aAAa,CAAC,MAAM;YAC5B,SAAS,EAAE,aAAa,CAAC,SAAS;YAClC,6BAA6B,EAAE,aAAa,CAAC,6BAA6B;YAC1E,kBAAkB,EAAE,aAAa,CAAC,kBAAkB;YACpD,QAAQ,EAAE,YAAY,CAAC,KAAK;AAC5B,YAAA,YAAY,EAAE;AACZ,gBAAA,gBAAgB,EAAE,KAAK;AACvB,gBAAA,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,QAAQ;AAC9C,aAAA;YACD,kBAAkB,EAAE,aAAa,CAAC,kBAAkB;AACpD,YAAA,2BAA2B,EACzB,aAAa,CAAC,2BAA2B,CAAC,6BAA6B,EAAE;YAC3E,oBAAoB,EAAE,oBAAoB,CAAC,MAAM;YACjD,IAAI,EAAE,qBAAqB,CAAC,MAAM;YAClC,SAAS,EAAE,SAAS,CAAC,kBAAkB;AACvC,YAAA,mBAAmB,EAAE,aAAa,CAAC,mBAAmB,CAAC,qBAAqB,EAAE;SAC/E,CAAC;AACF,QAAA,OAAO,gBAAgB,CAAC;KACzB;AAED,IAAA,KAAK,CAAC,gBAAkC,EAAA;AACtC,QAAA,MAAM,cAAc,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AAEtE,QAAA,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;AACrC,QAAA,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACtC,QAAA,IAAI,CAAC,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;AAChD,QAAA,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,gCAAgC,CAAC,gBAAgB,CAAC,CAAC;AAExD,QAAA,MAAM,gBAAgB,GAAqB;YACzC,UAAU,EAAE,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,GAAG,CAAC;YAChF,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,GAAG,CAAC;AACxE,YAAA,aAAa,EAAE,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;YACnD,kBAAkB,EAAE,gBAAgB,CAAC,kBAAkB;AACvD,YAAA,YAAY,EAAE,gBAAgB,CAAC,oBAAoB,CAAC,aAAa,CAAC,SAAS;YAC3E,MAAM,EAAE,gBAAgB,CAAC,MAAM;YAC/B,UAAU,EAAE,gBAAgB,CAAC,UAAU;YACvC,kBAAkB,EAAE,gBAAgB,CAAC,kBAAkB;AACvD,YAAA,mBAAmB,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAAC;AAClE,YAAA,sBAAsB,EAAE,IAAI,CAAC,yBAAyB,CAAC,gBAAgB,CAAC;YACxE,6BAA6B,EAAE,gBAAgB,CAAC,6BAA6B;AAC7E,YAAA,YAAY,EAAE;AACZ,gBAAA,QAAQ,EAAE,gBAAgB,CAAC,YAAY,CAAC,QAAQ;AACjD,aAAA;AACD,YAAA,qBAAqB,EAAE,gBAAgB,CAAC,2BAA2B,CAAC,GAAG,CAAC,qBAAqB;AAC7F,YAAA,2BAA2B,EAAE,IAAI,sBAAsB,CACrD,gBAAgB,CAAC,2BAA2B,CAC7C;YACD,SAAS,EAAE,gBAAgB,CAAC,SAAS;AACrC,YAAA,mBAAmB,EAAE,IAAI,aAAa,CAAC,gBAAgB,CAAC,mBAAmB,CAAC;SAC7E,CAAC;AACF,QAAA,OAAO,gBAAgB,CAAC;KACzB;AAED,IAAA,aAAa,CAAC,gBAAgB,EAAA;AAC5B,QAAA,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KAC3C;AAED,IAAA,cAAc,CAAC,gBAAgB,EAAA;AAC7B,QAAA,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;KAC1C;AAED,IAAA,wBAAwB,CAAC,gBAAgB,EAAA;AACvC,QAAA,MAAM,IAAI,GAAG,EAAE,CAAC,gBAAgB,EAAE;YAChC,0BAA0B;YAC1B,kBAAkB;YAClB,oBAAoB;AACrB,SAAA,CAAC,CAAC;AAEH,QAAA,MAAM,YAAY,GAAGhB,KAAG,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC;AACtE,QAAA,GAAG,CAAC,gBAAgB,EAAE,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC;AAExE,QAAA,MAAM,OAAO,GAAGA,KAAG,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7D,QAAA,GAAG,CAAC,gBAAgB,EAAE,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;KAChE;AAED,IAAA,oBAAoB,CAAC,GAAG,EAAA;AACtB,QAAA,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AAChE,QAAA,OAAO,UAAU,CAAC;KACnB;AAED,IAAA,gBAAgB,CAAC,GAAG,EAAA;QAClB,MAAM,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AAChE,QAAA,OAAO,MAAM,CAAC;KACf;AAED,IAAA,iBAAiB,CAAC,gBAAgB,EAAA;AAChC,QAAA,MAAM,MAAM,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC,CAAC;AAClF,QAAA,MAAM,aAAa,GAAGA,KAAG,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9E,QAAA,GAAG,CAAC,gBAAgB,EAAE,cAAc,EAAE,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC;KAC5E;AAED,IAAA,uBAAuB,CAAC,IAAI,EAAA;AAC1B,QAAA,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC,uBAAuB,CAAC,IAAI,EAAE,CAAC;AAC3E,QAAA,OAAO,kBAAkB,CAAC,YAAY,CAAC,CAAC;KACzC;AAED,IAAA,iBAAiB,CAAC,gBAAgB,EAAA;AAChC,QAAA,YAAY,CAAC,gBAAgB,EAAE,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;AACtE,QAAA,GAAG,CAAC,gBAAgB,EAAE,+BAA+B,EAAE,KAAK,CAAC,CAAC;KAC/D;AAED,IAAA,gCAAgC,CAAC,gBAAgB,EAAA;AAC/C,QAAA,YAAY,CAAC,gBAAgB,EAAE,EAAE,2BAA2B,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;KAC9E;AAED,IAAA,sBAAsB,CAAC,gBAAgB,EAAA;AACrC,QAAA,OAAO,GAAG,CAAC,gBAAgB,EAAE,sDAAsD,CAAC;AAClF,cAAE,IAAI;cACJ,KAAK,CAAC;KACX;AAED,IAAA,yBAAyB,CAAC,gBAAgB,EAAA;AACxC,QAAA,OAAO,gBAAgB,CAAC,aAAa,CAAC,aAAa,CAAC,wBAAwB;AAC1E,cAAE,gBAAgB,CAAC,aAAa,CAAC,aAAa,CAAC,wBAAwB;cACrE,IAAI,CAAC;KACV;AAED,IAAA,eAAe,CAAC,MAAM,EAAA;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;KAC1C;AAED,IAAA,cAAc,CAAC,MAAM,EAAA;QACnB,OAAOA,KAAG,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,GAAG,CAAA,CAAA,EAAI,KAAK,CAAE,CAAA,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KACjE;;mHA5MU,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAtB,sBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cAFrB,MAAM,EAAA,CAAA,CAAA;2FAEP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;iBACnB,CAAA;;;MCdY,4BAA4B,CAAA;;yHAA5B,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,4BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,4BAA4B,ECRzC,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,u7CAuCA,EDjCiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAX,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,CAAA,CAAA;2FAExD,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBALxC,SAAS;+BACE,8BAA8B,EAAA,aAAA,EAEzB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,QAAA,EAAA,u7CAAA,EAAA,CAAA;8BAG1D,aAAa,EAAA,CAAA;sBAArB,KAAK;;;AEEF,MAAO,oBAAqB,SAAQ,iBAAmC,CAAA;AAC3E,IAAA,WAAA,CAAoB,sBAA8C,EAAA;QAChE,KAAK,CAAC,sBAAsB,CAAC,CAAC;AADZ,QAAA,IAAsB,CAAA,sBAAA,GAAtB,sBAAsB,CAAwB;KAEjE;;iHAHU,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA2B,sBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,oBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,ECXjC,QAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,s3BAwBA,EDfiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA5B,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAmB,2BAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAU,4BAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,wBAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,sBAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,+BAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,4BAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAV,4BAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,CAAA,CAAA;2FAExD,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBALhC,SAAS;+BACE,kBAAkB,EAAA,aAAA,EAEb,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,QAAA,EAAA,s3BAAA,EAAA,CAAA;;;MEmBxD,yBAAyB,CAAA;AA6BpC,IAAA,WAAA,CACU,uBAAgD,EAChD,kBAAsC,EACtC,gBAAkC,EAClC,oBAA0C,EAC1C,YAA0B,EAC1B,YAA0B,EAC1B,YAA0B,EAC1B,eAAgC,EAChC,eAAgC,EAAA;AARhC,QAAA,IAAuB,CAAA,uBAAA,GAAvB,uBAAuB,CAAyB;AAChD,QAAA,IAAkB,CAAA,kBAAA,GAAlB,kBAAkB,CAAoB;AACtC,QAAA,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;AAClC,QAAA,IAAoB,CAAA,oBAAA,GAApB,oBAAoB,CAAsB;AAC1C,QAAA,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;AAC1B,QAAA,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;AAC1B,QAAA,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;AAC1B,QAAA,IAAe,CAAA,eAAA,GAAf,eAAe,CAAiB;AAChC,QAAA,IAAe,CAAA,eAAA,GAAf,eAAe,CAAiB;AAhC1C,QAAA,IAAY,CAAA,YAAA,GAAG,YAAY,CAAC;AAC5B,QAAA,IAAkB,CAAA,kBAAA,GAAG,kBAAkB,CAAC;QAExC,IAAA,CAAA,UAAU,GAA6B,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;AAClE,QAAA,IAAA,CAAA,MAAM,GAAuB,IAAI,YAAY,EAAE,CAAC;AAChD,QAAA,IAAA,CAAA,WAAW,GAAkB,IAAI,OAAO,EAAE,CAAC;AAInC,QAAA,IAAA,CAAA,KAAK,GAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CACnC,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EACrC,SAAS,CAAC,MACR,QAAQ,CAAC;AACP,YAAA,gBAAgB,EAAE,IAAI,CAAC,uBAAuB,CAAC,oBAAoB,EAAE;AACrE,YAAA,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE;AAC5B,YAAA,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;AACxB,YAAA,cAAc,EAAE,IAAI,CAAC,iBAAiB,EAAE;SACzC,CAAC,CACH,EACD,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EACtC,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;KAYE;IAEJ,QAAQ,GAAA;QACN,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAC1C,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,KAAI;AACrD,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACjB,YAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACrB,YAAA,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;AACrC,YAAA,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;AAC3C,SAAC,CACF,CAAC;QACF,IAAI,CAAC,oBAAoB,EAAE,CAAC;KAC7B;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;KACrC;IAED,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;KACpB;AAEK,IAAA,IAAI,CAAC,gBAAgB,EAAA;;YACzB,IAAI;AACF,gBAAA,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAC;AACvC,gBAAA,MAAM,cAAc,GAClB,IAAI,CAAC,eAAe,CAAC,uBAAuB,EAAE,KAAK,qBAAqB,CAAC,KAAK,CAAC;AACjF,gBAAA,IAAI,cAAc,EAAE;AAClB,oBAAA,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;AACzC,iBAAA;gBACD,MAAM,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC1D,gBAAA,IAAI,cAAc,EAAE;oBAClB,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACtC,iBAAA;AAAM,qBAAA;oBACL,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC;AAC5D,iBAAA;AACF,aAAA;AAAC,YAAA,OAAO,EAAE,EAAE;AACX,gBAAA,IAAI,EAAE,EAAE;AACN,oBAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;AACxC,iBAAA;AACF,aAAA;SACF,CAAA,CAAA;AAAA,KAAA;IAEO,eAAe,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CACzD,GAAG,IAAI,GAAG,CAAC,IAAI,EACf,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,KAAK,CAAC,CACnD,CAAC;KACH;IAEO,SAAS,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CACvD,GAAG,IAAI,GAAG,CAAC,IAAI,EACf,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,KAAK,CAAC,CACnD,CAAC;KACH;IAEO,iBAAiB,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAC3D,GAAG,IAAI,GAAG,CAAC,IAAI,EACf,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,KAAK,CAAC,CACnD,CAAC;KACH;IAEa,yBAAyB,GAAA;;AACrC,YAAA,MAAM,WAAW,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,0BAA0B,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC3F,YAAA,MAAM,SAAS,GAAG,OAAO,CACvB,kIAAkI,CACnI,CAAC;YACF,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CACpC,OAAO,CAAC,wBAAwB,CAAC,EACjC,SAAS,EACT,MAAM,CAAC,OAAO,EACd,WAAW,CACZ,CAAC;SACH,CAAA,CAAA;AAAA,KAAA;;sHAlHU,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAW,uBAAA,EAAA,EAAA,EAAA,KAAA,EAAAlC,IAAA,CAAA,kBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,yBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,6DC5BtC,8hHAmGA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA+B,uBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,yBAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,oBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAApC,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,UAAA,EAAA,CAAA,EAAA,CAAA,CAAA;2FDvEa,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAJrC,SAAS;+BACE,uBAAuB,EAAA,QAAA,EAAA,8hHAAA,EAAA,CAAA;;;MElBtB,qBAAqB,CAAA;AAChC,IAAA,WAAA,CAAoB,uBAAgD,EAAA;AAAhD,QAAA,IAAuB,CAAA,uBAAA,GAAvB,uBAAuB,CAAyB;KAAI;IAExE,WAAW,GAAA;QACT,OAAO,IAAI,CAAC,uBAAuB,CAAC,oBAAoB,EAAE,CAAC,IAAI,CAC7D,KAAK,CAAC,IAAI,CAAC,EACX,UAAU,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAC5B,CAAC;KACH;;kHARU,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA+B,uBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;sHAArB,qBAAqB,EAAA,CAAA,CAAA;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,UAAU;;;MC2DE,sBAAsB,CAAA;;mHAAtB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAtB,sBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,iBAjC/B,yBAAyB;QACzB,uBAAuB;QACvB,yBAAyB;QACzB,oBAAoB;QACpB,2BAA2B;QAC3B,6BAA6B;QAC7B,4BAA4B;QAC5B,wBAAwB;QACxB,sBAAsB;QACtB,6BAA6B;QAC7B,+BAA+B;QAC/B,4BAA4B;QAC5B,wBAAwB;QACxB,8BAA8B;QAC9B,4BAA4B;QAC5B,4BAA4B,CAAA,EAAA,OAAA,EAAA,CAEpB,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,mBAAmB,CAAA,EAAA,OAAA,EAAA,CACjF,yBAAyB,CAAA,EAAA,CAAA,CAAA;AAexB,sBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,EAdtB,SAAA,EAAA;QACT,qBAAqB;QACrB,QAAQ;QACR,uBAAuB;QACvB,sBAAsB;QACtB,yBAAyB;QACzB,2BAA2B;AAC3B,QAAA,SAAS,CAAC;AACR,YAAA,IAAI,EAAE,mCAAmC;AACzC,YAAA,SAAS,EAAE,yBAAyB;AACpC,YAAA,WAAW,EAAE,CAAC,sBAAsB,EAAE,qBAAqB,CAAC;SAC7D,CAAC;AACH,KAAA,EAdS,OAAA,EAAA,CAAA,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,mBAAmB,CAAA,EAAA,CAAA,CAAA;2FAgBhF,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAnClC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ,yBAAyB;wBACzB,uBAAuB;wBACvB,yBAAyB;wBACzB,oBAAoB;wBACpB,2BAA2B;wBAC3B,6BAA6B;wBAC7B,4BAA4B;wBAC5B,wBAAwB;wBACxB,sBAAsB;wBACtB,6BAA6B;wBAC7B,+BAA+B;wBAC/B,4BAA4B;wBAC5B,wBAAwB;wBACxB,8BAA8B;wBAC9B,4BAA4B;wBAC5B,4BAA4B;AAC7B,qBAAA;oBACD,OAAO,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,mBAAmB,CAAC;oBAC5F,OAAO,EAAE,CAAC,yBAAyB,CAAC;AACpC,oBAAA,SAAS,EAAE;wBACT,qBAAqB;wBACrB,QAAQ;wBACR,uBAAuB;wBACvB,sBAAsB;wBACtB,yBAAyB;wBACzB,2BAA2B;AAC3B,wBAAA,SAAS,CAAC;AACR,4BAAA,IAAI,EAAE,mCAAmC;AACzC,4BAAA,SAAS,EAAE,yBAAyB;AACpC,4BAAA,WAAW,EAAE,CAAC,sBAAsB,EAAE,qBAAqB,CAAC;yBAC7D,CAAC;AACH,qBAAA;iBACF,CAAA;;;MCxDY,WAAW,CAAA;IACtB,WAAmB,CAAA,MAAc,EAAU,uBAAgD,EAAA;AAAxE,QAAA,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;AAAU,QAAA,IAAuB,CAAA,uBAAA,GAAvB,uBAAuB,CAAyB;KAAI;IAC/F,GAAG,GAAA;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE;AACjD,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AACf,SAAA;QAED,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC3B,YAAA,IAAI,EAAE,mCAAmC;AACzC,YAAA,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC;AAChC,YAAA,IAAI,EAAE,YAAY;AAClB,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,WAAW,EAAE,YAAY;AACnB,SAAA,CAAC,CAAC;AACV,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,oBAAoB,EAAE,CAAC,IAAI,CACtE,KAAK,CAAC;AACJ,YAAA,IAAI,EAAE,mCAAmC;AACzC,YAAA,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC;AAChC,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,WAAW,EAAE,YAAY;SACnB,CAAC,EACT,UAAU,CAAC,MAAM,KAAK,CAAC,CACxB,CAAC;AACF,QAAA,OAAO,KAAK,CAAC,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;KACxE;;wGAzBU,WAAW,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAnC,IAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAAuC,uBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;4GAAX,WAAW,EAAA,CAAA,CAAA;2FAAX,WAAW,EAAA,UAAA,EAAA,CAAA;kBADvB,UAAU;;;MCHE,iBAAiB,CAAA;AAG5B,IAAA,WAAA,CAAoB,WAAwB,EAAA;AAAxB,QAAA,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;AAF5C,QAAA,IAAI,CAAA,IAAA,GAAoB,EAAE,CAAC;KAEqB;IAE1C,GAAG,GAAA;;AACP,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;gBACpD,mBAAmB;gBACnB,8BAA8B;AAC/B,aAAA,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,iBAAiB,EAAE;AAC/C,gBAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CACZ,IAAI,aAAa,CAAC;AAChB,oBAAA,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC;AAChC,oBAAA,IAAI,EAAE,YAAY;AAClB,oBAAA,IAAI,EAAE,qBAAqB;AAC3B,oBAAA,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC;AAC3B,oBAAA,eAAe,EAAE,KAAK;AACtB,oBAAA,QAAQ,EAAE,IAAI;AACf,iBAAA,CAAC,CACH,CAAC;AACH,aAAA;YACD,OAAO,IAAI,CAAC,IAAI,CAAC;SAClB,CAAA,CAAA;AAAA,KAAA;;8GAvBU,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAjB,iBAAiB,EAAA,CAAA,CAAA;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,UAAU;;;MCkBE,uBAAuB,CAAA;;oHAAvB,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;qHAAvB,uBAAuB,EAAA,OAAA,EAAA,CAZxB,mBAAmB,EAAE,sBAAsB,CAAA,EAAA,CAAA,CAAA;AAY1C,uBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,EAXvB,SAAA,EAAA;QACT,sBAAsB;QACtB,OAAO,CAAC,WAAW,CAAC;QACpB,aAAa,CAAC,iBAAiB,CAAC;AAChC,QAAA,SAAS,CAAC;AACR,YAAA,IAAI,EAAE,oBAAoB;AAC1B,YAAA,UAAU,EAAE,mCAAmC;AAC/C,YAAA,SAAS,EAAE,MAAM;SAClB,CAAC;KACH,EAVS,OAAA,EAAA,CAAA,mBAAmB,EAAE,sBAAsB,CAAA,EAAA,CAAA,CAAA;2FAY1C,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAbnC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;AACtD,oBAAA,SAAS,EAAE;wBACT,sBAAsB;wBACtB,OAAO,CAAC,WAAW,CAAC;wBACpB,aAAa,CAAC,iBAAiB,CAAC;AAChC,wBAAA,SAAS,CAAC;AACR,4BAAA,IAAI,EAAE,oBAAoB;AAC1B,4BAAA,UAAU,EAAE,mCAAmC;AAC/C,4BAAA,SAAS,EAAE,MAAM;yBAClB,CAAC;AACH,qBAAA;iBACF,CAAA;;;ACpBD;;AAEG;;;;"}
1
+ {"version":3,"file":"c8y-ngx-components-auth-configuration.mjs","sources":["../../auth-configuration/basic-settings/basic-settings.model.ts","../../auth-configuration/basic-settings/basic-auth-settings.component.ts","../../auth-configuration/basic-settings/basic-auth-settings.component.html","../../auth-configuration/auth-configuration.guard.ts","../../auth-configuration/basic-settings/typed-option.ts","../../auth-configuration/basic-settings/tenant-login-option.mapper.ts","../../auth-configuration/basic-settings/auth-configuration.service.ts","../../auth-configuration/basic-settings/session-configuration.component.ts","../../auth-configuration/basic-settings/session-configuration.component.html","../../auth-configuration/basic-settings/login-settings.component.ts","../../auth-configuration/basic-settings/login-settings.component.html","../../auth-configuration/basic-settings/tfa-settings.component.ts","../../auth-configuration/basic-settings/tfa-settings.component.html","../../auth-configuration/basic-settings/auth-configuration.component.ts","../../auth-configuration/basic-settings/auth-configuration.component.html","../../auth-configuration/basic-settings/basic-settings.module.ts","../../auth-configuration/sso-configuration/sso-configuration.model.ts","../../auth-configuration/sso-configuration/sso-configuration.service.ts","../../auth-configuration/sso-configuration/templates/sso-configuration.mapper.ts","../../auth-configuration/sso-configuration/templates/template.component.ts","../../auth-configuration/sso-configuration/template-parts/request-configuration.model.ts","../../auth-configuration/sso-configuration/template-parts/signature-configuration.model.ts","../../auth-configuration/sso-configuration/template-parts/external-token-config.model.ts","../../auth-configuration/sso-configuration/templates/custom-configuration-mapper.ts","../../auth-configuration/sso-configuration/template-parts/basic-configuration.component.ts","../../auth-configuration/sso-configuration/template-parts/basic-configuration.component.html","../../auth-configuration/sso-configuration/template-parts/request-configuration.component.ts","../../auth-configuration/sso-configuration/template-parts/request-configuration.component.html","../../auth-configuration/sso-configuration/template-parts/user-id-configuration.component.ts","../../auth-configuration/sso-configuration/template-parts/user-id-configuration.component.html","../../auth-configuration/sso-configuration/template-parts/user-data-mapping.component.ts","../../auth-configuration/sso-configuration/template-parts/user-data-mapping.component.html","../../auth-configuration/sso-configuration/template-parts/access-mapping/dynamic-accesss-mapping-relations.model.ts","../../auth-configuration/sso-configuration/template-parts/access-mapping/child-predicates.component.ts","../../auth-configuration/sso-configuration/template-parts/access-mapping/child-predicates.component.html","../../auth-configuration/sso-configuration/template-parts/access-mapping/dynamic-access-mapping.component.ts","../../auth-configuration/sso-configuration/template-parts/access-mapping/dynamic-access-mapping.component.html","../../auth-configuration/sso-configuration/template-parts/access-mapping/inventory-roles-modal.component.ts","../../auth-configuration/sso-configuration/template-parts/access-mapping/inventory-roles-modal.component.html","../../auth-configuration/sso-configuration/template-parts/access-mapping/inventory-roles-mapping.component.ts","../../auth-configuration/sso-configuration/template-parts/access-mapping/inventory-roles-mapping.component.html","../../auth-configuration/sso-configuration/template-parts/access-mapping/access-mapping.component.ts","../../auth-configuration/sso-configuration/template-parts/access-mapping/access-mapping.component.html","../../auth-configuration/sso-configuration/template-parts/signature-configuration.component.ts","../../auth-configuration/sso-configuration/template-parts/signature-configuration.component.html","../../auth-configuration/sso-configuration/template-parts/external-token-config.component.ts","../../auth-configuration/sso-configuration/template-parts/external-token-config.component.html","../../auth-configuration/sso-configuration/templates/custom-template.component.ts","../../auth-configuration/sso-configuration/templates/custom-template.component.html","../../auth-configuration/sso-configuration/templates/key-cloak-configuration-mapper.ts","../../auth-configuration/sso-configuration/templates/key-cloak-template.component.ts","../../auth-configuration/sso-configuration/templates/key-cloak-template.component.html","../../auth-configuration/sso-configuration/templates/aad-configuration-mapper.ts","../../auth-configuration/sso-configuration/template-parts/logout-configuration.component.ts","../../auth-configuration/sso-configuration/template-parts/logout-configuration.component.html","../../auth-configuration/sso-configuration/templates/aad-template.component.ts","../../auth-configuration/sso-configuration/templates/aad-template.component.html","../../auth-configuration/sso-configuration/sso-configuration.component.ts","../../auth-configuration/sso-configuration/sso-configuration.component.html","../../auth-configuration/sso-configuration/sso-configuration.guard.ts","../../auth-configuration/sso-configuration/sso-configuration.module.ts","../../auth-configuration/factories/tabs.factory.ts","../../auth-configuration/factories/navigation.factory.ts","../../auth-configuration/auth-configuration.module.ts","../../auth-configuration/c8y-ngx-components-auth-configuration.ts"],"sourcesContent":["import {\n IAuthenticationRestrictions,\n ITenantLoginOption,\n TenantLoginOptionType\n} from '@c8y/client';\n\nexport interface TenantLoginOption\n extends Omit<\n ITenantLoginOption,\n | 'authenticationRestrictions'\n | 'self'\n | 'strengthValidity'\n | 'tfaStrategy'\n | 'greenMinLength'\n | 'enforceStrength'\n | 'strengthValidity'\n | '_type'\n > {\n authenticationRestrictions?: AuthenticationRestrictions;\n}\n\nexport interface AuthenticationRestrictions\n extends Omit<IAuthenticationRestrictions, 'trustedUserAgents' | 'forbiddenUserAgents'> {\n trustedUserAgents: UserAgent[];\n forbiddenUserAgents: UserAgent[];\n}\n\nexport class UserAgent {\n readonly _id: string;\n value: string;\n\n constructor(value: string) {\n this._id = this.uniqueId();\n this.value = value;\n }\n\n get id() {\n return this._id;\n }\n\n private uniqueId() {\n const dateString = Date.now().toString(36);\n const randomString = Math.random().toString(36).substr(2);\n return dateString + randomString;\n }\n}\n\nexport function isOauthInternal(tenantLoginOption: TenantLoginOption) {\n return tenantLoginOption.type === TenantLoginOptionType.OAUTH2_INTERNAL;\n}\n\nexport function isBasic(tenantLoginOption: TenantLoginOption) {\n return tenantLoginOption.type === TenantLoginOptionType.BASIC;\n}\n","import { Component, Input, SimpleChanges } from '@angular/core';\nimport { TenantLoginOptionType } from '@c8y/client';\nimport { AuthConfiguration } from './auth-configuration.model';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { UserAgent, AuthenticationRestrictions, isBasic } from './basic-settings.model';\n\n@Component({\n selector: 'c8y-basic-auth-settings',\n templateUrl: './basic-auth-settings.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class BasicAuthSettingsComponent {\n @Input()\n authConfiguration: AuthConfiguration;\n\n preferredLoginOptionType: TenantLoginOptionType = TenantLoginOptionType.BASIC;\n\n tenantLoginOptionTypeEnum = TenantLoginOptionType;\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.authConfiguration && changes.authConfiguration.currentValue) {\n this.preferredLoginOptionType =\n changes.authConfiguration.currentValue.preferredLoginOptionType;\n }\n }\n\n ngDoCheck() {\n if (this.preferredLoginOptionType !== this.authConfiguration.preferredLoginOptionType) {\n this.preferredLoginOptionType = this.authConfiguration.preferredLoginOptionType;\n if (this.preferredLoginOptionType === TenantLoginOptionType.BASIC) {\n this.forbiddenWebBrowsers = false;\n }\n }\n }\n\n get forbiddenWebBrowsers() {\n return this.authenticationRestrictions.forbiddenClients.includes('WEB_BROWSERS');\n }\n\n set forbiddenWebBrowsers(value: boolean) {\n this.authenticationRestrictions.forbiddenClients = value ? ['WEB_BROWSERS'] : [];\n }\n\n forbiddenUserAgentsRemove(id) {\n this.authenticationRestrictions.forbiddenUserAgents = this.remove(\n this.authenticationRestrictions.forbiddenUserAgents,\n id\n );\n }\n\n trustedUserAgentsRemove(id) {\n this.authenticationRestrictions.trustedUserAgents = this.remove(\n this.authenticationRestrictions.trustedUserAgents,\n id\n );\n }\n\n get authenticationRestrictions(): AuthenticationRestrictions {\n return this.authConfiguration.loginOptions.find(isBasic).authenticationRestrictions;\n }\n\n add(collection) {\n collection.push(new UserAgent(''));\n }\n\n private remove(collection, id) {\n const newArray = collection.filter(obj => obj.id !== id);\n if (!newArray.length) {\n newArray.push(new UserAgent(''));\n }\n return newArray;\n }\n}\n","<div\n class=\"card-block separator-top\"\n *ngIf=\"authConfiguration.preferredLoginOptionType !== 'BASIC'\"\n>\n <div class=\"col-sm-2\">\n <div class=\"h4 text-normal text-right text-left-xs\">\n {{ 'Basic Auth restrictions' | translate }}\n </div>\n </div>\n\n <div class=\"col-sm-9\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"c8y-switch\" title=\"{{ 'Forbidden for web browsers' | translate }}\">\n <input type=\"checkbox\" name=\"forbiddenWebBrowsers\" [(ngModel)]=\"forbiddenWebBrowsers\" />\n <span></span>\n <span>{{ 'Forbidden for web browsers' | translate }}</span>\n </label>\n <div\n class=\"alert alert-warning\"\n *ngIf=\"\n preferredLoginOptionType === tenantLoginOptionTypeEnum.BASIC && forbiddenWebBrowsers\n \"\n >\n {{\n 'You are about to forbid browsers from using Basic authentication. This will prevent users from using web applications on your tenant because you are going to set Basic authentication as the preferred login mode.'\n | translate\n }}\n </div>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <label title=\"{{ 'Forbidden user agents' | translate }}\">\n {{ 'Forbidden user agents' | translate }}\n </label>\n <div\n class=\"input-group m-t-8\"\n *ngFor=\"\n let forbiddenUserAgent of authenticationRestrictions.forbiddenUserAgents;\n last as isLast;\n first as isFirst\n \"\n >\n <input\n type=\"text\"\n [name]=\"'forbiddenUserAgent' + forbiddenUserAgent.id\"\n [(ngModel)]=\"forbiddenUserAgent.value\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} forbidden-agent\"\n />\n <div class=\"input-group-btn col-sm-2\">\n <button\n *ngIf=\"!(isFirst && isLast && forbiddenUserAgent.value === '')\"\n title=\"{{ 'Remove' | translate }}\"\n [name]=\"'forbiddenUserAgentRemove' + forbiddenUserAgent.id\"\n type=\"button\"\n class=\"btn btn-dot text-primary\"\n (click)=\"forbiddenUserAgentsRemove(forbiddenUserAgent.id)\"\n >\n <i class=\"dlt-c8y-icon-minus-circle text-danger\"></i>\n </button>\n <button\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n class=\"btn btn-dot text-primary\"\n (click)=\"add(authenticationRestrictions.forbiddenUserAgents)\"\n *ngIf=\"isLast\"\n >\n <i class=\"dlt-c8y-icon-plus-circle\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <label title=\"{{ 'Trusted user agents' | translate }}\">\n {{ 'Trusted user agents' | translate }}\n </label>\n <div\n class=\"input-group m-t-8\"\n *ngFor=\"\n let trustedUserAgent of authenticationRestrictions.trustedUserAgents;\n last as isLast;\n first as isFirst\n \"\n >\n <input\n type=\"text\"\n [name]=\"'trustedUserAgent' + trustedUserAgent.id\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} trusted-agent\"\n [(ngModel)]=\"trustedUserAgent.value\"\n />\n <div class=\"input-group-btn col-sm-2\">\n <button\n *ngIf=\"!(isFirst && isLast && trustedUserAgent.value === '')\"\n title=\"{{ 'Remove' | translate }}\"\n [name]=\"'trustedUserAgentRemove' + trustedUserAgent.id\"\n type=\"button\"\n class=\"btn btn-dot btn-dot--danger text-primary\"\n (click)=\"trustedUserAgentsRemove(trustedUserAgent.id)\"\n >\n <i class=\"dlt-c8y-icon-minus-circle\"></i>\n </button>\n <button\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n (click)=\"add(authenticationRestrictions.trustedUserAgents)\"\n class=\"btn btn-dot text-primary\"\n *ngIf=\"isLast\"\n >\n <i class=\"dlt-c8y-icon-plus-circle\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { CanActivate } from '@angular/router';\nimport { Permissions } from '@c8y/ngx-components';\n\n@Injectable()\nexport class AuthConfigurationGuard implements CanActivate {\n constructor(private permissions: Permissions) {}\n\n canActivate(): boolean {\n return this.permissions.hasAnyRole(['ROLE_TENANT_ADMIN', 'ROLE_TENANT_MANAGEMENT_ADMIN']);\n }\n}\n","import { ISystemOption, ITenantOption } from '@c8y/client';\nimport { isString } from 'lodash-es';\n\nexport class TypedOption implements ISystemOption, ITenantOption {\n constructor(\n public category: string,\n public key: string,\n public type: 'string' | 'boolean' | 'number',\n public defaultValue?: string | boolean | number,\n public value?: string\n ) {}\n\n apply(option: ISystemOption | ITenantOption) {\n this.category = option.category;\n this.key = option.key;\n this.value = option.value;\n }\n\n getValue() {\n try {\n return this.getValueByType();\n } catch (ex) {\n return this.defaultValue;\n }\n }\n\n private getValueByType() {\n switch (this.type) {\n case 'boolean':\n return this.value.toLowerCase() === 'true';\n case 'number':\n return this.parseNumberValue(this.value);\n case 'string':\n return this.parseStringValue(this.value);\n default:\n throw new TypeError();\n }\n }\n\n private parseNumberValue(stringValue: string) {\n const value = Number.parseInt(stringValue, 10);\n if (typeof value !== 'number' || isNaN(value)) {\n throw new Error();\n }\n return value;\n }\n\n private parseStringValue(value: string) {\n if (!isString(value)) {\n throw new Error();\n }\n return value;\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n UserAgent,\n AuthenticationRestrictions,\n TenantLoginOption,\n isBasic,\n isOauthInternal\n} from './basic-settings.model';\nimport { ITenantLoginOption, IAuthenticationRestrictions } from '@c8y/client';\nimport { defaults, isEmpty, omitBy, omit } from 'lodash-es';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TenantLoginOptionMapper {\n mapTo(tenantLoginOption: ITenantLoginOption): TenantLoginOption {\n const loginOption: TenantLoginOption = omit(\n this.prapareTenantLoginOption(tenantLoginOption),\n 'authenticationRestrictions'\n );\n if (isBasic(loginOption)) {\n loginOption.authenticationRestrictions = this.mapAuthenticationRestrictionsTo(\n tenantLoginOption.authenticationRestrictions\n );\n }\n return loginOption;\n }\n\n mapFrom(\n originalLoginOption: TenantLoginOption,\n newLoginOption: TenantLoginOption\n ): ITenantLoginOption {\n if (isBasic(originalLoginOption)) {\n return this.mapBasicLoginOption(originalLoginOption, newLoginOption);\n }\n if (isOauthInternal(originalLoginOption)) {\n return this.mapOauthInternalLoginOption(originalLoginOption, newLoginOption);\n }\n throw new Error(\n `TenantLoginOptionMapper: The tenant login option cannot be mapped. Login option with type: ${originalLoginOption.type} is not supported.`\n );\n }\n\n private mapAuthenticationRestrictionsTo(\n authenticationRestrictions: IAuthenticationRestrictions\n ): AuthenticationRestrictions {\n const restrictions = defaults({}, omitBy(authenticationRestrictions, isEmpty), {\n forbiddenUserAgents: [''],\n trustedUserAgents: [''],\n forbiddenClients: []\n });\n restrictions.forbiddenUserAgents = restrictions.forbiddenUserAgents.map(\n val => new UserAgent(val)\n );\n restrictions.trustedUserAgents = restrictions.trustedUserAgents.map(val => new UserAgent(val));\n return restrictions;\n }\n\n private mapBasicLoginOption(\n originalLoginOption: TenantLoginOption,\n newLoginOption: TenantLoginOption\n ) {\n const loginOption = omit(originalLoginOption, ['sessionConfiguration']);\n loginOption.authenticationRestrictions = this.mapAuthenticationRestrictionsFrom(\n newLoginOption.authenticationRestrictions\n );\n return loginOption;\n }\n\n private mapOauthInternalLoginOption(\n originalLoginOption: TenantLoginOption,\n newLoginOption: TenantLoginOption\n ) {\n const loginOption = omit(originalLoginOption, ['authenticationRestrictions']);\n newLoginOption.sessionConfiguration !== null\n ? (loginOption.sessionConfiguration = newLoginOption.sessionConfiguration)\n : delete loginOption.sessionConfiguration;\n return loginOption;\n }\n\n private mapAuthenticationRestrictionsFrom(\n authenticationRestrictions: AuthenticationRestrictions\n ): IAuthenticationRestrictions {\n return {\n trustedUserAgents: authenticationRestrictions.trustedUserAgents\n .filter(({ value }) => value)\n .map(({ value }) => value),\n forbiddenUserAgents: authenticationRestrictions.forbiddenUserAgents\n .filter(({ value }) => value)\n .map(({ value }) => value),\n forbiddenClients: authenticationRestrictions.forbiddenClients.filter(value => value)\n };\n }\n\n private prapareTenantLoginOption(tenantLoginOption: ITenantLoginOption): TenantLoginOption {\n return omit(tenantLoginOption, [\n 'self',\n 'strengthValidity',\n 'tfaStrategy',\n 'greenMinLength',\n 'enforceStrength',\n 'strengthValidity',\n '_type'\n ]);\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n GrantType,\n IResult,\n ITenantLoginOption,\n ITenantOption,\n SystemOptionsService,\n TenantLoginOptionsService,\n TenantLoginOptionType,\n TenantOptionsService,\n UserManagementSource,\n TenantService\n} from '@c8y/client';\nimport { catchError, map } from 'rxjs/operators';\nimport { forkJoin, from, Observable, of } from 'rxjs';\nimport { defaults } from 'lodash-es';\nimport { AuthConfiguration, Options } from './auth-configuration.model';\nimport { AppStateService, TenantUiService } from '@c8y/ngx-components';\nimport { TypedOption } from './typed-option';\nimport { TenantLoginOption } from './basic-settings.model';\nimport { TenantLoginOptionMapper } from './tenant-login-option.mapper';\n\n@Injectable()\nexport class AuthConfigurationService {\n private systemOptionsWithDefaultValue: TypedOption[] = [\n new TypedOption('password', 'limit.validity', 'number', null),\n new TypedOption('password', 'enforce.strength', 'boolean', false),\n new TypedOption('two-factor-authentication', 'tenant-scope-settings.enabled', 'boolean', false),\n new TypedOption('two-factor-authentication', 'enabled', 'boolean', false),\n // note: this definition is inconsistent with backend and is overridden in getSystemOptions$\n new TypedOption('two-factor-authentication', 'enforced', 'boolean', false),\n new TypedOption('two-factor-authentication', 'enforced.group', 'string', '')\n ];\n\n private tenantOptionsWithDefaultValue: TypedOption[] = [\n new TypedOption('password', 'limit.validity', 'number', 0),\n new TypedOption('password', 'strength.validity', 'boolean', false),\n new TypedOption('two-factor-authentication', 'enabled', 'boolean', false),\n new TypedOption('two-factor-authentication', 'token.validity', 'number', 43200), // 30 days\n new TypedOption('two-factor-authentication', 'pin.validity', 'number', 30),\n new TypedOption('two-factor-authentication', 'enforced', 'boolean', false),\n new TypedOption('two-factor-authentication', 'strategy', 'string', 'SMS'),\n new TypedOption('oauth.internal', 'basic-token.lifespan.seconds', 'number', null)\n ];\n\n constructor(\n private tenantLoginOptionsService: TenantLoginOptionsService,\n private tenantOptionsService: TenantOptionsService,\n private systemOptionsService: SystemOptionsService,\n private appState: AppStateService,\n private tenantUiService: TenantUiService,\n private tenantLoginOptionMapper: TenantLoginOptionMapper,\n private tenantService: TenantService\n ) {}\n\n getAuthConfiguration$(): Observable<AuthConfiguration> {\n const loginOptions$ = this.getLoginOptions$();\n return forkJoin({\n loginOptions: this.map(loginOptions$),\n tenantOptions: this.getTenantOptions$(),\n systemOptions: this.getSystemOptions$(),\n smsGatewayAvailable: this.isSmsApplicationAvailable$(),\n preferredLoginOptionType: this.getPreferredLoginOptionType$(loginOptions$)\n });\n }\n\n save(newAuthConfiguration: AuthConfiguration, previousAuthConfiguration: AuthConfiguration) {\n const tenantOptions = this.prepareTenantOptions(\n newAuthConfiguration,\n previousAuthConfiguration\n );\n const updateTenantOptions = tenantOptions.map(tenantOption =>\n this.tenantOptionsService.create(tenantOption)\n );\n const basicLoginOption = this.prepareBasicLoginOption(\n newAuthConfiguration,\n previousAuthConfiguration\n );\n const oauthInternalLoginOption = this.prepareOauthInternalLoginOption(\n newAuthConfiguration,\n previousAuthConfiguration\n );\n\n return Promise.all([\n this.saveOrUpdateLoginOption(basicLoginOption),\n this.saveOrUpdateLoginOption(oauthInternalLoginOption),\n updateTenantOptions\n ]);\n }\n\n private map(loginOptions$: Observable<ITenantLoginOption[]>): Observable<TenantLoginOption[]> {\n return loginOptions$.pipe(\n map(loginOptions =>\n loginOptions.map(loginOption => this.tenantLoginOptionMapper.mapTo(loginOption))\n )\n );\n }\n\n private saveOrUpdateLoginOption(\n loginOption: ITenantLoginOption\n ): Promise<IResult<ITenantLoginOption>> {\n return loginOption.id\n ? this.tenantLoginOptionsService.update(loginOption)\n : this.tenantLoginOptionsService.create(loginOption);\n }\n\n private prepareBasicLoginOption(\n newAuthConfiguration: AuthConfiguration,\n previousAuthConfiguration: AuthConfiguration\n ): ITenantLoginOption {\n const basicLoginOption = this.originalLoginOptionWithDefaults(\n previousAuthConfiguration,\n TenantLoginOptionType.BASIC\n );\n basicLoginOption.visibleOnLoginPage = this.visibleOnLoginPage(\n newAuthConfiguration,\n TenantLoginOptionType.BASIC\n );\n return this.tenantLoginOptionMapper.mapFrom(\n basicLoginOption,\n this.getLoginOptionFromAuthConfiguration(newAuthConfiguration, TenantLoginOptionType.BASIC)\n );\n }\n\n private prepareOauthInternalLoginOption(\n newAuthConfiguration: AuthConfiguration,\n previousAuthConfiguration: AuthConfiguration\n ): ITenantLoginOption {\n const oauthInternalLoginOption = this.originalLoginOptionWithDefaults(\n previousAuthConfiguration,\n TenantLoginOptionType.OAUTH2_INTERNAL\n );\n oauthInternalLoginOption.visibleOnLoginPage = this.visibleOnLoginPage(\n newAuthConfiguration,\n TenantLoginOptionType.OAUTH2_INTERNAL\n );\n return this.tenantLoginOptionMapper.mapFrom(\n oauthInternalLoginOption,\n this.getLoginOptionFromAuthConfiguration(\n newAuthConfiguration,\n TenantLoginOptionType.OAUTH2_INTERNAL\n )\n );\n }\n\n private originalLoginOptionWithDefaults(\n previousAuthConfiguration: AuthConfiguration,\n loginOptionType: TenantLoginOptionType\n ): TenantLoginOption {\n return defaults(\n {},\n this.getLoginOptionFromAuthConfiguration(previousAuthConfiguration, loginOptionType),\n this.getDefaultLoginOption(loginOptionType)\n );\n }\n\n private getLoginOptionFromAuthConfiguration(\n authConfiguration: AuthConfiguration,\n loginOptionType: TenantLoginOptionType\n ) {\n return authConfiguration.loginOptions.find(loginOption => loginOption.type === loginOptionType);\n }\n\n private visibleOnLoginPage(\n authConfiguration: AuthConfiguration,\n loginOptionType: TenantLoginOptionType\n ): boolean {\n return authConfiguration.preferredLoginOptionType === loginOptionType;\n }\n\n private prepareTenantOptions(\n newAuthConfiguration: AuthConfiguration,\n previousAuthConfiguration: AuthConfiguration\n ): ITenantOption[] {\n const getValue = (authCfg, tenantOption) =>\n authCfg.tenantOptions[tenantOption.category][tenantOption.key];\n const hasChanged = tenantOption =>\n getValue(newAuthConfiguration, tenantOption) !==\n getValue(previousAuthConfiguration, tenantOption);\n\n return this.tenantOptionsWithDefaultValue\n .filter(tenantOption => getValue(newAuthConfiguration, tenantOption) !== null)\n .filter(tenantOption => hasChanged(tenantOption))\n .map(tenantOption => ({\n category: tenantOption.category,\n key: tenantOption.key,\n value: getValue(newAuthConfiguration, tenantOption).toString()\n }));\n }\n\n private getLoginOptions$(): Observable<ITenantLoginOption[]> {\n return from(this.tenantLoginOptionsService.listForCurrentTenant()).pipe(\n map(res => res.data),\n map(loginOptions => this.addDefaultLoginOptions(loginOptions))\n );\n }\n\n private getPreferredLoginOptionType$(\n loginOptions$: Observable<ITenantLoginOption[]>\n ): Observable<TenantLoginOptionType> {\n return loginOptions$.pipe(\n map(loginOptions => {\n return this.tenantUiService.getPreferredLoginOption(loginOptions).type;\n })\n );\n }\n\n private addDefaultLoginOptions(loginOptions: ITenantLoginOption[]) {\n if (!loginOptions.find(this.tenantUiService.isBasic)) {\n loginOptions.push(this.getDefaultLoginOption(TenantLoginOptionType.BASIC));\n }\n if (!loginOptions.find(this.tenantUiService.isOauthInternal)) {\n loginOptions.push(this.getDefaultLoginOption(TenantLoginOptionType.OAUTH2_INTERNAL));\n }\n return loginOptions;\n }\n\n private getTenantOptions$(): Observable<Options> {\n return forkJoin(\n this.tenantOptionsWithDefaultValue.map((option: TypedOption) =>\n from(this.tenantOptionsService.detail(option)).pipe(\n map(res => {\n option.apply(res.data);\n return option;\n }),\n catchError(() => of(option))\n )\n )\n ).pipe(map(options => this.getOptionsObject(options)));\n }\n\n private getSystemOptions$(): Observable<Options> {\n return forkJoin(\n this.systemOptionsWithDefaultValue.map((option: TypedOption) => {\n const fixedOption = this.fixTfaEnforcedSystemOption(option);\n if (fixedOption) {\n return fixedOption;\n }\n\n return from(this.systemOptionsService.detail(option)).pipe(\n map(res => {\n option.apply(res.data);\n return option;\n }),\n catchError(() => of(option))\n );\n })\n ).pipe(map(options => this.getOptionsObject(options)));\n }\n\n /**\n * Returns an observable with fixed `two-factor-authentication.enforced` system option or null.\n * This method fixes problem with inconsistent value. System option `two-factor-authentication.enforced` is list of tenants when UI using boolean value.\n * This part will be removed after implementing new endpoint in MTM-50490.\n */\n private fixTfaEnforcedSystemOption(option: TypedOption): Observable<TypedOption> {\n if (option.category === 'two-factor-authentication' && option.key === 'enforced') {\n return from(this.tenantService.getTfaSettings(this.tenantUiService.currentTenant)).pipe(\n map(tfaSettings => {\n option.value = tfaSettings.enforcedOnSystemLevel.toString();\n return option;\n })\n );\n }\n return null;\n }\n\n private isSmsApplicationAvailable$(): Observable<boolean> {\n return from(this.appState.isApplicationAvailable('sms-gateway'));\n }\n\n private getOptionsObject(options: TypedOption[]) {\n return options.reduce((optionsObject, option) => {\n optionsObject[option.category] = optionsObject[option.category] || {};\n optionsObject[option.category][option.key] = option.getValue();\n return optionsObject;\n }, {});\n }\n\n private getDefaultLoginOption(tenantLoginOptionType: TenantLoginOptionType): ITenantLoginOption {\n return {\n userManagementSource: UserManagementSource.INTERNAL,\n grantType: GrantType.PASSWORD,\n providerName: 'Cumulocity',\n visibleOnLoginPage: false,\n type: tenantLoginOptionType\n };\n }\n}\n","import { Component, Input, SimpleChanges } from '@angular/core';\nimport { ISessionConfiguration, TenantLoginOptionType } from '@c8y/client';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { defaults, cloneDeep, isFinite } from 'lodash-es';\nimport { gettext, TenantUiService } from '@c8y/ngx-components';\nimport { AuthConfiguration } from './auth-configuration.model';\nimport { TranslateService } from '@ngx-translate/core';\nimport { isOauthInternal } from './basic-settings.model';\n\n@Component({\n selector: 'c8y-session-configuration',\n templateUrl: './session-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class SessionConfigurationComponent {\n @Input()\n authConfiguration: AuthConfiguration;\n tenantLoginOptionTypeEnum = TenantLoginOptionType;\n ABSOLUTE_TIMEOUT_VALIDATION_MESSAGE = gettext(\n 'The value must be greater than \"Token lifespan\" and not less than {{ minAbsoluteTimeout }}.'\n );\n RENEWAL_TIMEOUT_VALIDATION_MESSAGE = gettext('The value must be less than \"Token lifespan\".');\n MAX_TOKEN_LIFESPAN_VALIDATION_MESSAGE = gettext(\n 'The value must be less than \"Session absolute timeout\".'\n );\n MIN_TOKEN_LIFESPAN_VALIDATION_MESSAGE = gettext(\n 'The value must be greater than \"Session renewal timeout\".'\n );\n\n USER_AGENT_VALIDATION_REQUIRED_POPOVER = gettext(\n 'If selected, then every request needs to use the same \"User-Agent\" header as the first request which initiated the session.'\n );\n\n private MIN_ABSOLUTE_TIMEOUT: number = 15 * 60;\n private originalSessionConfiguration;\n private previousTokenLifespan;\n\n constructor(\n private tenantUiService: TenantUiService,\n private translateService: TranslateService\n ) {\n this.ABSOLUTE_TIMEOUT_VALIDATION_MESSAGE = this.translateService.instant(\n this.ABSOLUTE_TIMEOUT_VALIDATION_MESSAGE,\n { minAbsoluteTimeout: this.MIN_ABSOLUTE_TIMEOUT }\n );\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.authConfiguration && changes.authConfiguration.currentValue) {\n const oauthInternal =\n changes.authConfiguration.currentValue.loginOptions.find(isOauthInternal) || {};\n this.originalSessionConfiguration = cloneDeep(oauthInternal.sessionConfiguration);\n this.sessionConfiguration = oauthInternal.sessionConfiguration;\n this.previousTokenLifespan =\n this.authConfiguration.tenantOptions['oauth.internal']['basic-token.lifespan.seconds'];\n }\n }\n\n get renewalTimeoutSeconds(): number {\n const sessionConfiguration = this.sessionConfiguration;\n return this.convertToSeconds(sessionConfiguration.renewalTimeoutMillis);\n }\n\n set renewalTimeoutSeconds(value: number) {\n this.sessionConfiguration.renewalTimeoutMillis = this.convertToMillis(value);\n }\n\n get absoluteTimeoutSeconds(): number {\n const sessionConfiguration = this.sessionConfiguration;\n return this.convertToSeconds(sessionConfiguration.absoluteTimeoutMillis);\n }\n\n set absoluteTimeoutSeconds(value: number) {\n this.sessionConfiguration.absoluteTimeoutMillis = this.convertToMillis(value);\n }\n\n get maximumNumberOfParallelSessions(): number {\n return this.sessionConfiguration.maximumNumberOfParallelSessions;\n }\n\n set maximumNumberOfParallelSessions(value: number) {\n this.sessionConfiguration.maximumNumberOfParallelSessions = value;\n }\n\n get userAgentValidationRequired(): boolean {\n return this.sessionConfiguration.userAgentValidationRequired;\n }\n\n set userAgentValidationRequired(value: boolean) {\n this.sessionConfiguration.userAgentValidationRequired = value;\n }\n\n get basicTokenLifespan() {\n return this.authConfiguration.tenantOptions['oauth.internal']['basic-token.lifespan.seconds'];\n }\n\n set basicTokenLifespan(value) {\n this.authConfiguration.tenantOptions['oauth.internal']['basic-token.lifespan.seconds'] = value;\n }\n\n get useSessionConfiguration() {\n return !!this.sessionConfiguration;\n }\n\n set useSessionConfiguration(value) {\n this.sessionConfiguration = value\n ? defaults({}, this.originalSessionConfiguration, {\n absoluteTimeoutMillis: 1209600000, // 14 days\n renewalTimeoutMillis: 86400000, // 1 day\n maximumNumberOfParallelSessions: 5,\n userAgentValidationRequired: false\n })\n : null;\n this.basicTokenLifespan = this.previousTokenLifespan || 172800; // 2 days\n }\n\n get absoluteTimeoutConstraints() {\n return {\n min: Math.max(this.MIN_ABSOLUTE_TIMEOUT, this.basicTokenLifespan + 1)\n };\n }\n\n get renewalTimeoutConstraints() {\n return {\n min: this.MIN_ABSOLUTE_TIMEOUT / 2,\n max: this.basicTokenLifespan ? this.basicTokenLifespan - 1 : null\n };\n }\n\n get basicTokenLifespanConstraints() {\n return {\n min: this.renewalTimeoutSeconds ? this.renewalTimeoutSeconds + 1 : null,\n max: this.absoluteTimeoutSeconds ? this.absoluteTimeoutSeconds - 1 : null\n };\n }\n\n get sessionConfiguration(): ISessionConfiguration {\n return this.authConfiguration.loginOptions.find(isOauthInternal).sessionConfiguration;\n }\n\n set sessionConfiguration(value: ISessionConfiguration) {\n this.authConfiguration.loginOptions.find(isOauthInternal).sessionConfiguration = value;\n }\n\n private convertToMillis(seconds: number): number {\n return isFinite(seconds) ? seconds * 1000 : null;\n }\n\n private convertToSeconds(milliseconds: number): number {\n return isFinite(milliseconds) ? Math.ceil(milliseconds / 1000) : null;\n }\n}\n","<div\n class=\"card-block separator-top overflow-auto\"\n *ngIf=\"authConfiguration.preferredLoginOptionType === tenantLoginOptionTypeEnum.OAUTH2_INTERNAL\"\n>\n <div class=\"col-sm-2\">\n <div class=\"h4 text-normal text-right text-left-xs\">\n {{ 'OAI-Secure session configuration' | translate }}\n </div>\n </div>\n\n <div class=\"col-sm-9\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"c8y-switch\" title=\"{{ 'Use session configuration' | translate }}\">\n <input\n type=\"checkbox\"\n name=\"useSessionConfiguration\"\n [(ngModel)]=\"useSessionConfiguration\"\n />\n <span></span>\n <span>{{ 'Use session configuration' | translate }}</span>\n </label>\n </c8y-form-group>\n </div>\n </div>\n\n <fieldset *ngIf=\"sessionConfiguration\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"c8y-switch\" title=\"{{ 'User agent validation required' | translate }}\">\n <input\n type=\"checkbox\"\n name=\"userAgentValidationRequired\"\n [(ngModel)]=\"userAgentValidationRequired\"\n />\n <span></span>\n <span>{{ 'User agent validation required' | translate }}</span>\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ USER_AGENT_VALIDATION_REQUIRED_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label title=\"{{ 'Session absolute timeout' | translate }}\">\n {{ 'Session absolute timeout' | translate }}\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n name=\"absoluteTimeoutSeconds\"\n class=\"form-control text-right\"\n [(ngModel)]=\"absoluteTimeoutSeconds\"\n [required]=\"useSessionConfiguration\"\n [min]=\"absoluteTimeoutConstraints.min\"\n step=\"1\"\n />\n <span class=\"input-group-addon\" translate>seconds</span>\n </div>\n <c8y-messages>\n <c8y-message\n name=\"min\"\n text=\"{{ ABSOLUTE_TIMEOUT_VALIDATION_MESSAGE | translate }}\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label title=\"{{ 'Session renewal timeout' | translate }}\">\n {{ 'Session renewal timeout' | translate }}\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n name=\"renewalTimeoutSeconds\"\n class=\"form-control text-right\"\n [(ngModel)]=\"renewalTimeoutSeconds\"\n [required]=\"useSessionConfiguration\"\n [max]=\"renewalTimeoutConstraints.max\"\n [min]=\"renewalTimeoutConstraints.min\"\n step=\"1\"\n />\n <span class=\"input-group-addon\" translate>seconds</span>\n </div>\n <c8y-messages>\n <c8y-message\n name=\"max\"\n text=\"{{ RENEWAL_TIMEOUT_VALIDATION_MESSAGE | translate }}\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label title=\"{{ 'Maximum parallel sessions per user' | translate }}\">\n {{ 'Maximum parallel sessions per user' | translate }}\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n name=\"maximumNumberOfParallelSessions\"\n class=\"form-control text-right\"\n [(ngModel)]=\"maximumNumberOfParallelSessions\"\n [required]=\"useSessionConfiguration\"\n [min]=\"1\"\n step=\"1\"\n />\n <span class=\"input-group-addon\" translate>sessions</span>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label title=\"{{ 'Token lifespan' | translate }}\">\n {{ 'Token lifespan' | translate }}\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n name=\"basicTokenLifespan\"\n class=\"form-control text-right\"\n [(ngModel)]=\"basicTokenLifespan\"\n [required]=\"useSessionConfiguration\"\n [max]=\"basicTokenLifespanConstraints.max\"\n [min]=\"basicTokenLifespanConstraints.min\"\n step=\"1\"\n />\n <span class=\"input-group-addon\" translate>seconds</span>\n </div>\n <c8y-messages>\n <c8y-message\n name=\"max\"\n text=\"{{ MAX_TOKEN_LIFESPAN_VALIDATION_MESSAGE | translate }}\"\n ></c8y-message>\n <c8y-message\n name=\"min\"\n text=\"{{ MIN_TOKEN_LIFESPAN_VALIDATION_MESSAGE | translate }}\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n </div>\n</div>\n","import { Component, Input, SimpleChanges } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { AuthConfiguration } from './auth-configuration.model';\nimport { TenantUiService } from '@c8y/ngx-components';\nimport { TenantLoginOptionType } from '@c8y/client';\n\n@Component({\n selector: 'c8y-login-settings',\n templateUrl: './login-settings.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class LoginSettingsComponent {\n PREFERRED_LOGIN_MODE_POPOVER = gettext(\n 'Main difference is the storage of the authentication information. With Basic Auth, it is saved in a session storage and with OAI-Secure in a HttpOnly cookie. OAI-Secure grant is recommended as the authentication information is not accessible via JavaScript. Single sign-on redirect allows a user to login with a single 3rd-party authorization server using the OAuth2 protocol.'\n );\n ENFORCED_BY_PLATFORM_POPOVER = gettext('The setting is enforced on the platform level.');\n\n @Input()\n authConfiguration: AuthConfiguration;\n\n isOauth2: boolean;\n tenantLoginOptionTypeEnum = TenantLoginOptionType;\n\n private PASSWORD_CATEGORY = 'password';\n private LIMIT_VALIDITY_KEY = 'limit.validity';\n private TENANT_STRENGTH_VALIDITY_KEY = 'strength.validity';\n private SYSTEM_STRENGTH_VALIDITY_KEY = 'enforce.strength';\n\n constructor(private tenantUiService: TenantUiService) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.authConfiguration && changes.authConfiguration.currentValue) {\n this.isOauth2 = !!changes.authConfiguration.currentValue.loginOptions.find(\n this.tenantUiService.isOauth2\n );\n }\n }\n\n get systemPasswordLimitValidity() {\n return this.authConfiguration.systemOptions[this.PASSWORD_CATEGORY][this.LIMIT_VALIDITY_KEY];\n }\n\n get passwordLimitValidity() {\n return this.systemPasswordLimitValidity !== null\n ? this.systemPasswordLimitValidity\n : this.authConfiguration.tenantOptions[this.PASSWORD_CATEGORY][this.LIMIT_VALIDITY_KEY];\n }\n\n set passwordLimitValidity(value) {\n if (this.systemPasswordLimitValidity === null) {\n this.authConfiguration.tenantOptions[this.PASSWORD_CATEGORY][this.LIMIT_VALIDITY_KEY] = value;\n }\n }\n\n get systemPasswordEnforceStrength() {\n return this.authConfiguration.systemOptions[this.PASSWORD_CATEGORY][\n this.SYSTEM_STRENGTH_VALIDITY_KEY\n ];\n }\n\n get passwordEnforceStrength() {\n return this.systemPasswordEnforceStrength\n ? this.systemPasswordEnforceStrength\n : this.authConfiguration.tenantOptions[this.PASSWORD_CATEGORY][\n this.TENANT_STRENGTH_VALIDITY_KEY\n ];\n }\n\n set passwordEnforceStrength(value) {\n if (!this.systemPasswordEnforceStrength) {\n this.authConfiguration.tenantOptions[this.PASSWORD_CATEGORY][\n this.TENANT_STRENGTH_VALIDITY_KEY\n ] = value;\n }\n }\n}\n","<div class=\"card-block separator-top overflow-auto\" *ngIf=\"authConfiguration\">\n <div class=\"col-sm-2\">\n <div class=\"h4 text-normal text-right text-left-xs\">{{ 'Login settings' | translate }}</div>\n </div>\n\n <div class=\"col-sm-9\">\n <div class=\"row m-b-8\">\n <c8y-form-group class=\"col-sm-6\">\n <label>\n {{ 'Preferred login mode' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ PREFERRED_LOGIN_MODE_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n [attr.aria-label]=\"'Auth type' | translate\"\n class=\"form-control\"\n id=\"preferredLoginOptionType\"\n name=\"preferredLoginOptionType\"\n [(ngModel)]=\"authConfiguration.preferredLoginOptionType\"\n >\n <option value=\"{{ tenantLoginOptionTypeEnum.BASIC }}\" translate>Basic Auth</option>\n <option value=\"{{ tenantLoginOptionTypeEnum.OAUTH2_INTERNAL }}\" translate>\n OAI-Secure\n </option>\n <option value=\"{{ tenantLoginOptionTypeEnum.OAUTH2 }}\" [disabled]=\"!isOauth2\" translate>\n Single sign-on redirect\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label title=\"{{ 'Password validity limit' | translate }}\">\n {{ 'Password validity limit' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ ENFORCED_BY_PLATFORM_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n *ngIf=\"systemPasswordLimitValidity\"\n ></button>\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n name=\"passwordLimitValidity\"\n class=\"form-control text-right\"\n [(ngModel)]=\"passwordLimitValidity\"\n min=\"0\"\n max=\"999999\"\n step=\"1\"\n required\n [disabled]=\"systemPasswordLimitValidity\"\n />\n <span class=\"input-group-addon\" translate>days</span>\n </div>\n <p class=\"help-block\">\n {{ 'Default: 0 (unlimited validity)' | translate }}\n </p>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label title=\"{{ 'Password strength' | translate }}\">\n {{ 'Password strength' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ ENFORCED_BY_PLATFORM_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n *ngIf=\"systemPasswordEnforceStrength\"\n ></button>\n </label>\n <div>\n <label\n title=\"{{ 'Enforce that all passwords are strong (green)' | translate }}\"\n class=\"c8y-switch\"\n >\n <input\n type=\"checkbox\"\n name=\"passwordEnforceStrength\"\n [(ngModel)]=\"passwordEnforceStrength\"\n [disabled]=\"systemPasswordEnforceStrength\"\n />\n <span></span>\n <span>{{ 'Enforce strong passwords (green)' | translate }}</span>\n </label>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n</div>\n","// tslint:disable:no-string-literal\nimport { Component, Input, SimpleChanges } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components';\nimport { isEmpty } from 'lodash-es';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { TfaStrategy, TenantLoginOptionType } from '@c8y/client';\nimport { AuthConfiguration } from './auth-configuration.model';\n\nenum TfaStateEnum {\n TFA_UNDEFINED_BY_SYSTEM,\n TFA_ENFORCED_FOR_GROUP,\n TFA_ENABLED_BY_SYSTEM,\n TFA_ENFORCED_BY_SYSTEM\n}\n\n@Component({\n selector: 'c8y-auth-tfa',\n templateUrl: './tfa-settings.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class TfaSettingsComponent {\n @Input()\n authConfiguration: AuthConfiguration;\n\n preferredLoginOptionType: TenantLoginOptionType = TenantLoginOptionType.BASIC;\n\n smsGatewayAvailable: boolean;\n\n tfaStateEnum = TfaStateEnum;\n tfaStrategyEnum = TfaStrategy;\n tenantLoginOptionTypeEnum = TenantLoginOptionType;\n\n TOTP_REQUIRES_OAUTH_POPOVER = gettext('TOTP requires OAI-Secure login mode.');\n SMS_APP_NOT_SUBSCRIBED_POPOVER = gettext(\n 'SMS strategy requires messaging application to be subscribed.'\n );\n\n TFA_IS_ENFORCED_BY_SYSTEM_POPOVER = gettext('The setting is enforced on the platform level.');\n TFA_IS_ENABLED_BY_SYSTEM_POPOVER = gettext('The setting is enabled on the platform level.');\n TOKEN_VALIDITY_DETERMINED_BY_JWT_POPOVER = gettext(\n \"In OAI-Secure login mode, the token's validity limit is determined by the JWT token and cannot be edited here.\"\n );\n TFA_IS_ENABLED_BY_ENFORCE_FOR_GROUP_POPOVER = gettext(\n 'The setting is enabled on the platform level because it is enforced for particular roles.'\n );\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.authConfiguration && changes.authConfiguration.currentValue) {\n this.smsGatewayAvailable = changes.authConfiguration.currentValue.smsGatewayAvailable;\n this.preferredLoginOptionType =\n changes.authConfiguration.currentValue.preferredLoginOptionType;\n }\n }\n\n ngDoCheck() {\n if (this.preferredLoginOptionType !== this.authConfiguration.preferredLoginOptionType) {\n this.preferredLoginOptionType = this.authConfiguration.preferredLoginOptionType;\n this.tenantTfaStrategy = this.tfaBySmsCanBeSet ? TfaStrategy.SMS : TfaStrategy.TOTP;\n }\n }\n\n get tenantTfaTokenValidity() {\n return this.authConfiguration.tenantOptions['two-factor-authentication']['token.validity'];\n }\n\n set tenantTfaTokenValidity(value) {\n this.authConfiguration.tenantOptions['two-factor-authentication']['token.validity'] = value;\n }\n\n get tenantTfaPinValidity() {\n return this.authConfiguration.tenantOptions['two-factor-authentication']['pin.validity'];\n }\n\n set tenantTfaPinValidity(value) {\n this.authConfiguration.tenantOptions['two-factor-authentication']['pin.validity'] = value;\n }\n\n get tenantTfaEnabled() {\n return this.authConfiguration.tenantOptions['two-factor-authentication']['enabled'];\n }\n\n set tenantTfaEnabled(value) {\n this.authConfiguration.tenantOptions['two-factor-authentication']['enabled'] = value;\n }\n\n get tenantTfaEnforced() {\n return this.authConfiguration.tenantOptions['two-factor-authentication']['enforced'];\n }\n\n set tenantTfaEnforced(value) {\n this.authConfiguration.tenantOptions['two-factor-authentication']['enforced'] = value;\n }\n\n get tenantTfaStrategy() {\n return this.authConfiguration.tenantOptions['two-factor-authentication']['strategy'];\n }\n\n set tenantTfaStrategy(value) {\n this.authConfiguration.tenantOptions['two-factor-authentication']['strategy'] = value;\n }\n\n get systemTfaEnforcedGroup() {\n return this.authConfiguration.systemOptions['two-factor-authentication']['enforced.group'];\n }\n\n get systemTfaTenantScopeSettingEnabled() {\n return this.authConfiguration.systemOptions['two-factor-authentication'][\n 'tenant-scope-settings.enabled'\n ];\n }\n\n get systemTfaEnabled() {\n return this.authConfiguration.systemOptions['two-factor-authentication']['enabled'];\n }\n\n get systemTfaEnforced() {\n return this.authConfiguration.systemOptions['two-factor-authentication']['enforced'];\n }\n\n get tfaState() {\n if (this.systemTfaEnforced) {\n return this.tfaStateEnum.TFA_ENFORCED_BY_SYSTEM;\n }\n if (!isEmpty(this.systemTfaEnforcedGroup)) {\n return this.tfaStateEnum.TFA_ENFORCED_FOR_GROUP;\n }\n if (this.systemTfaEnabled) {\n return this.tfaStateEnum.TFA_ENABLED_BY_SYSTEM;\n }\n return this.tfaStateEnum.TFA_UNDEFINED_BY_SYSTEM;\n }\n\n get tfaBySmsCanBeSet() {\n return (\n (this.tfaState !== this.tfaStateEnum.TFA_UNDEFINED_BY_SYSTEM || this.tenantTfaEnabled) &&\n this.smsGatewayAvailable\n );\n }\n\n get tfaByTotpCanBeSet() {\n return (\n (this.tfaState !== this.tfaStateEnum.TFA_UNDEFINED_BY_SYSTEM || this.tenantTfaEnabled) &&\n this.preferredLoginOptionType === TenantLoginOptionType.OAUTH2_INTERNAL\n );\n }\n}\n","<div\n class=\"card-block separator-top\"\n *ngIf=\"preferredLoginOptionType !== tenantLoginOptionTypeEnum.OAUTH2\"\n>\n <div class=\"col-sm-2\">\n <div class=\"h4 text-normal text-right text-left-xs\">\n {{ 'Two-factor authentication' | translate }}\n </div>\n </div>\n\n <div class=\"col-sm-9\">\n <c8y-form-group>\n <label\n class=\"c8y-switch\"\n title=\"{{ 'Enable two-factor authentication' | translate }}\"\n *ngIf=\"\n tfaState === tfaStateEnum.TFA_UNDEFINED_BY_SYSTEM;\n else enabledOrEnforcedOnSystemLevelTemplate\n \"\n >\n <input type=\"checkbox\" [(ngModel)]=\"tenantTfaEnabled\" name=\"tenantTfaEnabled\" />\n <span></span>\n <span>{{ 'Enable' | translate }}</span>\n </label>\n\n <ng-template #enabledOrEnforcedOnSystemLevelTemplate>\n <div [ngSwitch]=\"tfaState\">\n <span *ngSwitchCase=\"tfaStateEnum.TFA_ENABLED_BY_SYSTEM\">\n {{ 'Two-factor authentication is enabled on all users' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TFA_IS_ENABLED_BY_SYSTEM_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n ></button>\n </span>\n <div *ngSwitchCase=\"tfaStateEnum.TFA_ENFORCED_BY_SYSTEM\">\n <span>\n {{ 'Two-factor authentication is enforced on all users' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TFA_IS_ENFORCED_BY_SYSTEM_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n ></button>\n </span>\n </div>\n <div *ngSwitchCase=\"tfaStateEnum.TFA_ENFORCED_FOR_GROUP\">\n <span>\n <span translate [translateParams]=\"{ role: systemTfaEnforcedGroup }\" ngNonBindable>\n Two-factor authentication is enabled on all users and enforced on users with role\n {{ role }}.\n </span>\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TFA_IS_ENABLED_BY_ENFORCE_FOR_GROUP_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n ></button>\n </span>\n </div>\n </div>\n </ng-template>\n </c8y-form-group>\n\n <fieldset *ngIf=\"tfaBySmsCanBeSet || tfaByTotpCanBeSet\">\n <div class=\"row\">\n <c8y-form-group class=\"col-sm-6\">\n <label title=\"{{ 'TFA strategy' | translate }}\">\n {{ 'TFA strategy' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ SMS_APP_NOT_SUBSCRIBED_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n *ngIf=\"!tfaBySmsCanBeSet\"\n ></button>\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TOTP_REQUIRES_OAUTH_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n *ngIf=\"!tfaByTotpCanBeSet\"\n ></button>\n </label>\n\n <div class=\"c8y-select-wrapper\">\n <select\n [attr.aria-label]=\"'TFA' | translate\"\n class=\"form-control\"\n [(ngModel)]=\"tenantTfaStrategy\"\n name=\"tenantTfaStrategy\"\n >\n <option value=\"{{ tfaStrategyEnum.SMS }}\" translate [disabled]=\"!tfaBySmsCanBeSet\">\n SMS based\n </option>\n <option value=\"{{ tfaStrategyEnum.TOTP }}\" translate [disabled]=\"!tfaByTotpCanBeSet\">\n TOTP\n </option>\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n </div>\n\n <div\n class=\"row\"\n *ngIf=\"\n tenantTfaStrategy === tfaStrategyEnum.TOTP &&\n tfaState !== tfaStateEnum.TFA_ENFORCED_BY_SYSTEM\n \"\n >\n <label title=\"{{ 'Enforcement' | translate }}\">{{ 'Enforcement' | translate }}</label>\n <div class=\"form-control-static\">\n <label\n title=\"{{ 'Enforce two-factor authentication on all users' | translate }}\"\n class=\"c8y-switch\"\n >\n <input type=\"checkbox\" name=\"tenantTfaEnforced\" [(ngModel)]=\"tenantTfaEnforced\" />\n <span></span>\n <span>{{ 'Enforce two-factor authentication on all users' | translate }}</span>\n </label>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"tenantTfaStrategy === tfaStrategyEnum.SMS\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label title=\"{{ 'Token validity limit' | translate }}\">\n {{ 'Token validity limit' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TFA_IS_ENFORCED_BY_SYSTEM_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n *ngIf=\"!systemTfaTenantScopeSettingEnabled\"\n ></button>\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TOKEN_VALIDITY_DETERMINED_BY_JWT_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n *ngIf=\"\n systemTfaTenantScopeSettingEnabled &&\n preferredLoginOptionType === tenantLoginOptionTypeEnum.OAUTH2_INTERNAL\n \"\n ></button>\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n class=\"form-control text-right\"\n name=\"tenantTfaTokenValidity\"\n [(ngModel)]=\"tenantTfaTokenValidity\"\n [disabled]=\"\n !systemTfaTenantScopeSettingEnabled ||\n preferredLoginOptionType === tenantLoginOptionTypeEnum.OAUTH2_INTERNAL\n \"\n [required]=\"systemTfaTenantScopeSettingEnabled\"\n [max]=\"999999\"\n [min]=\"0\"\n />\n <span class=\"input-group-addon\" translate>minutes</span>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label title=\"{{ 'Verification code validity limit' | translate }}\">\n {{ 'Verification code validity limit' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TFA_IS_ENFORCED_BY_SYSTEM_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n *ngIf=\"!systemTfaTenantScopeSettingEnabled\"\n ></button>\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n class=\"form-control text-right\"\n name=\"tenantTfaPinValidity\"\n [(ngModel)]=\"tenantTfaPinValidity\"\n [disabled]=\"!systemTfaTenantScopeSettingEnabled\"\n [required]=\"systemTfaTenantScopeSettingEnabled\"\n [max]=\"999999\"\n [min]=\"0\"\n />\n <span class=\"input-group-addon\" translate>minutes</span>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n <div\n *ngIf=\"\n preferredLoginOptionType !== tenantLoginOptionTypeEnum.OAUTH2_INTERNAL &&\n !smsGatewayAvailable\n \"\n >\n <div class=\"alert alert-warning\">\n <strong>{{ 'None of TFA strategy can be set.' | translate }}</strong>\n <br />\n {{ SMS_APP_NOT_SUBSCRIBED_POPOVER | translate }}\n <br />\n {{ TOTP_REQUIRES_OAUTH_POPOVER | translate }}\n </div>\n </div>\n </div>\n</div>\n","import { Component, OnInit, EventEmitter } from '@angular/core';\nimport { AuthConfigurationService } from './auth-configuration.service';\nimport { AlertService, LoginService, ModalService } from '@c8y/ngx-components';\nimport { TenantLoginOptionsService } from '@c8y/client';\nimport { cloneDeep } from 'lodash-es';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { tap, switchMap, shareReplay } from 'rxjs/operators';\nimport { AuthConfiguration } from './auth-configuration.model';\n\n@Component({\n selector: 'c8y-auth-configuration',\n templateUrl: './auth-configuration.component.html'\n})\nexport class AuthConfigurationComponent implements OnInit {\n reloading$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n reload: EventEmitter<void> = new EventEmitter();\n authConfiguration: AuthConfiguration;\n\n private authConfiguration$: Observable<AuthConfiguration> = this.reload.pipe(\n tap(() => this.reloading$.next(true)),\n switchMap(() => this.authConfigurationService.getAuthConfiguration$()),\n tap(() => this.reloading$.next(false)),\n shareReplay(1)\n );\n private previousAuthConfiguration: AuthConfiguration;\n private authConfigurationSubscription: Subscription;\n\n constructor(\n private authConfigurationService: AuthConfigurationService,\n private tenantLoginOptionsService: TenantLoginOptionsService,\n private modalService: ModalService,\n private loginService: LoginService,\n private alertService: AlertService\n ) {}\n\n ngOnInit() {\n this.authConfigurationSubscription = this.authConfiguration$.subscribe(\n (authConfiguration: AuthConfiguration) => {\n this.authConfiguration = authConfiguration;\n this.previousAuthConfiguration = cloneDeep(this.authConfiguration);\n }\n );\n this.loadAuthConfig();\n }\n\n loadAuthConfig() {\n this.reload.next();\n }\n\n ngOnDestroy(): void {\n this.authConfigurationSubscription.unsubscribe();\n }\n\n async save() {\n try {\n await this.modalService.confirmLogout();\n await this.authConfigurationService.save(\n this.authConfiguration,\n this.previousAuthConfiguration\n );\n await this.loginService.logout(true);\n } catch (ex) {\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n}\n","<c8y-title>{{ 'Authentication' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [label]=\"'Settings' | translate\"\n [icon]=\"'cog'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'cog'\"\n [label]=\"'Authentication' | translate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button title=\"{{ 'Reload' | translate }}\" class=\"btn btn-link\" (click)=\"loadAuthConfig()\">\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading$ | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/administration/#authentication\"></c8y-help>\n\n<form class=\"card card--fullpage\" #authConfigurationForm=\"ngForm\" novalidate>\n <div class=\"card-header separator\">\n <div class=\"card-title\">\n {{ 'Authentication' | translate }}\n </div>\n </div>\n <div class=\"inner-scroll\" *ngIf=\"authConfiguration\">\n <c8y-login-settings [authConfiguration]=\"authConfiguration\"></c8y-login-settings>\n <c8y-basic-auth-settings [authConfiguration]=\"authConfiguration\"></c8y-basic-auth-settings>\n <c8y-session-configuration [authConfiguration]=\"authConfiguration\"></c8y-session-configuration>\n <c8y-auth-tfa [authConfiguration]=\"authConfiguration\"></c8y-auth-tfa>\n </div>\n <div class=\"card-footer separator\">\n <button\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"!authConfigurationForm.form.valid || authConfigurationForm.form.pristine\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n","import { NgModule } from '@angular/core';\nimport { CoreModule, hookRoute } from '@c8y/ngx-components';\nimport { BasicAuthSettingsComponent } from './basic-auth-settings.component';\nimport { AuthConfigurationGuard } from '../auth-configuration.guard';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { AuthConfigurationService } from './auth-configuration.service';\nimport { AuthConfigurationComponent } from './auth-configuration.component';\nimport { TfaSettingsComponent } from './tfa-settings.component';\nimport { SessionConfigurationComponent } from './session-configuration.component';\nimport { LoginSettingsComponent } from './login-settings.component';\nimport { TenantLoginOptionMapper } from './tenant-login-option.mapper';\n\n@NgModule({\n declarations: [\n SessionConfigurationComponent,\n LoginSettingsComponent,\n BasicAuthSettingsComponent,\n AuthConfigurationComponent,\n TfaSettingsComponent\n ],\n exports: [],\n imports: [CoreModule, PopoverModule],\n providers: [\n AuthConfigurationService,\n TenantLoginOptionMapper,\n hookRoute({\n path: 'auth-configuration/basic_settings',\n component: AuthConfigurationComponent,\n canActivate: [AuthConfigurationGuard]\n })\n ]\n})\nexport class BasicSettingsModule {}\n","import { ITenantLoginOption } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components';\n\nexport enum TemplateType {\n CUSTOM = 'CUSTOM',\n AZURE = 'AZURE',\n KEYCLOAK = 'KEYCLOAK'\n}\n\nexport const templateTypeConfig = {\n [TemplateType.CUSTOM]: {\n name: 'CUSTOM',\n value: 'CUSTOM',\n label: gettext('Custom')\n },\n [TemplateType.AZURE]: {\n name: 'AZURE',\n value: 'AZURE',\n label: gettext('Azure AD')\n },\n [TemplateType.KEYCLOAK]: {\n name: 'KEYCLOAK',\n value: 'KEYCLOAK',\n label: gettext('Keycloak')\n }\n};\n\nexport enum ValidationMethod {\n USERINFO = 'USERINFO',\n INTROSPECTION = 'INTROSPECTION'\n}\n\nexport interface AccessTokenToUserDataMappings {\n firstNameClaimName?: string;\n lastNameClaimName?: string;\n emailClaimName?: string;\n phoneNumberClaimName?: string;\n}\n\nexport interface RequestParams {\n [key: string]: string;\n}\n\nexport interface Headers {\n [key: string]: string;\n}\n\nexport interface OnNewUser {\n dynamicMapping: DynamicMapping;\n}\n\nexport interface Configuration {\n mapRolesOnlyForNewUser: boolean;\n manageRolesOnlyFromAccessMapping: boolean;\n}\n\nexport interface ChildPredicate {\n operator: 'EQ' | 'NEQ' | 'GT' | 'LT' | 'GTE' | 'LTE' | 'IN';\n parameterPath: string;\n value: string;\n}\n\nexport interface WhenItemsAreMapped {\n childPredicates: ChildPredicate[];\n operator: 'AND';\n}\n\nexport interface AccessMapping {\n thenApplications: number[];\n thenGroups: number[];\n when: WhenItemsAreMapped;\n}\n\nexport interface DynamicMapping {\n configuration?: Configuration;\n mappings: AccessMapping[];\n inventoryMappings: InventoryMapping[];\n}\n\nexport interface InventoryMapping {\n when: WhenItemsAreMapped;\n thenInventoryRoles: InventoryRole[];\n}\n\nexport interface InventoryRole {\n roleIds: number[];\n managedObject: string;\n}\n\nexport interface MapRolesOnlyForNewUser {\n configuration: Configuration;\n}\n\nexport interface CustomSignatureVerificationConfig {\n certIdFromField: boolean;\n certIdField?: string;\n certificates?: {\n [certIdValue: string]: Certificate;\n };\n}\n\nexport interface Certificate {\n alg: 'PCKS' | 'RSA';\n publicKey: string;\n validFrom?: Date;\n validTill?: Date;\n}\n\nexport interface AadSignatureVerificationConfig {\n publicKeyDiscoveryUrl: string;\n}\n\nexport interface JwksSignatureVerificationConfig {\n jwksUri: string;\n}\n\nexport interface AdfsSignatureVerificationConfig {\n manifestUrl: string;\n}\n\nexport interface SignatureVerificationConfig {\n manual?: CustomSignatureVerificationConfig;\n aad?: AadSignatureVerificationConfig;\n jwks?: JwksSignatureVerificationConfig;\n adfsManifest?: AdfsSignatureVerificationConfig;\n template?: string;\n}\n\nexport interface Request {\n body?: string;\n headers: Headers;\n method: string;\n operation: string;\n requestParams: RequestParams;\n url?: string;\n}\n\nexport interface UserIdConfig {\n jwtField?: string;\n constantValue?: string;\n useConstantValue: boolean;\n}\n\nexport interface ExternalTokenConfig {\n enabled: boolean;\n userOrAppIdConfig?: UserIdConfig;\n validationMethod?: ValidationMethod;\n validationRequired?: boolean;\n tokenValidationRequest?: Request;\n accessTokenValidityCheckIntervalInMinutes?: number;\n}\n\nexport interface SsoConfiguration extends ITenantLoginOption {\n accessTokenToUserDataMappings: AccessTokenToUserDataMappings;\n audience: string;\n authorizationRequest: Request;\n buttonName: string;\n clientId: string;\n id?: string;\n issuer: string;\n logoutRequest: Request;\n onNewUser: OnNewUser;\n providerName: string;\n redirectToPlatform: string;\n refreshRequest: Request;\n self?: string;\n signatureVerificationConfig: SignatureVerificationConfig;\n template: TemplateType;\n tokenRequest: Request;\n userIdConfig: UserIdConfig;\n visibleOnLoginPage: boolean;\n externalTokenConfig?: ExternalTokenConfig;\n}\n","import { Injectable } from '@angular/core';\nimport {\n GrantType,\n ITenantLoginOption,\n TenantLoginOptionsService,\n TenantLoginOptionType,\n UserManagementSource\n} from '@c8y/client';\nimport { SsoConfiguration, TemplateType } from './sso-configuration.model';\nimport { defer, Observable, of, throwError } from 'rxjs';\nimport { catchError, map, publishReplay, refCount, take } from 'rxjs/operators';\nimport { HttpStatusCode } from '@angular/common/http';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SsoConfigurationService {\n private ssoConfiguration$: Observable<ITenantLoginOption> = defer(() =>\n this.loginOptionsService.detail(TenantLoginOptionType.OAUTH2)\n ).pipe(\n map(res => res.data),\n catchError(({ res }) => {\n if (res.status === HttpStatusCode.Forbidden) return throwError(new Error());\n else return of(this.defaultConfiguration);\n }),\n publishReplay(1, 1000),\n refCount(),\n take(1)\n );\n\n private defaultConfiguration: SsoConfiguration = {\n authorizationRequest: {\n body: '',\n headers: {},\n method: 'GET',\n operation: 'REDIRECT',\n requestParams: {\n response_type: 'code',\n client_id: '${clientId}',\n redirect_uri: '${redirectUri}',\n scope: ''\n }\n },\n tokenRequest: {\n body: 'grant_type=authorization_code&code=${code}&redirect_uri=${redirectUri}&client_id=${clientId}',\n headers: {},\n method: 'POST',\n operation: 'EXECUTE',\n requestParams: {\n response_type: 'code',\n client_id: '${clientId}',\n redirect_uri: '${redirectUri}',\n scope: ''\n }\n },\n refreshRequest: {\n body: 'grant_type=refresh_token&refresh_token=${refreshToken}&client_id=${clientId}',\n headers: {\n Authorization: ''\n },\n method: 'POST',\n operation: 'EXECUTE',\n requestParams: {\n response_type: 'refresh',\n client_id: '${clientId}'\n }\n },\n logoutRequest: {\n headers: {},\n method: 'POST',\n operation: 'REDIRECT',\n requestParams: {}\n },\n type: TenantLoginOptionType.OAUTH2,\n grantType: GrantType.AUTHORIZATION_CODE,\n userManagementSource: UserManagementSource.REMOTE,\n onNewUser: {\n dynamicMapping: {\n mappings: [],\n inventoryMappings: [],\n configuration: {\n mapRolesOnlyForNewUser: false,\n manageRolesOnlyFromAccessMapping: false\n }\n }\n },\n userIdConfig: {\n jwtField: '',\n useConstantValue: true\n },\n signatureVerificationConfig: {\n manual: {\n certIdFromField: false\n }\n },\n template: TemplateType.CUSTOM,\n clientId: '',\n audience: '',\n issuer: '',\n buttonName: '',\n redirectToPlatform: '',\n providerName: '',\n visibleOnLoginPage: true,\n accessTokenToUserDataMappings: {},\n externalTokenConfig: {\n enabled: false\n }\n };\n\n constructor(private loginOptionsService: TenantLoginOptionsService) {}\n\n getSsoConfiguration$(): Observable<ITenantLoginOption> {\n return this.ssoConfiguration$;\n }\n\n save(ssoConfiguration: SsoConfiguration) {\n return this.loginOptionsService.save(ssoConfiguration);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { SsoConfiguration } from '../sso-configuration.model';\n\n@Injectable({ providedIn: 'root' })\nexport abstract class SsoConfigurationMapper<T> {\n abstract mapTo: (ssoConfiguration: SsoConfiguration) => T;\n abstract mapFrom: (templateModel: T) => SsoConfiguration;\n}\n","import { Input, Output, EventEmitter, Component, SimpleChanges } from '@angular/core';\nimport { SsoConfigurationMapper } from './sso-configuration.mapper';\nimport { SsoConfiguration } from '../sso-configuration.model';\nimport { Observable, Subscription } from 'rxjs';\nimport { IApplication, IIdentified, IUserGroup } from '@c8y/client';\n\n@Component({\n template: ''\n})\nexport abstract class TemplateComponent<T> {\n templateModel: T;\n @Input() apps: IApplication[];\n @Input() groups: IUserGroup[];\n @Input() inventoryRoles: IIdentified[];\n @Input() ssoConfiguration: SsoConfiguration;\n @Input() ssoConfigurationChangeTrigger: Observable<void>;\n @Output() ssoConfigurationChange = new EventEmitter<SsoConfiguration>();\n\n triggerSubscription: Subscription;\n\n protected constructor(protected configurationMapper: SsoConfigurationMapper<T>) {}\n\n ngOnInit() {\n this.triggerSubscription = this.ssoConfigurationChangeTrigger.subscribe(() => {\n this.emitSsoConfiguration();\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.ssoConfiguration && changes.ssoConfiguration.currentValue) {\n this.mapSsoConfiguration(changes.ssoConfiguration.currentValue);\n }\n }\n\n ngOnDestroy() {\n this.triggerSubscription.unsubscribe();\n }\n\n private mapSsoConfiguration(ssoConfiguration) {\n this.templateModel = this.configurationMapper.mapTo(ssoConfiguration) as T;\n }\n\n private emitSsoConfiguration() {\n const ssoConfiguration = this.configurationMapper.mapFrom(this.templateModel);\n if (this.ssoConfiguration.id) {\n ssoConfiguration.id = this.ssoConfiguration.id;\n }\n this.ssoConfigurationChange.emit(ssoConfiguration);\n }\n}\n","import { RequestParams, Headers, Request } from '../sso-configuration.model';\nimport { map, pickBy, identity } from 'lodash-es';\n\nexport class RequestConfiguration {\n body?: string;\n headers: RequestConfigurationDynamicArray;\n method: string;\n operation: string;\n requestParams: RequestConfigurationDynamicArray;\n url?: string;\n\n constructor(requestConfiguration: Request) {\n this.headers = new RequestConfigurationDynamicArray(requestConfiguration.headers);\n this.method = requestConfiguration.method;\n this.operation = requestConfiguration.operation;\n this.requestParams = new RequestConfigurationDynamicArray(requestConfiguration.requestParams);\n this.body = requestConfiguration.body;\n this.url = requestConfiguration.url;\n }\n\n toRequest(): Request {\n return pickBy(\n {\n body: this.method === 'GET' ? '' : this.body,\n headers: this.headers.toObject(),\n method: this.method,\n operation: this.operation,\n requestParams: this.requestParams.toObject(),\n url: this.url\n },\n identity\n ) as Request;\n }\n}\n\n// tslint:disable-next-line:max-classes-per-file\nexport class RequestConfigurationDynamicArray extends Array {\n constructor(obj: RequestParams | Headers) {\n super();\n this.push(\n ...map(obj, (value, key) => ({\n key,\n value\n }))\n );\n }\n\n toObject(): { [key: string]: string } {\n return this.reduce((obj, element) => {\n obj[element.key] = element.value;\n return obj;\n }, {});\n }\n}\n","import {\n AadSignatureVerificationConfig,\n AdfsSignatureVerificationConfig,\n CustomSignatureVerificationConfig,\n JwksSignatureVerificationConfig,\n SignatureVerificationConfig\n} from '../sso-configuration.model';\nimport { pick, findKey, get, has, reduce, map, omit } from 'lodash-es';\nimport { gettext } from '@c8y/ngx-components';\n\nexport enum AlgorithmType {\n PCKS = 'PCKS',\n RSA = 'RSA'\n}\n\nexport const algorithmTypeConfig = {\n [AlgorithmType.PCKS]: {\n name: 'PCKS',\n value: 'PCKS',\n label: gettext('X.509 certificate (PEM format)')\n },\n [AlgorithmType.RSA]: {\n name: 'RSA',\n value: 'RSA',\n label: gettext('RSA public key (X.509 Subject Public Key Info)')\n }\n};\n\nexport enum CertificateType {\n CUSTOM = 'CUSTOM',\n AZURE = 'AZURE',\n ADFS = 'ADFS',\n JWKS = 'JWKS'\n}\n\nexport const certificateTypeConfig = {\n [CertificateType.CUSTOM]: {\n name: 'CUSTOM',\n label: gettext('Custom'),\n value: 'CUSTOM',\n signatureVerificationConfigFragment: 'manual',\n ordinal: 0\n },\n [CertificateType.AZURE]: {\n name: 'AZURE',\n label: 'Azure',\n value: 'AZURE',\n signatureVerificationConfigFragment: 'aad',\n ordinal: 1\n },\n [CertificateType.ADFS]: {\n name: 'ADFS',\n label: gettext('ADFS manifest'),\n value: 'ADFS',\n signatureVerificationConfigFragment: 'adfsManifest',\n ordinal: 2\n },\n [CertificateType.JWKS]: {\n name: 'JWKS',\n label: 'JWKS',\n value: 'JWKS',\n signatureVerificationConfigFragment: 'jwks',\n ordinal: 3\n }\n};\n\nexport interface CustomCertificate {\n alg: AlgorithmType;\n key: string;\n publicKey: string;\n validFrom?: Date;\n validTill?: Date;\n}\n\nexport class SignatureConfiguration {\n manual?: CustomSignatureVerification;\n aad?: AadSignatureVerificationConfig;\n jwks?: JwksSignatureVerificationConfig;\n adfsManifest?: AdfsSignatureVerificationConfig;\n certificateTypeChosen: CertificateType;\n\n constructor(signatureVerificationConfig: SignatureVerificationConfig) {\n this.manual = new CustomSignatureVerification(\n signatureVerificationConfig.manual || { certIdFromField: false }\n );\n this.aad = signatureVerificationConfig.aad || { publicKeyDiscoveryUrl: '' };\n this.jwks = signatureVerificationConfig.jwks || { jwksUri: '' };\n this.adfsManifest = signatureVerificationConfig.adfsManifest || { manifestUrl: '' };\n this.certificateTypeChosen = this.getCertificateType(signatureVerificationConfig);\n }\n\n toSignatureVerificationConfig(): SignatureVerificationConfig {\n const result = {\n manual: this.manual.toManual(),\n aad: this.aad,\n jwks: this.jwks,\n adfsManifest: this.adfsManifest\n };\n return pick(\n result,\n certificateTypeConfig[this.certificateTypeChosen].signatureVerificationConfigFragment\n );\n }\n\n getCertificateType(signatureVerificationConfig: SignatureVerificationConfig): CertificateType {\n const templateCertificateType = findKey(certificateTypeConfig, certificateType =>\n has(signatureVerificationConfig, certificateType.signatureVerificationConfigFragment)\n );\n return templateCertificateType || CertificateType.CUSTOM;\n }\n}\n\n// tslint:disable-next-line:max-classes-per-file\nclass CustomSignatureVerification {\n certIdFromField: boolean;\n certIdField: string;\n customCertificates: CustomCertificate[] = [];\n\n constructor(manual: CustomSignatureVerificationConfig) {\n this.certIdFromField = manual.certIdFromField;\n this.certIdField = manual.certIdField;\n this.customCertificates = this.getCustomCertificates(manual);\n }\n\n getCustomCertificates(manual: CustomSignatureVerificationConfig) {\n const certificates = get(manual, 'certificates', []);\n const customCertificates = map(certificates, (certificate, key) => ({\n ...certificate,\n key,\n validFrom: new Date(certificate.validFrom),\n validTill: new Date(certificate.validTill)\n }));\n if (customCertificates.length === 0) {\n const newCustomCertificate = { alg: 'RSA' };\n customCertificates.push(newCustomCertificate);\n }\n return customCertificates;\n }\n\n addCustomCertificate() {\n const newCustomCertificate = { alg: AlgorithmType.RSA, key: '', publicKey: '' };\n this.customCertificates.push(newCustomCertificate);\n }\n\n removeCustomCertificate(customCertificate: CustomCertificate) {\n const indexOfCustomCertificate = this.customCertificates.indexOf(customCertificate);\n this.customCertificates.splice(indexOfCustomCertificate, 1);\n }\n\n toManual(): CustomSignatureVerificationConfig {\n const manual: CustomSignatureVerificationConfig = this.getManualSignatureVerificationConfig();\n manual.certificates = this.getSignatureCertificates();\n return manual;\n }\n\n getSignatureCertificates() {\n if (this.customCertificates.length < 2) {\n this.customCertificates[0].key = 'default';\n }\n return reduce(\n this.customCertificates,\n (signatureCertificates, customCertificate) => ({\n ...signatureCertificates,\n [customCertificate.key]: {\n alg: customCertificate.alg,\n publicKey: customCertificate.publicKey,\n validFrom: customCertificate.validFrom,\n validTill: customCertificate.validTill\n }\n }),\n {}\n );\n }\n\n getManualSignatureVerificationConfig() {\n let manual = {\n certIdFromField: this.customCertificates.length > 1,\n certIdField: this.certIdField\n };\n if (!manual.certIdFromField) {\n manual = omit(manual, 'certIdField');\n }\n return manual;\n }\n}\n","import {\n ExternalTokenConfig,\n Request,\n UserIdConfig,\n ValidationMethod\n} from '../sso-configuration.model';\nimport { gettext } from '@c8y/ngx-components';\nimport { RequestConfiguration } from './request-configuration.model';\n\nexport const validationMethodConfig = {\n [ValidationMethod.INTROSPECTION]: {\n name: 'INTROSPECTION',\n value: 'INTROSPECTION',\n label: gettext('Introspection`Method of validating access token from external IAM system`'),\n defaults: {\n method: 'POST',\n body: 'token=${accessToken}&client_id=${clientId}&client_secret=',\n url: '',\n headers: {},\n operation: 'EXECUTE',\n requestParams: {}\n }\n },\n [ValidationMethod.USERINFO]: {\n name: 'USERINFO',\n value: 'USERINFO',\n label: gettext('User info`Method of validating access token from external IAM system`'),\n defaults: {\n url: '',\n method: 'GET',\n body: '',\n headers: { Authorization: 'Bearer ${accessToken}' },\n operation: 'EXECUTE',\n requestParams: {}\n }\n }\n};\n\nconst defaultTokenValidationRequest: Request = {\n body: 'token=${accessToken}&client_id=${clientId}&client_secret=',\n url: '',\n headers: {},\n method: 'POST',\n operation: 'EXECUTE',\n requestParams: {}\n};\n\nconst defaultUserIdConfig: UserIdConfig = {\n jwtField: '',\n useConstantValue: true\n};\n\nexport class ExternalToken {\n userOrAppIdConfig: UserIdConfig;\n validationMethod: ValidationMethod;\n validationRequired: boolean;\n enabled: boolean;\n tokenValidationRequest: RequestConfiguration;\n accessTokenValidityCheckIntervalInMinutes: number;\n\n constructor(externalTokenConfig: ExternalTokenConfig) {\n const _externalTokenConfig = Object.assign({ enabled: false }, externalTokenConfig);\n this.userOrAppIdConfig = _externalTokenConfig.userOrAppIdConfig || defaultUserIdConfig;\n this.validationMethod = _externalTokenConfig.validationMethod || ValidationMethod.INTROSPECTION;\n this.validationRequired = _externalTokenConfig.validationRequired;\n this.enabled = _externalTokenConfig.enabled;\n this.tokenValidationRequest = new RequestConfiguration(\n _externalTokenConfig.tokenValidationRequest || defaultTokenValidationRequest\n );\n this.accessTokenValidityCheckIntervalInMinutes =\n _externalTokenConfig.accessTokenValidityCheckIntervalInMinutes || 1;\n }\n\n toExternalTokenConfig(): ExternalTokenConfig {\n if (!this.enabled) {\n return { enabled: this.enabled };\n }\n const externalTokenConfig: ExternalTokenConfig = {\n userOrAppIdConfig: this.userOrAppIdConfig,\n validationRequired: this.validationRequired,\n enabled: this.enabled\n };\n if (this.validationRequired) {\n externalTokenConfig.validationMethod = this.validationMethod;\n externalTokenConfig.tokenValidationRequest = this.tokenValidationRequest.toRequest();\n externalTokenConfig.accessTokenValidityCheckIntervalInMinutes =\n this.accessTokenValidityCheckIntervalInMinutes;\n }\n return externalTokenConfig;\n }\n}\n","import { SsoConfiguration, TemplateType } from '../sso-configuration.model';\nimport { SsoConfigurationMapper } from './sso-configuration.mapper';\nimport { GrantType, TenantLoginOptionType } from '@c8y/client';\nimport { CustomSsoConfiguration } from './custom.model';\nimport { RequestConfiguration } from '../template-parts/request-configuration.model';\nimport {\n CertificateType,\n SignatureConfiguration\n} from '../template-parts/signature-configuration.model';\nimport { Injectable } from '@angular/core';\nimport { ExternalToken } from '../template-parts/external-token-config.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CustomConfigurationMapper implements SsoConfigurationMapper<CustomSsoConfiguration> {\n mapFrom(templateModel: CustomSsoConfiguration): SsoConfiguration {\n const ssoConfiguration: SsoConfiguration = {\n accessTokenToUserDataMappings: templateModel.accessTokenToUserDataMappings,\n audience: templateModel.audience,\n authorizationRequest: templateModel.authorizationRequest.toRequest(),\n buttonName: templateModel.buttonName,\n clientId: templateModel.clientId,\n issuer: templateModel.issuer,\n logoutRequest: templateModel.logoutRequest.toRequest(),\n onNewUser: templateModel.onNewUser,\n providerName: templateModel.providerName,\n redirectToPlatform: templateModel.redirectToPlatform,\n refreshRequest: templateModel.refreshRequest.toRequest(),\n signatureVerificationConfig:\n templateModel.signatureVerificationConfig.toSignatureVerificationConfig(),\n template: TemplateType.CUSTOM,\n tokenRequest: templateModel.tokenRequest.toRequest(),\n userIdConfig: templateModel.userIdConfig,\n userManagementSource: templateModel.userManagementSource,\n visibleOnLoginPage: templateModel.visibleOnLoginPage,\n type: TenantLoginOptionType.OAUTH2,\n grantType: GrantType.AUTHORIZATION_CODE,\n externalTokenConfig: templateModel.externalTokenConfig.toExternalTokenConfig()\n };\n return ssoConfiguration;\n }\n\n mapTo(ssoConfiguration: SsoConfiguration): CustomSsoConfiguration {\n return {\n accessTokenToUserDataMappings: ssoConfiguration.accessTokenToUserDataMappings,\n audience: ssoConfiguration.audience,\n authorizationRequest: new RequestConfiguration(ssoConfiguration.authorizationRequest),\n buttonName: ssoConfiguration.buttonName,\n clientId: ssoConfiguration.clientId,\n issuer: ssoConfiguration.issuer,\n logoutRequest: new RequestConfiguration(ssoConfiguration.logoutRequest),\n onNewUser: ssoConfiguration.onNewUser,\n providerName: ssoConfiguration.providerName,\n redirectToPlatform: ssoConfiguration.redirectToPlatform,\n refreshRequest: new RequestConfiguration(ssoConfiguration.refreshRequest),\n signatureVerificationConfig: new SignatureConfiguration(\n ssoConfiguration.signatureVerificationConfig\n ),\n template: TemplateType.CUSTOM,\n tokenRequest: new RequestConfiguration(ssoConfiguration.tokenRequest),\n userIdConfig: ssoConfiguration.userIdConfig,\n userManagementSource: ssoConfiguration.userManagementSource,\n visibleOnLoginPage: ssoConfiguration.visibleOnLoginPage,\n certificateType: CertificateType.CUSTOM,\n externalTokenConfig: new ExternalToken(ssoConfiguration.externalTokenConfig)\n };\n }\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { memoize } from '@c8y/ngx-components';\nimport { TenantService } from '@c8y/client';\nimport { defaults } from 'lodash-es';\n\n@Component({\n selector: 'c8y-basic-configuration',\n templateUrl: './basic-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class BasicConfigurationComponent implements OnInit {\n @Input() templateModel;\n\n redirectToPlatformWarningParams: { defaultRedirectUrl: string; host?: string };\n\n constructor(private tenantService: TenantService) {}\n\n @memoize()\n shouldShow(field: string) {\n return field in this.templateModel;\n }\n\n async ngOnInit() {\n const currentTenant = (await this.tenantService.current()).data;\n const { domainName } = currentTenant;\n this.redirectToPlatformWarningParams = {\n host: `https://${domainName}`,\n defaultRedirectUrl: `https://${domainName}/tenant/oauth`\n };\n defaults(this.templateModel, {\n redirectToPlatform: this.redirectToPlatformWarningParams.defaultRedirectUrl\n });\n }\n}\n","<div class=\"col-md-12 p-t-24\">\n <div class=\"row m-l-8 m-r-8\">\n <div class=\"col-xs-12 col-sm-3 col-md-2\">\n <h4 class=\"text-right text-left-xs\" translate>Basic</h4>\n </div>\n\n <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\" *ngIf=\"templateModel\">\n <div class=\"row\" *ngIf=\"shouldShow('keyCloakAddress')\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"keyCloakAddress\" class=\"control-label\" translate>Keycloak address</label>\n <input\n class=\"form-control\"\n type=\"url\"\n id=\"keyCloakAddress\"\n name=\"keyCloakAddress\"\n [(ngModel)]=\"templateModel.keyCloakAddress\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'https://example.de' }\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"shouldShow('aadAddress')\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"aadAddress\" class=\"control-label\" translate>Azure AD address</label>\n <input\n class=\"form-control\"\n type=\"url\"\n id=\"aadAddress\"\n name=\"aadAddress\"\n [(ngModel)]=\"templateModel.aadAddress\"\n [placeholder]=\"\n 'e.g. {{ example }}' | translate: { example: 'https://login.microsoftonline.de' }\n \"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"shouldShow('tenant')\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"tenant\" class=\"control-label\" translate>Tenant</label>\n <input\n class=\"form-control\"\n id=\"tenant\"\n name=\"tenant\"\n [(ngModel)]=\"templateModel.tenant\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y.onmicrosoft.de' }\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"shouldShow('applicationId')\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"applicationId\" class=\"control-label\" translate>Application ID</label>\n <input\n class=\"form-control\"\n required\n id=\"applicationId\"\n name=\"applicationId\"\n [(ngModel)]=\"templateModel.applicationId\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"shouldShow('realmName')\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"realmName\" class=\"control-label\" translate>Realm name</label>\n <input\n class=\"form-control\"\n required\n id=\"realmName\"\n name=\"realmName\"\n [(ngModel)]=\"templateModel.realmName\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"shouldShow('redirectToPlatform')\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"redirectToPlatform\" class=\"control-label\" translate>Redirect URL</label>\n <input\n type=\"url\"\n class=\"form-control\"\n id=\"redirectToPlatform\"\n name=\"redirectToPlatform\"\n [(ngModel)]=\"templateModel.redirectToPlatform\"\n [placeholder]=\"\n 'e.g. {{ example }}'\n | translate\n : {\n example:\n redirectToPlatformWarningParams?.defaultRedirectUrl ||\n 'https://tenant.domain.com'\n }\n \"\n required\n />\n </c8y-form-group>\n\n <div\n *ngIf=\"\n redirectToPlatformWarningParams &&\n templateModel.redirectToPlatform != redirectToPlatformWarningParams.defaultRedirectUrl\n \"\n >\n <div\n class=\"alert alert-warning max-width-100 m-b-32\"\n ngNonBindable\n translate\n [translateParams]=\"redirectToPlatformWarningParams\"\n >\n For correct application behavior you can use only {{ defaultRedirectUrl }} or\n {{ host }} values, it is advised to use the first one.\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\" *ngIf=\"shouldShow('clientSecret')\">\n <c8y-form-group>\n <label for=\"clientSecret\" class=\"control-label\" translate>Client secret</label>\n <input\n class=\"form-control\"\n required\n id=\"clientSecret\"\n name=\"clientSecret\"\n [(ngModel)]=\"templateModel.clientSecret\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\" *ngIf=\"shouldShow('clientId')\">\n <c8y-form-group>\n <label for=\"clientId\" class=\"control-label\" translate>Client ID</label>\n <input\n class=\"form-control\"\n id=\"clientId\"\n name=\"clientId\"\n [(ngModel)]=\"templateModel.clientId\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '254234981c-78a8-4588…' }\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"shouldShow('issuer')\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"issuer\" class=\"control-label\" translate>Token issuer</label>\n <input\n class=\"form-control\"\n id=\"issuer\"\n name=\"issuer\"\n [(ngModel)]=\"templateModel.issuer\"\n [placeholder]=\"\n 'e.g. {{ example }}'\n | translate: { example: 'https://login.microsoftonline.de/237652-3727' }\n \"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"shouldShow('scopeId')\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"scopeId\" class=\"control-label\" translate>Scope ID</label>\n <input\n class=\"form-control\"\n id=\"scopeId\"\n name=\"scopeId\"\n [(ngModel)]=\"templateModel.scopeId\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '237652-3727' }\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\" *ngIf=\"shouldShow('buttonName')\">\n <c8y-form-group>\n <label for=\"buttonName\" class=\"control-label\" translate>Button name</label>\n <input\n class=\"form-control\"\n id=\"buttonName\"\n name=\"buttonName\"\n [(ngModel)]=\"templateModel.buttonName\"\n [placeholder]=\"'e.g. Log in with Azure AD' | translate\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\" *ngIf=\"shouldShow('providerName')\">\n <c8y-form-group>\n <label for=\"providerName\" class=\"control-label\" translate>Provider name</label>\n <input\n class=\"form-control\"\n id=\"providerName\"\n name=\"providerName\"\n [(ngModel)]=\"templateModel.providerName\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'Azure AD' }\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"shouldShow('audience')\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"audience\" class=\"control-label\" translate>Audience</label>\n <input\n class=\"form-control\"\n id=\"audience\"\n name=\"audience\"\n [(ngModel)]=\"templateModel.audience\"\n [placeholder]=\"\n 'e.g. {{ example }}' | translate: { example: 'https://test.example.com' }\n \"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"shouldShow('visibleOnLoginPage')\">\n <div class=\"col-sm-6\">\n <label\n for=\"visibleOnLoginPage\"\n title=\"{{ 'Visible on login page' | translate }}\"\n class=\"c8y-switch\"\n >\n <input\n id=\"visibleOnLoginPage\"\n name=\"visibleOnLoginPage\"\n type=\"checkbox\"\n [(ngModel)]=\"templateModel.visibleOnLoginPage\"\n />\n <span></span>\n <span class=\"control-label\">{{ 'Visible on login page' | translate }}</span>\n </label>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { memoize } from '@c8y/ngx-components';\nimport { pull } from 'lodash-es';\nimport { ControlContainer, NgForm } from '@angular/forms';\n\n@Component({\n selector: 'c8y-request-configuration',\n templateUrl: './request-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class RequestConfigurationComponent {\n @Input() templateModel;\n @Input() requestName: string;\n @Input() requestType:\n | 'authorizationRequest'\n | 'tokenRequest'\n | 'refreshRequest'\n | 'logoutRequest'\n | 'tokenValidationRequest';\n\n constructor(private controlContainer: ControlContainer) {}\n\n @memoize()\n shouldShow(field: string) {\n return field in this.templateModel;\n }\n\n get requestConfiguration() {\n return this.templateModel[this.requestType];\n }\n\n addCustomValue(array) {\n const customValue = {\n key: '',\n value: ''\n };\n array.push(customValue);\n }\n\n removeCustomValue(array, customValue) {\n pull(array, customValue);\n this.controlContainer.control.markAsDirty();\n }\n\n get showBody() {\n return this.requestConfiguration.method === 'POST' && this.requestType !== 'logoutRequest';\n }\n}\n","<fieldset ngModelGroup=\"{{ requestName }}\" id=\"{{ requestType }}\">\n <div class=\"col-md-12 p-t-24\">\n <div class=\"row m-l-8 m-r-8\">\n <div\n class=\"col-xs-12 col-sm-3 col-md-2 m-b-xs-8\"\n *ngIf=\"requestType !== 'tokenValidationRequest'\"\n >\n <div class=\"h4 text-normal text-right text-left-xs\">\n {{ requestName }}\n </div>\n </div>\n\n <div\n [ngClass]=\"\n requestType !== 'tokenValidationRequest' ? 'col-xs-12 col-sm-9 col-md-10 col-lg-9' : ''\n \"\n *ngIf=\"templateModel\"\n >\n <div class=\"legend form-block m-t-4\" *ngIf=\"requestType === 'tokenValidationRequest'\">\n <span>{{ requestName }}</span>\n </div>\n\n <div class=\"row\">\n <div class=\"col-md-10\">\n <c8y-form-group>\n <label [for]=\"requestType + 'url'\" class=\"control-label\" translate>URL</label>\n <input\n type=\"url\"\n class=\"form-control\"\n name=\"url\"\n [id]=\"requestType + 'url'\"\n [(ngModel)]=\"requestConfiguration.url\"\n [placeholder]=\"\n 'e.g. {{ example }}' | translate: { example: 'http://www.example.com/' }\n \"\n c8yDefaultValidation=\"httpUrl\"\n [required]=\"requestType !== 'logoutRequest'\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div *ngIf=\"showBody\">\n <div class=\"col-md-10\">\n <c8y-form-group>\n <label [for]=\"requestType + 'body'\" class=\"control-label\" translate>Body</label>\n <input\n type=\"text\"\n class=\"form-control\"\n name=\"body\"\n [id]=\"requestType + 'body'\"\n [(ngModel)]=\"requestConfiguration.body\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"requestType !== 'logoutRequest'\">\n <div class=\"legend form-block\" translate>Headers</div>\n <div\n class=\"tight-grid\"\n data-cy=\"refreshRequestHeaders\"\n *ngFor=\"let header of requestConfiguration.headers; index as headerIndex\"\n >\n <div class=\"col-md-5\">\n <c8y-form-group>\n <label\n [for]=\"requestType + 'headerKey' + headerIndex\"\n class=\"visible-sm visible-xs\"\n translate\n >\n Key\n </label>\n <input\n class=\"form-control\"\n [name]=\"'headerKey' + headerIndex\"\n [id]=\"requestType + 'headerKey' + headerIndex\"\n [(ngModel)]=\"header.key\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'Authorization' }\"\n required\n />\n </c8y-form-group>\n </div>\n <div class=\"col-md-5\">\n <c8y-form-group>\n <label\n [for]=\"requestType + 'headerValue' + headerIndex\"\n class=\"visible-sm visible-xs\"\n translate\n >\n Value\n </label>\n <input\n class=\"form-control\"\n [name]=\"'headerValue' + headerIndex\"\n [id]=\"requestType + 'headerValue' + headerIndex\"\n [(ngModel)]=\"header.value\"\n [placeholder]=\"\n 'e.g. {{ example }}' | translate: { example: 'Basic USY7jW9jb2RlX2=' }\n \"\n required\n />\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\">\n <c8y-form-group>\n <button\n class=\"btn btn-link hidden-xs hidden-sm\"\n type=\"button\"\n title=\"{{ 'Remove' | translate }}\"\n (click)=\"removeCustomValue(requestConfiguration.headers, header)\"\n >\n <i c8yIcon=\"minus-circle\" class=\"text-danger\"></i>\n </button>\n <button\n class=\"btn btn-danger btn-block btn-sm visible-xs visible-sm\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n (click)=\"removeCustomValue(requestConfiguration.headers, header)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n <span translate>Remove</span>\n </button>\n </c8y-form-group>\n </div>\n </div>\n <button\n class=\"btn btn-default m-t-8 m-b-16\"\n type=\"button\"\n title=\"{{ 'Add header' | translate }}\"\n (click)=\"addCustomValue(requestConfiguration.headers)\"\n >\n <i c8yIcon=\"plus-circle\" class=\"m-r-4\"></i>\n <span translate>Add header</span>\n </button>\n </div>\n\n <div class=\"legend form-block\" translate>Request parameters</div>\n <div\n class=\"tight-grid\"\n data-cy=\"requestParam\"\n *ngFor=\"let requestParam of requestConfiguration.requestParams; index as paramIndex\"\n >\n <div class=\"col-md-5\">\n <c8y-form-group>\n <label\n [for]=\"requestType + 'paramKey' + paramIndex\"\n class=\"visible-sm visible-xs\"\n translate\n >\n Key - {{ paramIndex }}\n </label>\n <input\n class=\"form-control\"\n [name]=\"'paramKey' + paramIndex\"\n [id]=\"requestType + 'paramKey' + paramIndex\"\n [(ngModel)]=\"requestParam.key\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'client_id' }\"\n required\n />\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-5\">\n <c8y-form-group>\n <label\n [for]=\"requestType + 'paramValue' + paramIndex\"\n class=\"visible-sm visible-xs\"\n translate\n >\n Value\n </label>\n <input\n class=\"form-control\"\n [name]=\"'paramValue' + paramIndex\"\n [id]=\"requestType + 'paramValue' + paramIndex\"\n [(ngModel)]=\"requestParam.value\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '${clientId}' }\"\n required\n />\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-1\">\n <c8y-form-group>\n <button\n class=\"btn btn-link hidden-xs hidden-sm\"\n type=\"button\"\n title=\"{{ 'Remove' | translate }}\"\n (click)=\"removeCustomValue(requestConfiguration.requestParams, requestParam)\"\n >\n <i c8yIcon=\"minus-circle\" class=\"text-danger\"></i>\n </button>\n\n <button\n class=\"btn btn-danger btn-block btn-sm visible-xs visible-sm\"\n type=\"button\"\n title=\"{{ 'Remove' | translate }}\"\n (click)=\"removeCustomValue(requestConfiguration.requestParams, requestParam)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n <span translate>Remove</span>\n </button>\n </c8y-form-group>\n </div>\n </div>\n\n <button\n class=\"btn btn-default m-t-8 m-b-16\"\n type=\"button\"\n title=\"{{ 'Add request parameter' | translate }}\"\n (click)=\"addCustomValue(requestConfiguration.requestParams)\"\n >\n <i c8yIcon=\"plus-circle\" class=\"m-r-4\"></i>\n <span translate>Add request parameter</span>\n </button>\n </div>\n </div>\n </div>\n</fieldset>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { memoize } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-user-id-configuration',\n templateUrl: './user-id-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class UserIdConfigurationComponent implements OnInit {\n private static id = 0;\n\n @Input() userIdConfig;\n @Input() withHeader = true;\n\n componentId = 0;\n\n @memoize()\n shouldShow(field: string) {\n return field in this.userIdConfig;\n }\n\n ngOnInit(): void {\n this.componentId = ++UserIdConfigurationComponent.id;\n }\n}\n","<div class=\"col-md-12 p-t-16\">\n <div class=\"row m-l-8 m-r-8\">\n <div *ngIf=\"withHeader\" class=\"col-xs-12 col-sm-3 col-md-2\">\n <div class=\"h4 text-normal text-right text-left-xs\" translate>User ID</div>\n </div>\n <div [ngClass]=\"withHeader ? 'col-xs-12 col-sm-9 col-md-10 col-lg-9' : 'row'\">\n <div *ngIf=\"!withHeader\" class=\"legend form-block m-t-4\">\n <span translate>User/App ID</span>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group *ngIf=\"userIdConfig.useConstantValue\">\n <label [for]=\"'constantValue' + componentId\" class=\"control-label\" translate>\n Constant value\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n [id]=\"'constantValue' + componentId\"\n [name]=\"'constantValue' + componentId\"\n [(ngModel)]=\"userIdConfig.constantValue\"\n required\n />\n </c8y-form-group>\n <c8y-form-group *ngIf=\"!userIdConfig.useConstantValue\">\n <label [for]=\"'jwtField' + componentId\" class=\"control-label\" translate>\n JWT field\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n [id]=\"'jwtField' + componentId\"\n [name]=\"'jwtField' + componentId\"\n [(ngModel)]=\"userIdConfig.jwtField\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'upn' }\"\n required\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <div class=\"form-group\" *ngIf=\"shouldShow('useConstantValue')\">\n <label\n [for]=\"'useConstantValue' + componentId\"\n title=\"{{ 'Use constant value' | translate }}\"\n class=\"c8y-switch m-t-24\"\n >\n <input\n type=\"checkbox\"\n [name]=\"'useConstantValue' + componentId\"\n [id]=\"'useConstantValue' + componentId\"\n [(ngModel)]=\"userIdConfig.useConstantValue\"\n />\n <span></span>\n <span class=\"control-label\">{{ 'Use constant value' | translate }}</span>\n </label>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components';\nimport { ControlContainer, NgForm } from '@angular/forms';\n\n@Component({\n selector: 'c8y-sso-user-data-mapping',\n templateUrl: './user-data-mapping.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class UserDataMappingComponent {\n @Input() templateModel;\n CLAIM_NAMES = gettext('Token claims can be checked in Audit Logs under Single sign-on type.');\n\n ngAfterContentInit() {\n if (!this.templateModel.accessTokenToUserDataMappings) {\n this.templateModel.accessTokenToUserDataMappings = {};\n }\n }\n}\n","<div class=\"col-md-12 p-t-16\">\n <div class=\"row m-l-8 m-r-8\">\n <div class=\"col-xs-12 col-sm-3 col-md-2\">\n <div class=\"h4 text-normal text-right text-left-xs\" translate>User data mappings</div>\n </div>\n\n <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\">\n <div class=\"legend form-block m-t-4\">\n <span translate>Claim names</span>\n <button\n class=\"btn btn-clean\"\n type=\"button\"\n [attr.aria-label]=\"'Claim names' | translate\"\n popover=\"{{ CLAIM_NAMES | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n >\n <i [c8yIcon]=\"'question-circle-o'\" class=\"text-info\"></i>\n </button>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"firstName\" class=\"control-label\" translate>First name</label>\n <input\n class=\"form-control\"\n name=\"firstName\"\n id=\"firstName\"\n [(ngModel)]=\"templateModel.accessTokenToUserDataMappings.firstNameClaimName\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'given_name' }\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"lastName\" class=\"control-label\" translate>Last name</label>\n <input\n class=\"form-control\"\n name=\"lastName\"\n id=\"lastName\"\n [(ngModel)]=\"templateModel.accessTokenToUserDataMappings.lastNameClaimName\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'family_name' }\"\n />\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"email\" class=\"control-label\" translate>Email</label>\n <input\n class=\"form-control\"\n name=\"email\"\n id=\"email\"\n [(ngModel)]=\"templateModel.accessTokenToUserDataMappings.emailClaimName\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'email' }\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"phoneNumber\" class=\"control-label\" translate>Phone number</label>\n <input\n class=\"form-control\"\n name=\"phoneNumber\"\n id=\"phoneNumber\"\n [(ngModel)]=\"templateModel.accessTokenToUserDataMappings.phoneNumberClaimName\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'phone_number' }\"\n />\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { gettext } from '@c8y/ngx-components';\n\nexport const relations = [\n {\n name: 'EQ',\n value: 'EQ',\n label: '=',\n ordinal: 0\n },\n {\n name: 'NEQ',\n value: 'NEQ',\n label: '!=',\n ordinal: 1\n },\n {\n name: 'GT',\n value: 'GT',\n label: '>',\n ordinal: 2\n },\n {\n name: 'LT',\n value: 'LT',\n label: '<',\n ordinal: 3\n },\n {\n name: 'GTE',\n value: 'GTE',\n label: '>=',\n ordinal: 4\n },\n {\n name: 'LTE',\n value: 'LTE',\n label: '<=',\n ordinal: 5\n },\n {\n name: 'IN',\n value: 'IN',\n label: gettext('in`value-range`'),\n ordinal: 6\n }\n];\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { pull } from 'lodash-es';\nimport { relations } from './dynamic-accesss-mapping-relations.model';\nimport { ChildPredicate } from '../../sso-configuration.model';\n\n@Component({\n selector: 'c8y-sso-child-predicates',\n templateUrl: './child-predicates.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class ChildPredicatesComponent {\n @Input() childPredicates: ChildPredicate[];\n @Input() accessMappingIndex: string;\n @Output() onRemoveAllChildPredicates: EventEmitter<null> = new EventEmitter();\n\n relations = relations;\n\n constructor(private controlContainer: ControlContainer) {}\n\n removeChildPredicate(childPredicate: ChildPredicate) {\n pull(this.childPredicates, childPredicate);\n if (this.childPredicates.length === 0) {\n this.onRemoveAllChildPredicates.emit();\n }\n this.controlContainer.control.markAsDirty();\n }\n\n addChildPredicate() {\n this.childPredicates.push({\n operator: 'EQ',\n parameterPath: '',\n value: ''\n });\n }\n}\n","<div class=\"legend form-block m-t-4\" translate>When</div>\n<div class=\"tight-grid hidden-sm hidden-xs\">\n <div class=\"col-md-4\">\n <label translate>Key</label>\n </div>\n <div class=\"col-md-2\">\n <label translate>Operator`logical`</label>\n </div>\n <div class=\"col-md-4\">\n <label translate>Value</label>\n </div>\n</div>\n<div\n class=\"tight-grid\"\n *ngFor=\"\n let childPredicate of childPredicates;\n last as isLast;\n index as idx\n \"\n>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label\n [for]=\"'parameterPath' + accessMappingIndex + idx\"\n class=\"visible-sm visible-xs\"\n translate\n >\n Key\n </label>\n <input\n [name]=\"'parameterPath' + accessMappingIndex + idx\"\n [id]=\"'parameterPath' + accessMappingIndex + idx\"\n type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"childPredicate.parameterPath\"\n placeholder=\"{{ 'Key' | translate }}\"\n required\n />\n </c8y-form-group>\n </div>\n <div class=\"col-md-2\">\n <c8y-form-group>\n <label\n [for]=\"'operator' + accessMappingIndex + idx\"\n class=\"visible-sm visible-xs\"\n translate\n >\n Operator`logical`\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n [name]=\"'operator' + accessMappingIndex + idx\"\n [id]=\"'operator' + accessMappingIndex + idx\"\n [(ngModel)]=\"childPredicate.operator\"\n required\n >\n <option *ngFor=\"let relation of relations\" [ngValue]=\"relation.value\">\n {{ relation.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label [for]=\"'value' + accessMappingIndex + idx\" class=\"visible-sm visible-xs\" translate>\n Value\n </label>\n <input\n [name]=\"'value' + accessMappingIndex + idx\"\n [id]=\"'value' + accessMappingIndex + idx\"\n type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"childPredicate.value\"\n placeholder=\"{{ 'Value' | translate }}\"\n required\n />\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\">\n <c8y-form-group>\n <button\n name=\"removeButton\"\n class=\"btn btn-link hidden-xs hidden-sm\"\n (click)=\"removeChildPredicate(childPredicate)\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n >\n <i c8yIcon=\"minus-circle\" class=\"text-danger\"></i>\n </button>\n <button\n name=\"removeButton\"\n class=\"btn btn-danger btn-block btn-sm visible-xs visible-sm\"\n (click)=\"removeChildPredicate(childPredicate)\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n <span translate>Remove</span>\n </button>\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\">\n <c8y-form-group *ngIf=\"isLast\">\n <button\n title=\"{{ 'and' | translate }}\"\n class=\"btn btn-default btn-xs hidden-xs hidden-sm\"\n (click)=\"addChildPredicate()\"\n type=\"button\"\n translate\n >\n and\n </button>\n <button\n title=\"{{ 'and' | translate }}\"\n class=\"btn btn-default btn-block btn-sm visible-xs visible-sm\"\n (click)=\"addChildPredicate()\"\n type=\"button\"\n translate\n >\n and\n </button>\n </c8y-form-group>\n </div>\n</div>\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { IApplication, IUserGroup } from '@c8y/client';\nimport { AccessMapping } from '../../sso-configuration.model';\n\n@Component({\n selector: 'c8y-sso-dynamic-access-mapping',\n templateUrl: './dynamic-access-mapping.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class DynamicAccessMappingComponent {\n @Input() groups: IUserGroup[];\n selectedGroups: IUserGroup[];\n\n @Input() apps: IApplication[];\n selectedApps: IApplication[];\n\n @Input() accessMapping: AccessMapping;\n @Output() onRemoveAccessMapping: EventEmitter<AccessMapping> = new EventEmitter();\n\n @Input() accessMappingIndex: number;\n\n ngOnChanges(): void {\n if (this.accessMapping && this.apps && this.groups) {\n this.setSelectedItems();\n }\n }\n\n onRemoveAllChildPredicates() {\n this.onRemoveAccessMapping.emit(this.accessMapping);\n }\n\n getIds(selectedItems) {\n return selectedItems.map(item => parseInt(item.id, 10));\n }\n\n private setSelectedItems() {\n if (this.accessMapping) {\n if (this.accessMapping.thenGroups) {\n this.selectedGroups = this.groups.filter(item =>\n this.accessMapping.thenGroups.includes(item.id)\n );\n }\n if (this.accessMapping.thenApplications) {\n this.selectedApps = this.apps.filter(item =>\n this.accessMapping.thenApplications.includes(+item.id)\n );\n }\n }\n }\n}\n","<div class=\"card\">\n <div class=\"card-block overflow-visible\" *ngIf=\"accessMapping.when.childPredicates.length != 0\">\n <c8y-sso-child-predicates\n [childPredicates]=\"accessMapping.when.childPredicates\"\n [accessMappingIndex]=\"'am' + accessMappingIndex\"\n (onRemoveAllChildPredicates)=\"onRemoveAllChildPredicates()\"\n ></c8y-sso-child-predicates>\n\n <div class=\"legend form-block\" translate>Provide access to</div>\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <div title=\"{{ 'Default global roles' | translate }}\" class=\"form-group\">\n <label [for]=\"'groups' + accessMappingIndex\" class=\"control-label\">\n {{ 'Default global roles' | translate }}\n </label>\n <c8y-select\n [id]=\"'groups' + accessMappingIndex\"\n [items]=\"groups\"\n [selected]=\"selectedGroups\"\n [disableApplyOnNoSelection]=\"true\"\n (onChange)=\"selectedGroups = $event; accessMapping.thenGroups = getIds($event)\"\n ></c8y-select>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <div title=\"{{ 'Default applications' | translate }}\" class=\"form-group\">\n <label [for]=\"'apps' + accessMappingIndex\" class=\"control-label\">\n {{ 'Default applications' | translate }}\n </label>\n <c8y-select\n [id]=\"'apps' + accessMappingIndex\"\n [items]=\"apps\"\n [selected]=\"selectedApps\"\n [disableApplyOnNoSelection]=\"true\"\n (onChange)=\"selectedApps = $event; accessMapping.thenApplications = getIds($event)\"\n ></c8y-select>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { Component, EventEmitter } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { IIdentified } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-sso-inventory-roles-modal',\n templateUrl: './inventory-roles-modal.component.html'\n})\nexport class InventoryRolesModalComponent {\n selectedGroups: IIdentified[];\n\n resultEmitter: EventEmitter<IIdentified[]> = new EventEmitter<IIdentified[]>();\n\n label = gettext('Groups');\n\n constructor(public modal: BsModalRef) {}\n\n dismiss() {\n this.modal.hide();\n }\n\n select() {\n this.resultEmitter.emit(this.selectedGroups);\n this.modal.hide();\n }\n}\n","<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <h1 id=\"modal-title\" class=\"h3\">\n {{ 'Select group(s)' | translate }}\n </h1>\n </div>\n <div class=\"p-16 text-center separator-bottom\">\n <p class=\"text-medium text-16\" translate>Select group(s) from inventory to assign roles</p>\n </div>\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body p-t-8\" id=\"modal-body\">\n <c8y-asset-selector-miller\n [(ngModel)]=\"selectedGroups\"\n [config]=\"{\n label: label,\n showFilter: true,\n view: 'tree',\n multi: true,\n groupsSelectable: true,\n columnHeaders: true,\n singleColumn: true,\n groupsOnly: true\n }\"\n ></c8y-asset-selector-miller>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n (click)=\"dismiss()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n title=\"{{ 'Select' | translate }}\"\n (click)=\"select()\"\n >\n {{ 'Select' | translate }}\n </button>\n </div>\n</div>\n","import { Component, Output, Input, EventEmitter } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { InventoryMapping, InventoryRole } from '../../sso-configuration.model';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { InventoryRolesModalComponent } from './inventory-roles-modal.component';\nimport { take } from 'rxjs/operators';\nimport { IIdentified } from '@c8y/client';\n\n@Component({\n selector: 'c8y-sso-inventory-roles-mapping',\n templateUrl: './inventory-roles-mapping.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class InventoryRolesMappingComponent {\n @Input() inventoryMapping: InventoryMapping;\n @Input() inventoryMappingIndex: number;\n\n @Input() inventoryRoles: IIdentified[] = [];\n selectedInventoryRoles: IIdentified[] = [];\n\n @Output() onRemoveInventoryMapping: EventEmitter<InventoryMapping> = new EventEmitter();\n\n constructor(private bsModal: BsModalService) {}\n\n ngOnChanges(): void {\n this.setSelectedInventoryRoles();\n }\n\n onRemoveAllChildPredicates() {\n this.onRemoveInventoryMapping.emit(this.inventoryMapping);\n }\n\n getIds(selectedItems: IIdentified[]) {\n return selectedItems.map(item => item.id);\n }\n\n removeInventoryRole(inventoryRole: InventoryRole) {\n this.inventoryMapping.thenInventoryRoles = this.inventoryMapping.thenInventoryRoles.filter(\n value => value.managedObject !== inventoryRole.managedObject\n );\n delete this.selectedInventoryRoles[inventoryRole.managedObject];\n }\n\n addInventoryRoles() {\n const currentlySelectedGroups: IIdentified[] = this.inventoryMapping.thenInventoryRoles.map(\n inventoryRole => ({ id: inventoryRole.managedObject })\n );\n const modal = this.bsModal.show(InventoryRolesModalComponent, {\n ignoreBackdropClick: true,\n ariaLabelledBy: 'modal-title',\n initialState: {\n selectedGroups: currentlySelectedGroups\n }\n });\n modal.content.resultEmitter.pipe(take(1)).subscribe(selectedGroups => {\n const newSelectedGroups = selectedGroups.filter(\n group => !currentlySelectedGroups.some(({ id }) => id === group.id)\n );\n const newInventoryRoles: InventoryRole[] = newSelectedGroups.map(\n group => ({ managedObject: group.id, roleIds: [] } as InventoryRole)\n );\n this.inventoryMapping.thenInventoryRoles =\n this.inventoryMapping.thenInventoryRoles.concat(newInventoryRoles);\n });\n }\n\n private setSelectedInventoryRoles() {\n if (this.inventoryMapping && this.inventoryMapping.thenInventoryRoles && this.inventoryRoles) {\n this.inventoryMapping.thenInventoryRoles.forEach(inventoryRole => {\n this.selectedInventoryRoles[inventoryRole.managedObject] = this.inventoryRoles.filter(\n item => inventoryRole.roleIds.includes(+item.id)\n );\n });\n }\n }\n}\n","<div class=\"card\">\n <div\n class=\"card-block overflow-visible\"\n *ngIf=\"inventoryMapping.when.childPredicates.length !== 0\"\n >\n <c8y-sso-child-predicates\n [childPredicates]=\"inventoryMapping.when.childPredicates\"\n [accessMappingIndex]=\"'irm' + inventoryMappingIndex\"\n (onRemoveAllChildPredicates)=\"onRemoveAllChildPredicates()\"\n ></c8y-sso-child-predicates>\n\n <div class=\"legend form-block\" translate>Provide inventory roles</div>\n <div *ngIf=\"inventoryMapping.thenInventoryRoles.length !== 0\">\n <div class=\"tight-grid hidden-sm hidden-xs\">\n <div class=\"col-md-5\">\n <label translate>Groups</label>\n </div>\n <div class=\"col-md-6\">\n <label translate>Inventory roles</label>\n </div>\n </div>\n <div\n class=\"tight-grid\"\n *ngFor=\"let inventoryRole of inventoryMapping.thenInventoryRoles; index as idx\"\n >\n <div class=\"col-md-5\">\n <i class=\"c8y-icon c8y-icon-group m-r-4\"></i>\n <span>{{ inventoryRole.managedObject | moName | async }}</span>\n </div>\n <div class=\"col-md-6\">\n <div title=\"{{ 'Inventory roles' | translate }}\" class=\"form-group\">\n <c8y-select\n [id]=\"'ir' + idx + accessMappingIndex\"\n [items]=\"inventoryRoles\"\n [selected]=\"selectedInventoryRoles[inventoryRole.managedObject]\"\n [disableApplyOnNoSelection]=\"true\"\n (onChange)=\"\n selectedInventoryRoles[inventoryRole.managedObject] = $event;\n inventoryRole.roleIds = getIds($event)\n \"\n ></c8y-select>\n </div>\n </div>\n <div class=\"col-md-1\">\n <c8y-form-group>\n <button\n name=\"removeButton\"\n class=\"btn btn-link hidden-xs hidden-sm\"\n (click)=\"removeInventoryRole(inventoryRole)\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n >\n <i c8yIcon=\"minus-circle\" class=\"text-danger\"></i>\n </button>\n <button\n name=\"removeButton\"\n class=\"btn btn-danger btn-block btn-sm visible-xs visible-sm\"\n (click)=\"removeInventoryRole(inventoryRole)\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n <span translate>Remove</span>\n </button>\n </c8y-form-group>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <button\n id=\"add-inventory-roles-button\"\n class=\"btn btn-default m-b-16\"\n type=\"button\"\n title=\"{{ 'Add inventory roles' | translate }}\"\n (click)=\"addInventoryRoles()\"\n >\n <i c8yIcon=\"plus-circle\" class=\"m-r-4\"></i>\n {{ 'Add inventory roles' | translate }}\n </button>\n </div>\n </div>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components';\nimport { pull, defaultsDeep } from 'lodash-es';\nimport { IApplication, IIdentified, IUserGroup } from '@c8y/client';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { InventoryMapping, AccessMapping } from '../../sso-configuration.model';\n\n@Component({\n selector: 'c8y-sso-access-mapping',\n templateUrl: './access-mapping.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class AccessMappingComponent {\n @Input() apps: IApplication[];\n @Input() groups: IUserGroup[];\n @Input() inventoryRoles: IIdentified[];\n @Input() templateModel;\n\n USE_ACCESS_MAPPING_ON_USER_CREATION_TOOLTIP = gettext(\n 'The access mapping will be executed only once during the first login, then the administrator can edit the user roles. During the next login, these mappings will not be executed.'\n );\n USE_ACCESS_MAPPING_ON_USER_CREATION_OPTION = gettext(\n 'Use dynamic access mapping only on user creation'\n );\n\n UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_TOOLTIP = gettext(\n 'The access mapping will be executed only once during the first login, then the administrator can edit the user roles. During the next login only the roles listed in the access mappings will be updated.'\n );\n UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_OPTION = gettext(\n 'Roles selected in the rules above will be reassigned to a user on each log in and other ones will be unchanged'\n );\n\n CLEAR_AND_UPDATED_ROLES_ON_EACH_LOG_IN_TOOLTIP = gettext(\n 'The access mapping will be executed during the first login. The administrator cannot edit the SSO user roles. During the next login all the roles will be cleared and the mapping will be executed again.'\n );\n CLEAR_AND_UPDATED_ROLES_ON_EACH_LOG_IN_OPTION = gettext(\n 'Roles selected in the rules above will be reassigned to a user on each log in and other ones will be cleared'\n );\n\n constructor(private controlContainer: ControlContainer) {}\n\n ngOnChanges(): void {\n if (this.templateModel && this.apps && this.groups) {\n this.setDynamicMapping();\n }\n }\n\n addAccessMapping() {\n const emptyMapping: AccessMapping = {\n when: {\n operator: 'AND',\n childPredicates: [{ parameterPath: '', operator: 'EQ', value: '' }]\n },\n thenGroups: [],\n thenApplications: []\n };\n this.templateModel.onNewUser.dynamicMapping.mappings.push(emptyMapping);\n }\n\n addInventoryMapping() {\n const emptyInventoryMapping: InventoryMapping = {\n when: {\n operator: 'AND',\n childPredicates: [{ parameterPath: '', operator: 'EQ', value: '' }]\n },\n thenInventoryRoles: []\n };\n this.templateModel.onNewUser.dynamicMapping.inventoryMappings.push(emptyInventoryMapping);\n }\n\n onRemove(accessMapping: AccessMapping) {\n pull(this.templateModel.onNewUser.dynamicMapping.mappings, accessMapping);\n }\n\n onRemoveInventoryMapping(inventoryMapping: InventoryMapping) {\n pull(this.templateModel.onNewUser.dynamicMapping.inventoryMappings, inventoryMapping);\n }\n\n setDynamicMappingConfiguration(\n mapRolesOnlyForNewUser: boolean,\n manageRolesOnlyFromAccessMapping = false\n ) {\n this.templateModel.onNewUser.dynamicMapping.configuration = {\n mapRolesOnlyForNewUser,\n manageRolesOnlyFromAccessMapping\n };\n this.controlContainer.control.markAsDirty();\n }\n\n get mapRolesOnlyForNewUser() {\n return this.templateModel.onNewUser.dynamicMapping.configuration.mapRolesOnlyForNewUser;\n }\n\n get manageRolesOnlyFromAccessMapping() {\n return this.templateModel.onNewUser.dynamicMapping.configuration\n .manageRolesOnlyFromAccessMapping;\n }\n\n private setDynamicMapping() {\n defaultsDeep(this.templateModel.onNewUser, {\n dynamicMapping: {\n mappings: [],\n inventoryMappings: [],\n configuration: { mapRolesOnlyForNewUser: false, manageRolesOnlyFromAccessMapping: false }\n }\n });\n }\n}\n","<div class=\"col-md-12 p-t-16\">\n <div class=\"row m-l-8 m-r-8\">\n <div class=\"col-xs-12 col-sm-3 col-md-2\">\n <div class=\"h4 text-normal text-right text-left-xs\" translate>Access mapping</div>\n </div>\n\n <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\">\n <div class=\"dynamic-access\">\n <div class=\"legend form-block m-t-4\" translate>Dynamic access mapping</div>\n <c8y-form-group>\n <c8y-ui-empty-state\n *ngIf=\"templateModel.onNewUser.dynamicMapping.mappings.length === 0\"\n [icon]=\"'list'\"\n [title]=\"'No access mapping rules defined.' | translate\"\n [subtitle]=\"'Click below to add a new mapping.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n <div\n *ngFor=\"\n let accessMapping of templateModel.onNewUser.dynamicMapping.mappings;\n index as idx\n \"\n >\n <c8y-sso-dynamic-access-mapping\n [accessMapping]=\"accessMapping\"\n (onRemoveAccessMapping)=\"onRemove(accessMapping)\"\n [apps]=\"apps\"\n [groups]=\"groups\"\n [accessMappingIndex]=\"idx\"\n ></c8y-sso-dynamic-access-mapping>\n </div>\n <div class=\"scroll-column-footer\">\n <button\n id=\"add-access-mapping-button\"\n class=\"btn btn-default m-b-16\"\n type=\"button\"\n title=\"{{ 'Add access mapping' | translate }}\"\n (click)=\"addAccessMapping()\"\n >\n <i c8yIcon=\"plus-circle\" class=\"m-r-4\"></i>\n {{ 'Add access mapping' | translate }}\n </button>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"dynamic-access\">\n <div class=\"legend form-block m-t-4\" translate>Inventory roles mapping</div>\n <c8y-form-group>\n <c8y-ui-empty-state\n *ngIf=\"templateModel.onNewUser.dynamicMapping.inventoryMappings.length === 0\"\n [icon]=\"'list'\"\n [title]=\"'No inventory roles mapping rules defined.' | translate\"\n [subtitle]=\"'Click below to add a new mapping.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n <div\n *ngFor=\"\n let inventoryMapping of templateModel.onNewUser.dynamicMapping.inventoryMappings;\n index as idx\n \"\n >\n <c8y-sso-inventory-roles-mapping\n [inventoryRoles]=\"inventoryRoles\"\n [inventoryMapping]=\"inventoryMapping\"\n (onRemoveInventoryMapping)=\"onRemoveInventoryMapping(inventoryMapping)\"\n [inventoryMappingIndex]=\"idx\"\n ></c8y-sso-inventory-roles-mapping>\n </div>\n <div class=\"scroll-column-footer\">\n <button\n id=\"add-inventory-mapping-button\"\n class=\"btn btn-default m-b-16\"\n type=\"button\"\n title=\"{{ 'Add inventory roles mapping' | translate }}\"\n (click)=\"addInventoryMapping()\"\n >\n <i c8yIcon=\"plus-circle\" class=\"m-r-4\"></i>\n {{ 'Add inventory roles mapping' | translate }}\n </button>\n </div>\n </c8y-form-group>\n </div>\n <c8y-form-group>\n <label\n title=\"{{ USE_ACCESS_MAPPING_ON_USER_CREATION_OPTION | translate }}\"\n class=\"c8y-radio input-sm\"\n >\n <input\n type=\"radio\"\n name=\"dynamicAccessMappingConfiguration\"\n [checked]=\"mapRolesOnlyForNewUser\"\n (change)=\"setDynamicMappingConfiguration(true)\"\n />\n <span></span>\n <span>{{ USE_ACCESS_MAPPING_ON_USER_CREATION_OPTION | translate }}</span>\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ USE_ACCESS_MAPPING_ON_USER_CREATION_TOOLTIP | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </label>\n <label\n title=\"{{ UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_OPTION | translate }}\"\n class=\"c8y-radio input-sm\"\n >\n <input\n type=\"radio\"\n name=\"dynamicAccessMappingConfiguration\"\n [checked]=\"!mapRolesOnlyForNewUser && manageRolesOnlyFromAccessMapping\"\n (change)=\"setDynamicMappingConfiguration(false, true)\"\n />\n <span></span>\n <span>\n {{ UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_OPTION | translate }}\n </span>\n <button\n type=\"button\"\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_TOOLTIP | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </label>\n <label\n title=\"{{ CLEAR_AND_UPDATED_ROLES_ON_EACH_LOG_IN_OPTION | translate }}\"\n class=\"c8y-radio input-sm\"\n >\n <input\n type=\"radio\"\n name=\"dynamicAccessMappingConfiguration\"\n [checked]=\"!mapRolesOnlyForNewUser && !manageRolesOnlyFromAccessMapping\"\n (change)=\"setDynamicMappingConfiguration(false, false)\"\n />\n <span></span>\n <span>\n {{ CLEAR_AND_UPDATED_ROLES_ON_EACH_LOG_IN_OPTION | translate }}\n </span>\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ CLEAR_AND_UPDATED_ROLES_ON_EACH_LOG_IN_TOOLTIP | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </label>\n </c8y-form-group>\n </div>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { gettext, memoize } from '@c8y/ngx-components';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport {\n algorithmTypeConfig,\n CertificateType,\n certificateTypeConfig,\n CustomCertificate\n} from './signature-configuration.model';\n\n@Component({\n selector: 'c8y-sso-signature-configuration',\n templateUrl: './signature-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class SignatureConfigurationComponent {\n @Input() templateModel;\n\n certificateType = CertificateType;\n certificateTypes = certificateTypeConfig;\n\n algorithmTypes = algorithmTypeConfig;\n\n CERTIFICATE_ID_FIELD_POPOVER = gettext(\n 'This is the name of the field in the token whose value will be used to select one of the certificates below which has matching \"Certificate ID value\".'\n );\n\n constructor(protected controlContainer: ControlContainer) {}\n\n @memoize()\n shouldShow(field: string) {\n return field in this.templateModel;\n }\n\n removeCustomCertificate(customCertificate: CustomCertificate) {\n this.templateModel.signatureVerificationConfig.manual.removeCustomCertificate(\n customCertificate\n );\n this.controlContainer.control.markAsDirty();\n }\n}\n","<div class=\"col-md-12 p-t-16\">\n <div class=\"row m-l-8 m-r-8 m-b-8\">\n <div class=\"col-xs-12 col-sm-3 col-md-2\">\n <div class=\"h4 text-normal text-right text-left-xs\" translate>Signature verification</div>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <div *ngIf=\"shouldShow('certificateType')\" class=\"form-group p-relative\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <label for=\"certificateType\" class=\"control-label\" translate>Verifier</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"certificateType\"\n name=\"certificateType\"\n [(ngModel)]=\"templateModel.signatureVerificationConfig.certificateTypeChosen\"\n >\n <option\n *ngFor=\"let certificateType of certificateTypes | keyvalue\"\n [ngValue]=\"certificateType.key\"\n >\n {{ certificateType.value.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div\n id=\"adfs\"\n *ngIf=\"\n templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.ADFS\n \"\n >\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"adfsManifestUrl\" class=\"control-label\" translate>ADFS manifest URL</label>\n <input\n type=\"url\"\n class=\"form-control\"\n required\n [placeholder]=\"\n 'e.g. {{ example }}'\n | translate\n : {\n example:\n 'https://adfs.tenant.com/federationmetadata/federationmetadata.xml'\n }\n \"\n [(ngModel)]=\"templateModel.signatureVerificationConfig.adfsManifest.manifestUrl\"\n name=\"adfsManifestUrl\"\n id=\"adfsManifestUrl\"\n />\n </c8y-form-group>\n </div>\n </div>\n </div>\n\n <div\n id=\"add\"\n *ngIf=\"\n templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.AZURE\n \"\n >\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"publicKeyDiscoveryUrl\" class=\"control-label\" translate>\n Public key discovery URL\n </label>\n <input\n type=\"url\"\n id=\"publicKeyDiscoveryUrl\"\n class=\"form-control\"\n required\n [placeholder]=\"\n 'e.g. {{ example }}'\n | translate\n : { example: 'https://login.microsoftonline.de/tenant/discovery/keys' }\n \"\n name=\"publicKeyDiscoveryUrl\"\n [(ngModel)]=\"templateModel.signatureVerificationConfig.aad.publicKeyDiscoveryUrl\"\n />\n </c8y-form-group>\n </div>\n </div>\n </div>\n\n <div\n id=\"jwks\"\n *ngIf=\"\n templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.JWKS\n \"\n >\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label for=\"jwksPublicKeyDiscoveryUrl\" class=\"control-label\" translate>\n JWKS URL\n </label>\n <input\n type=\"url\"\n class=\"form-control\"\n id=\"jwksPublicKeyDiscoveryUrl\"\n required\n [placeholder]=\"\n 'e.g. {{ example }}' | translate: { example: 'http://www.example.com/' }\n \"\n name=\"jwksUri\"\n [(ngModel)]=\"templateModel.signatureVerificationConfig.jwks.jwksUri\"\n />\n </c8y-form-group>\n </div>\n </div>\n </div>\n\n <div\n id=\"manual\"\n *ngIf=\"\n templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.CUSTOM\n \"\n >\n <c8y-form-group\n *ngIf=\"templateModel.signatureVerificationConfig.manual.customCertificates.length > 1\"\n >\n <div class=\"legend form-block\" translate>Manual</div>\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <label for=\"certIdField\" class=\"control-label\">\n {{ 'Certificate ID field' | translate }}\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ CERTIFICATE_ID_FIELD_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n name=\"certIdField\"\n id=\"certIdField\"\n [(ngModel)]=\"templateModel.signatureVerificationConfig.manual.certIdField\"\n required\n />\n </div>\n </div>\n </c8y-form-group>\n\n <div>\n <div class=\"legend form-block\" translate>Certificates</div>\n <div\n *ngFor=\"\n let customCertificate of templateModel.signatureVerificationConfig.manual\n .customCertificates;\n index as crtIndex\n \"\n >\n <div class=\"row\">\n <div\n class=\"col-sm-6\"\n *ngIf=\"\n templateModel.signatureVerificationConfig.manual.customCertificates.length > 1\n \"\n >\n <c8y-form-group>\n <label\n [for]=\"'customCertificateValue' + crtIndex\"\n class=\"control-label\"\n translate\n >\n Certificate ID value\n </label>\n <input\n [name]=\"'customCertificateValue' + crtIndex\"\n [id]=\"'customCertificateValue' + crtIndex\"\n type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"customCertificate.key\"\n required\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Type' | translate }}\n </label>\n <label\n title=\"{{ algorithmType.value.label | translate }}\"\n class=\"c8y-radio input-sm\"\n *ngFor=\"let algorithmType of algorithmTypes | keyvalue; index as algIndex\"\n >\n <input\n type=\"radio\"\n [name]=\"'alg' + crtIndex + algIndex\"\n [value]=\"algorithmType.key\"\n [(ngModel)]=\"customCertificate.alg\"\n />\n <span></span>\n <span>{{ algorithmType.value.label | translate }}</span>\n </label>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n [for]=\"'publicKey' + crtIndex\"\n *ngIf=\"customCertificate.alg === algorithmTypes.PCKS.value\"\n translate\n >\n Certificate in PEM format\n </label>\n <label\n class=\"control-label\"\n [for]=\"'publicKey' + crtIndex\"\n *ngIf=\"customCertificate.alg === algorithmTypes.RSA.value\"\n translate\n >\n Public key in PEM format\n </label>\n <input\n [name]=\"'publicKey' + crtIndex\"\n [id]=\"'publicKey' + crtIndex\"\n type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"customCertificate.publicKey\"\n required\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-3\">\n <div class=\"form-group datepicker\">\n <c8y-form-group>\n <label [for]=\"'validFromPicker' + crtIndex\" class=\"control-label\">\n {{ 'Valid from' | translate }}\n </label>\n <input\n [name]=\"'validFromPicker' + crtIndex\"\n [id]=\"'validFromPicker' + crtIndex\"\n [(ngModel)]=\"customCertificate.validFrom\"\n class=\"form-control\"\n placeholder=\"{{ 'Date from' | translate }}\"\n [bsConfig]=\"{ customTodayClass: 'today' }\"\n [maxDate]=\"customCertificate.validTill\"\n bsDatepicker\n required\n />\n </c8y-form-group>\n </div>\n </div>\n <div class=\"col-sm-3\">\n <div class=\"form-group datepicker\">\n <c8y-form-group>\n <label [for]=\"'validTillPicker' + crtIndex\" class=\"control-label\">\n {{ 'Valid till' | translate }}\n </label>\n <input\n [name]=\"'validTillPicker' + crtIndex\"\n [id]=\"'validTillPicker' + crtIndex\"\n [(ngModel)]=\"customCertificate.validTill\"\n class=\"form-control\"\n placeholder=\"{{ 'Date to' | translate }}\"\n aria-label=\"{{ 'Date to' | translate }}\"\n [bsConfig]=\"{ customTodayClass: 'today' }\"\n bsDatepicker\n [minDate]=\"customCertificate.validFrom\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n </div>\n <div\n class=\"form-group\"\n *ngIf=\"templateModel.signatureVerificationConfig.manual.customCertificates.length > 1\"\n >\n <button\n class=\"btn btn-danger btn-sm hidden-xs\"\n type=\"button\"\n title=\"{{ 'Delete certificate' | translate }}\"\n (click)=\"removeCustomCertificate(customCertificate)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n <span>{{ 'Delete certificate' | translate }}</span>\n </button>\n\n <button\n class=\"btn btn-danger btn-block btn-sm visible-xs\"\n type=\"button\"\n title=\"{{ 'Delete certificate' | translate }}\"\n (click)=\"removeCustomCertificate(customCertificate)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n <span>{{ 'Delete certificate' | translate }}</span>\n </button>\n </div>\n <div\n class=\"separator-top p-b-24\"\n *ngIf=\"templateModel.signatureVerificationConfig.manual.customCertificates.length > 1\"\n ></div>\n </div>\n <button\n class=\"btn btn-default m-b-16 m-t-8\"\n type=\"button\"\n title=\"{{ 'Add certificate' | translate }}\"\n (click)=\"templateModel.signatureVerificationConfig.manual.addCustomCertificate()\"\n name=\"addCertificate\"\n >\n <i c8yIcon=\"plus-circle\" class=\"m-r-4\"></i>\n <span>{{ 'Add certificate' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { validationMethodConfig } from './external-token-config.model';\nimport { RequestConfiguration } from './request-configuration.model';\n\n@Component({\n selector: 'c8y-external-token-config',\n templateUrl: './external-token-config.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class ExternalTokenConfigComponent {\n @Input() templateModel;\n\n validationMethods = validationMethodConfig;\n\n get externalTokenConfig() {\n return this.templateModel.externalTokenConfig;\n }\n\n onValidationMethodChange(event) {\n this.externalTokenConfig.validationMethod = event;\n this.externalTokenConfig.tokenValidationRequest = new RequestConfiguration(\n this.validationMethods[event].defaults\n );\n }\n}\n","<div class=\"col-md-12 p-16\">\n <div class=\"row m-l-8 m-r-8\">\n <div class=\"col-xs-12 col-sm-3 col-md-2\">\n <div class=\"h4 text-normal text-right text-left-xs\" translate>\n External token configuration\n </div>\n </div>\n\n <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9 p-0\" *ngIf=\"templateModel\">\n <div class=\"row p-l-4\">\n <div class=\"col-md-8\">\n <label\n for=\"enabled\"\n title=\"{{\n 'Allow authentication with access token from external IAM system' | translate\n }}\"\n class=\"c8y-switch\"\n >\n <input\n id=\"enabled\"\n name=\"enabled\"\n type=\"checkbox\"\n [(ngModel)]=\"externalTokenConfig.enabled\"\n />\n <span></span>\n <span class=\"control-label\">\n {{ 'Allow authentication with access token from external IAM system' | translate }}\n </span>\n </label>\n </div>\n </div>\n <ng-container *ngIf=\"externalTokenConfig.enabled\">\n <c8y-user-id-configuration\n [userIdConfig]=\"externalTokenConfig.userOrAppIdConfig\"\n [withHeader]=\"false\"\n ></c8y-user-id-configuration>\n <div class=\"row p-l-4\">\n <div class=\"col-sm-6\">\n <label\n for=\"validationRequired\"\n title=\"{{ 'Validate access token' | translate }}\"\n class=\"c8y-switch\"\n >\n <input\n id=\"validationRequired\"\n name=\"validationRequired\"\n type=\"checkbox\"\n [(ngModel)]=\"externalTokenConfig.validationRequired\"\n />\n <span></span>\n <span class=\"control-label\">{{ 'Validate access token' | translate }}</span>\n </label>\n </div>\n </div>\n <ng-container *ngIf=\"externalTokenConfig.validationRequired\">\n <div class=\"row\">\n <div class=\"col-sm-6 m-t-16 m-l-8\">\n <label for=\"validationMethod\" class=\"control-label\" translate>\n Validation method\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"validationMethod\"\n name=\"validationMethod\"\n [ngModel]=\"externalTokenConfig.validationMethod\"\n (ngModelChange)=\"onValidationMethodChange($event)\"\n >\n <option\n *ngFor=\"let validationMethod of validationMethods | keyvalue\"\n [ngValue]=\"validationMethod.key\"\n >\n {{ validationMethod.value.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <c8y-request-configuration\n [templateModel]=\"externalTokenConfig\"\n [requestName]=\"'Token validation request' | translate\"\n [requestType]=\"'tokenValidationRequest'\"\n ></c8y-request-configuration>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-6 m-l-8\">\n <c8y-form-group>\n <label\n for=\"accessTokenValidityCheckIntervalInMinutes\"\n class=\"control-label\"\n translate\n >\n Access token validation frequency\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"accessTokenValidityCheckIntervalInMinutes\"\n name=\"accessTokenValidityCheckIntervalInMinutes\"\n [(ngModel)]=\"externalTokenConfig.accessTokenValidityCheckIntervalInMinutes\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '1' }\"\n step=\"1\"\n required\n [min]=\"1\"\n />\n <span class=\"input-group-addon\" translate>minutes</span>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>\n","import { Component } from '@angular/core';\nimport { CustomConfigurationMapper } from './custom-configuration-mapper';\nimport { TemplateComponent } from './template.component';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { CustomSsoConfiguration } from './custom.model';\n\n@Component({\n selector: 'c8y-custom-template',\n templateUrl: './custom-template.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class CustomTemplateComponent extends TemplateComponent<CustomSsoConfiguration> {\n constructor(private customConfigurationMapper: CustomConfigurationMapper) {\n super(customConfigurationMapper);\n }\n}\n","<div *ngIf=\"templateModel\">\n <c8y-request-configuration\n [templateModel]=\"templateModel\"\n [requestName]=\"'Authorization request' | translate\"\n [requestType]=\"'authorizationRequest'\">\n </c8y-request-configuration>\n <hr/>\n <c8y-request-configuration\n [templateModel]=\"templateModel\"\n [requestName]=\"'Token request' | translate\"\n [requestType]=\"'tokenRequest'\">\n </c8y-request-configuration>\n <hr/>\n <c8y-request-configuration\n [templateModel]=\"templateModel\"\n [requestName]=\"'Refresh request' | translate\"\n [requestType]=\"'refreshRequest'\">\n </c8y-request-configuration>\n <hr/>\n <c8y-request-configuration\n [templateModel]=\"templateModel\"\n [requestName]=\"'Logout request' | translate\"\n [requestType]=\"'logoutRequest'\">\n </c8y-request-configuration>\n <hr/>\n <c8y-external-token-config\n [templateModel]=\"templateModel\">\n </c8y-external-token-config>\n <hr/>\n <c8y-basic-configuration\n [templateModel]=\"templateModel\">\n </c8y-basic-configuration>\n <hr/>\n <c8y-sso-access-mapping\n [templateModel]=\"templateModel\"\n [apps]=\"apps\"\n [groups]=\"groups\"\n [inventoryRoles]=\"inventoryRoles\"\n >\n </c8y-sso-access-mapping>\n <hr/>\n <c8y-sso-user-data-mapping\n [templateModel]=\"templateModel\">\n </c8y-sso-user-data-mapping>\n <hr/>\n <c8y-user-id-configuration\n [userIdConfig]=\"templateModel.userIdConfig\">\n </c8y-user-id-configuration>\n <hr/>\n <c8y-sso-signature-configuration\n [templateModel]=\"templateModel\">\n </c8y-sso-signature-configuration>\n</div>\n","import { SsoConfigurationMapper } from './sso-configuration.mapper';\nimport { KeyCloakConfiguration } from './key-cloak.model';\nimport { SsoConfiguration, TemplateType } from '../sso-configuration.model';\nimport { at, get, head, isUndefined, map, reject } from 'lodash-es';\nimport { GrantType, TenantLoginOptionType, UserManagementSource } from '@c8y/client';\nimport { RequestConfiguration } from '../template-parts/request-configuration.model';\nimport { Injectable } from '@angular/core';\nimport { ExternalToken } from '../template-parts/external-token-config.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class KeyCloakConfigurationMapper implements SsoConfigurationMapper<KeyCloakConfiguration> {\n private urlPattern = /^(.+)\\/auth\\/realms\\/((.+?))$/;\n\n mapFrom(templateModel: KeyCloakConfiguration): SsoConfiguration {\n const ssoConfiguration: SsoConfiguration = {\n template: TemplateType.KEYCLOAK,\n buttonName: templateModel.buttonName,\n userIdConfig: templateModel.userIdConfig,\n userManagementSource: UserManagementSource.REMOTE,\n type: TenantLoginOptionType.OAUTH2,\n onNewUser: templateModel.onNewUser,\n issuer: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}`,\n redirectToPlatform: templateModel.redirectToPlatform,\n providerName: 'keycloak',\n audience: templateModel.audience,\n clientId: templateModel.clientId,\n logoutRequest: templateModel.logoutRequest.toRequest(),\n visibleOnLoginPage: templateModel.visibleOnLoginPage,\n signatureVerificationConfig: {\n jwks: {\n jwksUri: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}/protocol/openid-connect/certs`\n }\n },\n tokenRequest: {\n headers: {},\n method: 'POST',\n requestParams: {},\n operation: 'EXECUTE',\n url: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}/protocol/openid-connect/token`,\n body: 'grant_type=authorization_code&code=${code}&redirect_uri=${redirectUri}&client_id=${clientId}&client_secret=${client secret}'\n },\n authorizationRequest: {\n headers: {},\n method: 'GET',\n requestParams: {\n scope: templateModel.scopeId,\n client_id: '${clientId}',\n redirect_uri: '${redirectUri}',\n response_type: 'code'\n },\n operation: 'REDIRECT',\n url: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}/protocol/openid-connect/auth`,\n body: ''\n },\n refreshRequest: {\n headers: {},\n method: 'POST',\n requestParams: {\n client_id: '${clientId}',\n redirect_uri: '${redirectUri}',\n response_type: 'refresh'\n },\n operation: 'EXECUTE',\n url: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}/protocol/openid-connect/token`,\n body:\n 'grant_type=refresh_token&refresh_token=${refreshToken}&client_id=${clientId}&client_secret=' +\n templateModel.clientSecret\n },\n grantType: GrantType.AUTHORIZATION_CODE,\n accessTokenToUserDataMappings: templateModel.accessTokenToUserDataMappings,\n externalTokenConfig: templateModel.externalTokenConfig.toExternalTokenConfig()\n };\n return ssoConfiguration;\n }\n\n mapTo(ssoConfiguration: SsoConfiguration): KeyCloakConfiguration {\n return {\n keyCloakAddress: this.getKeyCloakAddressFromUrl(ssoConfiguration.issuer),\n realmName: this.getRealmName(ssoConfiguration.issuer),\n clientId: ssoConfiguration.clientId,\n clientSecret: this.getClientSecret(ssoConfiguration),\n scopeId: this.getScopeId(ssoConfiguration),\n buttonName: ssoConfiguration.buttonName,\n userIdConfig: ssoConfiguration.userIdConfig,\n onNewUser: ssoConfiguration.onNewUser,\n redirectToPlatform: ssoConfiguration.redirectToPlatform,\n audience: ssoConfiguration.audience,\n logoutRequest: new RequestConfiguration(ssoConfiguration.logoutRequest),\n visibleOnLoginPage: ssoConfiguration.visibleOnLoginPage,\n accessTokenToUserDataMappings: ssoConfiguration.accessTokenToUserDataMappings,\n externalTokenConfig: new ExternalToken(ssoConfiguration.externalTokenConfig)\n };\n }\n\n private getKeyCloakAddressFromUrl(url) {\n const [, keyCloakAddress] = (url || '').match(this.urlPattern) || [];\n return keyCloakAddress;\n }\n\n private getRealmName(url) {\n const [, , realmName] = (url || '').match(this.urlPattern) || [];\n return realmName;\n }\n\n private getClientSecret(ssoConfiguration): string {\n const bodies = at(ssoConfiguration, ['tokenRequest.body', 'refreshRequest.body']);\n const clientSecrets = map(bodies, body => this.getClientSecretFromBody(body));\n const clientSecret = this.getFirstDefined(clientSecrets);\n return clientSecret ? decodeURIComponent(clientSecret) : '';\n }\n\n private getClientSecretFromBody(body) {\n const [, clientSecret] = (body || '').match(/client_secret=([^&]+)/) || [];\n return clientSecret;\n }\n\n private getFirstDefined(values) {\n return head(reject(values, isUndefined));\n }\n\n private getScopeId(ssoConfiguration) {\n return get(ssoConfiguration, 'authorizationRequest.requestParams.scope', '');\n }\n}\n","import { Component } from '@angular/core';\nimport { KeyCloakConfiguration } from './key-cloak.model';\nimport { TemplateComponent } from './template.component';\nimport { KeyCloakConfigurationMapper } from './key-cloak-configuration-mapper';\nimport { ControlContainer, NgForm } from '@angular/forms';\n\n@Component({\n selector: 'c8y-key-cloak-template',\n templateUrl: './key-cloak-template.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class KeyCloakTemplateComponent extends TemplateComponent<KeyCloakConfiguration> {\n constructor(private keyCloakConfigurationMapper: KeyCloakConfigurationMapper) {\n super(keyCloakConfigurationMapper);\n }\n}\n","<div *ngIf=\"templateModel\">\n <c8y-basic-configuration [templateModel]=\"templateModel\"></c8y-basic-configuration>\n <hr />\n <c8y-user-id-configuration\n [userIdConfig]=\"templateModel.userIdConfig\"\n ></c8y-user-id-configuration>\n <hr />\n <c8y-request-configuration\n [templateModel]=\"templateModel\"\n [requestName]=\"'Logout request' | translate\"\n [requestType]=\"'logoutRequest'\"\n ></c8y-request-configuration>\n <hr />\n <c8y-external-token-config [templateModel]=\"templateModel\"></c8y-external-token-config>\n <hr />\n <c8y-sso-access-mapping\n [templateModel]=\"templateModel\"\n [apps]=\"apps\"\n [groups]=\"groups\"\n [inventoryRoles]=\"inventoryRoles\"\n ></c8y-sso-access-mapping>\n <hr />\n <c8y-sso-user-data-mapping [templateModel]=\"templateModel\"></c8y-sso-user-data-mapping>\n</div>\n","import { SsoConfigurationMapper } from './sso-configuration.mapper';\nimport { AadConfiguration } from './aad.model';\nimport { SsoConfiguration, TemplateType } from '../sso-configuration.model';\nimport {\n assign,\n defaults,\n set,\n at,\n map,\n defaultsDeep,\n has,\n head,\n reject,\n isUndefined\n} from 'lodash-es';\nimport { GrantType, TenantLoginOptionType, UserManagementSource } from '@c8y/client';\nimport { SignatureConfiguration } from '../template-parts/signature-configuration.model';\nimport { Injectable } from '@angular/core';\nimport { ExternalToken } from '../template-parts/external-token-config.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AadConfigurationMapper implements SsoConfigurationMapper<AadConfiguration> {\n private defaults = {\n visibleOnLoginPage: true\n };\n\n private constants = {\n providerName: 'Azure AD',\n type: 'oauth2',\n grantType: 'AUTHORIZATION_CODE'\n };\n\n private urlPattern = /^(.+)\\/((.+?)\\/oauth2\\/authorize)$/;\n\n mapFrom(templateModel: AadConfiguration): SsoConfiguration {\n const baseUrl = `${templateModel.aadAddress}/${templateModel.tenant}/oauth2`;\n\n const ssoConfiguration: SsoConfiguration = {\n audience: templateModel.applicationId,\n clientId: templateModel.applicationId,\n logoutRequest: templateModel.redirectAfterLogout\n ? {\n method: 'POST',\n url: `${baseUrl}/logout`,\n requestParams: {\n post_logout_redirect_uri: templateModel.redirectAfterLogoutUrl\n },\n headers: {},\n body: '',\n operation: 'REDIRECT'\n }\n : {\n method: 'POST',\n headers: {},\n operation: 'REDIRECT',\n requestParams: {}\n },\n authorizationRequest: {\n method: 'GET',\n url: `${baseUrl}/authorize`,\n requestParams: {\n redirect_uri: '${redirectUri}',\n client_id: '${clientId}',\n response_type: 'code'\n },\n headers: {},\n body: '',\n operation: 'REDIRECT'\n },\n tokenRequest: {\n method: 'POST',\n url: `${baseUrl}/token`,\n requestParams: {},\n headers: {},\n body: this.getQueryString({\n grant_type: 'authorization_code',\n code: '${code}',\n redirect_uri: '${redirectUri}',\n resource: '${clientId}',\n client_id: '${clientId}',\n client_secret: encodeURIComponent(templateModel.clientSecret)\n }),\n operation: 'EXECUTE'\n },\n refreshRequest: {\n method: 'POST',\n url: `${baseUrl}/token`,\n requestParams: {},\n headers: {},\n body: this.getQueryString({\n grant_type: 'refresh_token',\n refresh_token: '${refreshToken}',\n resource: '${clientId}',\n client_id: '${clientId}',\n client_secret: encodeURIComponent(templateModel.clientSecret)\n }),\n operation: 'EXECUTE'\n },\n buttonName: templateModel.buttonName,\n providerName: 'Azure AD',\n issuer: templateModel.issuer,\n onNewUser: templateModel.onNewUser,\n accessTokenToUserDataMappings: templateModel.accessTokenToUserDataMappings,\n redirectToPlatform: templateModel.redirectToPlatform,\n template: TemplateType.AZURE,\n userIdConfig: {\n useConstantValue: false,\n jwtField: templateModel.userIdConfig.jwtField\n },\n visibleOnLoginPage: templateModel.visibleOnLoginPage,\n signatureVerificationConfig:\n templateModel.signatureVerificationConfig.toSignatureVerificationConfig(),\n userManagementSource: UserManagementSource.REMOTE,\n type: TenantLoginOptionType.OAUTH2,\n grantType: GrantType.AUTHORIZATION_CODE,\n externalTokenConfig: templateModel.externalTokenConfig.toExternalTokenConfig()\n };\n return ssoConfiguration;\n }\n\n mapTo(ssoConfiguration: SsoConfiguration): AadConfiguration {\n const applicationsId = at(ssoConfiguration, ['audience', 'clientId']);\n\n this.setupDefaults(ssoConfiguration);\n this.setupConstants(ssoConfiguration);\n this.setupAadAddressAndTenant(ssoConfiguration);\n this.setupClientSecret(ssoConfiguration);\n this.setupUserIdConfig(ssoConfiguration);\n this.setupSignatureVerificationConfig(ssoConfiguration);\n\n const aadConfiguration: AadConfiguration = {\n aadAddress: this.getAadAddressFromUrl(ssoConfiguration.authorizationRequest.url),\n tenant: this.getTenantFromUrl(ssoConfiguration.authorizationRequest.url),\n applicationId: this.getFirstDefined(applicationsId),\n redirectToPlatform: ssoConfiguration.redirectToPlatform,\n clientSecret: ssoConfiguration.authorizationRequest.requestParams.client_id,\n issuer: ssoConfiguration.issuer,\n buttonName: ssoConfiguration.buttonName,\n visibleOnLoginPage: ssoConfiguration.visibleOnLoginPage,\n redirectAfterLogout: this.getRedirectAfterLogout(ssoConfiguration),\n redirectAfterLogoutUrl: this.getRedirectAfterLogoutUrl(ssoConfiguration),\n accessTokenToUserDataMappings: ssoConfiguration.accessTokenToUserDataMappings,\n userIdConfig: {\n jwtField: ssoConfiguration.userIdConfig.jwtField\n },\n publicKeyDiscoveryUrl: ssoConfiguration.signatureVerificationConfig.aad.publicKeyDiscoveryUrl,\n signatureVerificationConfig: new SignatureConfiguration(\n ssoConfiguration.signatureVerificationConfig\n ),\n onNewUser: ssoConfiguration.onNewUser,\n externalTokenConfig: new ExternalToken(ssoConfiguration.externalTokenConfig)\n };\n return aadConfiguration;\n }\n\n setupDefaults(ssoConfiguration) {\n defaults(ssoConfiguration, this.defaults);\n }\n\n setupConstants(ssoConfiguration) {\n assign(ssoConfiguration, this.constants);\n }\n\n setupAadAddressAndTenant(ssoConfiguration) {\n const urls = at(ssoConfiguration, [\n 'authorizationRequest.url',\n 'tokenRequest.url',\n 'refreshRequest.url'\n ]);\n\n const aadAddresses = map(urls, url => this.getAadAddressFromUrl(url));\n set(ssoConfiguration, 'aadAddress', this.getFirstDefined(aadAddresses));\n\n const tenants = map(urls, url => this.getTenantFromUrl(url));\n set(ssoConfiguration, 'tenant', this.getFirstDefined(tenants));\n }\n\n getAadAddressFromUrl(url) {\n const [, aadAddress] = (url || '').match(this.urlPattern) || [];\n return aadAddress;\n }\n\n getTenantFromUrl(url) {\n const [, , , tenant] = (url || '').match(this.urlPattern) || [];\n return tenant;\n }\n\n setupClientSecret(ssoConfiguration) {\n const bodies = at(ssoConfiguration, ['tokenRequest.body', 'refreshRequest.body']);\n const clientSecrets = map(bodies, body => this.getClientSecretFromBody(body));\n set(ssoConfiguration, 'clientSecret', this.getFirstDefined(clientSecrets));\n }\n\n getClientSecretFromBody(body) {\n const [, clientSecret] = (body || '').match(/client_secret=([^&]+)/) || [];\n return decodeURIComponent(clientSecret);\n }\n\n setupUserIdConfig(ssoConfiguration) {\n defaultsDeep(ssoConfiguration, { userIdConfig: { jwtField: 'upn' } });\n set(ssoConfiguration, 'userIdConfig.useConstantValue', false);\n }\n\n setupSignatureVerificationConfig(ssoConfiguration) {\n defaultsDeep(ssoConfiguration, { signatureVerificationConfig: { aad: {} } });\n }\n\n getRedirectAfterLogout(ssoConfiguration): boolean {\n return has(ssoConfiguration, 'logoutRequest.requestParams.post_logout_redirect_uri')\n ? true\n : false;\n }\n\n getRedirectAfterLogoutUrl(ssoConfiguration): string {\n return ssoConfiguration.logoutRequest.requestParams.post_logout_redirect_uri\n ? ssoConfiguration.logoutRequest.requestParams.post_logout_redirect_uri\n : null;\n }\n\n getFirstDefined(values) {\n return head(reject(values, isUndefined));\n }\n\n getQueryString(params) {\n return map(params, (value, key) => `${key}=${value}`).join('&');\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\n\n@Component({\n selector: 'c8y-sso-logout-configuration',\n templateUrl: './logout-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class LogoutConfigurationComponent {\n @Input() templateModel;\n}\n","<div class=\"col-md-12 p-t-16\">\n <div class=\"row m-l-8 m-r-8\">\n <div class=\"col-xs-12 col-sm-3 col-md-2\">\n <div class=\"h4 text-normal text-right text-left-xs\" translate>Logout configuration</div>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\">\n <c8y-form-group>\n <label\n for=\"redirectAfterLogout\"\n title=\"{{ 'Redirect after logout' | translate }}\"\n class=\"c8y-switch\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"templateModel.redirectAfterLogout\"\n name=\"redirectAfterLogout\"\n id=\"redirectAfterLogout\"\n />\n <span></span>\n <span class=\"control-label\">{{ 'Redirect after logout' | translate }}</span>\n </label>\n </c8y-form-group>\n\n <c8y-form-group *ngIf=\"templateModel.redirectAfterLogout\">\n <label for=\"redirectAfterLogoutUrl\" class=\"control-label\" translate>Redirect URL</label>\n <input\n class=\"form-control\"\n name=\"redirectAfterLogoutUrl\"\n id=\"redirectAfterLogoutUrl\"\n type=\"url\"\n [(ngModel)]=\"templateModel.redirectAfterLogoutUrl\"\n placeholder=\"{{ 'e.g. https://my-tenant.cumulocity.com/apps/cockpit' | translate }}\"\n c8yDefaultValidation=\"httpUrl\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n</div>\n","import { Component } from '@angular/core';\nimport { TemplateComponent } from './template.component';\nimport { AadConfigurationMapper } from './aad-configuration-mapper';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { AadConfiguration } from './aad.model';\n\n@Component({\n selector: 'c8y-aad-template',\n templateUrl: './aad-template.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class AadTemplateComponent extends TemplateComponent<AadConfiguration> {\n constructor(private aadConfigurationMapper: AadConfigurationMapper) {\n super(aadConfigurationMapper);\n }\n}\n","<div *ngIf=\"templateModel\">\n <c8y-basic-configuration [templateModel]=\"templateModel\"></c8y-basic-configuration>\n <hr />\n <c8y-sso-logout-configuration [templateModel]=\"templateModel\"></c8y-sso-logout-configuration>\n <hr />\n <c8y-external-token-config [templateModel]=\"templateModel\"></c8y-external-token-config>\n <hr />\n <c8y-sso-access-mapping\n [templateModel]=\"templateModel\"\n [apps]=\"apps\"\n [groups]=\"groups\"\n [inventoryRoles]=\"inventoryRoles\"\n ></c8y-sso-access-mapping>\n <hr />\n <c8y-sso-user-data-mapping [templateModel]=\"templateModel\"></c8y-sso-user-data-mapping>\n <hr />\n <c8y-user-id-configuration\n [userIdConfig]=\"templateModel.userIdConfig\"\n ></c8y-user-id-configuration>\n <hr />\n <c8y-sso-signature-configuration\n [templateModel]=\"templateModel\"\n ></c8y-sso-signature-configuration>\n</div>\n","import { Component, EventEmitter, OnInit } from '@angular/core';\nimport {\n ApplicationService,\n UserGroupService,\n IApplication,\n IUserGroup,\n TenantLoginOptionType,\n InventoryRoleService,\n IIdentified\n} from '@c8y/client';\nimport {\n gettext,\n AlertService,\n ModalService,\n Status,\n LoginService,\n AppStateService,\n TenantUiService\n} from '@c8y/ngx-components';\nimport { BehaviorSubject, forkJoin, Subscription, Subject } from 'rxjs';\nimport { shareReplay, tap, switchMap } from 'rxjs/operators';\nimport { SsoConfiguration, TemplateType, templateTypeConfig } from './sso-configuration.model';\nimport { SsoConfigurationService } from './sso-configuration.service';\n\n@Component({\n selector: 'c8y-sso-configuration',\n templateUrl: './sso-configuration.component.html'\n})\nexport class SsoConfigurationComponent implements OnInit {\n apps: IApplication[];\n groups: IUserGroup[];\n inventoryRoles: IIdentified[];\n ssoConfiguration: SsoConfiguration;\n\n templateType = TemplateType;\n templateTypeConfig = templateTypeConfig;\n\n reloading$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n reload: EventEmitter<void> = new EventEmitter();\n saveSubject: Subject<void> = new Subject();\n\n private dataSubscription: Subscription;\n\n private data$: any = this.reload.pipe(\n tap(() => this.reloading$.next(true)),\n switchMap(() =>\n forkJoin({\n ssoConfiguration: this.ssoConfigurationService.getSsoConfiguration$(),\n apps: this.getApplications(),\n groups: this.getGroups(),\n inventoryRoles: this.getInventoryRoles()\n })\n ),\n tap(() => this.reloading$.next(false)),\n shareReplay(1)\n );\n\n constructor(\n private ssoConfigurationService: SsoConfigurationService,\n private applicationService: ApplicationService,\n private userGroupService: UserGroupService,\n private inventoryRoleService: InventoryRoleService,\n private alertService: AlertService,\n private modalService: ModalService,\n private loginService: LoginService,\n private appStateService: AppStateService,\n private tenantUiService: TenantUiService\n ) {}\n\n ngOnInit(): void {\n this.dataSubscription = this.data$.subscribe(\n ({ ssoConfiguration, apps, groups, inventoryRoles }) => {\n this.apps = apps;\n this.groups = groups;\n this.inventoryRoles = inventoryRoles;\n this.ssoConfiguration = ssoConfiguration;\n }\n );\n this.loadSsoConfiguration();\n }\n\n ngOnDestroy(): void {\n this.dataSubscription.unsubscribe();\n }\n\n loadSsoConfiguration() {\n this.reload.next();\n }\n\n async save(ssoConfiguration) {\n try {\n await this.warnAboutForceUsersLogOut();\n const logoutRequired =\n this.tenantUiService.getCurrentUserLoginMode() !== TenantLoginOptionType.BASIC;\n if (logoutRequired) {\n await this.modalService.confirmLogout();\n }\n await this.ssoConfigurationService.save(ssoConfiguration);\n if (logoutRequired) {\n await this.loginService.logout(true);\n } else {\n this.alertService.success(gettext('Configuration saved.'));\n }\n } catch (ex) {\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n private getApplications(): Promise<void | IApplication[]> {\n return this.applicationService.list({ pageSize: 100 }).then(\n res => res.data,\n error => this.alertService.addServerFailure(error)\n );\n }\n\n private getGroups(): Promise<void | IUserGroup[]> {\n return this.userGroupService.list({ pageSize: 100 }).then(\n res => res.data,\n error => this.alertService.addServerFailure(error)\n );\n }\n\n private getInventoryRoles(): Promise<void | IIdentified[]> {\n return this.inventoryRoleService.list({ pageSize: 100 }).then(\n res => res.data,\n error => this.alertService.addServerFailure(error)\n );\n }\n\n private async warnAboutForceUsersLogOut() {\n const modalLabels = { ok: gettext('Update and log out users'), cancel: gettext('Cancel') };\n const modalBody = gettext(\n 'Updating SSO configuration will log out all users logged with \"OAI-Secure\" or \"Single sign-on redirect\". Do you want to proceed?'\n );\n return await this.modalService.confirm(\n gettext('Force users to log out'),\n modalBody,\n Status.WARNING,\n modalLabels\n );\n }\n}\n","<c8y-title>{{ 'Single sign-on' | translate }}</c8y-title>\n<c8y-breadcrumb>\n <c8y-breadcrumb-item [label]=\"'Settings' | translate\" [icon]=\"'cog'\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [icon]=\"'cog'\" [label]=\"'Single sign-on' | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n (click)=\"loadSsoConfiguration()\"\n >\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading$ | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form hidden-xs\">\n <div title=\"{{ 'Template' | translate }}\" class=\"form-group\">\n <label for=\"template\" class=\"control-label\">\n {{ 'Template' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n *ngIf=\"ssoConfiguration\"\n name=\"template\"\n id=\"template\"\n [(ngModel)]=\"ssoConfiguration.template\"\n >\n <option\n *ngFor=\"let templateType of templateTypeConfig | keyvalue\"\n [ngValue]=\"templateType.key\"\n >\n {{ templateType.value.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n</c8y-action-bar-item>\n\n<div class=\"row\">\n <div class=\"col-lg-12 col-lg-max\">\n <form class=\"card card--fullpage\" #ssoConfigurationForm=\"ngForm\" novalidate>\n <div class=\"card-header separator\">\n <div class=\"card-title\">\n {{ 'Single sign-on' | translate }}\n </div>\n </div>\n\n <div class=\"inner-scroll\">\n <div class=\"card-block p-0\" *ngIf=\"ssoConfiguration\">\n <c8y-custom-template\n *ngIf=\"ssoConfiguration.template === templateType.CUSTOM\"\n [ssoConfiguration]=\"ssoConfiguration\"\n [ssoConfigurationChangeTrigger]=\"saveSubject.asObservable()\"\n (ssoConfigurationChange)=\"save($event)\"\n [apps]=\"apps\"\n [groups]=\"groups\"\n [inventoryRoles]=\"inventoryRoles\"\n ></c8y-custom-template>\n\n <c8y-aad-template\n *ngIf=\"ssoConfiguration.template === templateType.AZURE\"\n [ssoConfiguration]=\"ssoConfiguration\"\n [ssoConfigurationChangeTrigger]=\"saveSubject.asObservable()\"\n (ssoConfigurationChange)=\"save($event)\"\n [apps]=\"apps\"\n [groups]=\"groups\"\n [inventoryRoles]=\"inventoryRoles\"\n ></c8y-aad-template>\n\n <c8y-key-cloak-template\n *ngIf=\"ssoConfiguration.template === templateType.KEYCLOAK\"\n [ssoConfiguration]=\"ssoConfiguration\"\n [ssoConfigurationChangeTrigger]=\"saveSubject.asObservable()\"\n (ssoConfigurationChange)=\"save($event)\"\n [apps]=\"apps\"\n [groups]=\"groups\"\n [inventoryRoles]=\"inventoryRoles\"\n ></c8y-key-cloak-template>\n </div>\n </div>\n <div class=\"card-footer separator\">\n <button\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n class=\"btn btn-primary\"\n (click)=\"saveSubject.next()\"\n [disabled]=\"!ssoConfigurationForm.form.valid || ssoConfigurationForm.form.pristine\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </form>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { CanActivate } from '@angular/router';\nimport { of, Observable } from 'rxjs';\nimport { catchError, mapTo } from 'rxjs/operators';\nimport { SsoConfigurationService } from './sso-configuration.service';\n\n@Injectable()\nexport class SsoConfigurationGuard implements CanActivate {\n constructor(private ssoConfigurationService: SsoConfigurationService) {}\n\n canActivate(): Observable<boolean> {\n return this.ssoConfigurationService.getSsoConfiguration$().pipe(\n mapTo(true),\n catchError(() => of(false))\n );\n }\n}\n","import { NgModule } from '@angular/core';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { SsoConfigurationComponent } from './sso-configuration.component';\nimport { CoreModule, hookRoute } from '@c8y/ngx-components';\nimport { SsoConfigurationService } from './sso-configuration.service';\nimport { BsDatepickerModule } from 'ngx-bootstrap/datepicker';\nimport { DatePipe } from '@angular/common';\nimport { CustomTemplateComponent } from './templates/custom-template.component';\nimport { KeyCloakTemplateComponent } from './templates/key-cloak-template.component';\nimport { BasicConfigurationComponent } from './template-parts/basic-configuration.component';\nimport { RequestConfigurationComponent } from './template-parts/request-configuration.component';\nimport { UserIdConfigurationComponent } from './template-parts/user-id-configuration.component';\nimport { UserDataMappingComponent } from './template-parts/user-data-mapping.component';\nimport { AccessMappingComponent } from './template-parts/access-mapping/access-mapping.component';\nimport { DynamicAccessMappingComponent } from './template-parts/access-mapping/dynamic-access-mapping.component';\nimport { SignatureConfigurationComponent } from './template-parts/signature-configuration.component';\nimport { AadTemplateComponent } from './templates/aad-template.component';\nimport { LogoutConfigurationComponent } from './template-parts/logout-configuration.component';\nimport { AuthConfigurationGuard } from '../auth-configuration.guard';\nimport { CustomConfigurationMapper } from './templates/custom-configuration-mapper';\nimport { KeyCloakConfigurationMapper } from './templates/key-cloak-configuration-mapper';\nimport { AadConfigurationMapper } from './templates/aad-configuration-mapper';\nimport { SsoConfigurationGuard } from './sso-configuration.guard';\nimport { ExternalTokenConfigComponent } from './template-parts/external-token-config.component';\nimport { ChildPredicatesComponent } from './template-parts/access-mapping/child-predicates.component';\nimport { InventoryRolesMappingComponent } from './template-parts/access-mapping/inventory-roles-mapping.component';\nimport { InventoryRolesModalComponent } from './template-parts/access-mapping/inventory-roles-modal.component';\nimport { AssetSelectorModule } from '@c8y/ngx-components/assets-navigator';\n\n@NgModule({\n declarations: [\n SsoConfigurationComponent,\n CustomTemplateComponent,\n KeyCloakTemplateComponent,\n AadTemplateComponent,\n BasicConfigurationComponent,\n RequestConfigurationComponent,\n UserIdConfigurationComponent,\n UserDataMappingComponent,\n AccessMappingComponent,\n DynamicAccessMappingComponent,\n SignatureConfigurationComponent,\n LogoutConfigurationComponent,\n ChildPredicatesComponent,\n InventoryRolesMappingComponent,\n InventoryRolesModalComponent,\n ExternalTokenConfigComponent\n ],\n imports: [CoreModule, TooltipModule, PopoverModule, BsDatepickerModule, AssetSelectorModule],\n exports: [SsoConfigurationComponent],\n providers: [\n SsoConfigurationGuard,\n DatePipe,\n SsoConfigurationService,\n AadConfigurationMapper,\n CustomConfigurationMapper,\n KeyCloakConfigurationMapper,\n hookRoute({\n path: 'auth-configuration/single_sign-on',\n component: SsoConfigurationComponent,\n canActivate: [AuthConfigurationGuard, SsoConfigurationGuard]\n })\n ]\n})\nexport class SsoConfigurationModule {}\n","import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { gettext, Tab, TabFactory } from '@c8y/ngx-components';\nimport { SsoConfigurationService } from '../sso-configuration/sso-configuration.service';\nimport { catchError, mapTo, mergeAll, toArray } from 'rxjs/operators';\nimport { Observable, of, EMPTY, merge } from 'rxjs';\n\n@Injectable()\nexport class TabsFactory implements TabFactory {\n constructor(public router: Router, private ssoConfigurationService: SsoConfigurationService) {}\n get(): Observable<Tab[]> {\n if (!this.router.url.match(/auth-configuration/g)) {\n return of([]);\n }\n\n const basicSettingsTab$ = of({\n path: 'auth-configuration/basic_settings',\n label: gettext('Basic settings'),\n icon: 'unlock-alt',\n priority: 1100,\n orientation: 'horizontal'\n } as Tab);\n const ssoTab$ = this.ssoConfigurationService.getSsoConfiguration$().pipe(\n mapTo({\n path: 'auth-configuration/single_sign-on',\n label: gettext('Single sign-on'),\n icon: 'sign-in',\n priority: 1050,\n orientation: 'horizontal'\n } as Tab),\n catchError(() => EMPTY)\n );\n return merge([basicSettingsTab$, ssoTab$]).pipe(mergeAll(), toArray());\n }\n}\n","import { Injectable } from '@angular/core';\nimport { gettext, NavigatorNode, NavigatorNodeFactory, Permissions } from '@c8y/ngx-components';\n\n@Injectable()\nexport class NavigationFactory implements NavigatorNodeFactory {\n navs: NavigatorNode[] = [];\n\n constructor(private permissions: Permissions) {}\n\n async get() {\n const userHasPermission = this.permissions.hasAnyRole([\n 'ROLE_TENANT_ADMIN',\n 'ROLE_TENANT_MANAGEMENT_ADMIN'\n ]);\n if (this.navs.length === 0 && userHasPermission) {\n this.navs.push(\n new NavigatorNode({\n label: gettext('Authentication'),\n icon: 'c8y-shield',\n path: '/auth-configuration',\n parent: gettext('Settings'),\n routerLinkExact: false,\n priority: 2000\n })\n );\n }\n return this.navs;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { BasicSettingsModule } from './basic-settings/basic-settings.module';\nimport { SsoConfigurationModule } from './sso-configuration/sso-configuration.module';\nimport { hookNavigator, hookRoute, hookTab } from '@c8y/ngx-components';\nimport { TabsFactory } from './factories/tabs.factory';\nimport { NavigationFactory } from './factories/navigation.factory';\nimport { AuthConfigurationGuard } from './auth-configuration.guard';\n\n@NgModule({\n imports: [BasicSettingsModule, SsoConfigurationModule],\n providers: [\n AuthConfigurationGuard,\n hookTab(TabsFactory),\n hookNavigator(NavigationFactory),\n hookRoute({\n path: 'auth-configuration',\n redirectTo: 'auth-configuration/basic_settings',\n pathMatch: 'full'\n })\n ]\n})\nexport class AuthConfigurationModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3","i3.TenantLoginOptionMapper","i4","i5","i1.AuthConfigurationService","i6.SessionConfigurationComponent","i7.LoginSettingsComponent","i8.BasicAuthSettingsComponent","i9.TfaSettingsComponent","i1.SsoConfigurationMapper","map","i3.ChildPredicatesComponent","i4.ChildPredicatesComponent","i5.DynamicAccessMappingComponent","i6.InventoryRolesMappingComponent","i4.RequestConfigurationComponent","i5.UserIdConfigurationComponent","i1.CustomConfigurationMapper","i3.BasicConfigurationComponent","i6.UserDataMappingComponent","i7.AccessMappingComponent","i8.SignatureConfigurationComponent","i9.ExternalTokenConfigComponent","i10","i1.KeyCloakConfigurationMapper","i8.ExternalTokenConfigComponent","i9","i1.AadConfigurationMapper","i4.UserIdConfigurationComponent","i5.UserDataMappingComponent","i6.AccessMappingComponent","i7.SignatureConfigurationComponent","i8.LogoutConfigurationComponent","i1.SsoConfigurationService","i6.CustomTemplateComponent","i7.KeyCloakTemplateComponent","i8.AadTemplateComponent","i2.SsoConfigurationService"],"mappings":"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"}