{"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/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/templates/sso-configuration.mapper.ts","../../auth-configuration/sso-configuration/templates/template.component.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/paginated-list-group.component.ts","../../auth-configuration/sso-configuration/template-parts/access-mapping/paginated-list-group.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/pattern-messages.data.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  standalone: false\n})\nexport class BasicAuthSettingsComponent {\n  @Input()\n  authConfiguration: AuthConfiguration;\n\n  preferredLoginOptionType: TenantLoginOptionType = TenantLoginOptionType.BASIC;\n\n  tenantLoginOptionTypeEnum = TenantLoginOptionType;\n\n  constructor(private controlContainer: ControlContainer) {}\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    this.controlContainer.control.markAsDirty();\n  }\n\n  trustedUserAgentsRemove(id) {\n    this.authenticationRestrictions.trustedUserAgents = this.remove(\n      this.authenticationRestrictions.trustedUserAgents,\n      id\n    );\n    this.controlContainer.control.markAsDirty();\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            data-cy=\"c8y-basic-auth--forbidden-agent\"\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            data-cy=\"c8y-basic-auth--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';\n\nimport { Permissions } from '@c8y/ngx-components';\n\n@Injectable()\nexport class AuthConfigurationGuard {\n  constructor(private permissions: Permissions) {}\n\n  canActivate(): boolean {\n    return this.permissions.hasAnyRole([\n      Permissions.ROLE_TENANT_ADMIN,\n      Permissions.ROLE_TENANT_MANAGEMENT_ADMIN\n    ]);\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  TenantService,\n  TfaStrategy,\n  UserManagementSource\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    new TypedOption('configuration', 'tenant.login.ignore-case', 'boolean', false)\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      const fixedOption = this.fixTfaStrategy(tenantOption);\n      if (fixedOption) {\n        return fixedOption;\n      }\n      return 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 forkJoin([\n      this.getLoginOption(TenantLoginOptionType.OAUTH2),\n      this.getLoginOption(TenantLoginOptionType.BASIC),\n      this.getLoginOption(TenantLoginOptionType.OAUTH2_INTERNAL)\n    ]).pipe(map(loginOptions => loginOptions.filter(loginOption => !!loginOption)));\n  }\n\n  private getLoginOption(\n    tenantLoginOptionType: TenantLoginOptionType\n  ): Observable<ITenantLoginOption> {\n    return from(this.tenantLoginOptionsService.detail(tenantLoginOptionType)).pipe(\n      map(res => res.data),\n      catchError(() =>\n        tenantLoginOptionType !== TenantLoginOptionType.OAUTH2\n          ? of(this.getDefaultLoginOption(tenantLoginOptionType))\n          : of(null)\n      )\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 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  /**\n   * Returns a promise or null.\n   * This method is needed now, because simply changing TFA strategy tenant option does not trigger all the necessary backend logic to apply the change, therefore, we need to call tenant's `/tfa` endpoint, which applies the change for all users in the tenant.\n   * Within MTM-50490, we're going to simplify the process further by replacing multiple requests with one new endpoint that will handle saving of all authentication settings.\n   */\n  private fixTfaStrategy(option: ITenantOption): Promise<IResult<null>> {\n    if (option.category === 'two-factor-authentication' && option.key === 'strategy') {\n      const strategy: TfaStrategy = option.value === 'SMS' ? TfaStrategy.SMS : TfaStrategy.TOTP;\n      return this.tenantService.updateTfaStrategy(this.tenantUiService.currentTenant, strategy);\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  standalone: false\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  standalone: false\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  IGNORE_CASE_SENSITIVITY_POPOVER = gettext(\n    'If selected, the letter case of the username does not matter during login.'\n  );\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  get tenantLoginIgnoreCase() {\n    return this.authConfiguration.tenantOptions['configuration']['tenant.login.ignore-case'];\n  }\n\n  set tenantLoginIgnoreCase(value) {\n    this.authConfiguration.tenantOptions['configuration']['tenant.login.ignore-case'] = value;\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' | translate }}\"\n              class=\"c8y-switch\"\n            >\n              <input\n                type=\"checkbox\"\n                name=\"passwordEnforceStrength\"\n                data-cy=\"c8y-form-group--password-enforce-toggle-btn\"\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 class=\"row\">\n      <div class=\"col-sm-6\">\n        <c8y-form-group>\n          <label\n            title=\"{{ 'Ignore case when logging in' | translate }}\"\n            data-cy=\"c8y-authentication-configuration--ignore-case-when-logging-in\"\n            class=\"c8y-switch\"\n          >\n            <input\n              type=\"checkbox\"\n              name=\"tenantLoginIgnoreCase\"\n              [(ngModel)]=\"tenantLoginIgnoreCase\"\n            />\n            <span></span>\n            <span>{{ 'Ignore case when logging in' | translate }}</span>\n            <button\n              class=\"btn-help btn-help--sm\"\n              type=\"button\"\n              [attr.aria-label]=\"'Help' | translate\"\n              popover=\"{{ IGNORE_CASE_SENSITIVITY_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>\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  standalone: false\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, ModalService, SimplifiedAuthService } from '@c8y/ngx-components';\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  standalone: false\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 modalService: ModalService,\n    private authService: SimplifiedAuthService,\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.authService.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    [icon]=\"'cog'\"\n    [label]=\"'Settings' | translate\"\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\n    class=\"btn btn-link\"\n    title=\"{{ 'Reload' | translate }}\"\n    (click)=\"loadAuthConfig()\"\n  >\n    <i\n      c8yIcon=\"refresh\"\n      [ngClass]=\"{ 'icon-spin': reloading$ | async }\"\n    ></i>\n    {{ 'Reload' | translate }}\n  </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/docs/authentication/basic-settings/#basic-settings\"></c8y-help>\n\n<form\n  class=\"card card--fullpage\"\n  #authConfigurationForm=\"ngForm\"\n  novalidate\n>\n  <div class=\"card-header separator\">\n    <div class=\"card-title\">\n      {{ 'Authentication' | translate }}\n    </div>\n  </div>\n  <div\n    class=\"inner-scroll\"\n    *ngIf=\"authConfiguration\"\n  >\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      class=\"btn btn-primary\"\n      title=\"{{ 'Save' | translate }}\"\n      type=\"submit\"\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 SSORequestParams {\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  mapFromIdToken: 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 SSORequest {\n  body?: string;\n  headers: Headers;\n  method: string;\n  operation: string;\n  requestParams: SSORequestParams;\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?: SSORequest;\n  accessTokenValidityCheckIntervalInMinutes?: number;\n}\n\nexport interface SsoConfiguration extends ITenantLoginOption {\n  accessTokenToUserDataMappings: AccessTokenToUserDataMappings;\n  audience: string;\n  authorizationRequest: SSORequest;\n  buttonName: string;\n  clientId: string;\n  id?: string;\n  issuer: string;\n  logoutRequest: SSORequest;\n  onNewUser: OnNewUser;\n  providerName: string;\n  redirectToPlatform: string;\n  refreshRequest: SSORequest;\n  self?: string;\n  signatureVerificationConfig: SignatureVerificationConfig;\n  template: TemplateType;\n  tokenRequest: SSORequest;\n  userIdConfig: UserIdConfig;\n  visibleOnLoginPage: boolean;\n  externalTokenConfig?: ExternalTokenConfig;\n  useIdToken: boolean;\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          mapFromIdToken: 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    useIdToken: false\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 { SSORequestParams, Headers, SSORequest } 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: SSORequest) {\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(): SSORequest {\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 SSORequest;\n  }\n}\n\n// tslint:disable-next-line:max-classes-per-file\nexport class RequestConfigurationDynamicArray extends Array {\n  constructor(obj: SSORequestParams | 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  SSORequest,\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: SSORequest = {\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 || null,\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      useIdToken: templateModel.useIdToken\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      useIdToken: ssoConfiguration.useIdToken\n    };\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  standalone: false\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 { Component, Input, OnChanges } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { memoize } from '@c8y/ngx-components';\nimport { TenantService } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components';\n\n@Component({\n  selector: 'c8y-basic-configuration',\n  templateUrl: './basic-configuration.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  standalone: false\n})\nexport class BasicConfigurationComponent implements OnChanges {\n  @Input() templateModel;\n\n  REDIRECT_TO_THE_USER_INTERFACE_APPLICATION_TOOLTIP = gettext(\n    \"The redirect URL is automatically set to the application used by the user. In case of an error, it will be correctly displayed on the application's page.\"\n  );\n\n  redirectToPlatformWarningParams: { defaultRedirectUrl: string; host?: string };\n  flowControlledByUI = false;\n  redirectToPlatform = '';\n\n  constructor(private tenantService: TenantService) {}\n\n  @memoize()\n  shouldShow(field: string) {\n    return field in this.templateModel;\n  }\n\n  async ngOnChanges() {\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    this.redirectToPlatform = this.templateModel.redirectToPlatform || '';\n    this.flowControlledByUI = !this.templateModel.redirectToPlatform;\n  }\n}\n","<fieldset class=\"p-24\">\n  <div class=\"row\">\n    <div class=\"col-xs-12 col-sm-3 col-md-2 m-b-xs-8\">\n      <div\n        class=\"h4 text-normal text-right text-left-xs\"\n        translate\n      >\n        Basic\n      </div>\n    </div>\n\n    <div\n      class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\"\n      *ngIf=\"templateModel\"\n    >\n      <div class=\"row\">\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('keyCloakAddress')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"keyCloakAddress\"\n              translate\n            >\n              Keycloak address\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"keyCloakAddress\"\n              name=\"keyCloakAddress\"\n              type=\"url\"\n              required\n              [(ngModel)]=\"templateModel.keyCloakAddress\"\n              [placeholder]=\"'e.g. {{ example }}' | translate : { example: 'https://example.de' }\"\n            />\n          </c8y-form-group>\n        </div>\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('aadAddress')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"aadAddress\"\n              translate\n            >\n              Azure AD address\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"aadAddress\"\n              name=\"aadAddress\"\n              type=\"url\"\n              required\n              [(ngModel)]=\"templateModel.aadAddress\"\n              [placeholder]=\"\n                'e.g. {{ example }}' | translate : { example: 'https://login.microsoftonline.de' }\n              \"\n            />\n          </c8y-form-group>\n        </div>\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('tenant')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"tenant\"\n              translate\n            >\n              Tenant\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"tenant\"\n              name=\"tenant\"\n              required\n              [(ngModel)]=\"templateModel.tenant\"\n              [placeholder]=\"'e.g. {{ example }}' | translate : { example: 'c8y.onmicrosoft.de' }\"\n            />\n          </c8y-form-group>\n        </div>\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('applicationId')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"applicationId\"\n              translate\n            >\n              Application ID\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"applicationId\"\n              name=\"applicationId\"\n              required\n              [(ngModel)]=\"templateModel.applicationId\"\n            />\n          </c8y-form-group>\n        </div>\n\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('realmName')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"realmName\"\n              translate\n            >\n              Realm name\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"realmName\"\n              name=\"realmName\"\n              required\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\n              class=\"control-label\"\n              for=\"redirectToPlatform\"\n            >\n              {{ 'Redirect URL' | translate }}\n              <button\n                class=\"btn-help\"\n                [attr.aria-label]=\"'Help' | translate\"\n                [popover]=\"helpContent\"\n                placement=\"bottom\"\n                triggers=\"focus\"\n                type=\"button\"\n                [adaptivePosition]=\"false\"\n                *ngIf=\"\n                  !flowControlledByUI &&\n                  redirectToPlatformWarningParams &&\n                  templateModel.redirectToPlatform !=\n                    redirectToPlatformWarningParams.defaultRedirectUrl\n                \"\n              ></button>\n              <ng-template #helpContent>\n                <span\n                  ngNonBindable\n                  translate\n                  [translateParams]=\"redirectToPlatformWarningParams\"\n                >\n                  For correct application behavior you can use only \"{{ host }}\" or \"{{\n                    defaultRedirectUrl\n                  }}\", the latter one is recommended.\n                </span>\n              </ng-template>\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"redirectToPlatform\"\n              name=\"redirectToPlatform\"\n              type=\"url\"\n              [required]=\"!flowControlledByUI\"\n              [disabled]=\"flowControlledByUI\"\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            />\n          </c8y-form-group>\n        </div>\n        <div class=\"col-sm-6\">\n          <div\n            class=\"form-group\"\n          >\n            <label\n              class=\"c8y-switch m-t-24\"\n              title=\"{{ 'Redirect to the user interface application`SSO authentication`' | translate }}\"\n              for=\"flowControlledByUI\"\n            >\n              <input\n                type=\"checkbox\"\n                name=\"flowControlledByUI\"\n                id=\"flowControlledByUI\"\n                [(ngModel)]=\"flowControlledByUI\"\n                (change)=\"templateModel.redirectToPlatform = flowControlledByUI ? '' : redirectToPlatform\"\n              />\n              <span></span>\n              <span class=\"control-label\">{{ 'Redirect to the user interface application`SSO authentication`' | translate }}</span>\n              <button\n                type=\"button\"\n                class=\"btn-help\"\n                [attr.aria-label]=\"'Help' | translate\"\n                popover=\"{{ REDIRECT_TO_THE_USER_INTERFACE_APPLICATION_TOOLTIP | translate }}\"\n                placement=\"right\"\n                triggers=\"focus\"\n                container=\"body\"\n              ></button>\n            </label>\n          </div>\n        </div>\n        <div class=\"col-sm-12\">\n          <div *ngIf=\"flowControlledByUI && redirectToPlatform != ''\">\n            <div class=\"alert alert-warning max-width-100 m-b-32\"\n                 ngNonBindable\n                 translate\n                 [translateParams]=\"{\n                      redirectURI: '<tenant_domain>/apps/*'\n                    }\">\n              Make sure that \"Valid Redirect URIs\" in the authorization server is set to \"{{ redirectURI }}\" or to the full URIs of the used applications if the authorization server does not support patterns.\n            </div>\n          </div>\n          <div *ngIf=\"!flowControlledByUI && redirectToPlatform === ''\">\n            <div class=\"alert alert-warning max-width-100 m-b-32\"\n                 ngNonBindable\n                 translate\n                 [translateParams]=\"{\n                      redirectURI: '<tenant_domain>/tenant/oauth'\n                    }\">\n              Make sure that \"Valid Redirect URIs\" in the authorization server is set to \"{{ redirectURI }}\".\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('clientSecret')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"clientSecret\"\n              translate\n            >\n              Client secret\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"clientSecret\"\n              name=\"clientSecret\"\n              required\n              [(ngModel)]=\"templateModel.clientSecret\"\n            />\n          </c8y-form-group>\n        </div>\n\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('clientId')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"clientId\"\n              translate\n            >\n              Client ID\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"clientId\"\n              name=\"clientId\"\n              required\n              [(ngModel)]=\"templateModel.clientId\"\n              [placeholder]=\"\n                'e.g. {{ example }}' | translate : { example: '254234981c-78a8-4588…' }\n              \"\n            />\n          </c8y-form-group>\n        </div>\n\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('issuer')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"issuer\"\n              translate\n            >\n              Token issuer\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"issuer\"\n              name=\"issuer\"\n              required\n              [(ngModel)]=\"templateModel.issuer\"\n              [placeholder]=\"\n                'e.g. {{ example }}'\n                  | translate : { example: 'https://login.microsoftonline.de/237652-3727' }\n              \"\n            />\n          </c8y-form-group>\n        </div>\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('scopeId')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"scopeId\"\n              translate\n            >\n              Scope ID\n            </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            />\n          </c8y-form-group>\n        </div>\n\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('buttonName')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"buttonName\"\n              translate\n            >\n              Button name\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"buttonName\"\n              name=\"buttonName\"\n              required\n              [(ngModel)]=\"templateModel.buttonName\"\n              [placeholder]=\"'e.g. Log in with Azure AD' | translate\"\n            />\n          </c8y-form-group>\n        </div>\n\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('providerName')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"providerName\"\n              translate\n            >\n              Provider name\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"providerName\"\n              name=\"providerName\"\n              required\n              [(ngModel)]=\"templateModel.providerName\"\n              [placeholder]=\"'e.g. {{ example }}' | translate : { example: 'Azure AD' }\"\n            />\n          </c8y-form-group>\n        </div>\n\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('audience')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"audience\"\n              translate\n            >\n              Audience\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"audience\"\n              name=\"audience\"\n              required\n              [(ngModel)]=\"templateModel.audience\"\n              [placeholder]=\"\n                'e.g. {{ example }}' | translate : { example: 'https://test.example.com' }\n              \"\n            />\n          </c8y-form-group>\n        </div>\n      </div>\n\n      <div\n        class=\"row\"\n        *ngIf=\"shouldShow('visibleOnLoginPage')\"\n      >\n        <div class=\"col-sm-6\">\n          <label\n            class=\"c8y-switch\"\n            title=\"{{ 'Visible on login page' | translate }}\"\n            for=\"visibleOnLoginPage\"\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</fieldset>\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  standalone: false\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\n  class=\"p-24\"\n  ngModelGroup=\"{{ requestName }}\"\n  id=\"{{ requestType }}\"\n>\n  <div class=\"row\">\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      <fieldset [ngClass]=\"requestType === 'tokenValidationRequest' ? 'c8y-fieldset p-24' : ''\">\n        <legend *ngIf=\"requestType === 'tokenValidationRequest'\">\n          {{ requestName }}\n        </legend>\n\n        <c8y-form-group>\n          <label\n            [for]=\"requestType + 'url'\"\n            class=\"control-label\"\n            translate\n          >\n            URL\n          </label>\n          <input\n            type=\"url\"\n            class=\"form-control\"\n            name=\"url\"\n            [id]=\"requestType + 'url'\"\n            [(ngModel)]=\"requestConfiguration.url\"\n            [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'http://www.example.com/' }\"\n            c8yDefaultValidation=\"httpUrl\"\n            [required]=\"requestType !== 'logoutRequest'\"\n          />\n        </c8y-form-group>\n\n        <c8y-form-group *ngIf=\"showBody\">\n          <label\n            [for]=\"requestType + 'body'\"\n            class=\"control-label\"\n            translate\n          >\n            Body\n          </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      </fieldset>\n\n      <fieldset\n        class=\"c8y-fieldset p-24\"\n        *ngIf=\"requestType !== 'logoutRequest'\"\n      >\n        <legend translate>Headers</legend>\n        <div\n          class=\"tight-grid visible-md visible-lg\"\n          *ngIf=\"requestConfiguration.headers.length > 0\"\n        >\n          <div class=\"col-md-6\">\n            <p class=\"text-medium\">\n              {{ 'Key' | translate }}\n            </p>\n          </div>\n          <div class=\"col-md-5\">\n            <p class=\"text-medium\">\n              {{ 'Value' | translate }}\n            </p>\n          </div>\n        </div>\n        <div\n          class=\"tight-grid\"\n          data-cy=\"c8y-authentication-single-sign-on--request-header\"\n          *ngFor=\"let header of requestConfiguration.headers; index as headerIndex\"\n        >\n          <div class=\"col-md-6\">\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\n                  c8yIcon=\"minus-circle\"\n                  class=\"text-danger\"\n                ></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\"\n          type=\"button\"\n          title=\"{{ 'Add header' | translate }}\"\n          (click)=\"addCustomValue(requestConfiguration.headers)\"\n        >\n          <i\n            c8yIcon=\"plus-circle\"\n            class=\"m-r-4\"\n          ></i>\n          <span translate>Add header</span>\n        </button>\n      </fieldset>\n\n      <fieldset class=\"c8y-fieldset p-24\">\n        <legend translate>Request parameters</legend>\n        <div\n          class=\"tight-grid visible-md visible-lg\"\n          *ngIf=\"requestConfiguration.requestParams.length > 0\"\n        >\n          <div class=\"col-md-6\">\n            <p class=\"text-medium\">\n              {{ 'Key' | translate }}\n            </p>\n          </div>\n          <div class=\"col-md-5\">\n            <p class=\"text-medium\">\n              {{ 'Value' | translate }}\n            </p>\n          </div>\n        </div>\n        <div\n          class=\"tight-grid\"\n          data-cy=\"c8y-authentication-single-sign-on--request-parameter\"\n          *ngFor=\"let requestParam of requestConfiguration.requestParams; index as paramIndex\"\n        >\n          <div class=\"col-md-6\">\n            <c8y-form-group>\n              <label\n                [for]=\"requestType + 'paramKey' + paramIndex\"\n                class=\"visible-sm visible-xs\"\n                translate\n              >\n                Key\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\n                  c8yIcon=\"minus-circle\"\n                  class=\"text-danger\"\n                ></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\"\n          type=\"button\"\n          title=\"{{ 'Add request parameter' | translate }}\"\n          (click)=\"addCustomValue(requestConfiguration.requestParams)\"\n        >\n          <i\n            c8yIcon=\"plus-circle\"\n            class=\"m-r-4\"\n          ></i>\n          <span translate>Add request parameter</span>\n        </button>\n      </fieldset>\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  standalone: false\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 [ngClass]=\"withHeader ? 'p-24' : 'd-contents'\">\n  <div [ngClass]=\"withHeader ? 'row' : 'd-contents'\">\n    <div\n      class=\"col-xs-12 col-sm-3 col-md-2\"\n      *ngIf=\"withHeader\"\n    >\n      <div\n        class=\"h4 text-normal text-right text-left-xs\"\n        translate\n      >\n        User ID\n      </div>\n    </div>\n    <fieldset\n      [ngClass]=\"withHeader ? 'col-xs-12 col-sm-9 col-md-10 col-lg-9' : 'c8y-fieldset p-24'\"\n    >\n      <legend *ngIf=\"!withHeader\">\n        {{ 'User/App ID' | translate }}\n      </legend>\n\n      <div class=\"row\">\n        <div class=\"col-sm-6\">\n          <c8y-form-group *ngIf=\"userIdConfig.useConstantValue\">\n            <label\n              class=\"control-label\"\n              [for]=\"'constantValue' + componentId\"\n              translate\n            >\n              Constant value\n            </label>\n            <input\n              class=\"form-control\"\n              type=\"text\"\n              required\n              [id]=\"'constantValue' + componentId\"\n              [name]=\"'constantValue' + componentId\"\n              [(ngModel)]=\"userIdConfig.constantValue\"\n            />\n          </c8y-form-group>\n          <c8y-form-group *ngIf=\"!userIdConfig.useConstantValue\">\n            <label\n              class=\"control-label\"\n              [for]=\"'jwtField' + componentId\"\n              translate\n            >\n              JWT field\n            </label>\n            <input\n              class=\"form-control\"\n              type=\"text\"\n              required\n              [id]=\"'jwtField' + componentId\"\n              [name]=\"'jwtField' + componentId\"\n              [(ngModel)]=\"userIdConfig.jwtField\"\n              [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'upn' }\"\n            />\n          </c8y-form-group>\n        </div>\n        <div class=\"col-sm-6\">\n          <div\n            class=\"form-group\"\n            *ngIf=\"shouldShow('useConstantValue')\"\n          >\n            <div\n              class=\"form-group\"\n              *ngIf=\"shouldShow('useConstantValue')\"\n            >\n              <label\n                class=\"c8y-switch m-t-24\"\n                data-cy=\"c8y-authentication--external-token-configuration-constant-value-switcher\"\n                title=\"{{ 'Use constant value' | translate }}\"\n                [for]=\"'useConstantValue' + componentId\"\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    </fieldset>\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  standalone: false\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  RETRIVE_FROM_ACCESS_TOKEN = gettext('Retrieve from Access token');\n  RETRIVE_FROM_ID_TOKEN = gettext('Retrieve from ID token');\n\n  constructor(private controlContainer: ControlContainer) {}\n\n  ngAfterContentInit() {\n    if (!this.templateModel.accessTokenToUserDataMappings) {\n      this.templateModel.accessTokenToUserDataMappings = {};\n    }\n  }\n\n  get useIdToken() {\n    return this.templateModel.useIdToken || false;\n  }\n\n  setUseIdToken(useIdToken) {\n    this.templateModel.useIdToken = useIdToken;\n    this.controlContainer.control.markAsDirty();\n  }\n}\n","<div class=\"p-24\">\n  <div class=\"row\">\n    <div class=\"col-xs-12 col-sm-3 col-md-2\">\n      <div\n        class=\"h4 text-normal text-right text-left-xs\"\n        translate\n      >\n        User data mappings\n      </div>\n    </div>\n\n    <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\">\n      <fieldset class=\"c8y-fieldset p-24\">\n        <legend>{{ 'Source of user data mapping' | translate }}</legend>\n        <c8y-form-group>\n          <label\n            title=\"{{ RETRIVE_FROM_ACCESS_TOKEN | translate }}\"\n            class=\"c8y-radio input-sm\"\n          >\n            <input\n              type=\"radio\"\n              name=\"userAccessMappingSource\"\n              data-cy=\"user-access-mapping-from-access-token\"\n              [checked]=\"!useIdToken\"\n              (change)=\"setUseIdToken(false)\"\n            />\n            <span></span>\n            <span>{{ RETRIVE_FROM_ACCESS_TOKEN | translate }}</span>\n          </label>\n          <label\n            title=\"{{ RETRIVE_FROM_ID_TOKEN | translate }}\"\n            class=\"c8y-radio input-sm\"\n          >\n            <input\n              type=\"radio\"\n              name=\"userAccessMappingSource\"\n              data-cy=\"user-access-mapping-from-id-token\"\n              [checked]=\"useIdToken\"\n              (change)=\"setUseIdToken(true)\"\n            />\n            <span></span>\n            <span>{{ RETRIVE_FROM_ID_TOKEN | translate }}</span>\n          </label>\n        </c8y-form-group>\n      </fieldset>\n\n      <fieldset class=\"c8y-fieldset p-24\">\n        <legend>\n          {{ 'Claim names' | translate }}\n          <button\n            class=\"btn-help btn-help--sm\"\n            type=\"button\"\n            [attr.aria-label]=\"'Help' | translate\"\n            popover=\"{{ CLAIM_NAMES | translate }}\"\n            placement=\"right\"\n            triggers=\"focus\"\n          ></button>\n        </legend>\n\n        <div class=\"row\">\n          <div class=\"col-sm-6\">\n            <c8y-form-group>\n              <label\n                for=\"firstName\"\n                class=\"control-label\"\n                translate\n              >\n                First name\n              </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\n                for=\"lastName\"\n                class=\"control-label\"\n                translate\n              >\n                Last name\n              </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\n                for=\"email\"\n                class=\"control-label\"\n                translate\n              >\n                Email\n              </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\n                for=\"phoneNumber\"\n                class=\"control-label\"\n                translate\n              >\n                Phone number\n              </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      </fieldset>\n    </div>\n  </div>\n</div>\n","import {\n  Component,\n  ContentChild,\n  Input,\n  TemplateRef,\n  ElementRef,\n  AfterViewInit,\n  inject,\n  ChangeDetectorRef,\n  Renderer2,\n  OnInit,\n  OnChanges\n} from '@angular/core';\nimport { PageChangedEvent, PaginationModule } from 'ngx-bootstrap/pagination';\nimport { CoreModule } from '@c8y/ngx-components';\n\n@Component({\n  selector: 'c8y-paginated-list-group',\n  templateUrl: './paginated-list-group.component.html',\n  standalone: true,\n  imports: [CoreModule, PaginationModule]\n})\nexport class PaginatedListGroupComponent<T> implements OnInit, OnChanges, AfterViewInit {\n  @Input() items: T[] = [];\n  @Input() itemsPerPage = 5;\n  @ContentChild(TemplateRef) itemTemplate: TemplateRef<any>;\n\n  currentPage = 1;\n  currentPageItems: T[] = [];\n\n  private cdr = inject(ChangeDetectorRef);\n  private host = inject(ElementRef);\n  private renderer = inject(Renderer2);\n\n  ngOnInit() {\n    this.updateCurrentPageItems();\n  }\n\n  ngOnChanges() {\n    this.updateCurrentPageItems();\n  }\n\n  ngAfterViewInit() {\n    if (!this.itemTemplate) {\n      throw new Error('c8y-paginated-list-group requires an <ng-template> to be provided.');\n    }\n    this.updateCurrentPageItems();\n  }\n\n  pageChanged(event: PageChangedEvent) {\n    this.currentPage = event.page;\n    this.itemsPerPage = event.itemsPerPage;\n    this.updateCurrentPageItems();\n    this.cdr.detectChanges();\n\n    // keep the pagination component in view after page change:\n    const pagination = this.host.nativeElement.querySelector('pagination');\n    if (pagination.scrollIntoView) {\n      pagination.scrollIntoView({ behavior: 'smooth', block: 'center' });\n    }\n  }\n\n  updateCurrentPageItems() {\n    this.currentPageItems = this.items.slice(\n      (this.currentPage - 1) * this.itemsPerPage,\n      this.currentPage * this.itemsPerPage\n    );\n  }\n\n  getItemIndex(item: T): number {\n    return this.items.indexOf(item);\n  }\n\n  goToLastItem() {\n    const lastPage = Math.ceil(this.items.length / this.itemsPerPage) || 1;\n    this.currentPage = lastPage;\n    this.updateCurrentPageItems();\n    this.cdr.detectChanges();\n\n    const root = this.host.nativeElement;\n    const listItems = root.querySelectorAll('c8y-li:not(.sticky-bottom)');\n    if (listItems.length > 0) {\n      const lastItem = listItems[listItems.length - 1];\n      if (lastItem.scrollIntoView) {\n        lastItem.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n      this.renderer.addClass(lastItem, 'highlighted');\n      setTimeout(() => this.renderer.removeClass(lastItem, 'highlighted'), 2000);\n    }\n  }\n}\n","<div\n  class=\"container-fluid\"\n  *ngIf=\"items.length > 0\"\n>\n  <c8y-list-group>\n    <c8y-li *ngFor=\"let item of currentPageItems; let i = index\">\n      <ng-container\n        *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item, index: getItemIndex(item) }\"\n      ></ng-container>\n    </c8y-li>\n    <c8y-li class=\"sticky-bottom\">\n      <pagination\n        [totalItems]=\"items.length\"\n        [(ngModel)]=\"currentPage\"\n        [ngModelOptions]=\"{ standalone: true }\"\n        [itemsPerPage]=\"itemsPerPage\"\n        (pageChanged)=\"pageChanged($event)\"\n        [maxSize]=\"10\"\n        [boundaryLinks]=\"true\"\n        previousText=\"&nbsp;\"\n        nextText=\"&nbsp;\"\n        firstText=\"&laquo;\"\n        lastText=\"&raquo;\"\n      ></pagination>\n    </c8y-li>\n  </c8y-list-group>\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  standalone: false\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","<fieldset class=\"c8y-fieldset p-16\">\n  <legend>{{ 'When' | translate }}</legend>\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=\"let childPredicate of childPredicates; last as isLast; index as idx\"\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\n              *ngFor=\"let relation of relations\"\n              [ngValue]=\"relation.value\"\n            >\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\n          [for]=\"'value' + accessMappingIndex + idx\"\n          class=\"visible-sm visible-xs\"\n          translate\n        >\n          Value\n        </label>\n        <input\n          [id]=\"'value' + accessMappingIndex + idx\"\n          [name]=\"'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          class=\"btn btn-dot btn-dot--danger hidden-xs hidden-sm\"\n          name=\"removeButton\"\n          (click)=\"removeChildPredicate(childPredicate)\"\n          tooltip=\"{{ 'Remove' | translate }}\"\n          [attr.aria-label]=\"'Remove' | translate\"\n          [delay]=\"300\"\n          type=\"button\"\n        >\n          <i c8yIcon=\"minus-circle\"></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-block btn-sm\"\n          (click)=\"addChildPredicate()\"\n          type=\"button\"\n          translate\n        >\n          and\n        </button>\n      </c8y-form-group>\n    </div>\n  </div>\n</fieldset>\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  standalone: false\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  constructor(public controlContainer: ControlContainer) {}\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","<fieldset class=\"c8y-fieldset p-8\">\n  <div *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    <fieldset class=\"c8y-fieldset p-16\">\n      <legend>\n        {{ 'Provide access to' | translate }}\n      </legend>\n      <div class=\"row\">\n        <div class=\"col-sm-6\">\n          <div\n            class=\"form-group\"\n            title=\"{{ 'Default global roles' | translate }}\"\n          >\n            <label\n              class=\"control-label\"\n              [for]=\"'groups' + accessMappingIndex\"\n            >\n              {{ 'Default global roles' | translate }}\n            </label>\n            <c8y-select-legacy\n              [id]=\"'groups' + accessMappingIndex\"\n              [items]=\"groups\"\n              [selected]=\"selectedGroups\"\n              [disableApplyOnNoSelection]=\"true\"\n              (onChange)=\"\n                controlContainer.control.markAsDirty();\n                selectedGroups = $event;\n                accessMapping.thenGroups = getIds($event)\n              \"\n              [addDropdownContainerToBody]=\"true\"\n            ></c8y-select-legacy>\n          </div>\n        </div>\n        <div class=\"col-sm-6\">\n          <div\n            class=\"form-group\"\n            title=\"{{ 'Default applications' | translate }}\"\n          >\n            <label\n              class=\"control-label\"\n              [for]=\"'apps' + accessMappingIndex\"\n            >\n              {{ 'Default applications' | translate }}\n            </label>\n            <c8y-select-legacy\n              [id]=\"'apps' + accessMappingIndex\"\n              [items]=\"apps\"\n              [selected]=\"selectedApps\"\n              [disableApplyOnNoSelection]=\"true\"\n              (onChange)=\"\n                controlContainer.control.markAsDirty();\n                selectedApps = $event;\n                accessMapping.thenApplications = getIds($event)\n              \"\n              [addDropdownContainerToBody]=\"true\"\n            ></c8y-select-legacy>\n          </div>\n        </div>\n      </div>\n    </fieldset>\n  </div>\n</fieldset>\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  standalone: false\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    <i c8yIcon=\"c8y-group-open\"></i>\n    <h4 id=\"modal-title\">{{ 'Select from inventory' | translate }}</h4>\n  </div>\n  <div class=\"modal-inner-scroll\">\n    <div\n      id=\"modal-body\"\n      class=\"bg-component\"\n    >\n      <c8y-asset-selector\n        class=\"d-contents\"\n        [(ngModel)]=\"selectedGroups\"\n        [config]=\"{\n          label: label,\n          showFilter: true,\n          multi: true,\n          groupsSelectable: true,\n          columnHeaders: false,\n          singleColumn: true,\n          groupsOnly: true\n        }\"\n      ></c8y-asset-selector>\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, tap } 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  standalone: false\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(\n    public controlContainer: ControlContainer,\n    private bsModal: BsModalService\n  ) {}\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      class: 'modal-sm',\n      ariaDescribedby: 'modal-body',\n      ariaLabelledBy: 'modal-title',\n      initialState: {\n        selectedGroups: currentlySelectedGroups\n      }\n    });\n    modal.content.resultEmitter\n      .pipe(\n        take(1),\n        tap(() => this.controlContainer.control.markAsDirty())\n      )\n      .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","<fieldset class=\"c8y-fieldset p-t-8 p-b-8 p-l-16 p-r-16\">\n  <div *ngIf=\"inventoryMapping.when.childPredicates.length !== 0\">\n    <c8y-sso-child-predicates\n      [childPredicates]=\"inventoryMapping.when.childPredicates\"\n      [accessMappingIndex]=\"'irm' + inventoryMappingIndex\"\n      (onRemoveAllChildPredicates)=\"onRemoveAllChildPredicates()\"\n    ></c8y-sso-child-predicates>\n    <fieldset class=\"c8y-fieldset p-16\">\n      <legend>\n        {{ 'Provide inventory roles' | translate }}\n      </legend>\n      <div\n        class=\"p-l-8 p-r-8\"\n        *ngIf=\"inventoryMapping.thenInventoryRoles.length !== 0\"\n      >\n        <div class=\"tight-grid p-b-8 separator-bottom 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 d-flex-md a-i-center p-t-8 p-b-8 separator-bottom\"\n          *ngFor=\"let inventoryRole of inventoryMapping.thenInventoryRoles; index as idx\"\n        >\n          <div class=\"col-md-5\">\n            <div class=\"d-flex a-i-center\">\n              <!-- TODO:\n                We need to retrive the icon here, for groups there are 3 possible icons:\n                • Regular group\n                • Remote group\n                • Smartgroup\n                Besides groups, there's also Assets from DTM, in which each asset has a different icon\n              -->\n              <i\n                class=\"m-r-8 text-16\"\n                c8yIcon=\"c8y-group\"\n              ></i>\n              <span\n                class=\"text-truncate\"\n                title=\"{{ inventoryRole.managedObject | moName | async }}\"\n              >\n                {{ inventoryRole.managedObject | moName | async }}\n              </span>\n            </div>\n          </div>\n          <div class=\"col-md-6\">\n            <div\n              class=\"form-group m-b-0\"\n              title=\"{{ 'Inventory roles' | translate }}\"\n            >\n              <c8y-select-legacy\n                [id]=\"'ir' + idx + '_' + 'irm' + inventoryMappingIndex\"\n                [items]=\"inventoryRoles\"\n                [selected]=\"selectedInventoryRoles[inventoryRole.managedObject]\"\n                [disableApplyOnNoSelection]=\"true\"\n                (onChange)=\"\n                  controlContainer.control.markAsDirty();\n                  selectedInventoryRoles[inventoryRole.managedObject] = $event;\n                  inventoryRole.roleIds = getIds($event)\n                \"\n                [addDropdownContainerToBody]=\"true\"\n              ></c8y-select-legacy>\n            </div>\n          </div>\n          <div class=\"col-md-1\">\n            <button\n              class=\"btn btn-dot btn-dot--danger hidden-xs hidden-sm\"\n              [attr.aria-label]=\"'Remove' | translate\"\n              tooltip=\"{{ 'Remove' | translate }}\"\n              name=\"removeButton\"\n              type=\"button\"\n              (click)=\"controlContainer.control.markAsDirty(); removeInventoryRole(inventoryRole)\"\n              [delay]=\"300\"\n            >\n              <i c8yIcon=\"minus-circle\"></i>\n            </button>\n            <button\n              class=\"btn btn-danger btn-block btn-sm visible-xs visible-sm\"\n              title=\"{{ 'Remove' | translate }}\"\n              name=\"removeButton\"\n              type=\"button\"\n              (click)=\"controlContainer.control.markAsDirty(); removeInventoryRole(inventoryRole)\"\n            >\n              <i c8yIcon=\"minus-circle\"></i>\n              <span translate>Remove</span>\n            </button>\n          </div>\n        </div>\n      </div>\n\n      <button\n        class=\"btn btn-default m-t-16\"\n        title=\"{{ 'Add inventory roles' | translate }}\"\n        id=\"add-inventory-roles-button\"\n        type=\"button\"\n        (click)=\"addInventoryRoles()\"\n      >\n        <i\n          class=\"m-r-4\"\n          c8yIcon=\"plus-circle\"\n        ></i>\n        {{ 'Add inventory roles' | translate }}\n      </button>\n    </fieldset>\n  </div>\n</fieldset>\n","import { ChangeDetectorRef, Component, Input, ViewChild } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components';\nimport { defaultsDeep } from 'lodash-es';\nimport { IApplication, IIdentified, IUserGroup } from '@c8y/client';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { InventoryMapping, AccessMapping } from '../../sso-configuration.model';\nimport { PaginatedListGroupComponent } from './paginated-list-group.component';\n\n@Component({\n  selector: 'c8y-sso-access-mapping',\n  templateUrl: './access-mapping.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  standalone: false\n})\nexport class AccessMappingComponent {\n  @Input() apps: IApplication[];\n  @Input() groups: IUserGroup[];\n  @Input() inventoryRoles: IIdentified[];\n  @Input() templateModel;\n\n  @ViewChild('paginatedAccessMappings')\n  paginatedAccessMappings: PaginatedListGroupComponent<AccessMapping>;\n\n  @ViewChild('paginatedInventoryMappings')\n  paginatedInventoryMappings: PaginatedListGroupComponent<InventoryMapping>;\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 below 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 below will be reassigned to a user on each log in and other ones will be cleared'\n  );\n\n  RETRIVE_FROM_ACCESS_TOKEN = gettext('Retrieve from Access token');\n  RETRIVE_FROM_ID_TOKEN = gettext('Retrieve from ID token');\n\n  constructor(\n    private controlContainer: ControlContainer,\n    private cdr: ChangeDetectorRef\n  ) {}\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    const accessMappings = this.templateModel.onNewUser.dynamicMapping.mappings;\n    this.templateModel.onNewUser.dynamicMapping.mappings = [...accessMappings, emptyMapping];\n    this.cdr.detectChanges(); // Ensure items are updated in the pagination component before navigating\n    this.paginatedAccessMappings.goToLastItem();\n  }\n\n  addInventoryMapping() {\n    const emptyInventoryMapping: InventoryMapping = {\n      when: {\n        operator: 'AND',\n        childPredicates: [{ parameterPath: '', operator: 'EQ', value: '' }]\n      },\n      thenInventoryRoles: []\n    };\n    const inventoryMappings = this.templateModel.onNewUser.dynamicMapping.inventoryMappings;\n    this.templateModel.onNewUser.dynamicMapping.inventoryMappings = [\n      ...inventoryMappings,\n      emptyInventoryMapping\n    ];\n    this.cdr.detectChanges(); // Ensure items are updated in the pagination component before navigating\n    this.paginatedInventoryMappings.goToLastItem();\n  }\n\n  onRemove(accessMapping: AccessMapping) {\n    const accessMappings = this.templateModel.onNewUser.dynamicMapping.mappings;\n    this.templateModel.onNewUser.dynamicMapping.mappings = accessMappings.filter(\n      mapping => mapping !== accessMapping\n    );\n  }\n\n  onRemoveInventoryMapping(inventoryMapping: InventoryMapping) {\n    const inventoryMappings = this.templateModel.onNewUser.dynamicMapping.inventoryMappings;\n    this.templateModel.onNewUser.dynamicMapping.inventoryMappings = inventoryMappings.filter(\n      mapping => mapping !== inventoryMapping\n    );\n  }\n\n  setDynamicMappingConfiguration(\n    mapRolesOnlyForNewUser: boolean,\n    manageRolesOnlyFromAccessMapping = false\n  ) {\n    this.dynamicMappingConfiguration.mapRolesOnlyForNewUser = mapRolesOnlyForNewUser;\n    this.dynamicMappingConfiguration.manageRolesOnlyFromAccessMapping =\n      manageRolesOnlyFromAccessMapping;\n    this.controlContainer.control.markAsDirty();\n  }\n\n  get mapRolesOnlyForNewUser() {\n    return this.dynamicMappingConfiguration.mapRolesOnlyForNewUser;\n  }\n\n  get manageRolesOnlyFromAccessMapping() {\n    return this.dynamicMappingConfiguration.manageRolesOnlyFromAccessMapping;\n  }\n\n  get mapFromIdToken() {\n    return this.dynamicMappingConfiguration.mapFromIdToken;\n  }\n\n  setMapFromIdToken(mapFromIdToken) {\n    this.dynamicMappingConfiguration.mapFromIdToken = mapFromIdToken;\n    this.controlContainer.control.markAsDirty();\n  }\n\n  private get dynamicMappingConfiguration() {\n    return this.templateModel.onNewUser.dynamicMapping.configuration;\n  }\n\n  private setDynamicMapping() {\n    defaultsDeep(this.templateModel.onNewUser, {\n      dynamicMapping: {\n        mappings: [],\n        inventoryMappings: [],\n        configuration: {\n          mapRolesOnlyForNewUser: false,\n          manageRolesOnlyFromAccessMapping: false\n        }\n      }\n    });\n    const { configuration } = this.templateModel.onNewUser.dynamicMapping;\n    const { mapRolesOnlyForNewUser, manageRolesOnlyFromAccessMapping, mapFromIdToken } =\n      configuration;\n    configuration.mapFromIdToken =\n      mapFromIdToken !== undefined\n        ? mapFromIdToken\n        : mapRolesOnlyForNewUser === false && manageRolesOnlyFromAccessMapping === false;\n  }\n}\n","<div class=\"p-24\">\n  <div class=\"row\">\n    <div class=\"col-xs-12 col-sm-3 col-md-2\">\n      <div\n        class=\"h4 text-normal text-right text-left-xs\"\n        translate\n      >\n        Access mapping\n      </div>\n    </div>\n\n    <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\">\n      <fieldset class=\"c8y-fieldset p-24\">\n        <legend>{{ 'Source of dynamic access mapping' | translate }}</legend>\n        <c8y-form-group>\n          <label\n            class=\"c8y-radio input-sm\"\n            title=\"{{ RETRIVE_FROM_ACCESS_TOKEN | translate }}\"\n          >\n            <input\n              name=\"dynamicAccessMappingSource\"\n              type=\"radio\"\n              data-cy=\"dynamic-access-mapping-from-access-token\"\n              [checked]=\"!mapFromIdToken\"\n              (change)=\"setMapFromIdToken(false)\"\n            />\n            <span></span>\n            <span>{{ RETRIVE_FROM_ACCESS_TOKEN | translate }}</span>\n          </label>\n          <label\n            class=\"c8y-radio input-sm\"\n            title=\"{{ RETRIVE_FROM_ID_TOKEN | translate }}\"\n          >\n            <input\n              name=\"dynamicAccessMappingSource\"\n              type=\"radio\"\n              data-cy=\"dynamic-access-mapping-from-id-token\"\n              [checked]=\"mapFromIdToken\"\n              (change)=\"setMapFromIdToken(true)\"\n            />\n            <span></span>\n            <span>{{ RETRIVE_FROM_ID_TOKEN | translate }}</span>\n          </label>\n        </c8y-form-group>\n      </fieldset>\n\n      <fieldset class=\"c8y-fieldset p-24\">\n        <legend>{{ 'Dynamic access mapping principle' | translate }}</legend>\n        <c8y-form-group>\n          <label\n            class=\"c8y-radio input-sm\"\n            title=\"{{ USE_ACCESS_MAPPING_ON_USER_CREATION_OPTION | translate }}\"\n          >\n            <input\n              name=\"dynamicAccessMappingConfiguration\"\n              type=\"radio\"\n              data-cy=\"c8y-inventory-roles-mapping--on-user-creation\"\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              [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              type=\"button\"\n            ></button>\n          </label>\n          <label\n            class=\"c8y-radio input-sm\"\n            title=\"{{ UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_OPTION | translate }}\"\n          >\n            <input\n              name=\"dynamicAccessMappingConfiguration\"\n              type=\"radio\"\n              data-cy=\"c8y-inventory-roles-mapping--other-ones-will-be-unchanged\"\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              class=\"btn-help\"\n              [attr.aria-label]=\"'Help' | translate\"\n              popover=\"{{\n                UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_TOOLTIP | translate\n              }}\"\n              placement=\"right\"\n              triggers=\"focus\"\n              container=\"body\"\n              type=\"button\"\n            ></button>\n          </label>\n          <label\n            class=\"c8y-radio input-sm\"\n            title=\"{{ CLEAR_AND_UPDATED_ROLES_ON_EACH_LOG_IN_OPTION | translate }}\"\n          >\n            <input\n              name=\"dynamicAccessMappingConfiguration\"\n              type=\"radio\"\n              data-cy=\"c8y-inventory-roles-mapping--other-ones-will-be-cleared\"\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              [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              type=\"button\"\n            ></button>\n          </label>\n        </c8y-form-group>\n      </fieldset>\n      <fieldset class=\"c8y-fieldset p-16\">\n        <legend>{{ 'Dynamic access mapping' | translate }}</legend>\n        <c8y-ui-empty-state\n          [icon]=\"'list'\"\n          [title]=\"'No access mapping rules defined.' | translate\"\n          [subtitle]=\"'Click below to add a new mapping.' | translate\"\n          *ngIf=\"templateModel.onNewUser.dynamicMapping.mappings.length === 0\"\n          [horizontal]=\"true\"\n        ></c8y-ui-empty-state>\n        <div\n          class=\"container-fluid\"\n          *ngIf=\"templateModel.onNewUser.dynamicMapping.mappings.length > 0\"\n        >\n          <c8y-paginated-list-group\n            #paginatedAccessMappings\n            [items]=\"templateModel.onNewUser.dynamicMapping.mappings\"\n          >\n            <ng-template\n              let-accessMapping\n              let-index=\"index\"\n            >\n              <c8y-sso-dynamic-access-mapping\n                [accessMapping]=\"accessMapping\"\n                (onRemoveAccessMapping)=\"onRemove(accessMapping)\"\n                [apps]=\"apps\"\n                [groups]=\"groups\"\n                [accessMappingIndex]=\"index\"\n              ></c8y-sso-dynamic-access-mapping>\n            </ng-template>\n          </c8y-paginated-list-group>\n        </div>\n        <div class=\"p-t-16\">\n          <button\n            class=\"btn btn-default\"\n            title=\"{{ 'Add access mapping' | translate }}\"\n            id=\"add-access-mapping-button\"\n            type=\"button\"\n            (click)=\"addAccessMapping()\"\n          >\n            <i\n              class=\"m-r-4\"\n              c8yIcon=\"plus-circle\"\n            ></i>\n            {{ 'Add access mapping' | translate }}\n          </button>\n        </div>\n      </fieldset>\n      <fieldset class=\"c8y-fieldset p-16\">\n        <legend>\n          {{ 'Inventory roles mapping' | translate }}\n        </legend>\n        <c8y-ui-empty-state\n          [icon]=\"'list'\"\n          [title]=\"'No inventory roles mapping rules defined.' | translate\"\n          [subtitle]=\"'Click below to add a new mapping.' | translate\"\n          *ngIf=\"templateModel.onNewUser.dynamicMapping.inventoryMappings.length === 0\"\n          [horizontal]=\"true\"\n        ></c8y-ui-empty-state>\n        <div\n          class=\"container-fluid\"\n          *ngIf=\"templateModel.onNewUser.dynamicMapping.inventoryMappings.length > 0\"\n        >\n          <c8y-paginated-list-group\n            #paginatedInventoryMappings\n            [items]=\"templateModel.onNewUser.dynamicMapping.inventoryMappings\"\n          >\n            <ng-template\n              let-inventoryMapping\n              let-index=\"index\"\n            >\n              <c8y-sso-inventory-roles-mapping\n                [inventoryRoles]=\"inventoryRoles\"\n                [inventoryMapping]=\"inventoryMapping\"\n                (onRemoveInventoryMapping)=\"onRemoveInventoryMapping(inventoryMapping)\"\n                [inventoryMappingIndex]=\"index\"\n              ></c8y-sso-inventory-roles-mapping>\n            </ng-template>\n          </c8y-paginated-list-group>\n        </div>\n        <div class=\"p-t-16\">\n          <button\n            class=\"btn btn-default\"\n            title=\"{{ 'Add inventory roles mapping' | translate }}\"\n            id=\"add-inventory-mapping-button\"\n            type=\"button\"\n            (click)=\"addInventoryMapping()\"\n          >\n            <i\n              class=\"m-r-4\"\n              c8yIcon=\"plus-circle\"\n            ></i>\n            {{ 'Add inventory roles mapping' | translate }}\n          </button>\n        </div>\n      </fieldset>\n    </div>\n  </div>\n</div>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { DateFormatService, 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  standalone: false\n})\nexport class SignatureConfigurationComponent implements OnInit {\n  @Input() templateModel;\n\n  certificateType = CertificateType;\n  certificateTypes = certificateTypeConfig;\n\n  algorithmTypes = algorithmTypeConfig;\n\n  dateInputFormat: string;\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(\n    protected controlContainer: ControlContainer,\n    private dateFormatService: DateFormatService\n  ) {}\n\n  ngOnInit(): void {\n    this.dateInputFormat = this.dateFormatService.getDateFormat();\n  }\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=\"p-24\">\n  <div class=\"row\">\n    <div class=\"col-xs-12 col-sm-3 col-md-2\">\n      <div\n        class=\"h4 text-normal text-right text-left-xs\"\n        translate\n      >\n        Signature verification\n      </div>\n    </div>\n    <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\">\n      <div\n        *ngIf=\"shouldShow('certificateType')\"\n        class=\"form-group p-relative\"\n      >\n        <div class=\"row\">\n          <div class=\"col-sm-6\">\n            <label\n              for=\"certificateType\"\n              class=\"control-label\"\n              translate\n            >\n              Verifier\n            </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        id=\"adfs\"\n        *ngIf=\"\n          templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.ADFS\n        \"\n        class=\"row\"\n      >\n        <div class=\"col-sm-6\">\n          <c8y-form-group>\n            <label\n              for=\"adfsManifestUrl\"\n              class=\"control-label\"\n              translate\n            >\n              ADFS manifest URL\n            </label>\n            <input\n              type=\"url\"\n              class=\"form-control\"\n              required\n              [placeholder]=\"\n                'e.g. {{ example }}'\n                  | translate\n                    : {\n                        example: '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\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\n                for=\"publicKeyDiscoveryUrl\"\n                class=\"control-label\"\n                translate\n              >\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\n                for=\"jwksPublicKeyDiscoveryUrl\"\n                class=\"control-label\"\n                translate\n              >\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        <fieldset\n          class=\"c8y-fieldset p-24\"\n          *ngIf=\"templateModel.signatureVerificationConfig.manual.customCertificates.length > 1\"\n        >\n          <legend>\n            {{ 'Manual' | translate }}\n          </legend>\n          <div class=\"row\">\n            <div class=\"col-md-6\">\n              <label\n                for=\"certIdField\"\n                class=\"control-label\"\n              >\n                {{ 'Certificate ID field' | translate }}\n                <button\n                  class=\"btn-help btn-help--sm\"\n                  type=\"button\"\n                  [attr.aria-label]=\"'Help' | translate\"\n                  popover=\"{{ CERTIFICATE_ID_FIELD_POPOVER | translate }}\"\n                  placement=\"right\"\n                  triggers=\"focus\"\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        </fieldset>\n\n        <fieldset class=\"c8y-fieldset p-24\">\n          <legend>\n            {{ 'Certificates' | translate }}\n          </legend>\n          <fieldset\n            class=\"c8y-fieldset p-16\"\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-md-5\">\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-md-3\">\n                <div class=\"form-group datepicker\">\n                  <c8y-form-group>\n                    <label\n                      [for]=\"'validFromPicker' + crtIndex\"\n                      class=\"control-label\"\n                    >\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                      [attr.aria-label]=\"'Date from' | translate\"\n                      placeholder=\"{{ 'Date from' | translate }}\"\n                      [bsConfig]=\"{ customTodayClass: 'today', adaptivePosition: true, dateInputFormat: dateInputFormat }\"\n                      [maxDate]=\"customCertificate.validTill\"\n                      bsDatepicker\n                      required\n                    />\n                  </c8y-form-group>\n                </div>\n              </div>\n              <div class=\"col-md-3\">\n                <div class=\"form-group datepicker\">\n                  <c8y-form-group>\n                    <label\n                      [for]=\"'validTillPicker' + crtIndex\"\n                      class=\"control-label\"\n                    >\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                      [attr.aria-label]=\"'Date to' | translate\"\n                      [bsConfig]=\"{ customTodayClass: 'today', adaptivePosition: true, dateInputFormat: dateInputFormat }\"\n                      bsDatepicker\n                      [minDate]=\"customCertificate.validFrom\"\n                      required\n                    />\n                  </c8y-form-group>\n                </div>\n              </div>\n              <div\n                class=\"col-md-1\"\n                *ngIf=\"\n                  templateModel.signatureVerificationConfig.manual.customCertificates.length > 1\n                \"\n              >\n                <label>&nbsp;</label>\n                <button\n                  class=\"btn btn-danger btn-sm visible-xs visible-sm\"\n                  type=\"button\"\n                  title=\"{{ 'Delete certificate' | translate }}\"\n                  (click)=\"removeCustomCertificate(customCertificate)\"\n                >\n                  <i\n                    c8yIcon=\"minus-circle\"\n                    class=\"m-r-4\"\n                  ></i>\n                  <span>{{ 'Delete certificate' | translate }}</span>\n                </button>\n\n                <button\n                  class=\"btn btn-dot btn-dot--danger visible-md visible-lg\"\n                  type=\"button\"\n                  tooltip=\"{{ 'Delete certificate' | translate }}\"\n                  placement=\"top\"\n                  [adaptivePosition]=\"false\"\n                  [attr.aria-label]=\"'Delete certificate' | translate\"\n                  [delay]=\"300\"\n                  (click)=\"removeCustomCertificate(customCertificate)\"\n                >\n                  <i c8yIcon=\"minus-circle\"></i>\n                </button>\n              </div>\n            </div>\n          </fieldset>\n          <button\n            class=\"btn btn-default m-t-8\"\n            type=\"button\"\n            title=\"{{ 'Add certificate' | translate }}\"\n            (click)=\"templateModel.signatureVerificationConfig.manual.addCustomCertificate()\"\n            name=\"addCertificate\"\n          >\n            <i\n              c8yIcon=\"plus-circle\"\n              class=\"m-r-4\"\n            ></i>\n            <span>{{ 'Add certificate' | translate }}</span>\n          </button>\n        </fieldset>\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  standalone: false\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=\"p-24\">\n  <div class=\"row\">\n    <div class=\"col-xs-12 col-sm-3 col-md-2\">\n      <div\n        class=\"h4 text-normal text-right text-left-xs\"\n        translate\n      >\n        External token configuration\n      </div>\n    </div>\n\n    <div\n      class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\"\n      *ngIf=\"templateModel\"\n    >\n      <label\n        class=\"c8y-switch\"\n        data-cy=\"c8y-authentication--external-token-configuration-switcher\"\n        title=\"{{ 'Allow authentication with access token from external IAM system' | translate }}\"\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\n      <div\n        class=\"collapse\"\n        [collapse]=\"!externalTokenConfig.enabled\"\n        [isAnimated]=\"true\"\n      >\n        <ng-container *ngIf=\"externalTokenConfig.enabled\">\n          <c8y-user-id-configuration\n            [userIdConfig]=\"externalTokenConfig.userOrAppIdConfig\"\n            [withHeader]=\"false\"\n          ></c8y-user-id-configuration>\n\n          <label\n            class=\"c8y-switch\"\n            title=\"{{ 'Validate access token' | translate }}\"\n            for=\"validationRequired\"\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            class=\"collapse\"\n            [collapse]=\"!externalTokenConfig.validationRequired\"\n            [isAnimated]=\"true\"\n          >\n            <ng-container *ngIf=\"externalTokenConfig.validationRequired\">\n              <div class=\"row\">\n                <div class=\"col-sm-6 m-t-16\">\n                  <label\n                    class=\"control-label\"\n                    for=\"validationMethod\"\n                    translate\n                  >\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                      class=\"control-label\"\n                      for=\"accessTokenValidityCheckIntervalInMinutes\"\n                      translate\n                    >\n                      Access token validation frequency\n                    </label>\n                    <div class=\"input-group\">\n                      <input\n                        class=\"form-control\"\n                        id=\"accessTokenValidityCheckIntervalInMinutes\"\n                        name=\"accessTokenValidityCheckIntervalInMinutes\"\n                        type=\"number\"\n                        required\n                        [(ngModel)]=\"externalTokenConfig.accessTokenValidityCheckIntervalInMinutes\"\n                        [placeholder]=\"'e.g. {{ example }}' | translate: { example: '1' }\"\n                        step=\"1\"\n                        [min]=\"1\"\n                      />\n                      <span\n                        class=\"input-group-addon\"\n                        translate\n                      >\n                        minutes\n                      </span>\n                    </div>\n                  </c8y-form-group>\n                </div>\n              </div>\n            </ng-container>\n          </div>\n        </ng-container>\n      </div>\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  standalone: false\n})\nexport class CustomTemplateComponent extends TemplateComponent<CustomSsoConfiguration> {\n  constructor(private customConfigurationMapper: CustomConfigurationMapper) {\n    super(customConfigurationMapper);\n  }\n}\n","<ng-container *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 [templateModel]=\"templateModel\"></c8y-external-token-config>\n  <hr />\n  <c8y-basic-configuration [templateModel]=\"templateModel\"></c8y-basic-configuration>\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  <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</ng-container>\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 || null,\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:\n          'grant_type=authorization_code&code=${code}&redirect_uri=${redirectUri}&client_id=${clientId}&client_secret=' +\n          templateModel.clientSecret\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      useIdToken: templateModel.useIdToken\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      useIdToken: ssoConfiguration.useIdToken\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  standalone: false\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-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  <c8y-user-id-configuration\n    [userIdConfig]=\"templateModel.userIdConfig\"\n  ></c8y-user-id-configuration>\n</div>\n","import { SsoConfigurationMapper } from './sso-configuration.mapper';\nimport { AadConfiguration } from './aad.model';\nimport { SsoConfiguration, TemplateType } from '../sso-configuration.model';\nimport {\n  cloneDeep,\n  pick,\n  defaults,\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 urlPattern = /^(.+)\\/((.+?)\\/oauth2\\/(authorize|token))$/;\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 || null,\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      useIdToken: templateModel.useIdToken\n    };\n    return ssoConfiguration;\n  }\n\n  mapTo(ssoConfiguration: SsoConfiguration): AadConfiguration {\n    const ssoConfigurationForAad = cloneDeep(ssoConfiguration);\n\n    const applicationsId = at(ssoConfigurationForAad, ['audience', 'clientId']);\n    this.setupDefaults(ssoConfigurationForAad);\n    this.setupUserIdConfig(ssoConfigurationForAad);\n    this.setupSignatureVerificationConfig(ssoConfigurationForAad);\n\n    const aadConfiguration: AadConfiguration = {\n      aadAddress: this.getAadAddress(ssoConfigurationForAad),\n      tenant: this.getTenant(ssoConfigurationForAad),\n      applicationId: this.getFirstDefined(applicationsId),\n      redirectToPlatform: ssoConfigurationForAad.redirectToPlatform,\n      clientSecret: this.getClientSecret(ssoConfigurationForAad),\n      issuer: ssoConfigurationForAad.issuer,\n      buttonName: ssoConfigurationForAad.buttonName,\n      visibleOnLoginPage: ssoConfigurationForAad.visibleOnLoginPage,\n      redirectAfterLogout: this.getRedirectAfterLogout(ssoConfigurationForAad),\n      redirectAfterLogoutUrl: this.getRedirectAfterLogoutUrl(ssoConfigurationForAad),\n      accessTokenToUserDataMappings: ssoConfigurationForAad.accessTokenToUserDataMappings,\n      userIdConfig: {\n        jwtField: ssoConfigurationForAad.userIdConfig.jwtField\n      },\n      publicKeyDiscoveryUrl:\n        ssoConfigurationForAad.signatureVerificationConfig.aad.publicKeyDiscoveryUrl,\n      signatureVerificationConfig: new SignatureConfiguration(\n        ssoConfigurationForAad.signatureVerificationConfig\n      ),\n      onNewUser: ssoConfigurationForAad.onNewUser,\n      externalTokenConfig: new ExternalToken(ssoConfigurationForAad.externalTokenConfig),\n      useIdToken: ssoConfiguration.useIdToken\n    };\n    return aadConfiguration;\n  }\n\n  private setupDefaults(ssoConfiguration) {\n    defaults(ssoConfiguration, this.defaults);\n  }\n\n  private getAadAddress(ssoConfiguration) {\n    const urls = this.getUrlsFromRequests(ssoConfiguration);\n\n    const aadAddresses = map(urls, url => this.getAadAddressFromUrl(url));\n    return this.getFirstDefined(aadAddresses);\n  }\n\n  private getTenant(ssoConfiguration) {\n    const urls = this.getUrlsFromRequests(ssoConfiguration);\n\n    const tenants = map(urls, url => this.getTenantFromUrl(url));\n    return this.getFirstDefined(tenants);\n  }\n\n  private getUrlsFromRequests(ssoConfiguration) {\n    return at(ssoConfiguration, [\n      'authorizationRequest.url',\n      'tokenRequest.url',\n      'refreshRequest.url'\n    ]);\n  }\n\n  private getAadAddressFromUrl(url) {\n    const [, aadAddress] = (url || '').match(this.urlPattern) || [];\n    return aadAddress;\n  }\n\n  private getTenantFromUrl(url) {\n    const [, , , tenant] = (url || '').match(this.urlPattern) || [];\n    return tenant;\n  }\n\n  private getClientSecret(ssoConfiguration) {\n    const bodies = at(ssoConfiguration, ['tokenRequest.body', 'refreshRequest.body']);\n    const clientSecrets = map(bodies, body => this.getClientSecretFromBody(body));\n    return this.getFirstDefined(clientSecrets);\n  }\n\n  private getClientSecretFromBody(body) {\n    const [, clientSecret] = (body || '').match(/client_secret=([^&]+)/) || [];\n    return clientSecret ? decodeURIComponent(clientSecret) : undefined;\n  }\n\n  private setupUserIdConfig(ssoConfiguration) {\n    defaultsDeep(ssoConfiguration, { userIdConfig: { jwtField: 'upn' } });\n  }\n\n  private setupSignatureVerificationConfig(ssoConfiguration) {\n    defaultsDeep(ssoConfiguration, {\n      signatureVerificationConfig: { aad: { publicKeyDiscoveryUrl: '' } }\n    });\n    ssoConfiguration.signatureVerificationConfig = pick(\n      ssoConfiguration.signatureVerificationConfig,\n      'aad'\n    );\n  }\n\n  private getRedirectAfterLogout(ssoConfiguration): boolean {\n    return has(ssoConfiguration, 'logoutRequest.requestParams.post_logout_redirect_uri')\n      ? true\n      : false;\n  }\n\n  private 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  private getFirstDefined(values) {\n    return head(reject(values, isUndefined));\n  }\n\n  private 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  standalone: false\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  standalone: false\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  <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, ViewChild } 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  TenantUiService,\n  SimplifiedAuthService\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';\nimport { NgForm } from '@angular/forms';\n\n@Component({\n  selector: 'c8y-sso-configuration',\n  templateUrl: './sso-configuration.component.html',\n  standalone: false\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  @ViewChild('ssoConfigurationForm') ssoConfigurationForm!: NgForm;\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 authService: SimplifiedAuthService,\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    this.ssoConfigurationForm.form.markAsPristine();\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.authService.logout(true);\n      } else {\n        this.loadSsoConfiguration();\n        this.alertService.success(gettext('Configuration saved.'));\n      }\n    } catch (ex) {\n      if (ex) {\n        this.alertService.addServerFailure(ex);\n      } else {\n        this.loadSsoConfiguration();\n      }\n    }\n  }\n\n  private getApplications(): Promise<void | IApplication[]> {\n    return this.applicationService.listByTenant(null, { 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\n    [icon]=\"'cog'\"\n    [label]=\"'Settings' | translate\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    [icon]=\"'cog'\"\n    [label]=\"'Single sign-on' | translate\"\n  ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n  <button\n    class=\"btn btn-link\"\n    title=\"{{ 'Reload' | translate }}\"\n    type=\"button\"\n    (click)=\"loadSsoConfiguration()\"\n  >\n    <i\n      c8yIcon=\"refresh\"\n      [ngClass]=\"{ 'icon-spin': reloading$ | async }\"\n    ></i>\n    {{ 'Reload' | translate }}\n  </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n  [placement]=\"'left'\"\n  itemClass=\"navbar-form hidden-xs\"\n>\n  <div\n    class=\"form-group d-flex m-b-0\"\n    title=\"{{ 'Template' | translate }}\"\n  >\n    <label\n      class=\"control-label\"\n      for=\"template\"\n    >\n      {{ 'Template' | translate }}\n    </label>\n    <div class=\"c8y-select-wrapper\">\n      <select\n        class=\"form-control\"\n        id=\"template\"\n        name=\"template\"\n        *ngIf=\"ssoConfiguration\"\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\n      class=\"card card--fullpage\"\n      #ssoConfigurationForm=\"ngForm\"\n      novalidate\n    >\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\n          class=\"card-block p-0\"\n          *ngIf=\"ssoConfiguration\"\n        >\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          class=\"btn btn-primary\"\n          title=\"{{ 'Save' | translate }}\"\n          type=\"submit\"\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';\n\nimport { of, Observable } from 'rxjs';\nimport { catchError, mapTo } from 'rxjs/operators';\nimport { SsoConfigurationService } from './sso-configuration.service';\n\n@Injectable()\nexport class SsoConfigurationGuard {\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 { CollapseModule } from 'ngx-bootstrap/collapse';\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';\nimport { PaginatedListGroupComponent } from './template-parts/access-mapping/paginated-list-group.component';\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: [\n    CoreModule,\n    TooltipModule,\n    PopoverModule,\n    CollapseModule.forRoot(),\n    BsDatepickerModule,\n    AssetSelectorModule,\n    PaginatedListGroupComponent\n  ],\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 AuthConfigurationTabsFactory implements TabFactory {\n  constructor(\n    public router: Router,\n    private ssoConfigurationService: SsoConfigurationService\n  ) {}\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 AuthConfigurationNavigationFactory implements NavigatorNodeFactory {\n  navs: NavigatorNode[] = [];\n\n  constructor(private permissions: Permissions) {}\n\n  async get() {\n    const userHasPermission = this.permissions.hasAnyRole([\n      Permissions.ROLE_TENANT_ADMIN,\n      Permissions.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 { gettext } from '@c8y/ngx-components';\n\nexport const MESSAGES_AUTH_CONFIGURATION = {\n  '^The tenant option: configuration/tenant.login.ignore-case cannot be enabled : Username or alias is duplicated when case sensitivity is ignored.$':\n    {\n      gettext: gettext(\n        'Could not enable the \"Ignore case when logging in\" feature. Duplicate usernames or aliases were detected when ignoring case sensitivity. Resolve conflicting names and try again.'\n      )\n    },\n  \"^The tenant option: configuration/tenant.login.ignore-case cannot be managed : Feature 'Ignore case on username or alias login' is not available.$\":\n    {\n      gettext: gettext('The feature \"Ignore case when logging in\" is not available.')\n    },\n  \"^The tenant option: configuration/tenant.login.ignore-case cannot be managed : Only a tenant administrator can change the state of the 'Ignore case on username or alias login' feature.$\":\n    {\n      gettext: gettext(\n        'Only a tenant administrator can configure the \"Ignore case when logging in\" option.'\n      )\n    }\n} as const;\n","import { NgModule } from '@angular/core';\nimport { BasicSettingsModule } from './basic-settings/basic-settings.module';\nimport { SsoConfigurationModule } from './sso-configuration/sso-configuration.module';\nimport { hookNavigator, hookPatternMessages, hookRoute, hookTab } from '@c8y/ngx-components';\nimport { AuthConfigurationTabsFactory } from './factories/tabs.factory';\nimport { AuthConfigurationNavigationFactory } from './factories/navigation.factory';\nimport { AuthConfigurationGuard } from './auth-configuration.guard';\nimport { MESSAGES_AUTH_CONFIGURATION } from './pattern-messages.data';\n\n@NgModule({\n  imports: [BasicSettingsModule, SsoConfigurationModule],\n  providers: [\n    AuthConfigurationGuard,\n    hookTab(AuthConfigurationTabsFactory),\n    hookNavigator(AuthConfigurationNavigationFactory),\n    hookPatternMessages(MESSAGES_AUTH_CONFIGURATION),\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":["i3","i1","i2","i3.TenantLoginOptionMapper","i4","i5","i1.AuthConfigurationService","i5.SessionConfigurationComponent","i6.LoginSettingsComponent","i7.BasicAuthSettingsComponent","i8.TfaSettingsComponent","map","i1.SsoConfigurationMapper","i4.ChildPredicatesComponent","i6.ChildPredicatesComponent","i5.PaginatedListGroupComponent","i6.DynamicAccessMappingComponent","i7.InventoryRolesMappingComponent","i5.RequestConfigurationComponent","i6.UserIdConfigurationComponent","i1.CustomConfigurationMapper","i3.BasicConfigurationComponent","i4.RequestConfigurationComponent","i5.UserIdConfigurationComponent","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;AAC1B,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;;AAGpB,IAAA,IAAI,EAAE,GAAA;QACJ,OAAO,IAAI,CAAC,GAAG;;IAGT,QAAQ,GAAA;QACd,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC1C,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACzD,OAAO,UAAU,GAAG,YAAY;;AAEnC;AAEK,SAAU,eAAe,CAAC,iBAAoC,EAAA;AAClE,IAAA,OAAO,iBAAiB,CAAC,IAAI,KAAK,qBAAqB,CAAC,eAAe;AACzE;AAEM,SAAU,OAAO,CAAC,iBAAoC,EAAA;AAC1D,IAAA,OAAO,iBAAiB,CAAC,IAAI,KAAK,qBAAqB,CAAC,KAAK;AAC/D;;MCzCa,0BAA0B,CAAA;AAQrC,IAAA,WAAA,CAAoB,gBAAkC,EAAA;QAAlC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;AAJpC,QAAA,IAAA,CAAA,wBAAwB,GAA0B,qBAAqB,CAAC,KAAK;QAE7E,IAAyB,CAAA,yBAAA,GAAG,qBAAqB;;AAIjD,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;;;IAIrE,SAAS,GAAA;QACP,IAAI,IAAI,CAAC,wBAAwB,KAAK,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,EAAE;YACrF,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,iBAAiB,CAAC,wBAAwB;YAC/E,IAAI,IAAI,CAAC,wBAAwB,KAAK,qBAAqB,CAAC,KAAK,EAAE;AACjE,gBAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;;;;AAKvC,IAAA,IAAI,oBAAoB,GAAA;QACtB,OAAO,IAAI,CAAC,0BAA0B,CAAC,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC;;IAGlF,IAAI,oBAAoB,CAAC,KAAc,EAAA;AACrC,QAAA,IAAI,CAAC,0BAA0B,CAAC,gBAAgB,GAAG,KAAK,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE;;AAGlF,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;AACD,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE;;AAG7C,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;AACD,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE;;AAG7C,IAAA,IAAI,0BAA0B,GAAA;AAC5B,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,0BAA0B;;AAGrF,IAAA,GAAG,CAAC,UAAU,EAAA;QACZ,UAAU,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;;IAG5B,MAAM,CAAC,UAAU,EAAE,EAAE,EAAA;AAC3B,QAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;AACxD,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YACpB,QAAQ,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;;AAElC,QAAA,OAAO,QAAQ;;+GA/DN,0BAA0B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA1B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,0BAA0B,ECZvC,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,gpJA4HA,EDnHiB,YAAA,EAAA,CAAA,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,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,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,IAAA,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;;4FAGxD,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBANtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,EAEpB,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,cACvD,KAAK,EAAA,QAAA,EAAA,gpJAAA,EAAA;qFAIjB,iBAAiB,EAAA,CAAA;sBADhB;;;MERU,sBAAsB,CAAA;AACjC,IAAA,WAAA,CAAoB,WAAwB,EAAA;QAAxB,IAAW,CAAA,WAAA,GAAX,WAAW;;IAE/B,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;AACjC,YAAA,WAAW,CAAC,iBAAiB;AAC7B,YAAA,WAAW,CAAC;AACb,SAAA,CAAC;;+GAPO,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAAtB,sBAAsB,EAAA,CAAA,CAAA;;4FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBADlC;;;MCDY,WAAW,CAAA;IACtB,WACS,CAAA,QAAgB,EAChB,GAAW,EACX,IAAqC,EACrC,YAAwC,EACxC,KAAc,EAAA;QAJd,IAAQ,CAAA,QAAA,GAAR,QAAQ;QACR,IAAG,CAAA,GAAA,GAAH,GAAG;QACH,IAAI,CAAA,IAAA,GAAJ,IAAI;QACJ,IAAY,CAAA,YAAA,GAAZ,YAAY;QACZ,IAAK,CAAA,KAAA,GAAL,KAAK;;AAGd,IAAA,KAAK,CAAC,MAAqC,EAAA;AACzC,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ;AAC/B,QAAA,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG;AACrB,QAAA,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;;IAG3B,QAAQ,GAAA;AACN,QAAA,IAAI;AACF,YAAA,OAAO,IAAI,CAAC,cAAc,EAAE;;QAC5B,OAAO,EAAE,EAAE;YACX,OAAO,IAAI,CAAC,YAAY;;;IAIpB,cAAc,GAAA;AACpB,QAAA,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM;AAC5C,YAAA,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;AAC1C,YAAA,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;AAC1C,YAAA;gBACE,MAAM,IAAI,SAAS,EAAE;;;AAInB,IAAA,gBAAgB,CAAC,WAAmB,EAAA;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;QAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;YAC7C,MAAM,IAAI,KAAK,EAAE;;AAEnB,QAAA,OAAO,KAAK;;AAGN,IAAA,gBAAgB,CAAC,KAAa,EAAA;AACpC,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YACpB,MAAM,IAAI,KAAK,EAAE;;AAEnB,QAAA,OAAO,KAAK;;AAEf;;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;AACD,QAAA,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE;YACxB,WAAW,CAAC,0BAA0B,GAAG,IAAI,CAAC,+BAA+B,CAC3E,iBAAiB,CAAC,0BAA0B,CAC7C;;AAEH,QAAA,OAAO,WAAW;;IAGpB,OAAO,CACL,mBAAsC,EACtC,cAAiC,EAAA;AAEjC,QAAA,IAAI,OAAO,CAAC,mBAAmB,CAAC,EAAE;YAChC,OAAO,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,cAAc,CAAC;;AAEtE,QAAA,IAAI,eAAe,CAAC,mBAAmB,CAAC,EAAE;YACxC,OAAO,IAAI,CAAC,2BAA2B,CAAC,mBAAmB,EAAE,cAAc,CAAC;;QAE9E,MAAM,IAAI,KAAK,CACb,CAAA,2FAAA,EAA8F,mBAAmB,CAAC,IAAI,CAAoB,kBAAA,CAAA,CAC3I;;AAGK,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;AACnB,SAAA,CAAC;AACF,QAAA,YAAY,CAAC,mBAAmB,GAAG,YAAY,CAAC,mBAAmB,CAAC,GAAG,CACrE,GAAG,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,CAC1B;AACD,QAAA,YAAY,CAAC,iBAAiB,GAAG,YAAY,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;AAC9F,QAAA,OAAO,YAAY;;IAGb,mBAAmB,CACzB,mBAAsC,EACtC,cAAiC,EAAA;QAEjC,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,sBAAsB,CAAC,CAAC;QACvE,WAAW,CAAC,0BAA0B,GAAG,IAAI,CAAC,iCAAiC,CAC7E,cAAc,CAAC,0BAA0B,CAC1C;AACD,QAAA,OAAO,WAAW;;IAGZ,2BAA2B,CACjC,mBAAsC,EACtC,cAAiC,EAAA;QAEjC,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,4BAA4B,CAAC,CAAC;QAC7E,cAAc,CAAC,oBAAoB,KAAK;eACnC,WAAW,CAAC,oBAAoB,GAAG,cAAc,CAAC,oBAAoB;AACzE,cAAE,OAAO,WAAW,CAAC,oBAAoB;AAC3C,QAAA,OAAO,WAAW;;AAGZ,IAAA,iCAAiC,CACvC,0BAAsD,EAAA;QAEtD,OAAO;YACL,iBAAiB,EAAE,0BAA0B,CAAC;iBAC3C,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK;iBAC3B,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC;YAC5B,mBAAmB,EAAE,0BAA0B,CAAC;iBAC7C,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK;iBAC3B,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC;AAC5B,YAAA,gBAAgB,EAAE,0BAA0B,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK;SACpF;;AAGK,IAAA,wBAAwB,CAAC,iBAAqC,EAAA;QACpE,OAAO,IAAI,CAAC,iBAAiB,EAAE;YAC7B,MAAM;YACN,kBAAkB;YAClB,aAAa;YACb,gBAAgB;YAChB,iBAAiB;YACjB,kBAAkB;YAClB;AACD,SAAA,CAAC;;+GAzFO,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA,CAAA;;4FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCWY,wBAAwB,CAAA;AAuBnC,IAAA,WAAA,CACU,yBAAoD,EACpD,oBAA0C,EAC1C,oBAA0C,EAC1C,QAAyB,EACzB,eAAgC,EAChC,uBAAgD,EAChD,aAA4B,EAAA;QAN5B,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB;QACzB,IAAoB,CAAA,oBAAA,GAApB,oBAAoB;QACpB,IAAoB,CAAA,oBAAA,GAApB,oBAAoB;QACpB,IAAQ,CAAA,QAAA,GAAR,QAAQ;QACR,IAAe,CAAA,eAAA,GAAf,eAAe;QACf,IAAuB,CAAA,uBAAA,GAAvB,uBAAuB;QACvB,IAAa,CAAA,aAAA,GAAb,aAAa;AA7Bf,QAAA,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;SAC5E;AAEO,QAAA,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;YACjF,IAAI,WAAW,CAAC,eAAe,EAAE,0BAA0B,EAAE,SAAS,EAAE,KAAK;SAC9E;;IAYD,qBAAqB,GAAA;AACnB,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAC7C,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;AAC1E,SAAA,CAAC;;IAGJ,IAAI,CAAC,oBAAuC,EAAE,yBAA4C,EAAA;QACxF,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAC7C,oBAAoB,EACpB,yBAAyB,CAC1B;QACD,MAAM,mBAAmB,GAAG,aAAa,CAAC,GAAG,CAAC,YAAY,IAAG;YAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC;YACrD,IAAI,WAAW,EAAE;AACf,gBAAA,OAAO,WAAW;;YAEpB,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,YAAY,CAAC;AACvD,SAAC,CAAC;QACF,MAAM,gBAAgB,GAAG,IAAI,CAAC,uBAAuB,CACnD,oBAAoB,EACpB,yBAAyB,CAC1B;QACD,MAAM,wBAAwB,GAAG,IAAI,CAAC,+BAA+B,CACnE,oBAAoB,EACpB,yBAAyB,CAC1B;QAED,OAAO,OAAO,CAAC,GAAG,CAAC;AACjB,YAAA,IAAI,CAAC,uBAAuB,CAAC,gBAAgB,CAAC;AAC9C,YAAA,IAAI,CAAC,uBAAuB,CAAC,wBAAwB,CAAC;AACtD,YAAA,GAAG;AACJ,SAAA,CAAC;;AAGI,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;;AAGK,IAAA,uBAAuB,CAC7B,WAA+B,EAAA;QAE/B,OAAO,WAAW,CAAC;cACf,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,WAAW;cACjD,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,WAAW,CAAC;;IAGhD,uBAAuB,CAC7B,oBAAuC,EACvC,yBAA4C,EAAA;AAE5C,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,+BAA+B,CAC3D,yBAAyB,EACzB,qBAAqB,CAAC,KAAK,CAC5B;AACD,QAAA,gBAAgB,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAC3D,oBAAoB,EACpB,qBAAqB,CAAC,KAAK,CAC5B;AACD,QAAA,OAAO,IAAI,CAAC,uBAAuB,CAAC,OAAO,CACzC,gBAAgB,EAChB,IAAI,CAAC,mCAAmC,CAAC,oBAAoB,EAAE,qBAAqB,CAAC,KAAK,CAAC,CAC5F;;IAGK,+BAA+B,CACrC,oBAAuC,EACvC,yBAA4C,EAAA;AAE5C,QAAA,MAAM,wBAAwB,GAAG,IAAI,CAAC,+BAA+B,CACnE,yBAAyB,EACzB,qBAAqB,CAAC,eAAe,CACtC;AACD,QAAA,wBAAwB,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CACnE,oBAAoB,EACpB,qBAAqB,CAAC,eAAe,CACtC;AACD,QAAA,OAAO,IAAI,CAAC,uBAAuB,CAAC,OAAO,CACzC,wBAAwB,EACxB,IAAI,CAAC,mCAAmC,CACtC,oBAAoB,EACpB,qBAAqB,CAAC,eAAe,CACtC,CACF;;IAGK,+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;;IAGK,mCAAmC,CACzC,iBAAoC,EACpC,eAAsC,EAAA;AAEtC,QAAA,OAAO,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,eAAe,CAAC;;IAGzF,kBAAkB,CACxB,iBAAoC,EACpC,eAAsC,EAAA;AAEtC,QAAA,OAAO,iBAAiB,CAAC,wBAAwB,KAAK,eAAe;;IAG/D,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;QAChE,MAAM,UAAU,GAAG,YAAY,IAC7B,QAAQ,CAAC,oBAAoB,EAAE,YAAY,CAAC;AAC5C,YAAA,QAAQ,CAAC,yBAAyB,EAAE,YAAY,CAAC;QAEnD,OAAO,IAAI,CAAC;AACT,aAAA,MAAM,CAAC,YAAY,IAAI,QAAQ,CAAC,oBAAoB,EAAE,YAAY,CAAC,KAAK,IAAI;aAC5E,MAAM,CAAC,YAAY,IAAI,UAAU,CAAC,YAAY,CAAC;AAC/C,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;AAC7D,SAAA,CAAC,CAAC;;IAGC,gBAAgB,GAAA;AACtB,QAAA,OAAO,QAAQ,CAAC;AACd,YAAA,IAAI,CAAC,cAAc,CAAC,qBAAqB,CAAC,MAAM,CAAC;AACjD,YAAA,IAAI,CAAC,cAAc,CAAC,qBAAqB,CAAC,KAAK,CAAC;AAChD,YAAA,IAAI,CAAC,cAAc,CAAC,qBAAqB,CAAC,eAAe;SAC1D,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;;AAGzE,IAAA,cAAc,CACpB,qBAA4C,EAAA;AAE5C,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAC5E,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,EACpB,UAAU,CAAC,MACT,qBAAqB,KAAK,qBAAqB,CAAC;cAC5C,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,qBAAqB,CAAC;AACtD,cAAE,EAAE,CAAC,IAAI,CAAC,CACb,CACF;;AAGK,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;SACvE,CAAC,CACH;;IAGK,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;AACtB,YAAA,OAAO,MAAM;AACf,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;;IAGhD,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;YAC3D,IAAI,WAAW,EAAE;AACf,gBAAA,OAAO,WAAW;;AAGpB,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;AACtB,gBAAA,OAAO,MAAM;AACf,aAAC,CAAC,EACF,UAAU,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAC7B;AACH,SAAC,CAAC,CACH,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;;AAGxD;;;;AAIG;AACK,IAAA,0BAA0B,CAAC,MAAmB,EAAA;AACpD,QAAA,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;AAC3D,gBAAA,OAAO,MAAM;aACd,CAAC,CACH;;AAEH,QAAA,OAAO,IAAI;;AAGb;;;;AAIG;AACK,IAAA,cAAc,CAAC,MAAqB,EAAA;AAC1C,QAAA,IAAI,MAAM,CAAC,QAAQ,KAAK,2BAA2B,IAAI,MAAM,CAAC,GAAG,KAAK,UAAU,EAAE;AAChF,YAAA,MAAM,QAAQ,GAAgB,MAAM,CAAC,KAAK,KAAK,KAAK,GAAG,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,IAAI;AACzF,YAAA,OAAO,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,QAAQ,CAAC;;AAE3F,QAAA,OAAO,IAAI;;IAGL,0BAA0B,GAAA;QAChC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC;;AAG1D,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;AACrE,YAAA,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE;AAC9D,YAAA,OAAO,aAAa;SACrB,EAAE,EAAE,CAAC;;AAGA,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;SACP;;+GA7RQ,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,yBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,uBAAA,EAAA,EAAA,EAAA,KAAA,EAAAF,IAAA,CAAA,aAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAAxB,wBAAwB,EAAA,CAAA,CAAA;;4FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC;;;MCRY,6BAA6B,CAAA;IAuBxC,WACU,CAAA,eAAgC,EAChC,gBAAkC,EAAA;QADlC,IAAe,CAAA,eAAA,GAAf,eAAe;QACf,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAtB1B,IAAyB,CAAA,yBAAA,GAAG,qBAAqB;AACjD,QAAA,IAAA,CAAA,mCAAmC,GAAG,OAAO,CAC3C,6FAA6F,CAC9F;AACD,QAAA,IAAA,CAAA,kCAAkC,GAAG,OAAO,CAAC,+CAA+C,CAAC;AAC7F,QAAA,IAAA,CAAA,qCAAqC,GAAG,OAAO,CAC7C,yDAAyD,CAC1D;AACD,QAAA,IAAA,CAAA,qCAAqC,GAAG,OAAO,CAC7C,2DAA2D,CAC5D;AAED,QAAA,IAAA,CAAA,sCAAsC,GAAG,OAAO,CAC9C,6HAA6H,CAC9H;AAEO,QAAA,IAAA,CAAA,oBAAoB,GAAW,EAAE,GAAG,EAAE;QAQ5C,IAAI,CAAC,mCAAmC,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CACtE,IAAI,CAAC,mCAAmC,EACxC,EAAE,kBAAkB,EAAE,IAAI,CAAC,oBAAoB,EAAE,CAClD;;AAGH,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;YACjF,IAAI,CAAC,4BAA4B,GAAG,SAAS,CAAC,aAAa,CAAC,oBAAoB,CAAC;AACjF,YAAA,IAAI,CAAC,oBAAoB,GAAG,aAAa,CAAC,oBAAoB;AAC9D,YAAA,IAAI,CAAC,qBAAqB;gBACxB,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,8BAA8B,CAAC;;;AAI5F,IAAA,IAAI,qBAAqB,GAAA;AACvB,QAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB;QACtD,OAAO,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,oBAAoB,CAAC;;IAGzE,IAAI,qBAAqB,CAAC,KAAa,EAAA;QACrC,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;;AAG9E,IAAA,IAAI,sBAAsB,GAAA;AACxB,QAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB;QACtD,OAAO,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,qBAAqB,CAAC;;IAG1E,IAAI,sBAAsB,CAAC,KAAa,EAAA;QACtC,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;;AAG/E,IAAA,IAAI,+BAA+B,GAAA;AACjC,QAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,+BAA+B;;IAGlE,IAAI,+BAA+B,CAAC,KAAa,EAAA;AAC/C,QAAA,IAAI,CAAC,oBAAoB,CAAC,+BAA+B,GAAG,KAAK;;AAGnE,IAAA,IAAI,2BAA2B,GAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,2BAA2B;;IAG9D,IAAI,2BAA2B,CAAC,KAAc,EAAA;AAC5C,QAAA,IAAI,CAAC,oBAAoB,CAAC,2BAA2B,GAAG,KAAK;;AAG/D,IAAA,IAAI,kBAAkB,GAAA;QACpB,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,8BAA8B,CAAC;;IAG/F,IAAI,kBAAkB,CAAC,KAAK,EAAA;AAC1B,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,8BAA8B,CAAC,GAAG,KAAK;;AAGhG,IAAA,IAAI,uBAAuB,GAAA;AACzB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,oBAAoB;;IAGpC,IAAI,uBAAuB,CAAC,KAAK,EAAA;QAC/B,IAAI,CAAC,oBAAoB,GAAG;cACxB,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,4BAA4B,EAAE;gBAC9C,qBAAqB,EAAE,UAAU;gBACjC,oBAAoB,EAAE,QAAQ;AAC9B,gBAAA,+BAA+B,EAAE,CAAC;AAClC,gBAAA,2BAA2B,EAAE;aAC9B;cACD,IAAI;QACR,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,IAAI,MAAM,CAAC;;AAGjE,IAAA,IAAI,0BAA0B,GAAA;QAC5B,OAAO;AACL,YAAA,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,kBAAkB,GAAG,CAAC;SACrE;;AAGH,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;SAC9D;;AAGH,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;SACtE;;AAGH,IAAA,IAAI,oBAAoB,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,oBAAoB;;IAGvF,IAAI,oBAAoB,CAAC,KAA4B,EAAA;AACnD,QAAA,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,oBAAoB,GAAG,KAAK;;AAGhF,IAAA,eAAe,CAAC,OAAe,EAAA;AACrC,QAAA,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI;;AAG1C,IAAA,gBAAgB,CAAC,YAAoB,EAAA;AAC3C,QAAA,OAAO,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,IAAI;;+GAvI5D,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,ECf1C,YAAA,EAAA,KAAA,EAAA,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,EAAAD,IAAA,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,EAAAC,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,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,IAAA,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,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,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,EAAAJ,IAAA,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;;4FAGxD,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBANzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,EAEtB,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,cACvD,KAAK,EAAA,QAAA,EAAA,25LAAA,EAAA;uHAIjB,iBAAiB,EAAA,CAAA;sBADhB;;;MEHU,sBAAsB,CAAA;AAoBjC,IAAA,WAAA,CAAoB,eAAgC,EAAA;QAAhC,IAAe,CAAA,eAAA,GAAf,eAAe;AAnBnC,QAAA,IAAA,CAAA,4BAA4B,GAAG,OAAO,CACpC,0XAA0X,CAC3X;AACD,QAAA,IAAA,CAAA,4BAA4B,GAAG,OAAO,CAAC,gDAAgD,CAAC;AACxF,QAAA,IAAA,CAAA,+BAA+B,GAAG,OAAO,CACvC,4EAA4E,CAC7E;QAMD,IAAyB,CAAA,yBAAA,GAAG,qBAAqB;QAEzC,IAAiB,CAAA,iBAAA,GAAG,UAAU;QAC9B,IAAkB,CAAA,kBAAA,GAAG,gBAAgB;QACrC,IAA4B,CAAA,4BAAA,GAAG,mBAAmB;QAClD,IAA4B,CAAA,4BAAA,GAAG,kBAAkB;;AAIzD,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;;;AAIL,IAAA,IAAI,2BAA2B,GAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC;;AAG9F,IAAA,IAAI,qBAAqB,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,2BAA2B,KAAK;cACxC,IAAI,CAAC;AACP,cAAE,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC;;IAG3F,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;;;AAIjG,IAAA,IAAI,6BAA6B,GAAA;AAC/B,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CACjE,IAAI,CAAC,4BAA4B,CAClC;;AAGH,IAAA,IAAI,uBAAuB,GAAA;QACzB,OAAO,IAAI,CAAC;cACR,IAAI,CAAC;AACP,cAAE,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAC1D,IAAI,CAAC,4BAA4B,CAClC;;IAGP,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;;;AAIb,IAAA,IAAI,qBAAqB,GAAA;QACvB,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,0BAA0B,CAAC;;IAG1F,IAAI,qBAAqB,CAAC,KAAK,EAAA;AAC7B,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,0BAA0B,CAAC,GAAG,KAAK;;+GAzEhF,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,ECbnC,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,ygKAwIA,ED9HiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,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,EAAAA,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,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,IAAA,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,IAAA,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,EAAAA,IAAA,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;;4FAGxD,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBANlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAEf,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,cACvD,KAAK,EAAA,QAAA,EAAA,ygKAAA,EAAA;sFAYjB,iBAAiB,EAAA,CAAA;sBADhB;;;AEtBH;AAQA,IAAK,YAKJ;AALD,CAAA,UAAK,YAAY,EAAA;AACf,IAAA,YAAA,CAAA,YAAA,CAAA,yBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,yBAAuB;AACvB,IAAA,YAAA,CAAA,YAAA,CAAA,wBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,wBAAsB;AACtB,IAAA,YAAA,CAAA,YAAA,CAAA,uBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,uBAAqB;AACrB,IAAA,YAAA,CAAA,YAAA,CAAA,wBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,wBAAsB;AACxB,CAAC,EALI,YAAY,KAAZ,YAAY,GAKhB,EAAA,CAAA,CAAA;MAQY,oBAAoB,CAAA;AANjC,IAAA,WAAA,GAAA;AAUE,QAAA,IAAA,CAAA,wBAAwB,GAA0B,qBAAqB,CAAC,KAAK;QAI7E,IAAY,CAAA,YAAA,GAAG,YAAY;QAC3B,IAAe,CAAA,eAAA,GAAG,WAAW;QAC7B,IAAyB,CAAA,yBAAA,GAAG,qBAAqB;AAEjD,QAAA,IAAA,CAAA,2BAA2B,GAAG,OAAO,CAAC,sCAAsC,CAAC;AAC7E,QAAA,IAAA,CAAA,8BAA8B,GAAG,OAAO,CACtC,+DAA+D,CAChE;AAED,QAAA,IAAA,CAAA,iCAAiC,GAAG,OAAO,CAAC,gDAAgD,CAAC;AAC7F,QAAA,IAAA,CAAA,gCAAgC,GAAG,OAAO,CAAC,+CAA+C,CAAC;AAC3F,QAAA,IAAA,CAAA,wCAAwC,GAAG,OAAO,CAChD,gHAAgH,CACjH;AACD,QAAA,IAAA,CAAA,2CAA2C,GAAG,OAAO,CACnD,2FAA2F,CAC5F;AAqGF;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;AACrF,YAAA,IAAI,CAAC,wBAAwB;AAC3B,gBAAA,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,wBAAwB;;;IAIrE,SAAS,GAAA;QACP,IAAI,IAAI,CAAC,wBAAwB,KAAK,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,EAAE;YACrF,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,iBAAiB,CAAC,wBAAwB;AAC/E,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,IAAI;;;AAIvF,IAAA,IAAI,sBAAsB,GAAA;QACxB,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,gBAAgB,CAAC;;IAG5F,IAAI,sBAAsB,CAAC,KAAK,EAAA;AAC9B,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,gBAAgB,CAAC,GAAG,KAAK;;AAG7F,IAAA,IAAI,oBAAoB,GAAA;QACtB,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,cAAc,CAAC;;IAG1F,IAAI,oBAAoB,CAAC,KAAK,EAAA;AAC5B,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,cAAc,CAAC,GAAG,KAAK;;AAG3F,IAAA,IAAI,gBAAgB,GAAA;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,SAAS,CAAC;;IAGrF,IAAI,gBAAgB,CAAC,KAAK,EAAA;AACxB,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,SAAS,CAAC,GAAG,KAAK;;AAGtF,IAAA,IAAI,iBAAiB,GAAA;QACnB,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,UAAU,CAAC;;IAGtF,IAAI,iBAAiB,CAAC,KAAK,EAAA;AACzB,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,UAAU,CAAC,GAAG,KAAK;;AAGvF,IAAA,IAAI,iBAAiB,GAAA;QACnB,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,UAAU,CAAC;;IAGtF,IAAI,iBAAiB,CAAC,KAAK,EAAA;AACzB,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,UAAU,CAAC,GAAG,KAAK;;AAGvF,IAAA,IAAI,sBAAsB,GAAA;QACxB,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,gBAAgB,CAAC;;AAG5F,IAAA,IAAI,kCAAkC,GAAA;QACpC,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CACtE,+BAA+B,CAChC;;AAGH,IAAA,IAAI,gBAAgB,GAAA;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,SAAS,CAAC;;AAGrF,IAAA,IAAI,iBAAiB,GAAA;QACnB,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,UAAU,CAAC;;AAGtF,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,sBAAsB;;QAEjD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE;AACzC,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,sBAAsB;;AAEjD,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,qBAAqB;;AAEhD,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,uBAAuB;;AAGlD,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;;AAI5B,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;;+GA1HhE,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,ECrBjC,YAAA,EAAA,KAAA,EAAA,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,EAAAA,IAAA,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,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,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,IAAA,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,IAAA,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,EAAAA,IAAA,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;;4FAGxD,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAET,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,cACvD,KAAK,EAAA,QAAA,EAAA,4tRAAA,EAAA;8BAIjB,iBAAiB,EAAA,CAAA;sBADhB;;;METU,0BAA0B,CAAA;AAcrC,IAAA,WAAA,CACU,wBAAkD,EAClD,YAA0B,EAC1B,WAAkC,EAClC,YAA0B,EAAA;QAH1B,IAAwB,CAAA,wBAAA,GAAxB,wBAAwB;QACxB,IAAY,CAAA,YAAA,GAAZ,YAAY;QACZ,IAAW,CAAA,WAAA,GAAX,WAAW;QACX,IAAY,CAAA,YAAA,GAAZ,YAAY;AAjBtB,QAAA,IAAA,CAAA,UAAU,GAA6B,IAAI,eAAe,CAAC,KAAK,CAAC;AACjE,QAAA,IAAA,CAAA,MAAM,GAAuB,IAAI,YAAY,EAAE;QAGvC,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;;IAWD,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CACpE,CAAC,iBAAoC,KAAI;AACvC,YAAA,IAAI,CAAC,iBAAiB,GAAG,iBAAiB;YAC1C,IAAI,CAAC,yBAAyB,GAAG,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC;AACpE,SAAC,CACF;QACD,IAAI,CAAC,cAAc,EAAE;;IAGvB,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;;IAGpB,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,6BAA6B,CAAC,WAAW,EAAE;;AAGlD,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;AACvC,YAAA,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CACtC,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,yBAAyB,CAC/B;YACD,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;;QACnC,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,EAAE;AACN,gBAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC;;;;+GAjDjC,0BAA0B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAK,wBAAA,EAAA,EAAA,EAAA,KAAA,EAAAJ,IAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA1B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,0BAA0B,mFCbvC,6vDA4DA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,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,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,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,EAAAE,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,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,EAAAF,IAAA,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,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAF,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FD/Ca,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBALtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,cAEtB,KAAK,EAAA,QAAA,EAAA,6vDAAA,EAAA;;;MEqBN,mBAAmB,CAAA;+GAAnB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,iBAlB5B,6BAA6B;YAC7B,sBAAsB;YACtB,0BAA0B;YAC1B,0BAA0B;YAC1B,oBAAoB,CAAA,EAAA,OAAA,EAAA,CAGZ,UAAU,EAAE,aAAa,CAAA,EAAA,CAAA,CAAA;AAWxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,EAVnB,SAAA,EAAA;YACT,wBAAwB;YACxB,uBAAuB;AACvB,YAAA,SAAS,CAAC;AACR,gBAAA,IAAI,EAAE,mCAAmC;AACzC,gBAAA,SAAS,EAAE,0BAA0B;gBACrC,WAAW,EAAE,CAAC,sBAAsB;aACrC;SACF,EATS,OAAA,EAAA,CAAA,UAAU,EAAE,aAAa,CAAA,EAAA,CAAA,CAAA;;4FAWxB,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;AACD,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;yBACrC;AACF;AACF,iBAAA;;;AC5BD,IAAY,YAIX;AAJD,CAAA,UAAY,YAAY,EAAA;AACtB,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,YAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,YAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACvB,CAAC,EAJW,YAAY,KAAZ,YAAY,GAIvB,EAAA,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;AACxB,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;AAC1B,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;AAC1B;CACF;AAED,IAAY,gBAGX;AAHD,CAAA,UAAY,gBAAgB,EAAA;AAC1B,IAAA,gBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,gBAAA,CAAA,eAAA,CAAA,GAAA,eAA+B;AACjC,CAAC,EAHW,gBAAgB,KAAhB,gBAAgB,GAG3B,EAAA,CAAA,CAAA;;MCdY,uBAAuB,CAAA;AA+FlC,IAAA,WAAA,CAAoB,mBAA8C,EAAA;QAA9C,IAAmB,CAAA,mBAAA,GAAnB,mBAAmB;AA9F/B,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,KAAK,cAAc,CAAC,SAAS;AAAE,gBAAA,OAAO,UAAU,CAAC,IAAI,KAAK,EAAE,CAAC;;AACtE,gBAAA,OAAO,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC;AAC3C,SAAC,CAAC,EACF,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,EACtB,QAAQ,EAAE,EACV,IAAI,CAAC,CAAC,CAAC,CACR;AAEO,QAAA,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,MAAM;AACrB,oBAAA,SAAS,EAAE,aAAa;AACxB,oBAAA,YAAY,EAAE,gBAAgB;AAC9B,oBAAA,KAAK,EAAE;AACR;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;AACR;AACF,aAAA;AACD,YAAA,cAAc,EAAE;AACd,gBAAA,IAAI,EAAE,8EAA8E;AACpF,gBAAA,OAAO,EAAE;AACP,oBAAA,aAAa,EAAE;AAChB,iBAAA;AACD,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,SAAS,EAAE,SAAS;AACpB,gBAAA,aAAa,EAAE;AACb,oBAAA,aAAa,EAAE,SAAS;AACxB,oBAAA,SAAS,EAAE;AACZ;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;AAChB,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;AACvC,wBAAA,cAAc,EAAE;AACjB;AACF;AACF,aAAA;AACD,YAAA,YAAY,EAAE;AACZ,gBAAA,QAAQ,EAAE,EAAE;AACZ,gBAAA,gBAAgB,EAAE;AACnB,aAAA;AACD,YAAA,2BAA2B,EAAE;AAC3B,gBAAA,MAAM,EAAE;AACN,oBAAA,eAAe,EAAE;AAClB;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;AACV,aAAA;AACD,YAAA,UAAU,EAAE;SACb;;IAID,oBAAoB,GAAA;QAClB,OAAO,IAAI,CAAC,iBAAiB;;AAG/B,IAAA,IAAI,CAAC,gBAAkC,EAAA;QACrC,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,gBAAgB,CAAC;;+GAtG7C,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,yBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA,CAAA;;4FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCZY,oBAAoB,CAAA;AAQ/B,IAAA,WAAA,CAAY,oBAAgC,EAAA;QAC1C,IAAI,CAAC,OAAO,GAAG,IAAI,gCAAgC,CAAC,oBAAoB,CAAC,OAAO,CAAC;AACjF,QAAA,IAAI,CAAC,MAAM,GAAG,oBAAoB,CAAC,MAAM;AACzC,QAAA,IAAI,CAAC,SAAS,GAAG,oBAAoB,CAAC,SAAS;QAC/C,IAAI,CAAC,aAAa,GAAG,IAAI,gCAAgC,CAAC,oBAAoB,CAAC,aAAa,CAAC;AAC7F,QAAA,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC,IAAI;AACrC,QAAA,IAAI,CAAC,GAAG,GAAG,oBAAoB,CAAC,GAAG;;IAGrC,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;SACX,EACD,QAAQ,CACK;;AAElB;AAED;AACM,MAAO,gCAAiC,SAAQ,KAAK,CAAA;AACzD,IAAA,WAAA,CAAY,GAA+B,EAAA;AACzC,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,CAAC,IAAI,CACP,GAAGU,KAAG,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,MAAM;YAC3B,GAAG;YACH;SACD,CAAC,CAAC,CACJ;;IAGH,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,KAAI;YAClC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK;AAChC,YAAA,OAAO,GAAG;SACX,EAAE,EAAE,CAAC;;AAET;;AC3CD,IAAY,aAGX;AAHD,CAAA,UAAY,aAAa,EAAA;AACvB,IAAA,aAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,aAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACb,CAAC,EAHW,aAAa,KAAb,aAAa,GAGxB,EAAA,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;AAChD,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;AAChE;CACF;AAED,IAAY,eAKX;AALD,CAAA,UAAY,eAAe,EAAA;AACzB,IAAA,eAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,eAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,eAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,eAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACf,CAAC,EALW,eAAe,KAAf,eAAe,GAK1B,EAAA,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;AACV,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;AACV,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;AACV,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;AACV;CACF;MAUY,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;AACD,QAAA,IAAI,CAAC,GAAG,GAAG,2BAA2B,CAAC,GAAG,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAE;AAC3E,QAAA,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC,IAAI,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;AAC/D,QAAA,IAAI,CAAC,YAAY,GAAG,2BAA2B,CAAC,YAAY,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE;QACnF,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,kBAAkB,CAAC,2BAA2B,CAAC;;IAGnF,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;SACpB;AACD,QAAA,OAAO,IAAI,CACT,MAAM,EACN,qBAAqB,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,mCAAmC,CACtF;;AAGH,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;AACD,QAAA,OAAO,uBAAuB,IAAI,eAAe,CAAC,MAAM;;AAE3D;AAED;AACA,MAAM,2BAA2B,CAAA;AAK/B,IAAA,WAAA,CAAY,MAAyC,EAAA;QAFrD,IAAkB,CAAA,kBAAA,GAAwB,EAAE;AAG1C,QAAA,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe;AAC7C,QAAA,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW;QACrC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC;;AAG9D,IAAA,qBAAqB,CAAC,MAAyC,EAAA;QAC7D,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC;AACpD,QAAA,MAAM,kBAAkB,GAAGA,KAAG,CAAC,YAAY,EAAE,CAAC,WAAW,EAAE,GAAG,MAAM;AAClE,YAAA,GAAG,WAAW;YACd,GAAG;AACH,YAAA,SAAS,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;AAC1C,YAAA,SAAS,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS;AAC1C,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE;AACnC,YAAA,MAAM,oBAAoB,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE;AAC3C,YAAA,kBAAkB,CAAC,IAAI,CAAC,oBAAoB,CAAC;;AAE/C,QAAA,OAAO,kBAAkB;;IAG3B,oBAAoB,GAAA;AAClB,QAAA,MAAM,oBAAoB,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;AAC/E,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,oBAAoB,CAAC;;AAGpD,IAAA,uBAAuB,CAAC,iBAAoC,EAAA;QAC1D,MAAM,wBAAwB,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,iBAAiB,CAAC;QACnF,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,wBAAwB,EAAE,CAAC,CAAC;;IAG7D,QAAQ,GAAA;AACN,QAAA,MAAM,MAAM,GAAsC,IAAI,CAAC,oCAAoC,EAAE;AAC7F,QAAA,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,wBAAwB,EAAE;AACrD,QAAA,OAAO,MAAM;;IAGf,wBAAwB,GAAA;QACtB,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE;YACtC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,SAAS;;AAE5C,QAAA,OAAO,MAAM,CACX,IAAI,CAAC,kBAAkB,EACvB,CAAC,qBAAqB,EAAE,iBAAiB,MAAM;AAC7C,YAAA,GAAG,qBAAqB;AACxB,YAAA,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;AAC9B;SACF,CAAC,EACF,EAAE,CACH;;IAGH,oCAAoC,GAAA;AAClC,QAAA,IAAI,MAAM,GAAG;AACX,YAAA,eAAe,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC;YACnD,WAAW,EAAE,IAAI,CAAC;SACnB;AACD,QAAA,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;AAC3B,YAAA,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC;;AAEtC,QAAA,OAAO,MAAM;;AAEhB;;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;AAChB;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;AAChB;AACF;CACF;AAED,MAAM,6BAA6B,GAAe;AAChD,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;CAChB;AAED,MAAM,mBAAmB,GAAiB;AACxC,IAAA,QAAQ,EAAE,EAAE;AACZ,IAAA,gBAAgB,EAAE;CACnB;MAEY,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;QACnF,IAAI,CAAC,iBAAiB,GAAG,oBAAoB,CAAC,iBAAiB,IAAI,mBAAmB;QACtF,IAAI,CAAC,gBAAgB,GAAG,oBAAoB,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,aAAa;AAC/F,QAAA,IAAI,CAAC,kBAAkB,GAAG,oBAAoB,CAAC,kBAAkB;AACjE,QAAA,IAAI,CAAC,OAAO,GAAG,oBAAoB,CAAC,OAAO;AAC3C,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,oBAAoB,CACpD,oBAAoB,CAAC,sBAAsB,IAAI,6BAA6B,CAC7E;AACD,QAAA,IAAI,CAAC,yCAAyC;AAC5C,YAAA,oBAAoB,CAAC,yCAAyC,IAAI,CAAC;;IAGvE,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACjB,YAAA,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;;AAElC,QAAA,MAAM,mBAAmB,GAAwB;YAC/C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,OAAO,EAAE,IAAI,CAAC;SACf;AACD,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,YAAA,mBAAmB,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB;YAC5D,mBAAmB,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE;AACpF,YAAA,mBAAmB,CAAC,yCAAyC;gBAC3D,IAAI,CAAC,yCAAyC;;AAElD,QAAA,OAAO,mBAAmB;;AAE7B;;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;AACxC,YAAA,kBAAkB,EAAE,aAAa,CAAC,kBAAkB,IAAI,IAAI;AAC5D,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;YAC9E,UAAU,EAAE,aAAa,CAAC;SAC3B;AACD,QAAA,OAAO,gBAAgB;;AAGzB,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;YAC5E,UAAU,EAAE,gBAAgB,CAAC;SAC9B;;+GArDQ,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,cAFxB,MAAM,EAAA,CAAA,CAAA;;4FAEP,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAHrC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCVqB,sBAAsB,CAAA;+GAAtB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cADlB,MAAM,EAAA,CAAA,CAAA;;4FACV,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAD3C,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCOZ,iBAAiB,CAAA;AAWrC,IAAA,WAAA,CAAgC,mBAA8C,EAAA;QAA9C,IAAmB,CAAA,mBAAA,GAAnB,mBAAmB;AAJzC,QAAA,IAAA,CAAA,sBAAsB,GAAG,IAAI,YAAY,EAAoB;;IAMvE,QAAQ,GAAA;QACN,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,6BAA6B,CAAC,SAAS,CAAC,MAAK;YAC3E,IAAI,CAAC,oBAAoB,EAAE;AAC7B,SAAC,CAAC;;AAGJ,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;;;IAInE,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE;;AAGhC,IAAA,mBAAmB,CAAC,gBAAgB,EAAA;QAC1C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,gBAAgB,CAAM;;IAGpE,oBAAoB,GAAA;AAC1B,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;AAC7E,QAAA,IAAI,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE;YAC5B,gBAAgB,CAAC,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE;;AAEhD,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,gBAAgB,CAAC;;+GAtChC,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,sBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,iVAH3B,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,CAAA;;4FAGQ,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAJtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,EAAE;AACZ,oBAAA,UAAU,EAAE;AACb,iBAAA;wFAGU,IAAI,EAAA,CAAA;sBAAZ;gBACQ,MAAM,EAAA,CAAA;sBAAd;gBACQ,cAAc,EAAA,CAAA;sBAAtB;gBACQ,gBAAgB,EAAA,CAAA;sBAAxB;gBACQ,6BAA6B,EAAA,CAAA;sBAArC;gBACS,sBAAsB,EAAA,CAAA;sBAA/B;;;MCLU,2BAA2B,CAAA;AAWtC,IAAA,WAAA,CAAoB,aAA4B,EAAA;QAA5B,IAAa,CAAA,aAAA,GAAb,aAAa;AARjC,QAAA,IAAA,CAAA,kDAAkD,GAAG,OAAO,CAC1D,2JAA2J,CAC5J;QAGD,IAAkB,CAAA,kBAAA,GAAG,KAAK;QAC1B,IAAkB,CAAA,kBAAA,GAAG,EAAE;;AAKvB,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,OAAO,KAAK,IAAI,IAAI,CAAC,aAAa;;AAGpC,IAAA,MAAM,WAAW,GAAA;AACf,QAAA,MAAM,aAAa,GAAG,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,IAAI;AAC/D,QAAA,MAAM,EAAE,UAAU,EAAE,GAAG,aAAa;QACpC,IAAI,CAAC,+BAA+B,GAAG;YACrC,IAAI,EAAE,CAAW,QAAA,EAAA,UAAU,CAAE,CAAA;YAC7B,kBAAkB,EAAE,CAAW,QAAA,EAAA,UAAU,CAAe,aAAA;SACzD;QACD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,IAAI,EAAE;QACrE,IAAI,CAAC,kBAAkB,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,kBAAkB;;+GA1BvD,2BAA2B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAX,IAAA,CAAA,aAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,ECZxC,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,s5aA8aA,EDraiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,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,EAAAI,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,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,EAAAF,IAAA,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,IAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,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,EAAAH,IAAA,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;;AAiBnE,UAAA,CAAA;AADC,IAAA,OAAO,EAAE;;;;AAGT,CAAA,EAAA,2BAAA,CAAA,SAAA,EAAA,YAAA,EAAA,IAAA,CAAA;4FAhBU,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBANvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,EAEpB,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,cACvD,KAAK,EAAA,QAAA,EAAA,s5aAAA,EAAA;oFAGR,aAAa,EAAA,CAAA;sBAArB;gBAaD,UAAU,EAAA,EAAA,EAAA,EAAA,CAAA;;MEfC,6BAA6B,CAAA;AAUxC,IAAA,WAAA,CAAoB,gBAAkC,EAAA;QAAlC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;;AAGpC,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,OAAO,KAAK,IAAI,IAAI,CAAC,aAAa;;AAGpC,IAAA,IAAI,oBAAoB,GAAA;QACtB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC;;AAG7C,IAAA,cAAc,CAAC,KAAK,EAAA;AAClB,QAAA,MAAM,WAAW,GAAG;AAClB,YAAA,GAAG,EAAE,EAAE;AACP,YAAA,KAAK,EAAE;SACR;AACD,QAAA,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;;IAGzB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAA;AAClC,QAAA,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC;AACxB,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE;;AAG7C,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,KAAK,eAAe;;+GAnCjF,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,ECX1C,YAAA,EAAA,KAAA,EAAA,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,ukSAkRA,ED1QiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,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,EAAAE,IAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,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,EAAAA,IAAA,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,IAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,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;;AAgBnE,UAAA,CAAA;AADC,IAAA,OAAO,EAAE;;;;AAGT,CAAA,EAAA,6BAAA,CAAA,SAAA,EAAA,YAAA,EAAA,IAAA,CAAA;4FAfU,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBANzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,EAEtB,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,cACvD,KAAK,EAAA,QAAA,EAAA,ukSAAA,EAAA;qFAGR,aAAa,EAAA,CAAA;sBAArB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBAUD,UAAU,EAAA,EAAA,EAAA,EAAA,CAAA;;MEdC,4BAA4B,CAAA;AANzC,IAAA,WAAA,GAAA;QAUW,IAAU,CAAA,UAAA,GAAG,IAAI;QAE1B,IAAW,CAAA,WAAA,GAAG,CAAC;AAUhB;aAfgB,IAAE,CAAA,EAAA,GAAG,CAAH,CAAK;AAQtB,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,OAAO,KAAK,IAAI,IAAI,CAAC,YAAY;;IAGnC,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,4BAA4B,CAAC,EAAE;;+GAd3C,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,ECVzC,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,87FAyFA,EDlFiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,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,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,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,IAAA,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,IAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,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;;AAYnE,UAAA,CAAA;AADC,IAAA,OAAO,EAAE;;;;AAGT,CAAA,EAAA,4BAAA,CAAA,SAAA,EAAA,YAAA,EAAA,IAAA,CAAA;4FAXU,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBANxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,EAEtB,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,cACvD,KAAK,EAAA,QAAA,EAAA,87FAAA,EAAA;8BAKR,YAAY,EAAA,CAAA;sBAApB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBAKD,UAAU,EAAA,EAAA,EAAA,EAAA,CAAA;;METC,wBAAwB,CAAA;AAOnC,IAAA,WAAA,CAAoB,gBAAkC,EAAA;QAAlC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;AALpC,QAAA,IAAA,CAAA,WAAW,GAAG,OAAO,CAAC,sEAAsE,CAAC;AAE7F,QAAA,IAAA,CAAA,yBAAyB,GAAG,OAAO,CAAC,4BAA4B,CAAC;AACjE,QAAA,IAAA,CAAA,qBAAqB,GAAG,OAAO,CAAC,wBAAwB,CAAC;;IAIzD,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,6BAA6B,EAAE;AACrD,YAAA,IAAI,CAAC,aAAa,CAAC,6BAA6B,GAAG,EAAE;;;AAIzD,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,IAAI,KAAK;;AAG/C,IAAA,aAAa,CAAC,UAAU,EAAA;AACtB,QAAA,IAAI,CAAC,aAAa,CAAC,UAAU,GAAG,UAAU;AAC1C,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE;;+GArBlC,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,ECVrC,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,ukJA2IA,EDpIiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,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,EAAAF,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,EAAAE,IAAA,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;;4FAGxD,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBANpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,EAEtB,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,cACvD,KAAK,EAAA,QAAA,EAAA,ukJAAA,EAAA;qFAGR,aAAa,EAAA,CAAA;sBAArB;;;MEWU,2BAA2B,CAAA;AANxC,IAAA,WAAA,GAAA;QAOW,IAAK,CAAA,KAAA,GAAQ,EAAE;QACf,IAAY,CAAA,YAAA,GAAG,CAAC;QAGzB,IAAW,CAAA,WAAA,GAAG,CAAC;QACf,IAAgB,CAAA,gBAAA,GAAQ,EAAE;AAElB,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AACzB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AA0DrC;IAxDC,QAAQ,GAAA;QACN,IAAI,CAAC,sBAAsB,EAAE;;IAG/B,WAAW,GAAA;QACT,IAAI,CAAC,sBAAsB,EAAE;;IAG/B,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACtB,YAAA,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC;;QAEvF,IAAI,CAAC,sBAAsB,EAAE;;AAG/B,IAAA,WAAW,CAAC,KAAuB,EAAA;AACjC,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI;AAC7B,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY;QACtC,IAAI,CAAC,sBAAsB,EAAE;AAC7B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;;AAGxB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,YAAY,CAAC;AACtE,QAAA,IAAI,UAAU,CAAC,cAAc,EAAE;AAC7B,YAAA,UAAU,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;;;IAItE,sBAAsB,GAAA;AACpB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CACtC,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,EAC1C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CACrC;;AAGH,IAAA,YAAY,CAAC,IAAO,EAAA;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;;IAGjC,YAAY,GAAA;AACV,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACtE,QAAA,IAAI,CAAC,WAAW,GAAG,QAAQ;QAC3B,IAAI,CAAC,sBAAsB,EAAE;AAC7B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAExB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,4BAA4B,CAAC;AACrE,QAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YACxB,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;AAChD,YAAA,IAAI,QAAQ,CAAC,cAAc,EAAE;AAC3B,gBAAA,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;;YAElE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;AAC/C,YAAA,UAAU,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC;;;+GAjEnE,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,wLAGxB,WAAW,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzB3B,y0BA2BA,EDPY,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,UAAU,qgCAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,wBAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAE3B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBANvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,cAExB,IAAI,EAAA,OAAA,EACP,CAAC,UAAU,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAAA,y0BAAA,EAAA;8BAG9B,KAAK,EAAA,CAAA;sBAAb;gBACQ,YAAY,EAAA,CAAA;sBAApB;gBAC0B,YAAY,EAAA,CAAA;sBAAtC,YAAY;uBAAC,WAAW;;;AEvBpB,MAAM,SAAS,GAAG;AACvB,IAAA;AACE,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,KAAK,EAAE,GAAG;AACV,QAAA,OAAO,EAAE;AACV,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,KAAK,EAAE,KAAK;AACZ,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,OAAO,EAAE;AACV,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,KAAK,EAAE,GAAG;AACV,QAAA,OAAO,EAAE;AACV,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,KAAK,EAAE,GAAG;AACV,QAAA,OAAO,EAAE;AACV,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,KAAK,EAAE,KAAK;AACZ,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,OAAO,EAAE;AACV,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,KAAK,EAAE,KAAK;AACZ,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,OAAO,EAAE;AACV,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;AACV;CACF;;MCjCY,wBAAwB,CAAA;AAOnC,IAAA,WAAA,CAAoB,gBAAkC,EAAA;QAAlC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;AAJ1B,QAAA,IAAA,CAAA,0BAA0B,GAAuB,IAAI,YAAY,EAAE;QAE7E,IAAS,CAAA,SAAA,GAAG,SAAS;;AAIrB,IAAA,oBAAoB,CAAC,cAA8B,EAAA;AACjD,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC;QAC1C,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;AACrC,YAAA,IAAI,CAAC,0BAA0B,CAAC,IAAI,EAAE;;AAExC,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE;;IAG7C,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACxB,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,aAAa,EAAE,EAAE;AACjB,YAAA,KAAK,EAAE;AACR,SAAA,CAAC;;+GAtBO,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,ECZrC,YAAA,EAAA,KAAA,EAAA,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,gxHA6HA,EDpHiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,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,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,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,IAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,OAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAF,IAAA,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;;4FAGxD,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBANpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,EAErB,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,cACvD,KAAK,EAAA,QAAA,EAAA,gxHAAA,EAAA;qFAGR,eAAe,EAAA,CAAA;sBAAvB;gBACQ,kBAAkB,EAAA,CAAA;sBAA1B;gBACS,0BAA0B,EAAA,CAAA;sBAAnC;;;MEJU,6BAA6B,CAAA;AAYxC,IAAA,WAAA,CAAmB,gBAAkC,EAAA;QAAlC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;AAJzB,QAAA,IAAA,CAAA,qBAAqB,GAAgC,IAAI,YAAY,EAAE;;IAMjF,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;YAClD,IAAI,CAAC,gBAAgB,EAAE;;;IAI3B,0BAA0B,GAAA;QACxB,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;;AAGrD,IAAA,MAAM,CAAC,aAAa,EAAA;AAClB,QAAA,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;;IAGjD,gBAAgB,GAAA;AACtB,QAAA,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;;AAEH,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;;;;+GAtCI,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,ECX1C,YAAA,EAAA,KAAA,EAAA,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,s1EAmEA,ED3DiB,YAAA,EAAA,CAAA,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,EAAAF,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,EAAA,2BAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,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,IAAA,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;;4FAGxD,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBANzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gCAAgC,EAE3B,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,cACvD,KAAK,EAAA,QAAA,EAAA,s1EAAA,EAAA;qFAGR,MAAM,EAAA,CAAA;sBAAd;gBAGQ,IAAI,EAAA,CAAA;sBAAZ;gBAGQ,aAAa,EAAA,CAAA;sBAArB;gBACS,qBAAqB,EAAA,CAAA;sBAA9B;gBAEQ,kBAAkB,EAAA,CAAA;sBAA1B;;;MEXU,4BAA4B,CAAA;AAOvC,IAAA,WAAA,CAAmB,KAAiB,EAAA;QAAjB,IAAK,CAAA,KAAA,GAAL,KAAK;AAJxB,QAAA,IAAA,CAAA,aAAa,GAAgC,IAAI,YAAY,EAAiB;AAE9E,QAAA,IAAA,CAAA,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC;;IAIzB,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;;IAGnB,MAAM,GAAA;QACJ,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;AAC5C,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;;+GAfR,4BAA4B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,0FCVzC,+nCA6CA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,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,EAAAI,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,OAAA,EAAA,OAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,eAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDnCa,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBALxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,+BAA+B,cAE7B,KAAK,EAAA,QAAA,EAAA,+nCAAA,EAAA;;;MEMN,8BAA8B,CAAA;IASzC,WACS,CAAA,gBAAkC,EACjC,OAAuB,EAAA;QADxB,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QACf,IAAO,CAAA,OAAA,GAAP,OAAO;QAPR,IAAc,CAAA,cAAA,GAAkB,EAAE;QAC3C,IAAsB,CAAA,sBAAA,GAAkB,EAAE;AAEhC,QAAA,IAAA,CAAA,wBAAwB,GAAmC,IAAI,YAAY,EAAE;;IAOvF,WAAW,GAAA;QACT,IAAI,CAAC,yBAAyB,EAAE;;IAGlC,0BAA0B,GAAA;QACxB,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC;;AAG3D,IAAA,MAAM,CAAC,aAA4B,EAAA;AACjC,QAAA,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;;AAG3C,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;QACD,OAAO,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,aAAa,CAAC;;IAGjE,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;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,4BAA4B,EAAE;AAC5D,YAAA,mBAAmB,EAAE,IAAI;AACzB,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,eAAe,EAAE,YAAY;AAC7B,YAAA,cAAc,EAAE,aAAa;AAC7B,YAAA,YAAY,EAAE;AACZ,gBAAA,cAAc,EAAE;AACjB;AACF,SAAA,CAAC;QACF,KAAK,CAAC,OAAO,CAAC;aACX,IAAI,CACH,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;aAEvD,SAAS,CAAC,cAAc,IAAG;AAC1B,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;YACD,MAAM,iBAAiB,GAAoB,iBAAiB,CAAC,GAAG,CAC9D,KAAK,KAAK,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAkB,CACrE;YACD,IAAI,CAAC,gBAAgB,CAAC,kBAAkB;gBACtC,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,MAAM,CAAC,iBAAiB,CAAC;AACtE,SAAC,CAAC;;IAGE,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;AACH,aAAC,CAAC;;;+GArEK,8BAA8B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA9B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,8BAA8B,ECd3C,YAAA,EAAA,KAAA,EAAA,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,gsIA6GA,EDlGiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,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,EAAAJ,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,EAAA,2BAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,OAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAS,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,EAAAd,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAI,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAJ,IAAA,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;;4FAGxD,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAN1C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iCAAiC,EAE5B,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,cACvD,KAAK,EAAA,QAAA,EAAA,gsIAAA,EAAA;oHAGR,gBAAgB,EAAA,CAAA;sBAAxB;gBACQ,qBAAqB,EAAA,CAAA;sBAA7B;gBAEQ,cAAc,EAAA,CAAA;sBAAtB;gBAGS,wBAAwB,EAAA,CAAA;sBAAjC;;;MEPU,sBAAsB,CAAA;IAoCjC,WACU,CAAA,gBAAkC,EAClC,GAAsB,EAAA;QADtB,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAChB,IAAG,CAAA,GAAA,GAAH,GAAG;AA1Bb,QAAA,IAAA,CAAA,2CAA2C,GAAG,OAAO,CACnD,mLAAmL,CACpL;AACD,QAAA,IAAA,CAAA,0CAA0C,GAAG,OAAO,CAClD,kDAAkD,CACnD;AAED,QAAA,IAAA,CAAA,4DAA4D,GAAG,OAAO,CACpE,2MAA2M,CAC5M;AACD,QAAA,IAAA,CAAA,2DAA2D,GAAG,OAAO,CACnE,gHAAgH,CACjH;AAED,QAAA,IAAA,CAAA,8CAA8C,GAAG,OAAO,CACtD,2MAA2M,CAC5M;AACD,QAAA,IAAA,CAAA,6CAA6C,GAAG,OAAO,CACrD,8GAA8G,CAC/G;AAED,QAAA,IAAA,CAAA,yBAAyB,GAAG,OAAO,CAAC,4BAA4B,CAAC;AACjE,QAAA,IAAA,CAAA,qBAAqB,GAAG,OAAO,CAAC,wBAAwB,CAAC;;IAOzD,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;YAClD,IAAI,CAAC,iBAAiB,EAAE;;;IAI5B,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;AACnE,aAAA;AACD,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,gBAAgB,EAAE;SACnB;QACD,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,CAAC,QAAQ;AAC3E,QAAA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,CAAC,QAAQ,GAAG,CAAC,GAAG,cAAc,EAAE,YAAY,CAAC;AACxF,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,uBAAuB,CAAC,YAAY,EAAE;;IAG7C,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;AACnE,aAAA;AACD,YAAA,kBAAkB,EAAE;SACrB;QACD,MAAM,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,CAAC,iBAAiB;QACvF,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,CAAC,iBAAiB,GAAG;AAC9D,YAAA,GAAG,iBAAiB;YACpB;SACD;AACD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,0BAA0B,CAAC,YAAY,EAAE;;AAGhD,IAAA,QAAQ,CAAC,aAA4B,EAAA;QACnC,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,CAAC,QAAQ;QAC3E,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,CAAC,QAAQ,GAAG,cAAc,CAAC,MAAM,CAC1E,OAAO,IAAI,OAAO,KAAK,aAAa,CACrC;;AAGH,IAAA,wBAAwB,CAAC,gBAAkC,EAAA;QACzD,MAAM,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,CAAC,iBAAiB;QACvF,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,CAAC,iBAAiB,GAAG,iBAAiB,CAAC,MAAM,CACtF,OAAO,IAAI,OAAO,KAAK,gBAAgB,CACxC;;AAGH,IAAA,8BAA8B,CAC5B,sBAA+B,EAC/B,gCAAgC,GAAG,KAAK,EAAA;AAExC,QAAA,IAAI,CAAC,2BAA2B,CAAC,sBAAsB,GAAG,sBAAsB;QAChF,IAAI,CAAC,2BAA2B,CAAC,gCAAgC;AAC/D,YAAA,gCAAgC;AAClC,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE;;AAG7C,IAAA,IAAI,sBAAsB,GAAA;AACxB,QAAA,OAAO,IAAI,CAAC,2BAA2B,CAAC,sBAAsB;;AAGhE,IAAA,IAAI,gCAAgC,GAAA;AAClC,QAAA,OAAO,IAAI,CAAC,2BAA2B,CAAC,gCAAgC;;AAG1E,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,2BAA2B,CAAC,cAAc;;AAGxD,IAAA,iBAAiB,CAAC,cAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,2BAA2B,CAAC,cAAc,GAAG,cAAc;AAChE,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE;;AAG7C,IAAA,IAAY,2BAA2B,GAAA;QACrC,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,CAAC,aAAa;;IAG1D,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;AACrB,gBAAA,aAAa,EAAE;AACb,oBAAA,sBAAsB,EAAE,KAAK;AAC7B,oBAAA,gCAAgC,EAAE;AACnC;AACF;AACF,SAAA,CAAC;QACF,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc;QACrE,MAAM,EAAE,sBAAsB,EAAE,gCAAgC,EAAE,cAAc,EAAE,GAChF,aAAa;AACf,QAAA,aAAa,CAAC,cAAc;AAC1B,YAAA,cAAc,KAAK;AACjB,kBAAE;kBACA,sBAAsB,KAAK,KAAK,IAAI,gCAAgC,KAAK,KAAK;;+GA7I3E,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,ECdnC,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,yBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,yBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,4BAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,4BAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,67QAgOA,EDrNiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,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,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,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,EAAAE,IAAA,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,EAAAa,2BAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,cAAA,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,IAAA,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;;4FAGxD,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBANlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,EAEnB,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,cACvD,KAAK,EAAA,QAAA,EAAA,67QAAA,EAAA;qHAGR,IAAI,EAAA,CAAA;sBAAZ;gBACQ,MAAM,EAAA,CAAA;sBAAd;gBACQ,cAAc,EAAA,CAAA;sBAAtB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBAGD,uBAAuB,EAAA,CAAA;sBADtB,SAAS;uBAAC,yBAAyB;gBAIpC,0BAA0B,EAAA,CAAA;sBADzB,SAAS;uBAAC,4BAA4B;;;MEP5B,+BAA+B,CAAA;IAc1C,WACY,CAAA,gBAAkC,EACpC,iBAAoC,EAAA;QADlC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAClB,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB;QAb3B,IAAe,CAAA,eAAA,GAAG,eAAe;QACjC,IAAgB,CAAA,gBAAA,GAAG,qBAAqB;QAExC,IAAc,CAAA,cAAA,GAAG,mBAAmB;AAIpC,QAAA,IAAA,CAAA,4BAA4B,GAAG,OAAO,CACpC,wJAAwJ,CACzJ;;IAOD,QAAQ,GAAA;QACN,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE;;AAI/D,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,OAAO,KAAK,IAAI,IAAI,CAAC,aAAa;;AAGpC,IAAA,uBAAuB,CAAC,iBAAoC,EAAA;QAC1D,IAAI,CAAC,aAAa,CAAC,2BAA2B,CAAC,MAAM,CAAC,uBAAuB,CAC3E,iBAAiB,CAClB;AACD,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE;;+GAhClC,+BAA+B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA/B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,+BAA+B,EChB5C,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,o6aAuXA,ED1WiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,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,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,8FAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,iBAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,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,IAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,OAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,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,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,oBAAA,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,EAAAH,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAF,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;;AA2BnE,UAAA,CAAA;AADC,IAAA,OAAO,EAAE;;;;AAGT,CAAA,EAAA,+BAAA,CAAA,SAAA,EAAA,YAAA,EAAA,IAAA,CAAA;4FA1BU,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAN3C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iCAAiC,EAE5B,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,cACvD,KAAK,EAAA,QAAA,EAAA,o6aAAA,EAAA;uHAGR,aAAa,EAAA,CAAA;sBAArB;gBAuBD,UAAU,EAAA,EAAA,EAAA,EAAA,CAAA;;ME7BC,4BAA4B,CAAA;AANzC,IAAA,WAAA,GAAA;QASE,IAAiB,CAAA,iBAAA,GAAG,sBAAsB;AAY3C;AAVC,IAAA,IAAI,mBAAmB,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,mBAAmB;;AAG/C,IAAA,wBAAwB,CAAC,KAAK,EAAA;AAC5B,QAAA,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,GAAG,KAAK;AACjD,QAAA,IAAI,CAAC,mBAAmB,CAAC,sBAAsB,GAAG,IAAI,oBAAoB,CACxE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,QAAQ,CACvC;;+GAbQ,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,ECXzC,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,0/JAyIA,EDjIiB,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,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,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,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,IAAA,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,IAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAc,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,EAAAlB,IAAA,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;;4FAGxD,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBANxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,EAEtB,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,cACvD,KAAK,EAAA,QAAA,EAAA,0/JAAA,EAAA;8BAGR,aAAa,EAAA,CAAA;sBAArB;;;AEAG,MAAO,uBAAwB,SAAQ,iBAAyC,CAAA;AACpF,IAAA,WAAA,CAAoB,yBAAoD,EAAA;QACtE,KAAK,CAAC,yBAAyB,CAAC;QADd,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB;;+GADlC,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAmB,yBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,ECZpC,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,2kDA6CA,EDpCiB,YAAA,EAAA,CAAA,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,EAAAC,2BAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,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,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,2BAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,IAAA,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;;4FAGxD,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBANnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAEhB,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,cACvD,KAAK,EAAA,QAAA,EAAA,2kDAAA,EAAA;;;MEEN,2BAA2B,CAAA;AAHxC,IAAA,WAAA,GAAA;QAIU,IAAU,CAAA,UAAA,GAAG,+BAA+B;AAoHrD;AAlHC,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;AACjF,YAAA,kBAAkB,EAAE,aAAa,CAAC,kBAAkB,IAAI,IAAI;AAC5D,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;AACjH;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,EACF,6GAA6G;AAC7G,oBAAA,aAAa,CAAC;AACjB,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;AAChB,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;AACP,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;AAChB,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;AACjB,aAAA;YACD,SAAS,EAAE,SAAS,CAAC,kBAAkB;YACvC,6BAA6B,EAAE,aAAa,CAAC,6BAA6B;AAC1E,YAAA,mBAAmB,EAAE,aAAa,CAAC,mBAAmB,CAAC,qBAAqB,EAAE;YAC9E,UAAU,EAAE,aAAa,CAAC;SAC3B;AACD,QAAA,OAAO,gBAAgB;;AAGzB,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;YAC5E,UAAU,EAAE,gBAAgB,CAAC;SAC9B;;AAGK,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;AACpE,QAAA,OAAO,eAAe;;AAGhB,IAAA,YAAY,CAAC,GAAG,EAAA;QACtB,MAAM,KAAK,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;AAChE,QAAA,OAAO,SAAS;;AAGV,IAAA,eAAe,CAAC,gBAAgB,EAAA;AACtC,QAAA,MAAM,MAAM,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC;AACjF,QAAA,MAAM,aAAa,GAAGjB,KAAG,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAC7E,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC;AACxD,QAAA,OAAO,YAAY,GAAG,kBAAkB,CAAC,YAAY,CAAC,GAAG,EAAE;;AAGrD,IAAA,uBAAuB,CAAC,IAAI,EAAA;AAClC,QAAA,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC,uBAAuB,CAAC,IAAI,EAAE;AAC1E,QAAA,OAAO,YAAY;;AAGb,IAAA,eAAe,CAAC,MAAM,EAAA;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;;AAGlC,IAAA,UAAU,CAAC,gBAAgB,EAAA;QACjC,OAAO,GAAG,CAAC,gBAAgB,EAAE,0CAA0C,EAAE,EAAE,CAAC;;+GAnHnE,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,2BAA2B,cAF1B,MAAM,EAAA,CAAA,CAAA;;4FAEP,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAHvC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACCK,MAAO,yBAA0B,SAAQ,iBAAwC,CAAA;AACrF,IAAA,WAAA,CAAoB,2BAAwD,EAAA;QAC1E,KAAK,CAAC,2BAA2B,CAAC;QADhB,IAA2B,CAAA,2BAAA,GAA3B,2BAA2B;;+GADpC,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAkB,2BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,ECZtC,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,80BAuBA,EDdiB,YAAA,EAAA,CAAA,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,EAAAR,2BAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,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,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,EAAAK,4BAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,IAAA,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;;4FAGxD,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBANrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,EAEnB,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,cACvD,KAAK,EAAA,QAAA,EAAA,80BAAA,EAAA;;;MEaN,sBAAsB,CAAA;AAHnC,IAAA,WAAA,GAAA;AAIU,QAAA,IAAA,CAAA,QAAQ,GAAG;AACjB,YAAA,kBAAkB,EAAE;SACrB;QAEO,IAAU,CAAA,UAAA,GAAG,4CAA4C;AA4MlE;AA1MC,IAAA,OAAO,CAAC,aAA+B,EAAA;QACrC,MAAM,OAAO,GAAG,CAAA,EAAG,aAAa,CAAC,UAAU,CAAA,CAAA,EAAI,aAAa,CAAC,MAAM,CAAA,OAAA,CAAS;AAE5E,QAAA,MAAM,gBAAgB,GAAqB;YACzC,QAAQ,EAAE,aAAa,CAAC,aAAa;YACrC,QAAQ,EAAE,aAAa,CAAC,aAAa;YACrC,aAAa,EAAE,aAAa,CAAC;AAC3B,kBAAE;AACE,oBAAA,MAAM,EAAE,MAAM;oBACd,GAAG,EAAE,CAAG,EAAA,OAAO,CAAS,OAAA,CAAA;AACxB,oBAAA,aAAa,EAAE;wBACb,wBAAwB,EAAE,aAAa,CAAC;AACzC,qBAAA;AACD,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,IAAI,EAAE,EAAE;AACR,oBAAA,SAAS,EAAE;AACZ;AACH,kBAAE;AACE,oBAAA,MAAM,EAAE,MAAM;AACd,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,SAAS,EAAE,UAAU;AACrB,oBAAA,aAAa,EAAE;AAChB,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;AAChB,iBAAA;AACD,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,IAAI,EAAE,EAAE;AACR,gBAAA,SAAS,EAAE;AACZ,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;iBAC7D,CAAC;AACF,gBAAA,SAAS,EAAE;AACZ,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;iBAC7D,CAAC;AACF,gBAAA,SAAS,EAAE;AACZ,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;AAC1E,YAAA,kBAAkB,EAAE,aAAa,CAAC,kBAAkB,IAAI,IAAI;YAC5D,QAAQ,EAAE,YAAY,CAAC,KAAK;AAC5B,YAAA,YAAY,EAAE;AACZ,gBAAA,gBAAgB,EAAE,KAAK;AACvB,gBAAA,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC;AACtC,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;YAC9E,UAAU,EAAE,aAAa,CAAC;SAC3B;AACD,QAAA,OAAO,gBAAgB;;AAGzB,IAAA,KAAK,CAAC,gBAAkC,EAAA;AACtC,QAAA,MAAM,sBAAsB,GAAG,SAAS,CAAC,gBAAgB,CAAC;AAE1D,QAAA,MAAM,cAAc,GAAG,EAAE,CAAC,sBAAsB,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAC3E,QAAA,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC;AAC1C,QAAA,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,CAAC;AAC9C,QAAA,IAAI,CAAC,gCAAgC,CAAC,sBAAsB,CAAC;AAE7D,QAAA,MAAM,gBAAgB,GAAqB;AACzC,YAAA,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC;AACtD,YAAA,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC;AAC9C,YAAA,aAAa,EAAE,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;YACnD,kBAAkB,EAAE,sBAAsB,CAAC,kBAAkB;AAC7D,YAAA,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC;YAC1D,MAAM,EAAE,sBAAsB,CAAC,MAAM;YACrC,UAAU,EAAE,sBAAsB,CAAC,UAAU;YAC7C,kBAAkB,EAAE,sBAAsB,CAAC,kBAAkB;AAC7D,YAAA,mBAAmB,EAAE,IAAI,CAAC,sBAAsB,CAAC,sBAAsB,CAAC;AACxE,YAAA,sBAAsB,EAAE,IAAI,CAAC,yBAAyB,CAAC,sBAAsB,CAAC;YAC9E,6BAA6B,EAAE,sBAAsB,CAAC,6BAA6B;AACnF,YAAA,YAAY,EAAE;AACZ,gBAAA,QAAQ,EAAE,sBAAsB,CAAC,YAAY,CAAC;AAC/C,aAAA;AACD,YAAA,qBAAqB,EACnB,sBAAsB,CAAC,2BAA2B,CAAC,GAAG,CAAC,qBAAqB;AAC9E,YAAA,2BAA2B,EAAE,IAAI,sBAAsB,CACrD,sBAAsB,CAAC,2BAA2B,CACnD;YACD,SAAS,EAAE,sBAAsB,CAAC,SAAS;AAC3C,YAAA,mBAAmB,EAAE,IAAI,aAAa,CAAC,sBAAsB,CAAC,mBAAmB,CAAC;YAClF,UAAU,EAAE,gBAAgB,CAAC;SAC9B;AACD,QAAA,OAAO,gBAAgB;;AAGjB,IAAA,aAAa,CAAC,gBAAgB,EAAA;AACpC,QAAA,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC;;AAGnC,IAAA,aAAa,CAAC,gBAAgB,EAAA;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC;AAEvD,QAAA,MAAM,YAAY,GAAGpB,KAAG,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;AACrE,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC;;AAGnC,IAAA,SAAS,CAAC,gBAAgB,EAAA;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC;AAEvD,QAAA,MAAM,OAAO,GAAGA,KAAG,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;AAC5D,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;;AAG9B,IAAA,mBAAmB,CAAC,gBAAgB,EAAA;QAC1C,OAAO,EAAE,CAAC,gBAAgB,EAAE;YAC1B,0BAA0B;YAC1B,kBAAkB;YAClB;AACD,SAAA,CAAC;;AAGI,IAAA,oBAAoB,CAAC,GAAG,EAAA;AAC9B,QAAA,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;AAC/D,QAAA,OAAO,UAAU;;AAGX,IAAA,gBAAgB,CAAC,GAAG,EAAA;QAC1B,MAAM,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;AAC/D,QAAA,OAAO,MAAM;;AAGP,IAAA,eAAe,CAAC,gBAAgB,EAAA;AACtC,QAAA,MAAM,MAAM,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC;AACjF,QAAA,MAAM,aAAa,GAAGA,KAAG,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;AAC7E,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC;;AAGpC,IAAA,uBAAuB,CAAC,IAAI,EAAA;AAClC,QAAA,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC,uBAAuB,CAAC,IAAI,EAAE;AAC1E,QAAA,OAAO,YAAY,GAAG,kBAAkB,CAAC,YAAY,CAAC,GAAG,SAAS;;AAG5D,IAAA,iBAAiB,CAAC,gBAAgB,EAAA;AACxC,QAAA,YAAY,CAAC,gBAAgB,EAAE,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;;AAG/D,IAAA,gCAAgC,CAAC,gBAAgB,EAAA;QACvD,YAAY,CAAC,gBAAgB,EAAE;YAC7B,2BAA2B,EAAE,EAAE,GAAG,EAAE,EAAE,qBAAqB,EAAE,EAAE,EAAE;AAClE,SAAA,CAAC;QACF,gBAAgB,CAAC,2BAA2B,GAAG,IAAI,CACjD,gBAAgB,CAAC,2BAA2B,EAC5C,KAAK,CACN;;AAGK,IAAA,sBAAsB,CAAC,gBAAgB,EAAA;AAC7C,QAAA,OAAO,GAAG,CAAC,gBAAgB,EAAE,sDAAsD;AACjF,cAAE;cACA,KAAK;;AAGH,IAAA,yBAAyB,CAAC,gBAAgB,EAAA;AAChD,QAAA,OAAO,gBAAgB,CAAC,aAAa,CAAC,aAAa,CAAC;AAClD,cAAE,gBAAgB,CAAC,aAAa,CAAC,aAAa,CAAC;cAC7C,IAAI;;AAGF,IAAA,eAAe,CAAC,MAAM,EAAA;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;;AAGlC,IAAA,cAAc,CAAC,MAAM,EAAA;QAC3B,OAAOA,KAAG,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,GAAG,CAAA,CAAA,EAAI,KAAK,CAAE,CAAA,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;;+GA/MtD,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cAFrB,MAAM,EAAA,CAAA,CAAA;;4FAEP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCbY,4BAA4B,CAAA;+GAA5B,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,ECTzC,YAAA,EAAA,KAAA,EAAA,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,EAAAV,IAAA,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,EAAAA,IAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,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,IAAA,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,IAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,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;;4FAGxD,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBANxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,8BAA8B,EAEzB,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,cACvD,KAAK,EAAA,QAAA,EAAA,u7CAAA,EAAA;8BAGR,aAAa,EAAA,CAAA;sBAArB;;;AEEG,MAAO,oBAAqB,SAAQ,iBAAmC,CAAA;AAC3E,IAAA,WAAA,CAAoB,sBAA8C,EAAA;QAChE,KAAK,CAAC,sBAAsB,CAAC;QADX,IAAsB,CAAA,sBAAA,GAAtB,sBAAsB;;+GAD/B,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA+B,sBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,ECZjC,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,42BAuBA,EDdiB,YAAA,EAAA,CAAA,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,EAAAX,2BAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAY,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;;4FAGxD,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAEb,aAAA,EAAA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,cACvD,KAAK,EAAA,QAAA,EAAA,42BAAA,EAAA;;;MEmBN,yBAAyB,CAAA;AA+BpC,IAAA,WAAA,CACU,uBAAgD,EAChD,kBAAsC,EACtC,gBAAkC,EAClC,oBAA0C,EAC1C,YAA0B,EAC1B,YAA0B,EAC1B,WAAkC,EAClC,eAAgC,EAAA;QAPhC,IAAuB,CAAA,uBAAA,GAAvB,uBAAuB;QACvB,IAAkB,CAAA,kBAAA,GAAlB,kBAAkB;QAClB,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAChB,IAAoB,CAAA,oBAAA,GAApB,oBAAoB;QACpB,IAAY,CAAA,YAAA,GAAZ,YAAY;QACZ,IAAY,CAAA,YAAA,GAAZ,YAAY;QACZ,IAAW,CAAA,WAAA,GAAX,WAAW;QACX,IAAe,CAAA,eAAA,GAAf,eAAe;QAjCzB,IAAY,CAAA,YAAA,GAAG,YAAY;QAC3B,IAAkB,CAAA,kBAAA,GAAG,kBAAkB;AAEvC,QAAA,IAAA,CAAA,UAAU,GAA6B,IAAI,eAAe,CAAC,KAAK,CAAC;AACjE,QAAA,IAAA,CAAA,MAAM,GAAuB,IAAI,YAAY,EAAE;AAC/C,QAAA,IAAA,CAAA,WAAW,GAAkB,IAAI,OAAO,EAAE;AAMlC,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;SACvC,CAAC,CACH,EACD,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EACtC,WAAW,CAAC,CAAC,CAAC,CACf;;IAaD,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;AAChB,YAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,YAAA,IAAI,CAAC,cAAc,GAAG,cAAc;AACpC,YAAA,IAAI,CAAC,gBAAgB,GAAG,gBAAgB;AAC1C,SAAC,CACF;QACD,IAAI,CAAC,oBAAoB,EAAE;;IAG7B,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE;;IAGrC,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AAClB,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,cAAc,EAAE;;IAGjD,MAAM,IAAI,CAAC,gBAAgB,EAAA;AACzB,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,yBAAyB,EAAE;AACtC,YAAA,MAAM,cAAc,GAClB,IAAI,CAAC,eAAe,CAAC,uBAAuB,EAAE,KAAK,qBAAqB,CAAC,KAAK;YAChF,IAAI,cAAc,EAAE;AAClB,gBAAA,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;;YAEzC,MAAM,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,gBAAgB,CAAC;YACzD,IAAI,cAAc,EAAE;gBAClB,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;;iBAC9B;gBACL,IAAI,CAAC,oBAAoB,EAAE;gBAC3B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;;;QAE5D,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,EAAE;AACN,gBAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC;;iBACjC;gBACL,IAAI,CAAC,oBAAoB,EAAE;;;;IAKzB,eAAe,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CACvE,GAAG,IAAI,GAAG,CAAC,IAAI,EACf,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,KAAK,CAAC,CACnD;;IAGK,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;;IAGK,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;;AAGK,IAAA,MAAM,yBAAyB,GAAA;AACrC,QAAA,MAAM,WAAW,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,0BAA0B,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC1F,QAAA,MAAM,SAAS,GAAG,OAAO,CACvB,kIAAkI,CACnI;QACD,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CACpC,OAAO,CAAC,wBAAwB,CAAC,EACjC,SAAS,EACT,MAAM,CAAC,OAAO,EACd,WAAW,CACZ;;+GAtHQ,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAW,uBAAA,EAAA,EAAA,EAAA,KAAA,EAAApC,IAAA,CAAA,kBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAAF,IAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,gNC7BtC,gsHA4HA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,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,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,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,EAAAJ,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,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,EAAA,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,EAAAkC,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,EAAAzC,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAI,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;;4FD/Fa,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBALrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,cAErB,KAAK,EAAA,QAAA,EAAA,gsHAAA,EAAA;kUAekB,oBAAoB,EAAA,CAAA;sBAAtD,SAAS;uBAAC,sBAAsB;;;MEnCtB,qBAAqB,CAAA;AAChC,IAAA,WAAA,CAAoB,uBAAgD,EAAA;QAAhD,IAAuB,CAAA,uBAAA,GAAvB,uBAAuB;;IAE3C,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;;+GAPQ,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAkC,uBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAArB,qBAAqB,EAAA,CAAA,CAAA;;4FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC;;;MCqEY,sBAAsB,CAAA;+GAAtB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,iBAzC/B,yBAAyB;YACzB,uBAAuB;YACvB,yBAAyB;YACzB,oBAAoB;YACpB,2BAA2B;YAC3B,6BAA6B;YAC7B,4BAA4B;YAC5B,wBAAwB;YACxB,sBAAsB;YACtB,6BAA6B;YAC7B,+BAA+B;YAC/B,4BAA4B;YAC5B,wBAAwB;YACxB,8BAA8B;YAC9B,4BAA4B;AAC5B,YAAA,4BAA4B,aAG5B,UAAU;YACV,aAAa;AACb,YAAA,aAAa,uBAEb,kBAAkB;YAClB,mBAAmB;AACnB,YAAA,2BAA2B,aAEnB,yBAAyB,CAAA,EAAA,CAAA,CAAA;AAexB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,EAdtB,SAAA,EAAA;YACT,qBAAqB;YACrB,QAAQ;YACR,uBAAuB;YACvB,sBAAsB;YACtB,yBAAyB;YACzB,2BAA2B;AAC3B,YAAA,SAAS,CAAC;AACR,gBAAA,IAAI,EAAE,mCAAmC;AACzC,gBAAA,SAAS,EAAE,yBAAyB;AACpC,gBAAA,WAAW,EAAE,CAAC,sBAAsB,EAAE,qBAAqB;aAC5D;AACF,SAAA,EAAA,OAAA,EAAA,CArBC,UAAU;YACV,aAAa;YACb,aAAa;YACb,cAAc,CAAC,OAAO,EAAE;YACxB,kBAAkB;YAClB,mBAAmB;YACnB,2BAA2B,CAAA,EAAA,CAAA,CAAA;;4FAiBlB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBA3ClC,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;AACD,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,UAAU;wBACV,aAAa;wBACb,aAAa;wBACb,cAAc,CAAC,OAAO,EAAE;wBACxB,kBAAkB;wBAClB,mBAAmB;wBACnB;AACD,qBAAA;oBACD,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;yBAC5D;AACF;AACF,iBAAA;;;MClEY,4BAA4B,CAAA;IACvC,WACS,CAAA,MAAc,EACb,uBAAgD,EAAA;QADjD,IAAM,CAAA,MAAA,GAAN,MAAM;QACL,IAAuB,CAAA,uBAAA,GAAvB,uBAAuB;;IAEjC,GAAG,GAAA;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE;AACjD,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC;;QAGf,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;AACP,SAAA,CAAC;AACT,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;SACP,CAAC,EACT,UAAU,CAAC,MAAM,KAAK,CAAC,CACxB;AACD,QAAA,OAAO,KAAK,CAAC,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC;;+GA3B7D,4BAA4B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAArC,IAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAAyC,uBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAA5B,4BAA4B,EAAA,CAAA,CAAA;;4FAA5B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBADxC;;;MCHY,kCAAkC,CAAA;AAG7C,IAAA,WAAA,CAAoB,WAAwB,EAAA;QAAxB,IAAW,CAAA,WAAA,GAAX,WAAW;QAF/B,IAAI,CAAA,IAAA,GAAoB,EAAE;;AAI1B,IAAA,MAAM,GAAG,GAAA;AACP,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;AACpD,YAAA,WAAW,CAAC,iBAAiB;AAC7B,YAAA,WAAW,CAAC;AACb,SAAA,CAAC;QACF,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,iBAAiB,EAAE;AAC/C,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CACZ,IAAI,aAAa,CAAC;AAChB,gBAAA,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC;AAChC,gBAAA,IAAI,EAAE,YAAY;AAClB,gBAAA,IAAI,EAAE,qBAAqB;AAC3B,gBAAA,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC;AAC3B,gBAAA,eAAe,EAAE,KAAK;AACtB,gBAAA,QAAQ,EAAE;AACX,aAAA,CAAC,CACH;;QAEH,OAAO,IAAI,CAAC,IAAI;;+GAtBP,kCAAkC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAzC,IAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAAlC,kCAAkC,EAAA,CAAA,CAAA;;4FAAlC,kCAAkC,EAAA,UAAA,EAAA,CAAA;kBAD9C;;;ACDM,MAAM,2BAA2B,GAAG;AACzC,IAAA,mJAAmJ,EACjJ;AACE,QAAA,OAAO,EAAE,OAAO,CACd,mLAAmL;AAEtL,KAAA;AACH,IAAA,oJAAoJ,EAClJ;AACE,QAAA,OAAO,EAAE,OAAO,CAAC,6DAA6D;AAC/E,KAAA;AACH,IAAA,2LAA2L,EACzL;AACE,QAAA,OAAO,EAAE,OAAO,CACd,qFAAqF;AAExF;CACK;;MCIG,uBAAuB,CAAA;+GAAvB,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;gHAAvB,uBAAuB,EAAA,OAAA,EAAA,CAbxB,mBAAmB,EAAE,sBAAsB,CAAA,EAAA,CAAA,CAAA;AAa1C,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,EAZvB,SAAA,EAAA;YACT,sBAAsB;YACtB,OAAO,CAAC,4BAA4B,CAAC;YACrC,aAAa,CAAC,kCAAkC,CAAC;YACjD,mBAAmB,CAAC,2BAA2B,CAAC;AAChD,YAAA,SAAS,CAAC;AACR,gBAAA,IAAI,EAAE,oBAAoB;AAC1B,gBAAA,UAAU,EAAE,mCAAmC;AAC/C,gBAAA,SAAS,EAAE;aACZ;SACF,EAXS,OAAA,EAAA,CAAA,mBAAmB,EAAE,sBAAsB,CAAA,EAAA,CAAA,CAAA;;4FAa1C,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAdnC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;AACtD,oBAAA,SAAS,EAAE;wBACT,sBAAsB;wBACtB,OAAO,CAAC,4BAA4B,CAAC;wBACrC,aAAa,CAAC,kCAAkC,CAAC;wBACjD,mBAAmB,CAAC,2BAA2B,CAAC;AAChD,wBAAA,SAAS,CAAC;AACR,4BAAA,IAAI,EAAE,oBAAoB;AAC1B,4BAAA,UAAU,EAAE,mCAAmC;AAC/C,4BAAA,SAAS,EAAE;yBACZ;AACF;AACF,iBAAA;;;ACtBD;;AAEG;;;;"}