{"version":3,"sources":["libs/client-platform/@shared/ui/responsive/buttons/rounded-button/src/lib/rounded-button.component.ts","libs/client-platform/@shared/ui/responsive/buttons/rounded-button/src/lib/rounded-button.component.html","libs/client-platform/@shared/ui/responsive/buttons/rounded-button/src/lib/rounded-button.module.ts","libs/@shared/rentals/src/lib/constants/balance.constants.ts","libs/@shared/rentals/src/lib/constants/rental.constants.ts","libs/@shared/rentals/src/lib/constants/solicitation.constants.ts","libs/@shared/rentals/src/lib/pipes/filter-solicitation.pipe.ts","libs/@shared/rentals/src/lib/http-clients/rentals-http-client.ts","libs/@shared/rentals/src/lib/pipes/rental-display.pipe.ts","libs/@shared/rentals/src/lib/rentals.module.ts","libs/@shared/rentals/src/lib/services/balances.service.ts","libs/@shared/rentals/src/lib/services/communication.service.ts","libs/@shared/rentals/src/lib/services/files.service.ts","libs/@shared/rentals/src/lib/services/forms.service.ts","libs/@shared/rentals/src/lib/services/insurances.service.ts","libs/@shared/rentals/src/lib/services/rentals.service.ts","libs/@shared/rentals/src/lib/services/solicitations-filter.service.ts","libs/@shared/rentals/src/lib/constants/family-situations-types.constants.ts","libs/@shared/rentals/src/lib/constants/insurance.constants.ts","libs/@shared/rentals/src/lib/constants/job-contract-types.constants.ts","libs/@shared/rentals/src/lib/constants/preference.constants.ts","libs/@shared/rentals/src/lib/services/solicitations.service.ts","libs/@shared/rentals/src/lib/services/third-parties.service.ts","libs/@shared/rentals/src/lib/types/payment-notice.types.ts","node_modules/ngx-cookie-service/fesm2022/ngx-cookie-service.mjs","libs/@shared/rentals/src/lib/services/cookies.service.ts","libs/@shared/rentals/src/lib/services/users.service.ts","libs/@shared/rentals/src/lib/types/form.types.ts","libs/@shared/rentals/src/lib/types/solicitation.types.ts","node_modules/@angular/cdk/fesm2022/portal.mjs","node_modules/@angular/cdk/fesm2022/collections.mjs","node_modules/@angular/cdk/fesm2022/scrolling.mjs","node_modules/@angular/cdk/fesm2022/observers/private.mjs","node_modules/@angular/animations/fesm2022/animations.mjs","node_modules/@angular/material/fesm2022/tabs.mjs","node_modules/@angular/material/fesm2022/form-field.mjs","libs/@shared/ui/inputs/base-control-input/src/lib/noop-value-accessor/noop-value-accessor.directive.ts","libs/@shared/ui/inputs/base-control-input/src/lib/base-control-input.component.ts","node_modules/@angular/cdk/fesm2022/overlay.mjs","node_modules/@angular/material/fesm2022/autocomplete.mjs","node_modules/@angular/cdk/fesm2022/text-field.mjs","node_modules/@angular/material/fesm2022/input.mjs","libs/client-platform/@shared/ui/responsive/inputs/common-auto-complete-input/src/lib/common-auto-complete-input.component.ts","libs/client-platform/@shared/ui/responsive/inputs/common-auto-complete-input/src/lib/common-auto-complete-input.component.html","node_modules/@maskito/angular/fesm2022/maskito-angular.mjs","libs/client-platform/@shared/ui/responsive/inputs/common-auto-complete-input/src/lib/common-auto-complete-input.module.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from \"@angular/core\";\r\n\r\n@Component({\r\n\tselector: \"cp-rounded-button\",\r\n\ttemplateUrl: \"./rounded-button.component.html\",\r\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class RoundedButtonComponent {\r\n\t@Input() label?: string;\r\n\t@Input() type: \"submit\" | \"button\" = \"button\";\r\n\t@Input() icon?: string;\r\n\t@Input() isIconFilled = false;\r\n\t@Input() isFullWidth = true;\r\n\t@Input() disabled = false;\r\n\t@Input() isReversed = false;\r\n\t@Input() readOnly = false;\r\n\r\n\t@Output() readonly clicked = new EventEmitter();\r\n}\r\n","\r\n\t@if (label) {\r\n\t\t
{{ label | uppercase }}
\r\n\t}\r\n\t@if (icon) {\r\n\t\t\r\n\t}\r\n\r\n","import { CommonModule } from \"@angular/common\";\r\nimport { NgModule } from \"@angular/core\";\r\nimport { MatRippleModule } from \"@angular/material/core\";\r\nimport { MatIconModule } from \"@angular/material/icon\";\r\nimport { EthIconComponent } from \"@e-tenant-hub/shared/ui/icon\";\r\nimport { RoundedButtonComponent } from \"./rounded-button.component\";\r\n\r\n@NgModule({\r\n\timports: [CommonModule, MatIconModule, MatRippleModule, EthIconComponent],\r\n\tdeclarations: [RoundedButtonComponent],\r\n\texports: [RoundedButtonComponent],\r\n})\r\nexport class RoundedButtonModule {}\r\n","export class SumUpCallbackPaymentKeys {\r\n\tstatic readonly status: string = \"smp-status\";\r\n\tstatic readonly transactionCode: string = \"smp-tx-code\";\r\n\tstatic readonly transactionId: string = \"foreign-tx-id\";\r\n}\r\n\r\nexport class SystemPayParameterKeys {\r\n\tstatic readonly actionMode: string = \"vads_action_mode\";\r\n\tstatic readonly amount: string = \"vads_amount\";\r\n\tstatic readonly contextMode: string = \"vads_ctx_mode\";\r\n\tstatic readonly currency: string = \"vads_currency\";\r\n\tstatic readonly customerEmail: string = \"vads_cust_email\";\r\n\tstatic readonly customerId: string = \"vads_cust_id\";\r\n\tstatic readonly pageAction: string = \"vads_page_action\";\r\n\tstatic readonly paymentConfig: string = \"vads_payment_config\";\r\n\tstatic readonly returnMode: string = \"vads_return_mode\";\r\n\tstatic readonly returnUrl: string = \"vads_url_return\";\r\n\tstatic readonly signature: string = \"signature\";\r\n\tstatic readonly siteId: string = \"vads_site_id\";\r\n\tstatic readonly transactionStatus: string = \"vads_trans_status\";\r\n\tstatic readonly transmissionDate: string = \"vads_trans_date\";\r\n\tstatic readonly transmissionId: string = \"vads_trans_id\";\r\n\tstatic readonly urlCheck: string = \"vads_url_check\";\r\n\tstatic readonly version: string = \"vads_version\";\r\n\r\n\t// Warning: Order is important !\r\n\tstatic readonly allRequest: string[] = [\r\n\t\tSystemPayParameterKeys.actionMode,\r\n\t\tSystemPayParameterKeys.amount,\r\n\t\tSystemPayParameterKeys.contextMode,\r\n\t\tSystemPayParameterKeys.currency,\r\n\t\tSystemPayParameterKeys.customerEmail,\r\n\t\tSystemPayParameterKeys.customerId,\r\n\t\tSystemPayParameterKeys.pageAction,\r\n\t\tSystemPayParameterKeys.paymentConfig,\r\n\t\tSystemPayParameterKeys.returnMode,\r\n\t\tSystemPayParameterKeys.siteId,\r\n\t\tSystemPayParameterKeys.transmissionDate,\r\n\t\tSystemPayParameterKeys.transmissionId,\r\n\t\tSystemPayParameterKeys.returnUrl,\r\n\t\tSystemPayParameterKeys.urlCheck,\r\n\t\tSystemPayParameterKeys.version,\r\n\t\tSystemPayParameterKeys.signature,\r\n\t];\r\n}\r\n\r\nexport class OnlinePaymentTransactionStatus {\r\n\tstatic readonly error = \"error\";\r\n\tstatic readonly expiration = \"expiration\";\r\n\tstatic readonly failure = \"failure\";\r\n\tstatic readonly none = \"none\";\r\n\tstatic readonly refusal = \"refusal\";\r\n\tstatic readonly success = \"success\";\r\n}\r\n\r\nexport class SystemPayTransmissionResponseStatus {\r\n\tstatic readonly abandoned = \"ABANDONED\";\r\n\tstatic readonly authorised = \"AUTHORISED\";\r\n\tstatic readonly authorisedToValidate = \"AUTHORISED_TO_VALIDATE\";\r\n\tstatic readonly cancelled = \"CANCELLED\";\r\n\tstatic readonly captured = \"CAPTURED\";\r\n\tstatic readonly captureFailed = \"CAPTURE_FAILED\";\r\n\tstatic readonly expired = \"EXPIRED\";\r\n\tstatic readonly initial = \"INITIAL\";\r\n\tstatic readonly notCreated = \"NOT_CREATED\";\r\n\tstatic readonly refused = \"REFUSED\";\r\n\tstatic readonly suspended = \"SUSPENDED\";\r\n\tstatic readonly underVerification = \"UNDER_VERIFICATION\";\r\n\tstatic readonly waitingAuthorisation = \"WAITING_AUTHORISATION\";\r\n\tstatic readonly waitingAuthorisationToValidate = \"WAITING_AUTHORISATION_TO_VALIDATE\";\r\n\r\n\tstatic readonly record: Record = {\r\n\t\t[SystemPayTransmissionResponseStatus.abandoned]: OnlinePaymentTransactionStatus.error,\r\n\t\t[SystemPayTransmissionResponseStatus.authorised]: OnlinePaymentTransactionStatus.success,\r\n\t\t[SystemPayTransmissionResponseStatus.authorisedToValidate]: OnlinePaymentTransactionStatus.success,\r\n\t\t[SystemPayTransmissionResponseStatus.cancelled]: OnlinePaymentTransactionStatus.failure,\r\n\t\t[SystemPayTransmissionResponseStatus.captureFailed]: OnlinePaymentTransactionStatus.error,\r\n\t\t[SystemPayTransmissionResponseStatus.expired]: OnlinePaymentTransactionStatus.failure,\r\n\t\t[SystemPayTransmissionResponseStatus.initial]: OnlinePaymentTransactionStatus.expiration,\r\n\t\t[SystemPayTransmissionResponseStatus.notCreated]: OnlinePaymentTransactionStatus.failure,\r\n\t\t[SystemPayTransmissionResponseStatus.refused]: OnlinePaymentTransactionStatus.refusal,\r\n\t\t[SystemPayTransmissionResponseStatus.suspended]: OnlinePaymentTransactionStatus.none,\r\n\t\t[SystemPayTransmissionResponseStatus.underVerification]: OnlinePaymentTransactionStatus.none,\r\n\t\t[SystemPayTransmissionResponseStatus.waitingAuthorisation]: OnlinePaymentTransactionStatus.success,\r\n\t\t[SystemPayTransmissionResponseStatus.waitingAuthorisationToValidate]: OnlinePaymentTransactionStatus.success,\r\n\t};\r\n}\r\n","export class RentalContactPersonRoles {\r\n\tstatic readonly buildingManager: string = \"ri\";\r\n\tstatic readonly areaManager: string = \"rs\";\r\n\tstatic readonly socialAndRentalManager: string = \"gls\";\r\n\tstatic readonly mediationAndResidentialPeaceOfficer: string = \"cpv\";\r\n\tstatic readonly territoryAssistant: string = \"adj\";\r\n\tstatic readonly territoryManager: string = \"dag\";\r\n\tstatic readonly specialPremisesManager: string = \"ctc\";\r\n\r\n\tstatic readonly record: Record = {\r\n\t\t[RentalContactPersonRoles.buildingManager]: \"Responsable d'immeuble\",\r\n\t\t[RentalContactPersonRoles.areaManager]: \"Responsable de secteur\",\r\n\t\t[RentalContactPersonRoles.socialAndRentalManager]: \"Gestionnaire locative et sociale\",\r\n\t\t[RentalContactPersonRoles.mediationAndResidentialPeaceOfficer]: \"Chargé de tranquillité sûreté\",\r\n\t\t[RentalContactPersonRoles.territoryAssistant]: \"Adjoint de territoire\",\r\n\t\t[RentalContactPersonRoles.territoryManager]: \"Directeur de territoire\",\r\n\t\t[RentalContactPersonRoles.specialPremisesManager]: \"Chargée de gestion des locaux spécifiques\",\r\n\t};\r\n}\r\n\r\nexport class RentalAccommodationTypes {\r\n\tstatic readonly buildingJanitor: string = \"lgd\";\r\n\tstatic readonly housingBRS: string = \"br1\";\r\n\tstatic readonly garage: string = \"gar\";\r\n\tstatic readonly residence: string = \"foy\";\r\n\tstatic readonly office: string = \"bur\";\r\n\tstatic readonly land: string = \"ter\";\r\n\tstatic readonly bikeGarage: string = \"gvl\";\r\n\tstatic readonly technicalReserve: string = \"tec\";\r\n\tstatic readonly professionalPremises: string = \"lpr\";\r\n\tstatic readonly residentCollectivePremises: string = \"lcr\";\r\n\tstatic readonly garageOrParkBRS: string = \"br2\";\r\n\tstatic readonly park: string = \"par\";\r\n\tstatic readonly gargabeRoom: string = \"lpc\";\r\n\tstatic readonly maintenanceRoom: string = \"ent\";\r\n\tstatic readonly motoRoom: string = \"l2r\";\r\n\tstatic readonly studentResidence: string = \"fo1\";\r\n\tstatic readonly miscellaneousRentals: string = \"ldi\";\r\n\tstatic readonly laundry: string = \"lav\";\r\n\tstatic readonly cellar: string = \"cav\";\r\n\tstatic readonly business: string = \"com\";\r\n\tstatic readonly studentAccommodation: string = \"etu\";\r\n\tstatic readonly cellarBRS: string = \"br3\";\r\n\tstatic readonly housing: string = \"hab\";\r\n\tstatic readonly nonPropertyPremises: string = \"lhp\";\r\n\tstatic readonly motoBoxing: string = \"bxm\";\r\n\r\n\tstatic readonly record: Record = {\r\n\t\t[RentalAccommodationTypes.buildingJanitor]: \"Local gardien\",\r\n\t\t[RentalAccommodationTypes.housingBRS]: \"Habitation/BRS\",\r\n\t\t[RentalAccommodationTypes.garage]: \"Garage\",\r\n\t\t[RentalAccommodationTypes.residence]: \"Foyer\",\r\n\t\t[RentalAccommodationTypes.office]: \"Bureau\",\r\n\t\t[RentalAccommodationTypes.land]: \"Terrain\",\r\n\t\t[RentalAccommodationTypes.bikeGarage]: \"Garage à vélo\",\r\n\t\t[RentalAccommodationTypes.technicalReserve]: \"Réserve technique\",\r\n\t\t[RentalAccommodationTypes.professionalPremises]: \"Local professionnel\",\r\n\t\t[RentalAccommodationTypes.residentCollectivePremises]: \"Local collectif résident\",\r\n\t\t[RentalAccommodationTypes.garageOrParkBRS]: \"Garage ou Parking/BRS\",\r\n\t\t[RentalAccommodationTypes.park]: \"Parking\",\r\n\t\t[RentalAccommodationTypes.gargabeRoom]: \"Local poubelle container\",\r\n\t\t[RentalAccommodationTypes.maintenanceRoom]: \"Local entretien\",\r\n\t\t[RentalAccommodationTypes.motoRoom]: \"Local 2 roues\",\r\n\t\t[RentalAccommodationTypes.studentResidence]: \"Foyer étudiant\",\r\n\t\t[RentalAccommodationTypes.miscellaneousRentals]: \"Location diverses\",\r\n\t\t[RentalAccommodationTypes.laundry]: \"Laverie\",\r\n\t\t[RentalAccommodationTypes.cellar]: \"Cave\",\r\n\t\t[RentalAccommodationTypes.business]: \"Commerce\",\r\n\t\t[RentalAccommodationTypes.studentAccommodation]: \"Logement étudiant\",\r\n\t\t[RentalAccommodationTypes.cellarBRS]: \"Cave/BRS\",\r\n\t\t[RentalAccommodationTypes.housing]: \"Habitation\",\r\n\t\t[RentalAccommodationTypes.nonPropertyPremises]: \"Locaux hors patrimoine\",\r\n\t\t[RentalAccommodationTypes.motoBoxing]: \"Boxe moto\",\r\n\t};\r\n\r\n\tstatic readonly isPrimaryRecord: Record = {\r\n\t\t[RentalAccommodationTypes.buildingJanitor]: true,\r\n\t\t[RentalAccommodationTypes.housingBRS]: true,\r\n\t\t[RentalAccommodationTypes.garage]: false,\r\n\t\t[RentalAccommodationTypes.residence]: true,\r\n\t\t[RentalAccommodationTypes.office]: true,\r\n\t\t[RentalAccommodationTypes.land]: true,\r\n\t\t[RentalAccommodationTypes.bikeGarage]: false,\r\n\t\t[RentalAccommodationTypes.technicalReserve]: false,\r\n\t\t[RentalAccommodationTypes.professionalPremises]: true,\r\n\t\t[RentalAccommodationTypes.residentCollectivePremises]: false,\r\n\t\t[RentalAccommodationTypes.garageOrParkBRS]: false,\r\n\t\t[RentalAccommodationTypes.park]: false,\r\n\t\t[RentalAccommodationTypes.gargabeRoom]: false,\r\n\t\t[RentalAccommodationTypes.maintenanceRoom]: false,\r\n\t\t[RentalAccommodationTypes.motoRoom]: false,\r\n\t\t[RentalAccommodationTypes.studentResidence]: true,\r\n\t\t[RentalAccommodationTypes.miscellaneousRentals]: false,\r\n\t\t[RentalAccommodationTypes.laundry]: false,\r\n\t\t[RentalAccommodationTypes.cellar]: false,\r\n\t\t[RentalAccommodationTypes.business]: true,\r\n\t\t[RentalAccommodationTypes.studentAccommodation]: true,\r\n\t\t[RentalAccommodationTypes.cellarBRS]: false,\r\n\t\t[RentalAccommodationTypes.housing]: true,\r\n\t\t[RentalAccommodationTypes.nonPropertyPremises]: true,\r\n\t\t[RentalAccommodationTypes.motoBoxing]: false,\r\n\t};\r\n}\r\n\r\nexport class RentalHabitationTypes {\r\n\tstatic readonly type1: string = \"t1\";\r\n\tstatic readonly type1bis: string = \"t1b\";\r\n\tstatic readonly type2: string = \"t2\";\r\n\tstatic readonly type3: string = \"t3\";\r\n\tstatic readonly type4: string = \"t4\";\r\n\tstatic readonly type5: string = \"t5\";\r\n\tstatic readonly type6: string = \"t6\";\r\n\tstatic readonly type7: string = \"t7\";\r\n\tstatic readonly garage: string = \"gar\";\r\n\tstatic readonly professionalPremises: string = \"lp\";\r\n\tstatic readonly business: string = \"com\";\r\n\tstatic readonly office: string = \"bur\";\r\n\tstatic readonly residentCollectivePremises: string = \"lcr\";\r\n\tstatic readonly studio: string = \"stu\";\r\n\tstatic readonly miscellaneousRentals: string = \"ld\";\r\n\tstatic readonly land: string = \"ter\";\r\n\tstatic readonly residence: string = \"fo\";\r\n\tstatic readonly room: string = \"cha\";\r\n\tstatic readonly restructuredType3: string = \"t3r\";\r\n\tstatic readonly restructuredType4: string = \"t4r\";\r\n\tstatic readonly restructuredType1: string = \"t1r\";\r\n\tstatic readonly restructuredType2: string = \"t2r\";\r\n\tstatic readonly restructuredType5: string = \"t5r\";\r\n\tstatic readonly restructuredType6: string = \"t6r\";\r\n\tstatic readonly slotsLocation: string = \"loe\";\r\n\tstatic readonly type3bis: string = \"t3b\";\r\n\tstatic readonly type4bis: string = \"t4b\";\r\n\tstatic readonly parking: string = \"par\";\r\n\r\n\tstatic readonly record: Record = {\r\n\t\t[RentalHabitationTypes.type1]: \"Type 1\",\r\n\t\t[RentalHabitationTypes.type1bis]: \"Type 1 bis\",\r\n\t\t[RentalHabitationTypes.type2]: \"Type 2\",\r\n\t\t[RentalHabitationTypes.type3]: \"Type 3\",\r\n\t\t[RentalHabitationTypes.type4]: \"Type 4\",\r\n\t\t[RentalHabitationTypes.type5]: \"Type 5\",\r\n\t\t[RentalHabitationTypes.type6]: \"Type 6\",\r\n\t\t[RentalHabitationTypes.type7]: \"Type 7\",\r\n\t\t[RentalHabitationTypes.garage]: \"Garage\",\r\n\t\t[RentalHabitationTypes.professionalPremises]: \"Local professsionnel\",\r\n\t\t[RentalHabitationTypes.business]: \"Commerce\",\r\n\t\t[RentalHabitationTypes.office]: \"Bureau\",\r\n\t\t[RentalHabitationTypes.residentCollectivePremises]: \"Local collectif résident\",\r\n\t\t[RentalHabitationTypes.studio]: \"Studio\",\r\n\t\t[RentalHabitationTypes.miscellaneousRentals]: \"Location Diverse\",\r\n\t\t[RentalHabitationTypes.land]: \"Terrain\",\r\n\t\t[RentalHabitationTypes.residence]: \"Foyer\",\r\n\t\t[RentalHabitationTypes.room]: \"Chambre\",\r\n\t\t[RentalHabitationTypes.restructuredType3]: \"Type 3 restucturé\",\r\n\t\t[RentalHabitationTypes.restructuredType4]: \"Type 4 restucturé\",\r\n\t\t[RentalHabitationTypes.restructuredType1]: \"Type 1 restucturé\",\r\n\t\t[RentalHabitationTypes.restructuredType2]: \"Type 2 restucturé\",\r\n\t\t[RentalHabitationTypes.restructuredType5]: \"Type 5 restucturé\",\r\n\t\t[RentalHabitationTypes.restructuredType6]: \"Type 6 restucturé\",\r\n\t\t[RentalHabitationTypes.slotsLocation]: \"Location emplacements\",\r\n\t\t[RentalHabitationTypes.type3bis]: \"Type 3 bis\",\r\n\t\t[RentalHabitationTypes.type4bis]: \"Type 4 bis\",\r\n\t\t[RentalHabitationTypes.parking]: \"Parking\",\r\n\t};\r\n}\r\n\r\nexport class RentalExpertiseAreaCodes {\r\n\tstatic readonly elevator: string = \"ka2\";\r\n\tstatic readonly playgrounds: string = \"kaj\";\r\n\tstatic readonly tv: string = \"kca\";\r\n\tstatic readonly individualBoiler: string = \"kcv\";\r\n\tstatic readonly individualBoiler2: string = \"kci\";\r\n\tstatic readonly gasWaterHeater: string = \"kcb\";\r\n\tstatic readonly cumulus: string = \"kcm\";\r\n\tstatic readonly collectiveHeating: string = \"kc2\";\r\n\tstatic readonly collectiveHeating2: string = \"ku1\";\r\n\tstatic readonly collectiveHeating3: string = \"kc1\";\r\n\tstatic readonly waterMeter: string = \"kce\";\r\n\tstatic readonly insectControl: string = \"kde\";\r\n\tstatic readonly multiMaintenance: string = \"kme\";\r\n\tstatic readonly automatedGarageDoor: string = \"kpg\";\r\n\tstatic readonly vmc: string = \"kvm\";\r\n\r\n\tstatic readonly record: Record = {\r\n\t\t[RentalExpertiseAreaCodes.elevator]: \"Ascenseur\",\r\n\t\t[RentalExpertiseAreaCodes.playgrounds]: \"Aires de jeux\",\r\n\t\t[RentalExpertiseAreaCodes.tv]: \"Télévision\",\r\n\t\t[RentalExpertiseAreaCodes.individualBoiler]: \"Chaudière individuelle\",\r\n\t\t[RentalExpertiseAreaCodes.individualBoiler2]: \"Chaudière individuelle\",\r\n\t\t[RentalExpertiseAreaCodes.gasWaterHeater]: \"Chauffe-eau gaz\",\r\n\t\t[RentalExpertiseAreaCodes.cumulus]: \"Cumulus\",\r\n\t\t[RentalExpertiseAreaCodes.collectiveHeating]: \"Chauffage collectif\",\r\n\t\t[RentalExpertiseAreaCodes.collectiveHeating2]: \"Chauffage collectif\",\r\n\t\t[RentalExpertiseAreaCodes.collectiveHeating3]: \"Chauffage collectif\",\r\n\t\t[RentalExpertiseAreaCodes.waterMeter]: \"Compteur d'eau\",\r\n\t\t[RentalExpertiseAreaCodes.insectControl]: \"Désinsectisation\",\r\n\t\t[RentalExpertiseAreaCodes.multiMaintenance]: \"Multi-entretien\",\r\n\t\t[RentalExpertiseAreaCodes.automatedGarageDoor]: \"Porte automatisée garage\",\r\n\t\t[RentalExpertiseAreaCodes.vmc]: \"VMC\",\r\n\t};\r\n}\r\n\r\nexport class RentalWaterTypes {\r\n\tstatic readonly hotWater: string = \"hot-water\";\r\n\tstatic readonly coldWater: string = \"cold-water\";\r\n\r\n\tstatic readonly record: Record = {\r\n\t\t[RentalWaterTypes.hotWater]: \"Eau chaude\",\r\n\t\t[RentalWaterTypes.coldWater]: \"Eau froide\",\r\n\t};\r\n}\r\n\r\nexport class RentalLotTypes {\r\n\tstatic readonly accommodation: string = \"log\";\r\n\tstatic readonly studentAccommodation: string = \"etu\";\r\n\tstatic readonly cellar: string = \"cav\";\r\n\tstatic readonly garage: string = \"gar\";\r\n\r\n\tstatic readonly record: Record = {\r\n\t\t[RentalLotTypes.accommodation]: \"Logement\",\r\n\t\t[RentalLotTypes.studentAccommodation]: \"Logement étudiant\",\r\n\t\t[RentalLotTypes.cellar]: \"Cave\",\r\n\t\t[RentalLotTypes.garage]: \"Garage\",\r\n\t};\r\n}\r\n","export class SolicitationStatus {\r\n\tstatic readonly canceled: string = \"canceled\";\r\n\tstatic readonly closed: string = \"closed\";\r\n\tstatic readonly inProgress: string = \"in-progress\";\r\n\tstatic readonly registered: string = \"registered\";\r\n\tstatic readonly requested: string = \"requested\";\r\n\tstatic readonly unknown: string = \"unknown\";\r\n\r\n\tstatic readonly closedCategoryItems: string[] = [SolicitationStatus.canceled, SolicitationStatus.closed];\r\n\r\n\tstatic readonly inProgressCategoryItems: string[] = [\r\n\t\tSolicitationStatus.inProgress,\r\n\t\tSolicitationStatus.registered,\r\n\t\tSolicitationStatus.requested,\r\n\t];\r\n\r\n\tstatic readonly record: Record = {\r\n\t\t[SolicitationStatus.canceled]: \"Annulée\",\r\n\t\t[SolicitationStatus.closed]: \"Clôturée\",\r\n\t\t[SolicitationStatus.inProgress]: \"En cours\",\r\n\t\t[SolicitationStatus.registered]: \"Enregistrée\",\r\n\t\t[SolicitationStatus.requested]: \"Demandée\",\r\n\t\t[SolicitationStatus.unknown]: \"Inconnue\",\r\n\t};\r\n}\r\n\r\nexport class SolicitationCategories {\r\n\tstatic readonly customerRelationshipCenter: string = \"CRC\";\r\n\tstatic readonly disorders: string = \"TRO\";\r\n\tstatic readonly rentalManagement: string = \"GL\";\r\n\tstatic readonly technical: string = \"TEC\";\r\n\r\n\t// Warning: Order is important !\r\n\tstatic readonly all: string[] = [\r\n\t\tSolicitationCategories.rentalManagement,\r\n\t\tSolicitationCategories.technical,\r\n\t\tSolicitationCategories.disorders,\r\n\t];\r\n\r\n\tstatic readonly record: Record = {\r\n\t\t[SolicitationCategories.customerRelationshipCenter]: \"Centre relation clients\",\r\n\t\t[SolicitationCategories.disorders]: \"Incivilités et troubles de voisinage\",\r\n\t\t[SolicitationCategories.rentalManagement]: \"Gestion Locative\",\r\n\t\t[SolicitationCategories.technical]: \"Gestion Technique\",\r\n\t};\r\n\r\n\tstatic readonly shortRecord: Record = {\r\n\t\t[SolicitationCategories.customerRelationshipCenter]: \"Relation clients\",\r\n\t\t[SolicitationCategories.disorders]: \"Troubles\",\r\n\t\t[SolicitationCategories.rentalManagement]: \"Administrative\",\r\n\t\t[SolicitationCategories.technical]: \"Technique\",\r\n\t};\r\n}\r\n\r\nexport class SolicitationSubCategories {\r\n\tstatic readonly bulkyItemsClearing: string = \"bulkyItemsClearing\";\r\n\tstatic readonly cleaningServices: string = \"cleaningServices\";\r\n\tstatic readonly documentsRequest: string = \"documentsRequest\";\r\n\tstatic readonly disorders: string = \"disorders\";\r\n\tstatic readonly electricity: string = \"electricity\";\r\n\tstatic readonly familySituationChange: string = \"familySituationChange\";\r\n\tstatic readonly floors: string = \"floors\";\r\n\tstatic readonly garageRequest: string = \"garageRequest\";\r\n\tstatic readonly glazing: string = \"glazing\";\r\n\tstatic readonly heatingAndVentilation: string = \"heatingAndVentilation\";\r\n\tstatic readonly homeAdaptationRequest: string = \"homeAdaptationRequest\";\r\n\tstatic readonly intercom: string = \"intercom\";\r\n\tstatic readonly joinery: string = \"joinery\";\r\n\tstatic readonly lift: string = \"lift\";\r\n\tstatic readonly locksmith: string = \"locksmith\";\r\n\tstatic readonly masonry: string = \"masonry\";\r\n\tstatic readonly others: string = \"others\";\r\n\tstatic readonly outdoorAreas: string = \"outdoorAreas\";\r\n\tstatic readonly paymentTermsAndConditions: string = \"paymentTermsAndConditions\";\r\n\tstatic readonly pests: string = \"pests\";\r\n\tstatic readonly plumbing: string = \"plumbing\";\r\n\tstatic readonly rentAndCosts: string = \"rentAndCosts\";\r\n\tstatic readonly residentialAutomaticDoor: string = \"residentialAutomaticDoor\";\r\n\tstatic readonly safetyEquipment: string = \"safetyEquipment\";\r\n\tstatic readonly securityDepositRefund: string = \"securityDepositRefund\";\r\n\tstatic readonly seepageAndTightness: string = \"seepageAndTightness\";\r\n\tstatic readonly slsOpsSurvey: string = \"slsOpsSurvey\";\r\n\tstatic readonly television: string = \"television\";\r\n\tstatic readonly workAuthorizationRequest: string = \"workAuthorizationRequest\";\r\n\r\n\tstatic readonly record: Record = {\r\n\t\t[SolicitationSubCategories.bulkyItemsClearing]: \"Débarrassage d'encombrants\",\r\n\t\t[SolicitationSubCategories.cleaningServices]: \"Prestation de nettoyage\",\r\n\t\t[SolicitationSubCategories.documentsRequest]: \"Demande de documents\",\r\n\t\t[SolicitationSubCategories.disorders]: \"Incivilités et troubles de voisinage\",\r\n\t\t[SolicitationSubCategories.electricity]: \"Électricité\",\r\n\t\t[SolicitationSubCategories.familySituationChange]: \"Changement situation familiale\",\r\n\t\t[SolicitationSubCategories.floors]: \"Sols\",\r\n\t\t[SolicitationSubCategories.garageRequest]: \"Demande de garage\",\r\n\t\t[SolicitationSubCategories.glazing]: \"Vitrerie\",\r\n\t\t[SolicitationSubCategories.heatingAndVentilation]: \"Chauffage/Chauffe-bain/Ventilation\",\r\n\t\t[SolicitationSubCategories.homeAdaptationRequest]: \"Demande adaptation logement\",\r\n\t\t[SolicitationSubCategories.intercom]: \"Interphonie\",\r\n\t\t[SolicitationSubCategories.joinery]: \"Menuiserie\",\r\n\t\t[SolicitationSubCategories.lift]: \"Ascenseur\",\r\n\t\t[SolicitationSubCategories.locksmith]: \"Serrurerie\",\r\n\t\t[SolicitationSubCategories.masonry]: \"Maçonnerie\",\r\n\t\t[SolicitationSubCategories.others]: \"Autres\",\r\n\t\t[SolicitationSubCategories.paymentTermsAndConditions]: \"Modalités de règlement\",\r\n\t\t[SolicitationSubCategories.outdoorAreas]: \"Espaces extérieurs\",\r\n\t\t[SolicitationSubCategories.pests]: \"Nuisibles\",\r\n\t\t[SolicitationSubCategories.plumbing]: \"Plomberie\",\r\n\t\t[SolicitationSubCategories.rentAndCosts]: \"Loyer/Charges\",\r\n\t\t[SolicitationSubCategories.residentialAutomaticDoor]: \"Porte automatique résidence\",\r\n\t\t[SolicitationSubCategories.safetyEquipment]: \"Équipement de sécurité\",\r\n\t\t[SolicitationSubCategories.securityDepositRefund]: \"Remboursement dépôt de garantie\",\r\n\t\t[SolicitationSubCategories.seepageAndTightness]: \"Infiltration/Étanchéité\",\r\n\t\t[SolicitationSubCategories.slsOpsSurvey]: \"Enquêtes SLS/OPS\",\r\n\t\t[SolicitationSubCategories.television]: \"Télévision\",\r\n\t\t[SolicitationSubCategories.workAuthorizationRequest]: \"Demande autorisation travaux\",\r\n\t};\r\n\r\n\t// Warning: Order is important !\r\n\tstatic readonly allDisorders: string[] = [SolicitationSubCategories.disorders];\r\n\r\n\t// Warning: Order is important !\r\n\tstatic readonly allRentalManagement: string[] = [\r\n\t\tSolicitationSubCategories.familySituationChange,\r\n\t\tSolicitationSubCategories.securityDepositRefund,\r\n\t\tSolicitationSubCategories.slsOpsSurvey,\r\n\t\tSolicitationSubCategories.rentAndCosts,\r\n\t\tSolicitationSubCategories.garageRequest,\r\n\t\tSolicitationSubCategories.paymentTermsAndConditions,\r\n\t\tSolicitationSubCategories.documentsRequest,\r\n\t];\r\n\r\n\t// Warning: Order is important !\r\n\tstatic readonly allTechnical: string[] = [\r\n\t\tSolicitationSubCategories.cleaningServices,\r\n\t\tSolicitationSubCategories.plumbing,\r\n\t\tSolicitationSubCategories.lift,\r\n\t\tSolicitationSubCategories.others,\r\n\t\tSolicitationSubCategories.heatingAndVentilation,\r\n\t\tSolicitationSubCategories.electricity,\r\n\t\tSolicitationSubCategories.bulkyItemsClearing,\r\n\t\tSolicitationSubCategories.outdoorAreas,\r\n\t\tSolicitationSubCategories.pests,\r\n\t\tSolicitationSubCategories.seepageAndTightness,\r\n\t\tSolicitationSubCategories.intercom,\r\n\t\tSolicitationSubCategories.masonry,\r\n\t\tSolicitationSubCategories.joinery,\r\n\t\tSolicitationSubCategories.residentialAutomaticDoor,\r\n\t\tSolicitationSubCategories.safetyEquipment,\r\n\t\tSolicitationSubCategories.locksmith,\r\n\t\tSolicitationSubCategories.floors,\r\n\t\tSolicitationSubCategories.television,\r\n\t\tSolicitationSubCategories.glazing,\r\n\t];\r\n}\r\n\r\nexport class SolicitationScopes {\r\n\tstatic readonly private: string = \"private\";\r\n\tstatic readonly public: string = \"public\";\r\n\r\n\t// Warning: Order is important !\r\n\tstatic readonly all: string[] = [SolicitationScopes.private, SolicitationScopes.public];\r\n\r\n\tstatic readonly record: Record = {\r\n\t\t[SolicitationScopes.private]: \"mon logement\",\r\n\t\t[SolicitationScopes.public]: \"la résidence\",\r\n\t};\r\n\r\n\tstatic readonly partRecord: Record = {\r\n\t\t[SolicitationScopes.private]: \"Partie Privative\",\r\n\t\t[SolicitationScopes.public]: \"Partie Commune\",\r\n\t};\r\n}\r\n\r\nexport class SolicitationCommentTypes {\r\n\tstatic readonly closureRequest: string = \"closure-request\";\r\n\tstatic readonly informationRequest: string = \"comment\";\r\n\tstatic readonly reminder: string = \"reminder\";\r\n\r\n\tstatic readonly tagRecord: Record = {\r\n\t\t[SolicitationCommentTypes.closureRequest]: \"Demander la clôture\",\r\n\t\t[SolicitationCommentTypes.reminder]: \"Relancer la demande\",\r\n\t};\r\n\r\n\tstatic readonly iconRecord: Record = {\r\n\t\t[SolicitationCommentTypes.closureRequest]: \"check_circle\",\r\n\t\t[SolicitationCommentTypes.reminder]: \"notifications\",\r\n\t};\r\n\r\n\tstatic readonly formRecord: Record = {\r\n\t\t[SolicitationCommentTypes.closureRequest]: \"Un locataire a demandé la clôture de la demande.\",\r\n\t\t[SolicitationCommentTypes.reminder]: \"Un locataire a relancé la demande.\",\r\n\t};\r\n}\r\n","import { Pipe, PipeTransform } from \"@angular/core\";\r\nimport { PreciseDate } from \"@e-tenant-hub/shared/utils\";\r\nimport { SolicitationFilter, SolicitationResponseItem } from \"../types\";\r\n\r\n@Pipe({\r\n\tname: \"filterSolicitation\",\r\n\tpure: false,\r\n})\r\nexport class FilterSolicitationPipe implements PipeTransform {\r\n\tprivate tmpValues = 0;\r\n\r\n\tpublic transform(values: SolicitationResponseItem[], filters?: SolicitationFilter[]): SolicitationResponseItem[] {\r\n\t\tif (!values) {\r\n\t\t\treturn values;\r\n\t\t}\r\n\r\n\t\tif (!filters) {\r\n\t\t\treturn values;\r\n\t\t}\r\n\r\n\t\tfilters\r\n\t\t\t.filter((f) => f.selected && f.value)\r\n\t\t\t.forEach((filter) => {\r\n\t\t\t\tvalues = this.filter(values, filter);\r\n\t\t\t\tthis.tmpValues++;\r\n\t\t\t});\r\n\r\n\t\treturn values;\r\n\t}\r\n\r\n\t/**\r\n\t * Return all solicitation binding with filter value\r\n\t */\r\n\tprivate filter(values: SolicitationResponseItem[], filter: SolicitationFilter): SolicitationResponseItem[] {\r\n\t\tswitch (filter.category) {\r\n\t\t\tcase \"dates\": {\r\n\t\t\t\tif (Array.isArray(filter.value)) {\r\n\t\t\t\t\tconst minDateFilter = filter.value[0];\r\n\t\t\t\t\tconst maxDateFilter = filter.value[1];\r\n\t\t\t\t\treturn values.filter(\r\n\t\t\t\t\t\t(v) =>\r\n\t\t\t\t\t\t\tv.creationDate &&\r\n\t\t\t\t\t\t\tnew PreciseDate(v.creationDate.toString()) >= minDateFilter &&\r\n\t\t\t\t\t\t\tnew PreciseDate(v.creationDate.toString()) <= maxDateFilter\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\treturn values;\r\n\t\t\t}\r\n\t\t\tcase \"scope\": {\r\n\t\t\t\tconst isPublicFilter = filter.value === \"public-scope\";\r\n\t\t\t\treturn values.filter((v) => v.isPublic === isPublicFilter);\r\n\t\t\t}\r\n\t\t\tcase \"state\": {\r\n\t\t\t\treturn values.filter((v) => v.status === filter.value);\r\n\t\t\t}\r\n\t\t\tcase \"category\": {\r\n\t\t\t\treturn values.filter((v) => v.category === filter.value);\r\n\t\t\t}\r\n\t\t\tcase \"search\": {\r\n\t\t\t\treturn values.filter((v) => {\r\n\t\t\t\t\tif (v.title) return v.title?.toLowerCase().includes(String(filter.value).toLowerCase());\r\n\t\t\t\t\treturn v.title.toLowerCase().includes(String(filter.value).toLowerCase());\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tdefault: {\r\n\t\t\t\treturn values;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n","import { HttpClient, HttpEvent, HttpEventType, HttpHeaders, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable, inject } from \"@angular/core\";\r\nimport { APP_CONFIG } from \"@e-tenant-hub/shared/config\";\r\nimport { Observable, tap } from \"rxjs\";\r\n\r\nexport interface RequestOptions {\r\n\theaders?: HttpHeaders;\r\n\tobserve?: \"body\";\r\n\tparams?: HttpParams;\r\n\treportProgress?: boolean;\r\n\tresponseType?: \"json\";\r\n\twithCredentials?: boolean;\r\n\tbody?: unknown;\r\n}\r\n\r\nexport interface FileProgress {\r\n\tpercentage: number;\r\n\ttotalFileSize: number;\r\n\tuploadedFileSize: number;\r\n}\r\n\r\n@Injectable()\r\nexport class RentalsHttpClient {\r\n\tprivate readonly appConfig = inject(APP_CONFIG);\r\n\tprivate httpClient = inject(HttpClient);\r\n\r\n\t/**\r\n\t * HTTP GET request\r\n\t * @param endPoint end point of the patient api\r\n\t * @param options options request (ex: header,body, params, etc..)\r\n\t * @returns {Observable}\r\n\t */\r\n\tget(endPoint: string, options?: RequestOptions): Observable {\r\n\t\treturn this.httpClient.get(this.appConfig.apiRoot + endPoint, options);\r\n\t}\r\n\r\n\t/**\r\n\t * HTTP POST request\r\n\t * @param endPoint end point of the patient api\r\n\t * @param params body of request\r\n\t * @param options options request (ex: header,body, params, etc..)\r\n\t * @returns {Observable}\r\n\t */\r\n\tpost(endPoint: string, params: object, options?: RequestOptions): Observable {\r\n\t\treturn this.httpClient.post(this.appConfig.apiRoot + endPoint, params, options);\r\n\t}\r\n\r\n\t/**\r\n\t * HTTP PUT request\r\n\t * @param endPoint end point of the patient api\r\n\t * @param params body of request\r\n\t * @param options options request (ex: header,body, params, etc..)\r\n\t * @returns {Observable}\r\n\t */\r\n\tput(endPoint: string, params: object | null, options?: RequestOptions): Observable {\r\n\t\treturn this.httpClient.put(this.appConfig.apiRoot + endPoint, params, options);\r\n\t}\r\n\r\n\t/**\r\n\t * HTTP DELETE request\r\n\t * @param endPoint\r\n\t * @param options\r\n\t * @returns {Observable}\r\n\t */\r\n\tdelete(endPoint: string, options?: RequestOptions): Observable {\r\n\t\treturn this.httpClient.delete(this.appConfig.apiRoot + endPoint, options);\r\n\t}\r\n\r\n\tdownloadFile(endPoint: string): Observable {\r\n\t\treturn this.httpClient.get(this.appConfig.apiRoot + endPoint, {\r\n\t\t\tresponseType: \"blob\" as \"json\",\r\n\t\t});\r\n\t}\r\n\r\n\tdownloadLocalFile(endPoint: string): Observable {\r\n\t\treturn this.httpClient.get(endPoint, {\r\n\t\t\tresponseType: \"blob\" as \"json\",\r\n\t\t});\r\n\t}\r\n\r\n\tuploadFile(endPoint: string, body: object, callback: (n: FileProgress) => any): Observable> {\r\n\t\tconst url = this.appConfig.apiRoot + endPoint;\r\n\r\n\t\treturn this.httpClient\r\n\t\t\t.post(url, body, {\r\n\t\t\t\treportProgress: true,\r\n\t\t\t\tobserve: \"events\",\r\n\t\t\t})\r\n\t\t\t.pipe(\r\n\t\t\t\ttap((event: HttpEvent) => {\r\n\t\t\t\t\tif (event.type === HttpEventType.UploadProgress) {\r\n\t\t\t\t\t\tconst fileProgress = {\r\n\t\t\t\t\t\t\tpercentage: event.total ? Math.round((100 * event.loaded) / event.total) : undefined,\r\n\t\t\t\t\t\t\ttotalFileSize: event.total,\r\n\t\t\t\t\t\t\tuploadedFileSize: event.loaded,\r\n\t\t\t\t\t\t} as FileProgress;\r\n\t\t\t\t\t\tcallback(fileProgress);\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t);\r\n\t}\r\n}\r\n","import { Pipe, PipeTransform } from \"@angular/core\";\r\n\r\n@Pipe({\r\n\tname: \"rentalDisplay\",\r\n\tstandalone: true,\r\n})\r\nexport class RentalDisplayPipe implements PipeTransform {\r\n\ttransform(rentalIdentifier: string, rentalKey: string): string {\r\n\t\treturn rentalKey ? `${rentalIdentifier}/${rentalKey}` : rentalIdentifier;\r\n\t}\r\n}\r\n","import { CommonModule } from \"@angular/common\";\r\nimport { HttpClient } from \"@angular/common/http\";\r\nimport { NgModule } from \"@angular/core\";\r\nimport { ConfigModule } from \"@e-tenant-hub/shared/config\";\r\nimport { UtilsModule } from \"@e-tenant-hub/shared/utils\";\r\nimport { RentalsHttpClient } from \"./http-clients\";\r\nimport { FilterSolicitationPipe } from \"./pipes\";\r\n\r\n@NgModule({\r\n\timports: [CommonModule, ConfigModule, UtilsModule],\r\n\tdeclarations: [FilterSolicitationPipe],\r\n\texports: [FilterSolicitationPipe],\r\n\tproviders: [\r\n\t\t{\r\n\t\t\tprovide: RentalsHttpClient,\r\n\t\t\tdeps: [HttpClient],\r\n\t\t},\r\n\t],\r\n})\r\nexport class RentalsModule {}\r\n","import { Injectable, inject } from \"@angular/core\";\r\nimport { BehaviorSubject, Observable } from \"rxjs\";\r\nimport { RentalsHttpClient } from \"../http-clients\";\r\nimport {\r\n\tAccountStatementResponse,\r\n\tDirectDebitResponse,\r\n\tOnlinePaymentInfoResponse,\r\n\tOnlinePaymentParametersRequest,\r\n\tOnlinePaymentParametersResponse,\r\n\tPaymentNotice,\r\n\tPaymentResponse,\r\n} from \"../types\";\r\n\r\n@Injectable({\r\n\tprovidedIn: \"root\",\r\n})\r\nexport class BalancesService {\r\n\tprivate readonly httpClient = inject(RentalsHttpClient);\r\n\r\n\tprivate lastPaymentsSubject$ = new BehaviorSubject(\"Init\");\r\n\tonLastPaymentsChange$: Observable = this.lastPaymentsSubject$.asObservable();\r\n\r\n\tgetOnlinePaymentInfoByRental(rentalId: string): Observable {\r\n\t\treturn this.httpClient.get(`/api/rental-balances/${rentalId}/balance-info`);\r\n\t}\r\n\r\n\tgetLastPaymentsByRental(rentalId: string): Observable {\r\n\t\treturn this.httpClient.get(`/api/rental-balances/${rentalId}/last-payments`);\r\n\t}\r\n\r\n\tgetLastPaymentNoticeByRental(rentalId: string): Observable {\r\n\t\treturn this.httpClient.get(`/api/rental-balances/${rentalId}/last-payment-notice`);\r\n\t}\r\n\r\n\tgetPaymentNoticeHistoryByRental(rentalId: string): Observable {\r\n\t\treturn this.httpClient.get(`/api/rental-balances/${rentalId}/payment-notice-history`);\r\n\t}\r\n\r\n\tgetAccountStatementByRental(rentalId: string): Observable {\r\n\t\treturn this.httpClient.get(`/api/rental-balances/${rentalId}/account-statement`);\r\n\t}\r\n\r\n\tgetDirectDebitByRental(rentalId: string, thirdPartyId: string): Observable {\r\n\t\treturn this.httpClient.get(\r\n\t\t\t`/api/rental-balances/${thirdPartyId}/${rentalId}/direct-debit-info`\r\n\t\t);\r\n\t}\r\n\r\n\tretrieveOnlinePaymentParameters(\r\n\t\tthirdPartyId: string,\r\n\t\trentalId: string,\r\n\t\trequest: OnlinePaymentParametersRequest\r\n\t): Observable {\r\n\t\treturn this.httpClient.post(\r\n\t\t\t`/api/rental-balances/${thirdPartyId}/${rentalId}/payment-form-link`,\r\n\t\t\trequest\r\n\t\t);\r\n\t}\r\n\r\n\treloadLastPayments(): void {\r\n\t\tthis.lastPaymentsSubject$.next(\"Reload\");\r\n\t}\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { BehaviorSubject, Observable } from \"rxjs\";\r\n\r\n@Injectable({\r\n\tprovidedIn: \"root\",\r\n})\r\nexport class CommunicationService {\r\n\tprivate _insuranceUploadedSubject$ = new BehaviorSubject(\"init\");\r\n\tprivate _rentalSelectionChangedSubject$ = new BehaviorSubject(\"init\");\r\n\r\n\tonInsuranceUploaded$: Observable = this._insuranceUploadedSubject$.asObservable();\r\n\tonRentalSelectionChanged$: Observable = this._rentalSelectionChangedSubject$.asObservable();\r\n\r\n\tchangeRentalUnitSelection(): void {\r\n\t\tthis._rentalSelectionChangedSubject$.next(\"reload\");\r\n\t}\r\n\r\n\tinsuranceUploaded(): void {\r\n\t\tthis._insuranceUploadedSubject$.next(\"uploaded\");\r\n\t}\r\n}\r\n","import { Injectable, inject } from \"@angular/core\";\r\nimport { Observable } from \"rxjs\";\r\nimport { RentalsHttpClient } from \"../http-clients\";\r\nimport { BaseApiResponse } from \"../types\";\r\n\r\n@Injectable({\r\n\tprovidedIn: \"root\",\r\n})\r\nexport class FilesService {\r\n\tprivate readonly httpClient = inject(RentalsHttpClient);\r\n\r\n\tgetOnlinePaymentNotice(rentalId: string, fileName: string): Observable {\r\n\t\treturn this.httpClient.downloadFile(\r\n\t\t\t`/api/rental-balances/${rentalId}/last-payment-notice/download/${fileName}`\r\n\t\t);\r\n\t}\r\n\r\n\tgetSEPAForm(): Observable {\r\n\t\treturn this.httpClient.downloadLocalFile(`assets/documents/emh_mandat_de_prelevement_sepa.pdf`);\r\n\t}\r\n\r\n\tgetBedbugsGuideUrl(): Observable {\r\n\t\treturn this.httpClient.get(`/api/app/bedbugs-guide-url`);\r\n\t}\r\n\r\n\tgetMaintenanceGuideUrl(): Observable {\r\n\t\treturn this.httpClient.get(`/api/app/maintenance-guide-url`);\r\n\t}\r\n\r\n\tgetRentalCostsGuideUrl(): Observable {\r\n\t\treturn this.httpClient.get(`/api/app/rental-costs-guide-url`);\r\n\t}\r\n\r\n\tgetRentalRepairGuideUrl(): Observable {\r\n\t\treturn this.httpClient.get(`/api/app/rental-repair-guide-url`);\r\n\t}\r\n}\r\n","import { Injectable, inject } from \"@angular/core\";\r\nimport { Observable } from \"rxjs\";\r\nimport { RentalsHttpClient } from \"../http-clients\";\r\nimport { FormResponse, QuestionAnswersRequest } from \"../types\";\r\n\r\n@Injectable({\r\n\tprovidedIn: \"root\",\r\n})\r\nexport class FormsService {\r\n\tprivate readonly httpClient = inject(RentalsHttpClient);\r\n\r\n\tgetLastActive(thirdPartyId: string): Observable {\r\n\t\treturn this.httpClient.get(`/api/forms/third-parties/${thirdPartyId}`);\r\n\t}\r\n\r\n\tregisterQuestionAnswers(thirdPartyId: string, request: QuestionAnswersRequest): Observable {\r\n\t\treturn this.httpClient.post(`/api/forms/third-parties/${thirdPartyId}/answers`, request);\r\n\t}\r\n}\r\n","import { HttpEvent } from \"@angular/common/http\";\r\nimport { Injectable, inject } from \"@angular/core\";\r\nimport { Observable, Subject } from \"rxjs\";\r\nimport { FileProgress, RentalsHttpClient } from \"../http-clients\";\r\nimport { BaseApiResponse, InsuranceStatus, UpdateInsuranceRequest } from \"../types\";\r\n\r\n@Injectable({\r\n\tprovidedIn: \"root\",\r\n})\r\nexport class InsurancesService {\r\n\tprivate readonly httpClient = inject(RentalsHttpClient);\r\n\r\n\tprivate _uploadInsuranceFileSource = new Subject();\r\n\tpublic onUploadInsuranceFile$: Observable = this._uploadInsuranceFileSource.asObservable();\r\n\r\n\tgetInsuranceStatusByRental(rentalId: string): Observable {\r\n\t\treturn this.httpClient.get(`/api/rentals/${rentalId}/insurance`);\r\n\t}\r\n\r\n\tpublic updateInsuranceDocument(\r\n\t\tthirdPartyId: string,\r\n\t\trentalId: string,\r\n\t\trequest: UpdateInsuranceRequest\r\n\t): Observable> {\r\n\t\tconst formData = new FormData();\r\n\t\tformData.append(\"file\", request.file, request.file.name);\r\n\t\tformData.append(\"beginDate\", request.beginDate.toISOString());\r\n\t\tformData.append(\"endDate\", request.endDate.toISOString());\r\n\r\n\t\tfor (let i = 0; i < request.lotIdentifiers.length; i++)\r\n\t\t\tformData.append(\"lotIdentifiers[]\", request.lotIdentifiers[i]);\r\n\r\n\t\treturn this.httpClient.uploadFile(\r\n\t\t\t`/api/rentals/${thirdPartyId}/${rentalId}/insurance`,\r\n\t\t\tformData,\r\n\t\t\t(fileProgress: FileProgress) => this._uploadInsuranceFileSource.next(fileProgress)\r\n\t\t);\r\n\t}\r\n}\r\n","import { Injectable, inject } from \"@angular/core\";\r\nimport { Observable } from \"rxjs\";\r\nimport { RentalsHttpClient } from \"../http-clients\";\r\nimport {\r\n\tAccommodationResponse,\r\n\tAgencyResponse,\r\n\tConsumptionResponse,\r\n\tContactPersonResponse,\r\n\tContractingCompanyResponse,\r\n\tRentalUnitResponse,\r\n\tRentalUnitsRequest,\r\n} from \"../types\";\r\n\r\n@Injectable({\r\n\tprovidedIn: \"root\",\r\n})\r\nexport class RentalsService {\r\n\tprivate readonly httpClient = inject(RentalsHttpClient);\r\n\r\n\tgetRentalById(rentalId: string): Observable {\r\n\t\treturn this.httpClient.get(`/api/rentals/${rentalId}`);\r\n\t}\r\n\r\n\tgetRentalsByIds(rentalIds: string[]): Observable {\r\n\t\treturn this.httpClient.post(`/api/rentals/rentals-by-ids`, {\r\n\t\t\trentalIds: rentalIds,\r\n\t\t} as RentalUnitsRequest);\r\n\t}\r\n\r\n\tgetRentalsByUsername(userName: string): Observable {\r\n\t\treturn this.httpClient.post(`/api/rentals/rentals-by-username`, { userName: userName });\r\n\t}\r\n\r\n\tgetRentalContactPersons(rentalId: string, isLegalPerson: boolean): Observable {\r\n\t\tif (isLegalPerson) {\r\n\t\t\treturn this.httpClient.get(`/api/rentals/${rentalId}/legal-contact-persons`);\r\n\t\t}\r\n\r\n\t\treturn this.httpClient.get(`/api/rentals/${rentalId}/contact-persons`);\r\n\t}\r\n\r\n\tgetRentalAgency(rentalId: string): Observable {\r\n\t\treturn this.httpClient.get(`/api/rentals/${rentalId}/agency`);\r\n\t}\r\n\r\n\tgetAccommodationsByRental(rentalId: string): Observable {\r\n\t\treturn this.httpClient.get(`/api/rentals/${rentalId}/accommodations`);\r\n\t}\r\n\r\n\tgetContractingCompaniesByRental(rentalId: string): Observable {\r\n\t\treturn this.httpClient.get(`/api/rentals/${rentalId}/contracting-companies`);\r\n\t}\r\n\r\n\tgetConsumptionsByRental(rentalId: string): Observable {\r\n\t\treturn this.httpClient.get(`/api/rentals/${rentalId}/consumptions`);\r\n\t}\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { BehaviorSubject, Observable } from \"rxjs\";\r\nimport { SolicitationFilter } from \"../types\";\r\n\r\n@Injectable({\r\n\tprovidedIn: \"root\",\r\n})\r\nexport class SolicitationsFilterService {\r\n\tprivate currentFilters!: SolicitationFilter[];\r\n\tprivate _filterChangedSubject = new BehaviorSubject([]);\r\n\r\n\tonFilterChanged$: Observable = this._filterChangedSubject.asObservable();\r\n\r\n\tconstructor() {\r\n\t\tthis.reset();\r\n\t}\r\n\r\n\tselect(filter: SolicitationFilter): void {\r\n\t\tconst currentFilterIndex: number = this.currentFilters.findIndex((cf) => cf.id === filter.id);\r\n\r\n\t\t// Filter by category except the current filter\r\n\t\tconst sameCategoryFilters: SolicitationFilter[] = this.currentFilters.filter(\r\n\t\t\t(f) => f.category === filter.category && f.id !== filter.id\r\n\t\t);\r\n\r\n\t\t// Delete all the filter with the same category\r\n\t\tsameCategoryFilters.forEach((f: SolicitationFilter) => {\r\n\t\t\tconst index: number = this.currentFilters.findIndex((cf) => cf.id === f.id);\r\n\t\t\tthis.currentFilters.splice(index, 1);\r\n\t\t});\r\n\r\n\t\t// Add/update the new filter\r\n\t\tif (currentFilterIndex === -1) {\r\n\t\t\tthis.currentFilters.push(filter);\r\n\t\t} else {\r\n\t\t\tthis.currentFilters[currentFilterIndex].selected = !this.currentFilters[currentFilterIndex].selected;\r\n\t\t}\r\n\r\n\t\tthis.handleNoFilter();\r\n\r\n\t\t// Notify\r\n\t\tthis.notify();\r\n\t}\r\n\r\n\tremove(removedFilterId: string): void {\r\n\t\tif (!removedFilterId) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst index = this.currentFilters.findIndex((f) => f.id === removedFilterId);\r\n\r\n\t\tif (index !== -1) {\r\n\t\t\tthis.currentFilters.splice(index, 1);\r\n\t\t}\r\n\r\n\t\tthis.handleNoFilter();\r\n\t\tthis.notify();\r\n\t}\r\n\r\n\tgetFilters(): SolicitationFilter[] {\r\n\t\treturn this.currentFilters;\r\n\t}\r\n\r\n\tnotify(): void {\r\n\t\tthis._filterChangedSubject.next(this.currentFilters);\r\n\t}\r\n\r\n\treset(): void {\r\n\t\tthis.currentFilters = [];\r\n\t\tthis.notify();\r\n\t}\r\n\r\n\tprivate handleNoFilter(): void {\r\n\t\tif (this.currentFilters.filter((cf) => cf.selected).length !== 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.reset();\r\n\t}\r\n}\r\n","export class FamilySituationTypes {\r\n\tstatic readonly record: Record = {\r\n\t\t[\"cel\"]: \"Célibataire\",\r\n\t\t[\"div\"]: \"Divorcé(e)\",\r\n\t\t[\"mpc\"]: \"Mère ou père célibataire\",\r\n\t\t[\"vma\"]: \"Vie maritale\",\r\n\t\t[\"mar\"]: \"Marié(e)\",\r\n\t\t[\"sep\"]: \"Séparé(e)\",\r\n\t\t[\"veu\"]: \"Veuf(ve)\",\r\n\t\t[\"inc\"]: \"Inconnue\",\r\n\t\t[\"pac\"]: \"Pacsé(e)\",\r\n\t\t[\"ccb\"]: \"Concubin(e)\",\r\n\t\t[\"dcd\"]: \"Décédé(e)\",\r\n\t};\r\n}\r\n","export class InsuranceStatusType {\r\n\tstatic readonly expired: string = \"expired\";\r\n\tstatic readonly upToDate: string = \"up-to-date\";\r\n\tstatic readonly processing: string = \"processing\";\r\n\tstatic readonly nearlyExpired: string = \"nearly-expired\";\r\n\r\n\tstatic readonly record: Record = {\r\n\t\t[InsuranceStatusType.expired]: \"Expirée\",\r\n\t\t[InsuranceStatusType.upToDate]: \"À jour\",\r\n\t\t[InsuranceStatusType.nearlyExpired]: \"Bientôt expirée\",\r\n\t};\r\n\r\n\tstatic readonly iconRecord: Record = {\r\n\t\t[InsuranceStatusType.expired]: \"warning\",\r\n\t\t[InsuranceStatusType.upToDate]: \"check_circle\",\r\n\t\t[InsuranceStatusType.nearlyExpired]: \"warning\",\r\n\t};\r\n}\r\n","export class JobContractTypes {\r\n\tstatic readonly record: Record = {\r\n\t\t[\"agr\"]: \"Agriculteur\",\r\n\t\t[\"art\"]: \"Artisan\",\r\n\t\t[\"cmd\"]: \"Cadre moyen CDD\",\r\n\t\t[\"csd\"]: \"Cadre supérieur CDD\",\r\n\t\t[\"cmo\"]: \"Cadre moyen CDI\",\r\n\t\t[\"csu\"]: \"Cadre supérieur CDI\",\r\n\t\t[\"cho\"]: \"Chômeur, demandeur d'emploi\",\r\n\t\t[\"ins\"]: \"Contrat d'insertion\",\r\n\t\t[\"emd\"]: \"Employé CDD\",\r\n\t\t[\"emp\"]: \"Employé CDI\",\r\n\t\t[\"emn\"]: \"Employé cne\",\r\n\t\t[\"ens\"]: \"Enseignant\",\r\n\t\t[\"etu\"]: \"Etudiant, éleve, stagiaire\",\r\n\t\t[\"fon\"]: \"Fonctionnaire\",\r\n\t\t[\"han\"]: \"Handicapé, pensionné\",\r\n\t\t[\"inc\"]: \"Inconnu\",\r\n\t\t[\"lma\"]: \"Longue maladie\",\r\n\t\t[\"mid\"]: \"Militaire, appelé CDD\",\r\n\t\t[\"mil\"]: \"Militaire CDI\",\r\n\t\t[\"oud\"]: \"Ouvrier CDD\",\r\n\t\t[\"ouv\"]: \"Ouvrier CDI\",\r\n\t\t[\"lib\"]: \"Profession libérale\",\r\n\t\t[\"ret\"]: \"Retraité, pre-retraité\",\r\n\t\t[\"san\"]: \"Sans profession\",\r\n\t\t[\"sco\"]: \"Scolaire\",\r\n\t};\r\n}\r\n","export enum PreferenceType {\r\n\tnoticeDelivery = \"notice-delivery\",\r\n\tfavoriteContactMode = \"favorite-contact-mode\",\r\n}\r\n\r\nexport class NotificationType {\r\n\tstatic readonly email = \"email\";\r\n\tstatic readonly post = \"post\";\r\n\tstatic readonly tenantSpace = \"tenant-space\";\r\n\tstatic readonly sms = \"sms\";\r\n}\r\n","import { Injectable, inject } from \"@angular/core\";\r\nimport { Colors } from \"@e-tenant-hub/shared/utils\";\r\nimport { BehaviorSubject, Observable, map, tap } from \"rxjs\";\r\nimport { SolicitationStatus } from \"../constants\";\r\nimport { RentalsHttpClient } from \"../http-clients\";\r\nimport {\r\n\tGetAllSolicitationsResponse,\r\n\tNbNewSolicitationsResponseItem,\r\n\tSolicitationCreationRequest,\r\n\tSolicitationCreationResponse,\r\n\tSolicitationResponseItem,\r\n\tSolicitationStepRequest,\r\n} from \"../types\";\r\n\r\n@Injectable({\r\n\tprovidedIn: \"root\",\r\n})\r\nexport class SolicitationsService {\r\n\tprivate readonly httpClient = inject(RentalsHttpClient);\r\n\r\n\tprivate solicitationUpdateSubject$ = new BehaviorSubject(\"Init\");\r\n\tonSolicitationUpdate$: Observable = this.solicitationUpdateSubject$.asObservable();\r\n\r\n\tprivate nbReadSolicitationsSubject$ = new BehaviorSubject(\"Init\");\r\n\tonNbReadSolicitationsChange$ = this.nbReadSolicitationsSubject$.asObservable();\r\n\r\n\tprivate isNewSolicitationRequestDisabledSubject$ = new BehaviorSubject(true);\r\n\tisNewSolicitationRequestDisabled$: Observable =\r\n\t\tthis.isNewSolicitationRequestDisabledSubject$.asObservable();\r\n\r\n\tgetNbNewSolicitationsByRental(rentalId: string): Observable {\r\n\t\tconst response = this.httpClient.get(\r\n\t\t\t`/api/solicitations/new/rentals/${rentalId}`\r\n\t\t);\r\n\t\treturn response.pipe(map((r) => r.nbNewSolicitations));\r\n\t}\r\n\r\n\tgetAllSolicitationsByRental(rentalId: string): Observable {\r\n\t\treturn this.httpClient\r\n\t\t\t.get(`/api/solicitations/rentals/${rentalId}`)\r\n\t\t\t.pipe(\r\n\t\t\t\ttap((response: GetAllSolicitationsResponse) =>\r\n\t\t\t\t\tthis.isNewSolicitationRequestDisabledSubject$.next(response.isNewSolicitationRequestDisabled)\r\n\t\t\t\t)\r\n\t\t\t);\r\n\t}\r\n\r\n\tcreateSolicitation(request: SolicitationCreationRequest): Observable {\r\n\t\treturn this.httpClient.post(`/api/solicitations`, request);\r\n\t}\r\n\r\n\taddSolicitationStep(\r\n\t\tsolicitationId: string,\r\n\t\trequest: SolicitationStepRequest\r\n\t): Observable {\r\n\t\treturn this.httpClient.post(`/api/solicitations/${solicitationId}/steps`, request);\r\n\t}\r\n\r\n\tmarkSolicitationAsRead(solicitationId: string): Observable {\r\n\t\treturn this.httpClient.put(`/api/solicitations/${solicitationId}/read`, null);\r\n\t}\r\n\r\n\treloadSolicitations(): void {\r\n\t\tthis.solicitationUpdateSubject$.next(\"Reload\");\r\n\t}\r\n\r\n\treloadNbReadSolicitations(): void {\r\n\t\tthis.nbReadSolicitationsSubject$.next(\"Reload\");\r\n\t}\r\n\r\n\tdetermineSolicitationStatusColor(status: string): Colors {\r\n\t\tswitch (status) {\r\n\t\t\tcase SolicitationStatus.canceled:\r\n\t\t\t\treturn Colors.Error;\r\n\t\t\tcase SolicitationStatus.closed:\r\n\t\t\t\treturn Colors.Success;\r\n\t\t\tcase SolicitationStatus.requested:\r\n\t\t\tcase SolicitationStatus.unknown:\r\n\t\t\t\treturn Colors.Neutral400;\r\n\t\t\tdefault:\r\n\t\t\t\treturn Colors.Primary;\r\n\t\t}\r\n\t}\r\n}\r\n","import { Injectable, inject } from \"@angular/core\";\r\nimport { Observable } from \"rxjs\";\r\nimport { RentalsHttpClient } from \"../http-clients\";\r\nimport {\r\n\tBaseApiResponse,\r\n\tThirdParty,\r\n\tThirdPartyPreference,\r\n\tThirdPartyPreferencesRequest,\r\n\tThirdPartySuggestionResponse,\r\n\tThirdPartySurveySetting,\r\n} from \"../types\";\r\n\r\n@Injectable({\r\n\tprovidedIn: \"root\",\r\n})\r\nexport class ThirdPartiesService {\r\n\tprivate readonly httpClient = inject(RentalsHttpClient);\r\n\r\n\tgetContactDetail(rentalId: string, thirdPartyId: string): Observable {\r\n\t\treturn this.httpClient.get(`/api/third-parties/${thirdPartyId}/${rentalId}/contact-detail`);\r\n\t}\r\n\r\n\tgetPreferences(thirdPartyId: string): Observable {\r\n\t\treturn this.httpClient.get(`/api/third-parties/${thirdPartyId}/preferences`);\r\n\t}\r\n\r\n\tgetSurveySettings(): Observable {\r\n\t\treturn this.httpClient.get(`/api/third-parties/survey-settings`);\r\n\t}\r\n\r\n\tgetThirdPartiesByRental(tenantNumber: string): Observable {\r\n\t\treturn this.httpClient.get(`/api/third-parties/rental/${tenantNumber}`);\r\n\t}\r\n\r\n\tgetThirdPartiesByFamilyName(familyName: string): Observable {\r\n\t\treturn this.httpClient.get(`/api/third-parties/${familyName}`);\r\n\t}\r\n\r\n\tupdateContactDetail(rentalId: string, thirdPartyId: string, request: ThirdParty): Observable {\r\n\t\treturn this.httpClient.post(`/api/third-parties/${thirdPartyId}/${rentalId}/contact-detail`, request);\r\n\t}\r\n\r\n\tupdatePreferences(thirdPartyId: string, request: ThirdPartyPreferencesRequest): Observable {\r\n\t\treturn this.httpClient.post(`/api/third-parties/${thirdPartyId}/preferences`, request);\r\n\t}\r\n}\r\n","export interface PaymentNotice {\r\n\taddedDate: Date;\r\n\tdisplayName: string;\r\n\tid: number;\r\n\tname: string;\r\n\ttitle: string;\r\n\ttypeCode: PaymentNoticeType;\r\n}\r\n\r\nexport enum PaymentNoticeType {\r\n\tChargesStatement = 0,\r\n\tPaymentNotice = 1,\r\n}\r\n","import * as i0 from '@angular/core';\nimport { PLATFORM_ID, Injectable, Inject } from '@angular/core';\nimport { isPlatformBrowser, DOCUMENT } from '@angular/common';\n\n// This service is based on the `ng2-cookies` package which sadly is not a service and does\n// not use `DOCUMENT` injection and therefore doesn't work well with AoT production builds.\n// Package: https://github.com/BCJTI/ng2-cookies\nlet CookieService = /*#__PURE__*/(() => {\n class CookieService {\n constructor(document,\n // Get the `PLATFORM_ID` so we can check if we're in a browser.\n platformId) {\n this.document = document;\n this.platformId = platformId;\n this.documentIsAccessible = isPlatformBrowser(this.platformId);\n }\n /**\n * Get cookie Regular Expression\n *\n * @param name Cookie name\n * @returns property RegExp\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n static getCookieRegExp(name) {\n const escapedName = name.replace(/([\\[\\]{}()|=;+?,.*^$])/gi, '\\\\$1');\n return new RegExp('(?:^' + escapedName + '|;\\\\s*' + escapedName + ')=(.*?)(?:;|$)', 'g');\n }\n /**\n * Gets the unencoded version of an encoded component of a Uniform Resource Identifier (URI).\n *\n * @param encodedURIComponent A value representing an encoded URI component.\n *\n * @returns The unencoded version of an encoded component of a Uniform Resource Identifier (URI).\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n static safeDecodeURIComponent(encodedURIComponent) {\n try {\n return decodeURIComponent(encodedURIComponent);\n } catch {\n // probably it is not uri encoded. return as is\n return encodedURIComponent;\n }\n }\n /**\n * Return `true` if {@link Document} is accessible, otherwise return `false`\n *\n * @param name Cookie name\n * @returns boolean - whether cookie with specified name exists\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n check(name) {\n if (!this.documentIsAccessible) {\n return false;\n }\n name = encodeURIComponent(name);\n const regExp = CookieService.getCookieRegExp(name);\n return regExp.test(this.document.cookie);\n }\n /**\n * Get cookies by name\n *\n * @param name Cookie name\n * @returns property value\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n get(name) {\n if (this.documentIsAccessible && this.check(name)) {\n name = encodeURIComponent(name);\n const regExp = CookieService.getCookieRegExp(name);\n const result = regExp.exec(this.document.cookie);\n return result[1] ? CookieService.safeDecodeURIComponent(result[1]) : '';\n } else {\n return '';\n }\n }\n /**\n * Get all cookies in JSON format\n *\n * @returns all the cookies in json\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n getAll() {\n if (!this.documentIsAccessible) {\n return {};\n }\n const cookies = {};\n const document = this.document;\n if (document.cookie && document.cookie !== '') {\n document.cookie.split(';').forEach(currentCookie => {\n const [cookieName, cookieValue] = currentCookie.split('=');\n cookies[CookieService.safeDecodeURIComponent(cookieName.replace(/^ /, ''))] = CookieService.safeDecodeURIComponent(cookieValue);\n });\n }\n return cookies;\n }\n set(name, value, expiresOrOptions, path, domain, secure, sameSite, partitioned) {\n if (!this.documentIsAccessible) {\n return;\n }\n if (typeof expiresOrOptions === 'number' || expiresOrOptions instanceof Date || path || domain || secure || sameSite) {\n const optionsBody = {\n expires: expiresOrOptions,\n path,\n domain,\n secure,\n sameSite: sameSite ? sameSite : 'Lax',\n partitioned\n };\n this.set(name, value, optionsBody);\n return;\n }\n let cookieString = encodeURIComponent(name) + '=' + encodeURIComponent(value) + ';';\n const options = expiresOrOptions ? expiresOrOptions : {};\n if (options.expires) {\n if (typeof options.expires === 'number') {\n const dateExpires = new Date(new Date().getTime() + options.expires * 1000 * 60 * 60 * 24);\n cookieString += 'expires=' + dateExpires.toUTCString() + ';';\n } else {\n cookieString += 'expires=' + options.expires.toUTCString() + ';';\n }\n }\n if (options.path) {\n cookieString += 'path=' + options.path + ';';\n }\n if (options.domain) {\n cookieString += 'domain=' + options.domain + ';';\n }\n if (options.secure === false && options.sameSite === 'None') {\n options.secure = true;\n console.warn(`[ngx-cookie-service] Cookie ${name} was forced with secure flag because sameSite=None.` + `More details : https://github.com/stevermeister/ngx-cookie-service/issues/86#issuecomment-597720130`);\n }\n if (options.secure) {\n cookieString += 'secure;';\n }\n if (!options.sameSite) {\n options.sameSite = 'Lax';\n }\n cookieString += 'sameSite=' + options.sameSite + ';';\n if (options.partitioned) {\n cookieString += 'Partitioned;';\n }\n this.document.cookie = cookieString;\n }\n /**\n * Delete cookie by name\n *\n * @param name Cookie name\n * @param path Cookie path\n * @param domain Cookie domain\n * @param secure Cookie secure flag\n * @param sameSite Cookie sameSite flag - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n delete(name, path, domain, secure, sameSite = 'Lax') {\n if (!this.documentIsAccessible) {\n return;\n }\n const expiresDate = new Date('Thu, 01 Jan 1970 00:00:01 GMT');\n this.set(name, '', {\n expires: expiresDate,\n path,\n domain,\n secure,\n sameSite\n });\n }\n /**\n * Delete all cookies\n *\n * @param path Cookie path\n * @param domain Cookie domain\n * @param secure Is the Cookie secure\n * @param sameSite Is the cookie same site\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n deleteAll(path, domain, secure, sameSite = 'Lax') {\n if (!this.documentIsAccessible) {\n return;\n }\n const cookies = this.getAll();\n for (const cookieName in cookies) {\n if (cookies.hasOwnProperty(cookieName)) {\n this.delete(cookieName, path, domain, secure, sameSite);\n }\n }\n }\n static {\n this.ɵfac = function CookieService_Factory(t) {\n return new (t || CookieService)(i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(PLATFORM_ID));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: CookieService,\n factory: CookieService.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return CookieService;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/*\n * Public API Surface of ngx-cookie-service\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { CookieService };\n","import { Injectable, inject } from \"@angular/core\";\r\nimport { environment } from \"@e-tenant-hub/environments\";\r\nimport { CookieService } from \"ngx-cookie-service\";\r\nimport { Observable } from \"rxjs\";\r\nimport { RentalsHttpClient } from \"../http-clients\";\r\nimport { BaseApiResponse, CookiesAcceptance } from \"../types\";\r\n\r\n@Injectable({\r\n\tprovidedIn: \"root\",\r\n})\r\nexport class CookiesService {\r\n\tprivate readonly httpClient = inject(RentalsHttpClient);\r\n\tprivate readonly cookieService = inject(CookieService);\r\n\r\n\tprivate disableGa: string = \"ga-disable-\" + environment.googleAnalyticsCode;\r\n\r\n\tsaveCookieAcceptance(request: CookiesAcceptance): Observable {\r\n\t\treturn this.httpClient.post(`/api/cookie/send-cookie-acceptance`, request);\r\n\t}\r\n\r\n\trefuseCookieGa(expirationDate: number) {\r\n\t\t/*set domain use by GA */\r\n\t\tthis.cookieService.deleteAll(\"/\", \".est-metropole-habitat.fr\");\r\n\t\tthis.cookieService.deleteAll(\"/\", \"localhost\");\r\n\t\tif (environment.googleAnalyticsCode) {\r\n\t\t\tthis.cookieService.set(this.disableGa, \"true\", expirationDate);\r\n\t\t}\r\n\t}\r\n\r\n\tacceptCookieGa() {\r\n\t\tif (this.cookieService.check(this.disableGa)) {\r\n\t\t\tthis.cookieService.delete(this.disableGa);\r\n\t\t}\r\n\t}\r\n}\r\n","import { Injectable, inject } from \"@angular/core\";\r\nimport { Observable } from \"rxjs\";\r\nimport { RentalsHttpClient } from \"../http-clients\";\r\nimport { UpdateEmailRequest, UpdatePasswordRequest } from \"../types\";\r\n\r\n@Injectable({\r\n\tprovidedIn: \"root\",\r\n})\r\nexport class UsersService {\r\n\tprivate readonly httpClient = inject(RentalsHttpClient);\r\n\r\n\tupdateEmail(username: string, request: UpdateEmailRequest): Observable {\r\n\t\treturn this.httpClient.post(`/api/users/${username}/change-email`, request);\r\n\t}\r\n\r\n\tupdatePassword(username: string, request: UpdatePasswordRequest): Observable {\r\n\t\treturn this.httpClient.post(`/api/users/${username}/change-password`, request);\r\n\t}\r\n}\r\n","import { PreciseDate } from \"@e-tenant-hub/shared/utils\";\r\n\r\nexport interface FormResponse {\r\n\tid: string;\r\n\tisMandatory: boolean;\r\n\tstartDate: PreciseDate;\r\n\tendDate: PreciseDate;\r\n\tdescription: string;\r\n\ttitle: string;\r\n\tvalidationMessage: string;\r\n\tquestions: QuestionResponse[];\r\n}\r\n\r\nexport interface QuestionResponse {\r\n\tid: string;\r\n\tdescription: string;\r\n\torder: number;\r\n\tpropositions: PropositionReponse[];\r\n\ttitle: string;\r\n\ttype: string;\r\n}\r\n\r\nexport interface PropositionReponse {\r\n\tvalue: string;\r\n}\r\n\r\nexport enum QuestionType {\r\n\tSingleChoice = \"single\",\r\n\tMultipleChoice = \"multiple\",\r\n\tFreeAnswer = \"free\",\r\n}\r\n\r\nexport interface QuestionAnswersRequest {\r\n\tanswers: QuestionAnswer[];\r\n}\r\n\r\nexport interface QuestionAnswer {\r\n\tquestionId: string;\r\n\tanswer: string;\r\n}\r\n","import { PreciseDate } from \"@e-tenant-hub/shared/utils\";\r\n\r\nexport interface GetAllSolicitationsResponse {\r\n\tisNewSolicitationRequestDisabled: boolean;\r\n\titems: SolicitationResponseItem[];\r\n}\r\n\r\nexport interface SolicitationResponseItem {\r\n\tid: string;\r\n\tcancellationDate: PreciseDate | null;\r\n\tcanInteract: boolean;\r\n\tcategory: string;\r\n\tclosingDate: string;\r\n\tcompanyMail: string;\r\n\tcompanyMobilePhone: string;\r\n\tcompanyName: string;\r\n\tcompanyOfficePhone: string;\r\n\tcreationDate: PreciseDate | null;\r\n\tisClosureRequestAllowed: boolean;\r\n\tisCommentAllowed: boolean;\r\n\tisNew: boolean;\r\n\tisPublic: boolean;\r\n\tisReminderAllowed: boolean;\r\n\tisRequested: boolean;\r\n\tlastEditionDate: PreciseDate | null;\r\n\tmainComment: string;\r\n\tmodificationDate: PreciseDate | null;\r\n\trentalId: string;\r\n\tstatus: string;\r\n\ttitle: string;\r\n\r\n\tsolicitationSteps: SolicitationStepResponseItem[] | null;\r\n}\r\n\r\nexport interface SolicitationStepResponseItem {\r\n\tid: string;\r\n\tcomment: string;\r\n\tcreationDate: PreciseDate | null;\r\n\tinformation: string;\r\n\tisRequestedByCurrentRentalContract: boolean;\r\n\tsolicitationId: string;\r\n\ttype: string;\r\n}\r\n\r\nexport interface NbNewSolicitationsResponseItem {\r\n\tnbNewSolicitations: number;\r\n}\r\n\r\nexport interface SolicitationCreationRequest {\r\n\tdescription: string;\r\n\tisPublic: boolean;\r\n\trentalId: string;\r\n\tthirdPartyId: string;\r\n\ttitle: string;\r\n}\r\n\r\nexport interface SolicitationCreationResponse {\r\n\trequestId: string;\r\n}\r\n\r\nexport interface SolicitationStepRequest {\r\n\tcomment: string;\r\n\tetenantType: string;\r\n\trentalId: string;\r\n\tthirdParty: string;\r\n}\r\n\r\nexport class SolicitationFilter {\r\n\tid: string;\r\n\tname!: string;\r\n\tcategory!: string;\r\n\tvalue?: string | number | PreciseDate[] | boolean;\r\n\tselected!: boolean;\r\n\r\n\tconstructor(init?: Partial) {\r\n\t\tthis.id = \"_\" + Math.random().toString(36).slice(2, 9);\r\n\t\tObject.assign(this, init);\r\n\t}\r\n}\r\n","import * as i0 from '@angular/core';\nimport { ElementRef, Injector, Directive, EventEmitter, Inject, Input, Output, NgModule } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\n/**\n * Throws an exception when attempting to attach a null portal to a host.\n * @docs-private\n */\nfunction throwNullPortalError() {\n throw Error('Must provide a portal to attach');\n}\n/**\n * Throws an exception when attempting to attach a portal to a host that is already attached.\n * @docs-private\n */\nfunction throwPortalAlreadyAttachedError() {\n throw Error('Host already has a portal attached');\n}\n/**\n * Throws an exception when attempting to attach a portal to an already-disposed host.\n * @docs-private\n */\nfunction throwPortalOutletAlreadyDisposedError() {\n throw Error('This PortalOutlet has already been disposed');\n}\n/**\n * Throws an exception when attempting to attach an unknown portal type.\n * @docs-private\n */\nfunction throwUnknownPortalTypeError() {\n throw Error('Attempting to attach an unknown Portal type. BasePortalOutlet accepts either ' + 'a ComponentPortal or a TemplatePortal.');\n}\n/**\n * Throws an exception when attempting to attach a portal to a null host.\n * @docs-private\n */\nfunction throwNullPortalOutletError() {\n throw Error('Attempting to attach a portal to a null PortalOutlet');\n}\n/**\n * Throws an exception when attempting to detach a portal that is not attached.\n * @docs-private\n */\nfunction throwNoPortalAttachedError() {\n throw Error('Attempting to detach a portal that is not attached to a host');\n}\n\n/**\n * A `Portal` is something that you want to render somewhere else.\n * It can be attach to / detached from a `PortalOutlet`.\n */\nclass Portal {\n /** Attach this portal to a host. */\n attach(host) {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (host == null) {\n throwNullPortalOutletError();\n }\n if (host.hasAttached()) {\n throwPortalAlreadyAttachedError();\n }\n }\n this._attachedHost = host;\n return host.attach(this);\n }\n /** Detach this portal from its host */\n detach() {\n let host = this._attachedHost;\n if (host != null) {\n this._attachedHost = null;\n host.detach();\n } else if (typeof ngDevMode === 'undefined' || ngDevMode) {\n throwNoPortalAttachedError();\n }\n }\n /** Whether this portal is attached to a host. */\n get isAttached() {\n return this._attachedHost != null;\n }\n /**\n * Sets the PortalOutlet reference without performing `attach()`. This is used directly by\n * the PortalOutlet when it is performing an `attach()` or `detach()`.\n */\n setAttachedHost(host) {\n this._attachedHost = host;\n }\n}\n/**\n * A `ComponentPortal` is a portal that instantiates some Component upon attachment.\n */\nclass ComponentPortal extends Portal {\n constructor(component, viewContainerRef, injector, componentFactoryResolver, projectableNodes) {\n super();\n this.component = component;\n this.viewContainerRef = viewContainerRef;\n this.injector = injector;\n this.componentFactoryResolver = componentFactoryResolver;\n this.projectableNodes = projectableNodes;\n }\n}\n/**\n * A `TemplatePortal` is a portal that represents some embedded template (TemplateRef).\n */\nclass TemplatePortal extends Portal {\n constructor( /** The embedded template that will be used to instantiate an embedded View in the host. */\n templateRef, /** Reference to the ViewContainer into which the template will be stamped out. */\n viewContainerRef, /** Contextual data to be passed in to the embedded view. */\n context, /** The injector to use for the embedded view. */\n injector) {\n super();\n this.templateRef = templateRef;\n this.viewContainerRef = viewContainerRef;\n this.context = context;\n this.injector = injector;\n }\n get origin() {\n return this.templateRef.elementRef;\n }\n /**\n * Attach the portal to the provided `PortalOutlet`.\n * When a context is provided it will override the `context` property of the `TemplatePortal`\n * instance.\n */\n attach(host, context = this.context) {\n this.context = context;\n return super.attach(host);\n }\n detach() {\n this.context = undefined;\n return super.detach();\n }\n}\n/**\n * A `DomPortal` is a portal whose DOM element will be taken from its current position\n * in the DOM and moved into a portal outlet, when it is attached. On detach, the content\n * will be restored to its original position.\n */\nclass DomPortal extends Portal {\n constructor(element) {\n super();\n this.element = element instanceof ElementRef ? element.nativeElement : element;\n }\n}\n/**\n * Partial implementation of PortalOutlet that handles attaching\n * ComponentPortal and TemplatePortal.\n */\nclass BasePortalOutlet {\n constructor() {\n /** Whether this host has already been permanently disposed. */\n this._isDisposed = false;\n // @breaking-change 10.0.0 `attachDomPortal` to become a required abstract method.\n this.attachDomPortal = null;\n }\n /** Whether this host has an attached portal. */\n hasAttached() {\n return !!this._attachedPortal;\n }\n /** Attaches a portal. */\n attach(portal) {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (!portal) {\n throwNullPortalError();\n }\n if (this.hasAttached()) {\n throwPortalAlreadyAttachedError();\n }\n if (this._isDisposed) {\n throwPortalOutletAlreadyDisposedError();\n }\n }\n if (portal instanceof ComponentPortal) {\n this._attachedPortal = portal;\n return this.attachComponentPortal(portal);\n } else if (portal instanceof TemplatePortal) {\n this._attachedPortal = portal;\n return this.attachTemplatePortal(portal);\n // @breaking-change 10.0.0 remove null check for `this.attachDomPortal`.\n } else if (this.attachDomPortal && portal instanceof DomPortal) {\n this._attachedPortal = portal;\n return this.attachDomPortal(portal);\n }\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n throwUnknownPortalTypeError();\n }\n }\n /** Detaches a previously attached portal. */\n detach() {\n if (this._attachedPortal) {\n this._attachedPortal.setAttachedHost(null);\n this._attachedPortal = null;\n }\n this._invokeDisposeFn();\n }\n /** Permanently dispose of this portal host. */\n dispose() {\n if (this.hasAttached()) {\n this.detach();\n }\n this._invokeDisposeFn();\n this._isDisposed = true;\n }\n /** @docs-private */\n setDisposeFn(fn) {\n this._disposeFn = fn;\n }\n _invokeDisposeFn() {\n if (this._disposeFn) {\n this._disposeFn();\n this._disposeFn = null;\n }\n }\n}\n/**\n * @deprecated Use `BasePortalOutlet` instead.\n * @breaking-change 9.0.0\n */\nclass BasePortalHost extends BasePortalOutlet {}\n\n/**\n * A PortalOutlet for attaching portals to an arbitrary DOM element outside of the Angular\n * application context.\n */\nclass DomPortalOutlet extends BasePortalOutlet {\n /**\n * @param outletElement Element into which the content is projected.\n * @param _componentFactoryResolver Used to resolve the component factory.\n * Only required when attaching component portals.\n * @param _appRef Reference to the application. Only used in component portals when there\n * is no `ViewContainerRef` available.\n * @param _defaultInjector Injector to use as a fallback when the portal being attached doesn't\n * have one. Only used for component portals.\n * @param _document Reference to the document. Used when attaching a DOM portal. Will eventually\n * become a required parameter.\n */\n constructor( /** Element into which the content is projected. */\n outletElement, _componentFactoryResolver, _appRef, _defaultInjector,\n /**\n * @deprecated `_document` Parameter to be made required.\n * @breaking-change 10.0.0\n */\n _document) {\n super();\n this.outletElement = outletElement;\n this._componentFactoryResolver = _componentFactoryResolver;\n this._appRef = _appRef;\n this._defaultInjector = _defaultInjector;\n /**\n * Attaches a DOM portal by transferring its content into the outlet.\n * @param portal Portal to be attached.\n * @deprecated To be turned into a method.\n * @breaking-change 10.0.0\n */\n this.attachDomPortal = portal => {\n // @breaking-change 10.0.0 Remove check and error once the\n // `_document` constructor parameter is required.\n if (!this._document && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('Cannot attach DOM portal without _document constructor parameter');\n }\n const element = portal.element;\n if (!element.parentNode && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('DOM portal content must be attached to a parent node.');\n }\n // Anchor used to save the element's previous position so\n // that we can restore it when the portal is detached.\n const anchorNode = this._document.createComment('dom-portal');\n element.parentNode.insertBefore(anchorNode, element);\n this.outletElement.appendChild(element);\n this._attachedPortal = portal;\n super.setDisposeFn(() => {\n // We can't use `replaceWith` here because IE doesn't support it.\n if (anchorNode.parentNode) {\n anchorNode.parentNode.replaceChild(element, anchorNode);\n }\n });\n };\n this._document = _document;\n }\n /**\n * Attach the given ComponentPortal to DOM element using the ComponentFactoryResolver.\n * @param portal Portal to be attached\n * @returns Reference to the created component.\n */\n attachComponentPortal(portal) {\n const resolver = portal.componentFactoryResolver || this._componentFactoryResolver;\n if ((typeof ngDevMode === 'undefined' || ngDevMode) && !resolver) {\n throw Error('Cannot attach component portal to outlet without a ComponentFactoryResolver.');\n }\n const componentFactory = resolver.resolveComponentFactory(portal.component);\n let componentRef;\n // If the portal specifies a ViewContainerRef, we will use that as the attachment point\n // for the component (in terms of Angular's component tree, not rendering).\n // When the ViewContainerRef is missing, we use the factory to create the component directly\n // and then manually attach the view to the application.\n if (portal.viewContainerRef) {\n componentRef = portal.viewContainerRef.createComponent(componentFactory, portal.viewContainerRef.length, portal.injector || portal.viewContainerRef.injector, portal.projectableNodes || undefined);\n this.setDisposeFn(() => componentRef.destroy());\n } else {\n if ((typeof ngDevMode === 'undefined' || ngDevMode) && !this._appRef) {\n throw Error('Cannot attach component portal to outlet without an ApplicationRef.');\n }\n componentRef = componentFactory.create(portal.injector || this._defaultInjector || Injector.NULL);\n this._appRef.attachView(componentRef.hostView);\n this.setDisposeFn(() => {\n // Verify that the ApplicationRef has registered views before trying to detach a host view.\n // This check also protects the `detachView` from being called on a destroyed ApplicationRef.\n if (this._appRef.viewCount > 0) {\n this._appRef.detachView(componentRef.hostView);\n }\n componentRef.destroy();\n });\n }\n // At this point the component has been instantiated, so we move it to the location in the DOM\n // where we want it to be rendered.\n this.outletElement.appendChild(this._getComponentRootNode(componentRef));\n this._attachedPortal = portal;\n return componentRef;\n }\n /**\n * Attaches a template portal to the DOM as an embedded view.\n * @param portal Portal to be attached.\n * @returns Reference to the created embedded view.\n */\n attachTemplatePortal(portal) {\n let viewContainer = portal.viewContainerRef;\n let viewRef = viewContainer.createEmbeddedView(portal.templateRef, portal.context, {\n injector: portal.injector\n });\n // The method `createEmbeddedView` will add the view as a child of the viewContainer.\n // But for the DomPortalOutlet the view can be added everywhere in the DOM\n // (e.g Overlay Container) To move the view to the specified host element. We just\n // re-append the existing root nodes.\n viewRef.rootNodes.forEach(rootNode => this.outletElement.appendChild(rootNode));\n // Note that we want to detect changes after the nodes have been moved so that\n // any directives inside the portal that are looking at the DOM inside a lifecycle\n // hook won't be invoked too early.\n viewRef.detectChanges();\n this.setDisposeFn(() => {\n let index = viewContainer.indexOf(viewRef);\n if (index !== -1) {\n viewContainer.remove(index);\n }\n });\n this._attachedPortal = portal;\n // TODO(jelbourn): Return locals from view.\n return viewRef;\n }\n /**\n * Clears out a portal from the DOM.\n */\n dispose() {\n super.dispose();\n this.outletElement.remove();\n }\n /** Gets the root HTMLElement for an instantiated component. */\n _getComponentRootNode(componentRef) {\n return componentRef.hostView.rootNodes[0];\n }\n}\n/**\n * @deprecated Use `DomPortalOutlet` instead.\n * @breaking-change 9.0.0\n */\nclass DomPortalHost extends DomPortalOutlet {}\n\n/**\n * Directive version of a `TemplatePortal`. Because the directive *is* a TemplatePortal,\n * the directive instance itself can be attached to a host, enabling declarative use of portals.\n */\nlet CdkPortal = /*#__PURE__*/(() => {\n class CdkPortal extends TemplatePortal {\n constructor(templateRef, viewContainerRef) {\n super(templateRef, viewContainerRef);\n }\n static {\n this.ɵfac = function CdkPortal_Factory(t) {\n return new (t || CdkPortal)(i0.ɵɵdirectiveInject(i0.TemplateRef), i0.ɵɵdirectiveInject(i0.ViewContainerRef));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkPortal,\n selectors: [[\"\", \"cdkPortal\", \"\"]],\n exportAs: [\"cdkPortal\"],\n standalone: true,\n features: [i0.ɵɵInheritDefinitionFeature]\n });\n }\n }\n return CdkPortal;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @deprecated Use `CdkPortal` instead.\n * @breaking-change 9.0.0\n */\nlet TemplatePortalDirective = /*#__PURE__*/(() => {\n class TemplatePortalDirective extends CdkPortal {\n static {\n this.ɵfac = /* @__PURE__ */(() => {\n let ɵTemplatePortalDirective_BaseFactory;\n return function TemplatePortalDirective_Factory(t) {\n return (ɵTemplatePortalDirective_BaseFactory || (ɵTemplatePortalDirective_BaseFactory = i0.ɵɵgetInheritedFactory(TemplatePortalDirective)))(t || TemplatePortalDirective);\n };\n })();\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: TemplatePortalDirective,\n selectors: [[\"\", \"cdk-portal\", \"\"], [\"\", \"portal\", \"\"]],\n exportAs: [\"cdkPortal\"],\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: CdkPortal,\n useExisting: TemplatePortalDirective\n }]), i0.ɵɵInheritDefinitionFeature]\n });\n }\n }\n return TemplatePortalDirective;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Directive version of a PortalOutlet. Because the directive *is* a PortalOutlet, portals can be\n * directly attached to it, enabling declarative use.\n *\n * Usage:\n * ``\n */\nlet CdkPortalOutlet = /*#__PURE__*/(() => {\n class CdkPortalOutlet extends BasePortalOutlet {\n constructor(_componentFactoryResolver, _viewContainerRef,\n /**\n * @deprecated `_document` parameter to be made required.\n * @breaking-change 9.0.0\n */\n _document) {\n super();\n this._componentFactoryResolver = _componentFactoryResolver;\n this._viewContainerRef = _viewContainerRef;\n /** Whether the portal component is initialized. */\n this._isInitialized = false;\n /** Emits when a portal is attached to the outlet. */\n this.attached = new EventEmitter();\n /**\n * Attaches the given DomPortal to this PortalHost by moving all of the portal content into it.\n * @param portal Portal to be attached.\n * @deprecated To be turned into a method.\n * @breaking-change 10.0.0\n */\n this.attachDomPortal = portal => {\n // @breaking-change 9.0.0 Remove check and error once the\n // `_document` constructor parameter is required.\n if (!this._document && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('Cannot attach DOM portal without _document constructor parameter');\n }\n const element = portal.element;\n if (!element.parentNode && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('DOM portal content must be attached to a parent node.');\n }\n // Anchor used to save the element's previous position so\n // that we can restore it when the portal is detached.\n const anchorNode = this._document.createComment('dom-portal');\n portal.setAttachedHost(this);\n element.parentNode.insertBefore(anchorNode, element);\n this._getRootNode().appendChild(element);\n this._attachedPortal = portal;\n super.setDisposeFn(() => {\n if (anchorNode.parentNode) {\n anchorNode.parentNode.replaceChild(element, anchorNode);\n }\n });\n };\n this._document = _document;\n }\n /** Portal associated with the Portal outlet. */\n get portal() {\n return this._attachedPortal;\n }\n set portal(portal) {\n // Ignore the cases where the `portal` is set to a falsy value before the lifecycle hooks have\n // run. This handles the cases where the user might do something like `
`\n // and attach a portal programmatically in the parent component. When Angular does the first CD\n // round, it will fire the setter with empty string, causing the user's content to be cleared.\n if (this.hasAttached() && !portal && !this._isInitialized) {\n return;\n }\n if (this.hasAttached()) {\n super.detach();\n }\n if (portal) {\n super.attach(portal);\n }\n this._attachedPortal = portal || null;\n }\n /** Component or view reference that is attached to the portal. */\n get attachedRef() {\n return this._attachedRef;\n }\n ngOnInit() {\n this._isInitialized = true;\n }\n ngOnDestroy() {\n super.dispose();\n this._attachedRef = this._attachedPortal = null;\n }\n /**\n * Attach the given ComponentPortal to this PortalOutlet using the ComponentFactoryResolver.\n *\n * @param portal Portal to be attached to the portal outlet.\n * @returns Reference to the created component.\n */\n attachComponentPortal(portal) {\n portal.setAttachedHost(this);\n // If the portal specifies an origin, use that as the logical location of the component\n // in the application tree. Otherwise use the location of this PortalOutlet.\n const viewContainerRef = portal.viewContainerRef != null ? portal.viewContainerRef : this._viewContainerRef;\n const resolver = portal.componentFactoryResolver || this._componentFactoryResolver;\n const componentFactory = resolver.resolveComponentFactory(portal.component);\n const ref = viewContainerRef.createComponent(componentFactory, viewContainerRef.length, portal.injector || viewContainerRef.injector, portal.projectableNodes || undefined);\n // If we're using a view container that's different from the injected one (e.g. when the portal\n // specifies its own) we need to move the component into the outlet, otherwise it'll be rendered\n // inside of the alternate view container.\n if (viewContainerRef !== this._viewContainerRef) {\n this._getRootNode().appendChild(ref.hostView.rootNodes[0]);\n }\n super.setDisposeFn(() => ref.destroy());\n this._attachedPortal = portal;\n this._attachedRef = ref;\n this.attached.emit(ref);\n return ref;\n }\n /**\n * Attach the given TemplatePortal to this PortalHost as an embedded View.\n * @param portal Portal to be attached.\n * @returns Reference to the created embedded view.\n */\n attachTemplatePortal(portal) {\n portal.setAttachedHost(this);\n const viewRef = this._viewContainerRef.createEmbeddedView(portal.templateRef, portal.context, {\n injector: portal.injector\n });\n super.setDisposeFn(() => this._viewContainerRef.clear());\n this._attachedPortal = portal;\n this._attachedRef = viewRef;\n this.attached.emit(viewRef);\n return viewRef;\n }\n /** Gets the root node of the portal outlet. */\n _getRootNode() {\n const nativeElement = this._viewContainerRef.element.nativeElement;\n // The directive could be set on a template which will result in a comment\n // node being the root. Use the comment's parent node if that is the case.\n return nativeElement.nodeType === nativeElement.ELEMENT_NODE ? nativeElement : nativeElement.parentNode;\n }\n static {\n this.ɵfac = function CdkPortalOutlet_Factory(t) {\n return new (t || CdkPortalOutlet)(i0.ɵɵdirectiveInject(i0.ComponentFactoryResolver), i0.ɵɵdirectiveInject(i0.ViewContainerRef), i0.ɵɵdirectiveInject(DOCUMENT));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkPortalOutlet,\n selectors: [[\"\", \"cdkPortalOutlet\", \"\"]],\n inputs: {\n portal: [0, \"cdkPortalOutlet\", \"portal\"]\n },\n outputs: {\n attached: \"attached\"\n },\n exportAs: [\"cdkPortalOutlet\"],\n standalone: true,\n features: [i0.ɵɵInheritDefinitionFeature]\n });\n }\n }\n return CdkPortalOutlet;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @deprecated Use `CdkPortalOutlet` instead.\n * @breaking-change 9.0.0\n */\nlet PortalHostDirective = /*#__PURE__*/(() => {\n class PortalHostDirective extends CdkPortalOutlet {\n static {\n this.ɵfac = /* @__PURE__ */(() => {\n let ɵPortalHostDirective_BaseFactory;\n return function PortalHostDirective_Factory(t) {\n return (ɵPortalHostDirective_BaseFactory || (ɵPortalHostDirective_BaseFactory = i0.ɵɵgetInheritedFactory(PortalHostDirective)))(t || PortalHostDirective);\n };\n })();\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: PortalHostDirective,\n selectors: [[\"\", \"cdkPortalHost\", \"\"], [\"\", \"portalHost\", \"\"]],\n inputs: {\n portal: [0, \"cdkPortalHost\", \"portal\"]\n },\n exportAs: [\"cdkPortalHost\"],\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: CdkPortalOutlet,\n useExisting: PortalHostDirective\n }]), i0.ɵɵInheritDefinitionFeature]\n });\n }\n }\n return PortalHostDirective;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet PortalModule = /*#__PURE__*/(() => {\n class PortalModule {\n static {\n this.ɵfac = function PortalModule_Factory(t) {\n return new (t || PortalModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: PortalModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({});\n }\n }\n return PortalModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Custom injector to be used when providing custom\n * injection tokens to components inside a portal.\n * @docs-private\n * @deprecated Use `Injector.create` instead.\n * @breaking-change 11.0.0\n */\nclass PortalInjector {\n constructor(_parentInjector, _customTokens) {\n this._parentInjector = _parentInjector;\n this._customTokens = _customTokens;\n }\n get(token, notFoundValue) {\n const value = this._customTokens.get(token);\n if (typeof value !== 'undefined') {\n return value;\n }\n return this._parentInjector.get(token, notFoundValue);\n }\n}\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { BasePortalHost, BasePortalOutlet, CdkPortal, CdkPortalOutlet, ComponentPortal, DomPortal, DomPortalHost, DomPortalOutlet, Portal, PortalHostDirective, PortalInjector, PortalModule, TemplatePortal, TemplatePortalDirective };\n","import { ConnectableObservable, isObservable, of, Subject } from 'rxjs';\nimport * as i0 from '@angular/core';\nimport { InjectionToken, Injectable } from '@angular/core';\nclass DataSource {}\n/** Checks whether an object is a data source. */\nfunction isDataSource(value) {\n // Check if the value is a DataSource by observing if it has a connect function. Cannot\n // be checked as an `instanceof DataSource` since people could create their own sources\n // that match the interface, but don't extend DataSource. We also can't use `isObservable`\n // here, because of some internal apps.\n return value && typeof value.connect === 'function' && !(value instanceof ConnectableObservable);\n}\n\n/** DataSource wrapper for a native array. */\nclass ArrayDataSource extends DataSource {\n constructor(_data) {\n super();\n this._data = _data;\n }\n connect() {\n return isObservable(this._data) ? this._data : of(this._data);\n }\n disconnect() {}\n}\n\n/** Indicates how a view was changed by a {@link _ViewRepeater}. */\nvar _ViewRepeaterOperation = /*#__PURE__*/function (_ViewRepeaterOperation) {\n /** The content of an existing view was replaced with another item. */\n _ViewRepeaterOperation[_ViewRepeaterOperation[\"REPLACED\"] = 0] = \"REPLACED\";\n /** A new view was created with `createEmbeddedView`. */\n _ViewRepeaterOperation[_ViewRepeaterOperation[\"INSERTED\"] = 1] = \"INSERTED\";\n /** The position of a view changed, but the content remains the same. */\n _ViewRepeaterOperation[_ViewRepeaterOperation[\"MOVED\"] = 2] = \"MOVED\";\n /** A view was detached from the view container. */\n _ViewRepeaterOperation[_ViewRepeaterOperation[\"REMOVED\"] = 3] = \"REMOVED\";\n return _ViewRepeaterOperation;\n}(_ViewRepeaterOperation || {});\n/**\n * Injection token for {@link _ViewRepeater}. This token is for use by Angular Material only.\n * @docs-private\n */\nconst _VIEW_REPEATER_STRATEGY = /*#__PURE__*/new InjectionToken('_ViewRepeater');\n\n/**\n * A repeater that destroys views when they are removed from a\n * {@link ViewContainerRef}. When new items are inserted into the container,\n * the repeater will always construct a new embedded view for each item.\n *\n * @template T The type for the embedded view's $implicit property.\n * @template R The type for the item in each IterableDiffer change record.\n * @template C The type for the context passed to each embedded view.\n */\nclass _DisposeViewRepeaterStrategy {\n applyChanges(changes, viewContainerRef, itemContextFactory, itemValueResolver, itemViewChanged) {\n changes.forEachOperation((record, adjustedPreviousIndex, currentIndex) => {\n let view;\n let operation;\n if (record.previousIndex == null) {\n const insertContext = itemContextFactory(record, adjustedPreviousIndex, currentIndex);\n view = viewContainerRef.createEmbeddedView(insertContext.templateRef, insertContext.context, insertContext.index);\n operation = _ViewRepeaterOperation.INSERTED;\n } else if (currentIndex == null) {\n viewContainerRef.remove(adjustedPreviousIndex);\n operation = _ViewRepeaterOperation.REMOVED;\n } else {\n view = viewContainerRef.get(adjustedPreviousIndex);\n viewContainerRef.move(view, currentIndex);\n operation = _ViewRepeaterOperation.MOVED;\n }\n if (itemViewChanged) {\n itemViewChanged({\n context: view?.context,\n operation,\n record\n });\n }\n });\n }\n detach() {}\n}\n\n/**\n * A repeater that caches views when they are removed from a\n * {@link ViewContainerRef}. When new items are inserted into the container,\n * the repeater will reuse one of the cached views instead of creating a new\n * embedded view. Recycling cached views reduces the quantity of expensive DOM\n * inserts.\n *\n * @template T The type for the embedded view's $implicit property.\n * @template R The type for the item in each IterableDiffer change record.\n * @template C The type for the context passed to each embedded view.\n */\nclass _RecycleViewRepeaterStrategy {\n constructor() {\n /**\n * The size of the cache used to store unused views.\n * Setting the cache size to `0` will disable caching. Defaults to 20 views.\n */\n this.viewCacheSize = 20;\n /**\n * View cache that stores embedded view instances that have been previously stamped out,\n * but don't are not currently rendered. The view repeater will reuse these views rather than\n * creating brand new ones.\n *\n * TODO(michaeljamesparsons) Investigate whether using a linked list would improve performance.\n */\n this._viewCache = [];\n }\n /** Apply changes to the DOM. */\n applyChanges(changes, viewContainerRef, itemContextFactory, itemValueResolver, itemViewChanged) {\n // Rearrange the views to put them in the right location.\n changes.forEachOperation((record, adjustedPreviousIndex, currentIndex) => {\n let view;\n let operation;\n if (record.previousIndex == null) {\n // Item added.\n const viewArgsFactory = () => itemContextFactory(record, adjustedPreviousIndex, currentIndex);\n view = this._insertView(viewArgsFactory, currentIndex, viewContainerRef, itemValueResolver(record));\n operation = view ? _ViewRepeaterOperation.INSERTED : _ViewRepeaterOperation.REPLACED;\n } else if (currentIndex == null) {\n // Item removed.\n this._detachAndCacheView(adjustedPreviousIndex, viewContainerRef);\n operation = _ViewRepeaterOperation.REMOVED;\n } else {\n // Item moved.\n view = this._moveView(adjustedPreviousIndex, currentIndex, viewContainerRef, itemValueResolver(record));\n operation = _ViewRepeaterOperation.MOVED;\n }\n if (itemViewChanged) {\n itemViewChanged({\n context: view?.context,\n operation,\n record\n });\n }\n });\n }\n detach() {\n for (const view of this._viewCache) {\n view.destroy();\n }\n this._viewCache = [];\n }\n /**\n * Inserts a view for a new item, either from the cache or by creating a new\n * one. Returns `undefined` if the item was inserted into a cached view.\n */\n _insertView(viewArgsFactory, currentIndex, viewContainerRef, value) {\n const cachedView = this._insertViewFromCache(currentIndex, viewContainerRef);\n if (cachedView) {\n cachedView.context.$implicit = value;\n return undefined;\n }\n const viewArgs = viewArgsFactory();\n return viewContainerRef.createEmbeddedView(viewArgs.templateRef, viewArgs.context, viewArgs.index);\n }\n /** Detaches the view at the given index and inserts into the view cache. */\n _detachAndCacheView(index, viewContainerRef) {\n const detachedView = viewContainerRef.detach(index);\n this._maybeCacheView(detachedView, viewContainerRef);\n }\n /** Moves view at the previous index to the current index. */\n _moveView(adjustedPreviousIndex, currentIndex, viewContainerRef, value) {\n const view = viewContainerRef.get(adjustedPreviousIndex);\n viewContainerRef.move(view, currentIndex);\n view.context.$implicit = value;\n return view;\n }\n /**\n * Cache the given detached view. If the cache is full, the view will be\n * destroyed.\n */\n _maybeCacheView(view, viewContainerRef) {\n if (this._viewCache.length < this.viewCacheSize) {\n this._viewCache.push(view);\n } else {\n const index = viewContainerRef.indexOf(view);\n // The host component could remove views from the container outside of\n // the view repeater. It's unlikely this will occur, but just in case,\n // destroy the view on its own, otherwise destroy it through the\n // container to ensure that all the references are removed.\n if (index === -1) {\n view.destroy();\n } else {\n viewContainerRef.remove(index);\n }\n }\n }\n /** Inserts a recycled view from the cache at the given index. */\n _insertViewFromCache(index, viewContainerRef) {\n const cachedView = this._viewCache.pop();\n if (cachedView) {\n viewContainerRef.insert(cachedView, index);\n }\n return cachedView || null;\n }\n}\n\n/**\n * Class to be used to power selecting one or more options from a list.\n */\nclass SelectionModel {\n /** Selected values. */\n get selected() {\n if (!this._selected) {\n this._selected = Array.from(this._selection.values());\n }\n return this._selected;\n }\n constructor(_multiple = false, initiallySelectedValues, _emitChanges = true, compareWith) {\n this._multiple = _multiple;\n this._emitChanges = _emitChanges;\n this.compareWith = compareWith;\n /** Currently-selected values. */\n this._selection = new Set();\n /** Keeps track of the deselected options that haven't been emitted by the change event. */\n this._deselectedToEmit = [];\n /** Keeps track of the selected options that haven't been emitted by the change event. */\n this._selectedToEmit = [];\n /** Event emitted when the value has changed. */\n this.changed = new Subject();\n if (initiallySelectedValues && initiallySelectedValues.length) {\n if (_multiple) {\n initiallySelectedValues.forEach(value => this._markSelected(value));\n } else {\n this._markSelected(initiallySelectedValues[0]);\n }\n // Clear the array in order to avoid firing the change event for preselected values.\n this._selectedToEmit.length = 0;\n }\n }\n /**\n * Selects a value or an array of values.\n * @param values The values to select\n * @return Whether the selection changed as a result of this call\n * @breaking-change 16.0.0 make return type boolean\n */\n select(...values) {\n this._verifyValueAssignment(values);\n values.forEach(value => this._markSelected(value));\n const changed = this._hasQueuedChanges();\n this._emitChangeEvent();\n return changed;\n }\n /**\n * Deselects a value or an array of values.\n * @param values The values to deselect\n * @return Whether the selection changed as a result of this call\n * @breaking-change 16.0.0 make return type boolean\n */\n deselect(...values) {\n this._verifyValueAssignment(values);\n values.forEach(value => this._unmarkSelected(value));\n const changed = this._hasQueuedChanges();\n this._emitChangeEvent();\n return changed;\n }\n /**\n * Sets the selected values\n * @param values The new selected values\n * @return Whether the selection changed as a result of this call\n * @breaking-change 16.0.0 make return type boolean\n */\n setSelection(...values) {\n this._verifyValueAssignment(values);\n const oldValues = this.selected;\n const newSelectedSet = new Set(values);\n values.forEach(value => this._markSelected(value));\n oldValues.filter(value => !newSelectedSet.has(this._getConcreteValue(value, newSelectedSet))).forEach(value => this._unmarkSelected(value));\n const changed = this._hasQueuedChanges();\n this._emitChangeEvent();\n return changed;\n }\n /**\n * Toggles a value between selected and deselected.\n * @param value The value to toggle\n * @return Whether the selection changed as a result of this call\n * @breaking-change 16.0.0 make return type boolean\n */\n toggle(value) {\n return this.isSelected(value) ? this.deselect(value) : this.select(value);\n }\n /**\n * Clears all of the selected values.\n * @param flushEvent Whether to flush the changes in an event.\n * If false, the changes to the selection will be flushed along with the next event.\n * @return Whether the selection changed as a result of this call\n * @breaking-change 16.0.0 make return type boolean\n */\n clear(flushEvent = true) {\n this._unmarkAll();\n const changed = this._hasQueuedChanges();\n if (flushEvent) {\n this._emitChangeEvent();\n }\n return changed;\n }\n /**\n * Determines whether a value is selected.\n */\n isSelected(value) {\n return this._selection.has(this._getConcreteValue(value));\n }\n /**\n * Determines whether the model does not have a value.\n */\n isEmpty() {\n return this._selection.size === 0;\n }\n /**\n * Determines whether the model has a value.\n */\n hasValue() {\n return !this.isEmpty();\n }\n /**\n * Sorts the selected values based on a predicate function.\n */\n sort(predicate) {\n if (this._multiple && this.selected) {\n this._selected.sort(predicate);\n }\n }\n /**\n * Gets whether multiple values can be selected.\n */\n isMultipleSelection() {\n return this._multiple;\n }\n /** Emits a change event and clears the records of selected and deselected values. */\n _emitChangeEvent() {\n // Clear the selected values so they can be re-cached.\n this._selected = null;\n if (this._selectedToEmit.length || this._deselectedToEmit.length) {\n this.changed.next({\n source: this,\n added: this._selectedToEmit,\n removed: this._deselectedToEmit\n });\n this._deselectedToEmit = [];\n this._selectedToEmit = [];\n }\n }\n /** Selects a value. */\n _markSelected(value) {\n value = this._getConcreteValue(value);\n if (!this.isSelected(value)) {\n if (!this._multiple) {\n this._unmarkAll();\n }\n if (!this.isSelected(value)) {\n this._selection.add(value);\n }\n if (this._emitChanges) {\n this._selectedToEmit.push(value);\n }\n }\n }\n /** Deselects a value. */\n _unmarkSelected(value) {\n value = this._getConcreteValue(value);\n if (this.isSelected(value)) {\n this._selection.delete(value);\n if (this._emitChanges) {\n this._deselectedToEmit.push(value);\n }\n }\n }\n /** Clears out the selected values. */\n _unmarkAll() {\n if (!this.isEmpty()) {\n this._selection.forEach(value => this._unmarkSelected(value));\n }\n }\n /**\n * Verifies the value assignment and throws an error if the specified value array is\n * including multiple values while the selection model is not supporting multiple values.\n */\n _verifyValueAssignment(values) {\n if (values.length > 1 && !this._multiple && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getMultipleValuesInSingleSelectionError();\n }\n }\n /** Whether there are queued up change to be emitted. */\n _hasQueuedChanges() {\n return !!(this._deselectedToEmit.length || this._selectedToEmit.length);\n }\n /** Returns a value that is comparable to inputValue by applying compareWith function, returns the same inputValue otherwise. */\n _getConcreteValue(inputValue, selection) {\n if (!this.compareWith) {\n return inputValue;\n } else {\n selection = selection ?? this._selection;\n for (let selectedValue of selection) {\n if (this.compareWith(inputValue, selectedValue)) {\n return selectedValue;\n }\n }\n return inputValue;\n }\n }\n}\n/**\n * Returns an error that reports that multiple values are passed into a selection model\n * with a single value.\n * @docs-private\n */\nfunction getMultipleValuesInSingleSelectionError() {\n return Error('Cannot pass multiple values into SelectionModel with single-value mode.');\n}\n\n/**\n * Class to coordinate unique selection based on name.\n * Intended to be consumed as an Angular service.\n * This service is needed because native radio change events are only fired on the item currently\n * being selected, and we still need to uncheck the previous selection.\n *\n * This service does not *store* any IDs and names because they may change at any time, so it is\n * less error-prone if they are simply passed through when the events occur.\n */\nlet UniqueSelectionDispatcher = /*#__PURE__*/(() => {\n class UniqueSelectionDispatcher {\n constructor() {\n this._listeners = [];\n }\n /**\n * Notify other items that selection for the given name has been set.\n * @param id ID of the item.\n * @param name Name of the item.\n */\n notify(id, name) {\n for (let listener of this._listeners) {\n listener(id, name);\n }\n }\n /**\n * Listen for future changes to item selection.\n * @return Function used to deregister listener\n */\n listen(listener) {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(registered => {\n return listener !== registered;\n });\n };\n }\n ngOnDestroy() {\n this._listeners = [];\n }\n static {\n this.ɵfac = function UniqueSelectionDispatcher_Factory(t) {\n return new (t || UniqueSelectionDispatcher)();\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: UniqueSelectionDispatcher,\n factory: UniqueSelectionDispatcher.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return UniqueSelectionDispatcher;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { ArrayDataSource, DataSource, SelectionModel, UniqueSelectionDispatcher, _DisposeViewRepeaterStrategy, _RecycleViewRepeaterStrategy, _VIEW_REPEATER_STRATEGY, _ViewRepeaterOperation, getMultipleValuesInSingleSelectionError, isDataSource };\n","import { coerceNumberProperty, coerceElement } from '@angular/cdk/coercion';\nimport * as i0 from '@angular/core';\nimport { InjectionToken, forwardRef, Directive, Input, Injectable, Optional, Inject, inject, Injector, afterNextRender, booleanAttribute, Component, ViewEncapsulation, ChangeDetectionStrategy, Output, ViewChild, SkipSelf, ElementRef, NgModule } from '@angular/core';\nimport { Subject, of, Observable, fromEvent, animationFrameScheduler, asapScheduler, Subscription, isObservable } from 'rxjs';\nimport { distinctUntilChanged, auditTime, filter, takeUntil, startWith, pairwise, switchMap, shareReplay } from 'rxjs/operators';\nimport * as i1 from '@angular/cdk/platform';\nimport { getRtlScrollAxisType, RtlScrollAxisType, supportsScrollBehavior, Platform } from '@angular/cdk/platform';\nimport { DOCUMENT } from '@angular/common';\nimport * as i2 from '@angular/cdk/bidi';\nimport { BidiModule } from '@angular/cdk/bidi';\nimport * as i2$1 from '@angular/cdk/collections';\nimport { isDataSource, ArrayDataSource, _VIEW_REPEATER_STRATEGY, _RecycleViewRepeaterStrategy } from '@angular/cdk/collections';\n\n/** The injection token used to specify the virtual scrolling strategy. */\nconst _c0 = [\"contentWrapper\"];\nconst _c1 = [\"*\"];\nconst VIRTUAL_SCROLL_STRATEGY = /*#__PURE__*/new InjectionToken('VIRTUAL_SCROLL_STRATEGY');\n\n/** Virtual scrolling strategy for lists with items of known fixed size. */\nclass FixedSizeVirtualScrollStrategy {\n /**\n * @param itemSize The size of the items in the virtually scrolling list.\n * @param minBufferPx The minimum amount of buffer (in pixels) before needing to render more\n * @param maxBufferPx The amount of buffer (in pixels) to render when rendering more.\n */\n constructor(itemSize, minBufferPx, maxBufferPx) {\n this._scrolledIndexChange = new Subject();\n /** @docs-private Implemented as part of VirtualScrollStrategy. */\n this.scrolledIndexChange = this._scrolledIndexChange.pipe(distinctUntilChanged());\n /** The attached viewport. */\n this._viewport = null;\n this._itemSize = itemSize;\n this._minBufferPx = minBufferPx;\n this._maxBufferPx = maxBufferPx;\n }\n /**\n * Attaches this scroll strategy to a viewport.\n * @param viewport The viewport to attach this strategy to.\n */\n attach(viewport) {\n this._viewport = viewport;\n this._updateTotalContentSize();\n this._updateRenderedRange();\n }\n /** Detaches this scroll strategy from the currently attached viewport. */\n detach() {\n this._scrolledIndexChange.complete();\n this._viewport = null;\n }\n /**\n * Update the item size and buffer size.\n * @param itemSize The size of the items in the virtually scrolling list.\n * @param minBufferPx The minimum amount of buffer (in pixels) before needing to render more\n * @param maxBufferPx The amount of buffer (in pixels) to render when rendering more.\n */\n updateItemAndBufferSize(itemSize, minBufferPx, maxBufferPx) {\n if (maxBufferPx < minBufferPx && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('CDK virtual scroll: maxBufferPx must be greater than or equal to minBufferPx');\n }\n this._itemSize = itemSize;\n this._minBufferPx = minBufferPx;\n this._maxBufferPx = maxBufferPx;\n this._updateTotalContentSize();\n this._updateRenderedRange();\n }\n /** @docs-private Implemented as part of VirtualScrollStrategy. */\n onContentScrolled() {\n this._updateRenderedRange();\n }\n /** @docs-private Implemented as part of VirtualScrollStrategy. */\n onDataLengthChanged() {\n this._updateTotalContentSize();\n this._updateRenderedRange();\n }\n /** @docs-private Implemented as part of VirtualScrollStrategy. */\n onContentRendered() {\n /* no-op */\n }\n /** @docs-private Implemented as part of VirtualScrollStrategy. */\n onRenderedOffsetChanged() {\n /* no-op */\n }\n /**\n * Scroll to the offset for the given index.\n * @param index The index of the element to scroll to.\n * @param behavior The ScrollBehavior to use when scrolling.\n */\n scrollToIndex(index, behavior) {\n if (this._viewport) {\n this._viewport.scrollToOffset(index * this._itemSize, behavior);\n }\n }\n /** Update the viewport's total content size. */\n _updateTotalContentSize() {\n if (!this._viewport) {\n return;\n }\n this._viewport.setTotalContentSize(this._viewport.getDataLength() * this._itemSize);\n }\n /** Update the viewport's rendered range. */\n _updateRenderedRange() {\n if (!this._viewport) {\n return;\n }\n const renderedRange = this._viewport.getRenderedRange();\n const newRange = {\n start: renderedRange.start,\n end: renderedRange.end\n };\n const viewportSize = this._viewport.getViewportSize();\n const dataLength = this._viewport.getDataLength();\n let scrollOffset = this._viewport.measureScrollOffset();\n // Prevent NaN as result when dividing by zero.\n let firstVisibleIndex = this._itemSize > 0 ? scrollOffset / this._itemSize : 0;\n // If user scrolls to the bottom of the list and data changes to a smaller list\n if (newRange.end > dataLength) {\n // We have to recalculate the first visible index based on new data length and viewport size.\n const maxVisibleItems = Math.ceil(viewportSize / this._itemSize);\n const newVisibleIndex = Math.max(0, Math.min(firstVisibleIndex, dataLength - maxVisibleItems));\n // If first visible index changed we must update scroll offset to handle start/end buffers\n // Current range must also be adjusted to cover the new position (bottom of new list).\n if (firstVisibleIndex != newVisibleIndex) {\n firstVisibleIndex = newVisibleIndex;\n scrollOffset = newVisibleIndex * this._itemSize;\n newRange.start = Math.floor(firstVisibleIndex);\n }\n newRange.end = Math.max(0, Math.min(dataLength, newRange.start + maxVisibleItems));\n }\n const startBuffer = scrollOffset - newRange.start * this._itemSize;\n if (startBuffer < this._minBufferPx && newRange.start != 0) {\n const expandStart = Math.ceil((this._maxBufferPx - startBuffer) / this._itemSize);\n newRange.start = Math.max(0, newRange.start - expandStart);\n newRange.end = Math.min(dataLength, Math.ceil(firstVisibleIndex + (viewportSize + this._minBufferPx) / this._itemSize));\n } else {\n const endBuffer = newRange.end * this._itemSize - (scrollOffset + viewportSize);\n if (endBuffer < this._minBufferPx && newRange.end != dataLength) {\n const expandEnd = Math.ceil((this._maxBufferPx - endBuffer) / this._itemSize);\n if (expandEnd > 0) {\n newRange.end = Math.min(dataLength, newRange.end + expandEnd);\n newRange.start = Math.max(0, Math.floor(firstVisibleIndex - this._minBufferPx / this._itemSize));\n }\n }\n }\n this._viewport.setRenderedRange(newRange);\n this._viewport.setRenderedContentOffset(this._itemSize * newRange.start);\n this._scrolledIndexChange.next(Math.floor(firstVisibleIndex));\n }\n}\n/**\n * Provider factory for `FixedSizeVirtualScrollStrategy` that simply extracts the already created\n * `FixedSizeVirtualScrollStrategy` from the given directive.\n * @param fixedSizeDir The instance of `CdkFixedSizeVirtualScroll` to extract the\n * `FixedSizeVirtualScrollStrategy` from.\n */\nfunction _fixedSizeVirtualScrollStrategyFactory(fixedSizeDir) {\n return fixedSizeDir._scrollStrategy;\n}\n/** A virtual scroll strategy that supports fixed-size items. */\nlet CdkFixedSizeVirtualScroll = /*#__PURE__*/(() => {\n class CdkFixedSizeVirtualScroll {\n constructor() {\n this._itemSize = 20;\n this._minBufferPx = 100;\n this._maxBufferPx = 200;\n /** The scroll strategy used by this directive. */\n this._scrollStrategy = new FixedSizeVirtualScrollStrategy(this.itemSize, this.minBufferPx, this.maxBufferPx);\n }\n /** The size of the items in the list (in pixels). */\n get itemSize() {\n return this._itemSize;\n }\n set itemSize(value) {\n this._itemSize = coerceNumberProperty(value);\n }\n /**\n * The minimum amount of buffer rendered beyond the viewport (in pixels).\n * If the amount of buffer dips below this number, more items will be rendered. Defaults to 100px.\n */\n get minBufferPx() {\n return this._minBufferPx;\n }\n set minBufferPx(value) {\n this._minBufferPx = coerceNumberProperty(value);\n }\n /**\n * The number of pixels worth of buffer to render for when rendering new items. Defaults to 200px.\n */\n get maxBufferPx() {\n return this._maxBufferPx;\n }\n set maxBufferPx(value) {\n this._maxBufferPx = coerceNumberProperty(value);\n }\n ngOnChanges() {\n this._scrollStrategy.updateItemAndBufferSize(this.itemSize, this.minBufferPx, this.maxBufferPx);\n }\n static {\n this.ɵfac = function CdkFixedSizeVirtualScroll_Factory(t) {\n return new (t || CdkFixedSizeVirtualScroll)();\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkFixedSizeVirtualScroll,\n selectors: [[\"cdk-virtual-scroll-viewport\", \"itemSize\", \"\"]],\n inputs: {\n itemSize: \"itemSize\",\n minBufferPx: \"minBufferPx\",\n maxBufferPx: \"maxBufferPx\"\n },\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: VIRTUAL_SCROLL_STRATEGY,\n useFactory: _fixedSizeVirtualScrollStrategyFactory,\n deps: [forwardRef(() => CdkFixedSizeVirtualScroll)]\n }]), i0.ɵɵNgOnChangesFeature]\n });\n }\n }\n return CdkFixedSizeVirtualScroll;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Time in ms to throttle the scrolling events by default. */\nconst DEFAULT_SCROLL_TIME = 20;\n/**\n * Service contained all registered Scrollable references and emits an event when any one of the\n * Scrollable references emit a scrolled event.\n */\nlet ScrollDispatcher = /*#__PURE__*/(() => {\n class ScrollDispatcher {\n constructor(_ngZone, _platform, document) {\n this._ngZone = _ngZone;\n this._platform = _platform;\n /** Subject for notifying that a registered scrollable reference element has been scrolled. */\n this._scrolled = new Subject();\n /** Keeps track of the global `scroll` and `resize` subscriptions. */\n this._globalSubscription = null;\n /** Keeps track of the amount of subscriptions to `scrolled`. Used for cleaning up afterwards. */\n this._scrolledCount = 0;\n /**\n * Map of all the scrollable references that are registered with the service and their\n * scroll event subscriptions.\n */\n this.scrollContainers = new Map();\n this._document = document;\n }\n /**\n * Registers a scrollable instance with the service and listens for its scrolled events. When the\n * scrollable is scrolled, the service emits the event to its scrolled observable.\n * @param scrollable Scrollable instance to be registered.\n */\n register(scrollable) {\n if (!this.scrollContainers.has(scrollable)) {\n this.scrollContainers.set(scrollable, scrollable.elementScrolled().subscribe(() => this._scrolled.next(scrollable)));\n }\n }\n /**\n * De-registers a Scrollable reference and unsubscribes from its scroll event observable.\n * @param scrollable Scrollable instance to be deregistered.\n */\n deregister(scrollable) {\n const scrollableReference = this.scrollContainers.get(scrollable);\n if (scrollableReference) {\n scrollableReference.unsubscribe();\n this.scrollContainers.delete(scrollable);\n }\n }\n /**\n * Returns an observable that emits an event whenever any of the registered Scrollable\n * references (or window, document, or body) fire a scrolled event. Can provide a time in ms\n * to override the default \"throttle\" time.\n *\n * **Note:** in order to avoid hitting change detection for every scroll event,\n * all of the events emitted from this stream will be run outside the Angular zone.\n * If you need to update any data bindings as a result of a scroll event, you have\n * to run the callback using `NgZone.run`.\n */\n scrolled(auditTimeInMs = DEFAULT_SCROLL_TIME) {\n if (!this._platform.isBrowser) {\n return of();\n }\n return new Observable(observer => {\n if (!this._globalSubscription) {\n this._addGlobalListener();\n }\n // In the case of a 0ms delay, use an observable without auditTime\n // since it does add a perceptible delay in processing overhead.\n const subscription = auditTimeInMs > 0 ? this._scrolled.pipe(auditTime(auditTimeInMs)).subscribe(observer) : this._scrolled.subscribe(observer);\n this._scrolledCount++;\n return () => {\n subscription.unsubscribe();\n this._scrolledCount--;\n if (!this._scrolledCount) {\n this._removeGlobalListener();\n }\n };\n });\n }\n ngOnDestroy() {\n this._removeGlobalListener();\n this.scrollContainers.forEach((_, container) => this.deregister(container));\n this._scrolled.complete();\n }\n /**\n * Returns an observable that emits whenever any of the\n * scrollable ancestors of an element are scrolled.\n * @param elementOrElementRef Element whose ancestors to listen for.\n * @param auditTimeInMs Time to throttle the scroll events.\n */\n ancestorScrolled(elementOrElementRef, auditTimeInMs) {\n const ancestors = this.getAncestorScrollContainers(elementOrElementRef);\n return this.scrolled(auditTimeInMs).pipe(filter(target => {\n return !target || ancestors.indexOf(target) > -1;\n }));\n }\n /** Returns all registered Scrollables that contain the provided element. */\n getAncestorScrollContainers(elementOrElementRef) {\n const scrollingContainers = [];\n this.scrollContainers.forEach((_subscription, scrollable) => {\n if (this._scrollableContainsElement(scrollable, elementOrElementRef)) {\n scrollingContainers.push(scrollable);\n }\n });\n return scrollingContainers;\n }\n /** Use defaultView of injected document if available or fallback to global window reference */\n _getWindow() {\n return this._document.defaultView || window;\n }\n /** Returns true if the element is contained within the provided Scrollable. */\n _scrollableContainsElement(scrollable, elementOrElementRef) {\n let element = coerceElement(elementOrElementRef);\n let scrollableElement = scrollable.getElementRef().nativeElement;\n // Traverse through the element parents until we reach null, checking if any of the elements\n // are the scrollable's element.\n do {\n if (element == scrollableElement) {\n return true;\n }\n } while (element = element.parentElement);\n return false;\n }\n /** Sets up the global scroll listeners. */\n _addGlobalListener() {\n this._globalSubscription = this._ngZone.runOutsideAngular(() => {\n const window = this._getWindow();\n return fromEvent(window.document, 'scroll').subscribe(() => this._scrolled.next());\n });\n }\n /** Cleans up the global scroll listener. */\n _removeGlobalListener() {\n if (this._globalSubscription) {\n this._globalSubscription.unsubscribe();\n this._globalSubscription = null;\n }\n }\n static {\n this.ɵfac = function ScrollDispatcher_Factory(t) {\n return new (t || ScrollDispatcher)(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i1.Platform), i0.ɵɵinject(DOCUMENT, 8));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: ScrollDispatcher,\n factory: ScrollDispatcher.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return ScrollDispatcher;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Sends an event when the directive's element is scrolled. Registers itself with the\n * ScrollDispatcher service to include itself as part of its collection of scrolling events that it\n * can be listened to through the service.\n */\nlet CdkScrollable = /*#__PURE__*/(() => {\n class CdkScrollable {\n constructor(elementRef, scrollDispatcher, ngZone, dir) {\n this.elementRef = elementRef;\n this.scrollDispatcher = scrollDispatcher;\n this.ngZone = ngZone;\n this.dir = dir;\n this._destroyed = new Subject();\n this._elementScrolled = new Observable(observer => this.ngZone.runOutsideAngular(() => fromEvent(this.elementRef.nativeElement, 'scroll').pipe(takeUntil(this._destroyed)).subscribe(observer)));\n }\n ngOnInit() {\n this.scrollDispatcher.register(this);\n }\n ngOnDestroy() {\n this.scrollDispatcher.deregister(this);\n this._destroyed.next();\n this._destroyed.complete();\n }\n /** Returns observable that emits when a scroll event is fired on the host element. */\n elementScrolled() {\n return this._elementScrolled;\n }\n /** Gets the ElementRef for the viewport. */\n getElementRef() {\n return this.elementRef;\n }\n /**\n * Scrolls to the specified offsets. This is a normalized version of the browser's native scrollTo\n * method, since browsers are not consistent about what scrollLeft means in RTL. For this method\n * left and right always refer to the left and right side of the scrolling container irrespective\n * of the layout direction. start and end refer to left and right in an LTR context and vice-versa\n * in an RTL context.\n * @param options specified the offsets to scroll to.\n */\n scrollTo(options) {\n const el = this.elementRef.nativeElement;\n const isRtl = this.dir && this.dir.value == 'rtl';\n // Rewrite start & end offsets as right or left offsets.\n if (options.left == null) {\n options.left = isRtl ? options.end : options.start;\n }\n if (options.right == null) {\n options.right = isRtl ? options.start : options.end;\n }\n // Rewrite the bottom offset as a top offset.\n if (options.bottom != null) {\n options.top = el.scrollHeight - el.clientHeight - options.bottom;\n }\n // Rewrite the right offset as a left offset.\n if (isRtl && getRtlScrollAxisType() != RtlScrollAxisType.NORMAL) {\n if (options.left != null) {\n options.right = el.scrollWidth - el.clientWidth - options.left;\n }\n if (getRtlScrollAxisType() == RtlScrollAxisType.INVERTED) {\n options.left = options.right;\n } else if (getRtlScrollAxisType() == RtlScrollAxisType.NEGATED) {\n options.left = options.right ? -options.right : options.right;\n }\n } else {\n if (options.right != null) {\n options.left = el.scrollWidth - el.clientWidth - options.right;\n }\n }\n this._applyScrollToOptions(options);\n }\n _applyScrollToOptions(options) {\n const el = this.elementRef.nativeElement;\n if (supportsScrollBehavior()) {\n el.scrollTo(options);\n } else {\n if (options.top != null) {\n el.scrollTop = options.top;\n }\n if (options.left != null) {\n el.scrollLeft = options.left;\n }\n }\n }\n /**\n * Measures the scroll offset relative to the specified edge of the viewport. This method can be\n * used instead of directly checking scrollLeft or scrollTop, since browsers are not consistent\n * about what scrollLeft means in RTL. The values returned by this method are normalized such that\n * left and right always refer to the left and right side of the scrolling container irrespective\n * of the layout direction. start and end refer to left and right in an LTR context and vice-versa\n * in an RTL context.\n * @param from The edge to measure from.\n */\n measureScrollOffset(from) {\n const LEFT = 'left';\n const RIGHT = 'right';\n const el = this.elementRef.nativeElement;\n if (from == 'top') {\n return el.scrollTop;\n }\n if (from == 'bottom') {\n return el.scrollHeight - el.clientHeight - el.scrollTop;\n }\n // Rewrite start & end as left or right offsets.\n const isRtl = this.dir && this.dir.value == 'rtl';\n if (from == 'start') {\n from = isRtl ? RIGHT : LEFT;\n } else if (from == 'end') {\n from = isRtl ? LEFT : RIGHT;\n }\n if (isRtl && getRtlScrollAxisType() == RtlScrollAxisType.INVERTED) {\n // For INVERTED, scrollLeft is (scrollWidth - clientWidth) when scrolled all the way left and\n // 0 when scrolled all the way right.\n if (from == LEFT) {\n return el.scrollWidth - el.clientWidth - el.scrollLeft;\n } else {\n return el.scrollLeft;\n }\n } else if (isRtl && getRtlScrollAxisType() == RtlScrollAxisType.NEGATED) {\n // For NEGATED, scrollLeft is -(scrollWidth - clientWidth) when scrolled all the way left and\n // 0 when scrolled all the way right.\n if (from == LEFT) {\n return el.scrollLeft + el.scrollWidth - el.clientWidth;\n } else {\n return -el.scrollLeft;\n }\n } else {\n // For NORMAL, as well as non-RTL contexts, scrollLeft is 0 when scrolled all the way left and\n // (scrollWidth - clientWidth) when scrolled all the way right.\n if (from == LEFT) {\n return el.scrollLeft;\n } else {\n return el.scrollWidth - el.clientWidth - el.scrollLeft;\n }\n }\n }\n static {\n this.ɵfac = function CdkScrollable_Factory(t) {\n return new (t || CdkScrollable)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(ScrollDispatcher), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i2.Directionality, 8));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkScrollable,\n selectors: [[\"\", \"cdk-scrollable\", \"\"], [\"\", \"cdkScrollable\", \"\"]],\n standalone: true\n });\n }\n }\n return CdkScrollable;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Time in ms to throttle the resize events by default. */\nconst DEFAULT_RESIZE_TIME = 20;\n/**\n * Simple utility for getting the bounds of the browser viewport.\n * @docs-private\n */\nlet ViewportRuler = /*#__PURE__*/(() => {\n class ViewportRuler {\n constructor(_platform, ngZone, document) {\n this._platform = _platform;\n /** Stream of viewport change events. */\n this._change = new Subject();\n /** Event listener that will be used to handle the viewport change events. */\n this._changeListener = event => {\n this._change.next(event);\n };\n this._document = document;\n ngZone.runOutsideAngular(() => {\n if (_platform.isBrowser) {\n const window = this._getWindow();\n // Note that bind the events ourselves, rather than going through something like RxJS's\n // `fromEvent` so that we can ensure that they're bound outside of the NgZone.\n window.addEventListener('resize', this._changeListener);\n window.addEventListener('orientationchange', this._changeListener);\n }\n // Clear the cached position so that the viewport is re-measured next time it is required.\n // We don't need to keep track of the subscription, because it is completed on destroy.\n this.change().subscribe(() => this._viewportSize = null);\n });\n }\n ngOnDestroy() {\n if (this._platform.isBrowser) {\n const window = this._getWindow();\n window.removeEventListener('resize', this._changeListener);\n window.removeEventListener('orientationchange', this._changeListener);\n }\n this._change.complete();\n }\n /** Returns the viewport's width and height. */\n getViewportSize() {\n if (!this._viewportSize) {\n this._updateViewportSize();\n }\n const output = {\n width: this._viewportSize.width,\n height: this._viewportSize.height\n };\n // If we're not on a browser, don't cache the size since it'll be mocked out anyway.\n if (!this._platform.isBrowser) {\n this._viewportSize = null;\n }\n return output;\n }\n /** Gets a DOMRect for the viewport's bounds. */\n getViewportRect() {\n // Use the document element's bounding rect rather than the window scroll properties\n // (e.g. pageYOffset, scrollY) due to in issue in Chrome and IE where window scroll\n // properties and client coordinates (boundingClientRect, clientX/Y, etc.) are in different\n // conceptual viewports. Under most circumstances these viewports are equivalent, but they\n // can disagree when the page is pinch-zoomed (on devices that support touch).\n // See https://bugs.chromium.org/p/chromium/issues/detail?id=489206#c4\n // We use the documentElement instead of the body because, by default (without a css reset)\n // browsers typically give the document body an 8px margin, which is not included in\n // getBoundingClientRect().\n const scrollPosition = this.getViewportScrollPosition();\n const {\n width,\n height\n } = this.getViewportSize();\n return {\n top: scrollPosition.top,\n left: scrollPosition.left,\n bottom: scrollPosition.top + height,\n right: scrollPosition.left + width,\n height,\n width\n };\n }\n /** Gets the (top, left) scroll position of the viewport. */\n getViewportScrollPosition() {\n // While we can get a reference to the fake document\n // during SSR, it doesn't have getBoundingClientRect.\n if (!this._platform.isBrowser) {\n return {\n top: 0,\n left: 0\n };\n }\n // The top-left-corner of the viewport is determined by the scroll position of the document\n // body, normally just (scrollLeft, scrollTop). However, Chrome and Firefox disagree about\n // whether `document.body` or `document.documentElement` is the scrolled element, so reading\n // `scrollTop` and `scrollLeft` is inconsistent. However, using the bounding rect of\n // `document.documentElement` works consistently, where the `top` and `left` values will\n // equal negative the scroll position.\n const document = this._document;\n const window = this._getWindow();\n const documentElement = document.documentElement;\n const documentRect = documentElement.getBoundingClientRect();\n const top = -documentRect.top || document.body.scrollTop || window.scrollY || documentElement.scrollTop || 0;\n const left = -documentRect.left || document.body.scrollLeft || window.scrollX || documentElement.scrollLeft || 0;\n return {\n top,\n left\n };\n }\n /**\n * Returns a stream that emits whenever the size of the viewport changes.\n * This stream emits outside of the Angular zone.\n * @param throttleTime Time in milliseconds to throttle the stream.\n */\n change(throttleTime = DEFAULT_RESIZE_TIME) {\n return throttleTime > 0 ? this._change.pipe(auditTime(throttleTime)) : this._change;\n }\n /** Use defaultView of injected document if available or fallback to global window reference */\n _getWindow() {\n return this._document.defaultView || window;\n }\n /** Updates the cached viewport size. */\n _updateViewportSize() {\n const window = this._getWindow();\n this._viewportSize = this._platform.isBrowser ? {\n width: window.innerWidth,\n height: window.innerHeight\n } : {\n width: 0,\n height: 0\n };\n }\n static {\n this.ɵfac = function ViewportRuler_Factory(t) {\n return new (t || ViewportRuler)(i0.ɵɵinject(i1.Platform), i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(DOCUMENT, 8));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: ViewportRuler,\n factory: ViewportRuler.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return ViewportRuler;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst VIRTUAL_SCROLLABLE = /*#__PURE__*/new InjectionToken('VIRTUAL_SCROLLABLE');\n/**\n * Extending the {@link CdkScrollable} to be used as scrolling container for virtual scrolling.\n */\nlet CdkVirtualScrollable = /*#__PURE__*/(() => {\n class CdkVirtualScrollable extends CdkScrollable {\n constructor(elementRef, scrollDispatcher, ngZone, dir) {\n super(elementRef, scrollDispatcher, ngZone, dir);\n }\n /**\n * Measure the viewport size for the provided orientation.\n *\n * @param orientation The orientation to measure the size from.\n */\n measureViewportSize(orientation) {\n const viewportEl = this.elementRef.nativeElement;\n return orientation === 'horizontal' ? viewportEl.clientWidth : viewportEl.clientHeight;\n }\n static {\n this.ɵfac = function CdkVirtualScrollable_Factory(t) {\n return new (t || CdkVirtualScrollable)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(ScrollDispatcher), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i2.Directionality, 8));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkVirtualScrollable,\n features: [i0.ɵɵInheritDefinitionFeature]\n });\n }\n }\n return CdkVirtualScrollable;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Checks if the given ranges are equal. */\nfunction rangesEqual(r1, r2) {\n return r1.start == r2.start && r1.end == r2.end;\n}\n/**\n * Scheduler to be used for scroll events. Needs to fall back to\n * something that doesn't rely on requestAnimationFrame on environments\n * that don't support it (e.g. server-side rendering).\n */\nconst SCROLL_SCHEDULER = typeof requestAnimationFrame !== 'undefined' ? animationFrameScheduler : asapScheduler;\n/** A viewport that virtualizes its scrolling with the help of `CdkVirtualForOf`. */\nlet CdkVirtualScrollViewport = /*#__PURE__*/(() => {\n class CdkVirtualScrollViewport extends CdkVirtualScrollable {\n /** The direction the viewport scrolls. */\n get orientation() {\n return this._orientation;\n }\n set orientation(orientation) {\n if (this._orientation !== orientation) {\n this._orientation = orientation;\n this._calculateSpacerSize();\n }\n }\n constructor(elementRef, _changeDetectorRef, ngZone, _scrollStrategy, dir, scrollDispatcher, viewportRuler, scrollable) {\n super(elementRef, scrollDispatcher, ngZone, dir);\n this.elementRef = elementRef;\n this._changeDetectorRef = _changeDetectorRef;\n this._scrollStrategy = _scrollStrategy;\n this.scrollable = scrollable;\n this._platform = inject(Platform);\n /** Emits when the viewport is detached from a CdkVirtualForOf. */\n this._detachedSubject = new Subject();\n /** Emits when the rendered range changes. */\n this._renderedRangeSubject = new Subject();\n this._orientation = 'vertical';\n /**\n * Whether rendered items should persist in the DOM after scrolling out of view. By default, items\n * will be removed.\n */\n this.appendOnly = false;\n // Note: we don't use the typical EventEmitter here because we need to subscribe to the scroll\n // strategy lazily (i.e. only if the user is actually listening to the events). We do this because\n // depending on how the strategy calculates the scrolled index, it may come at a cost to\n // performance.\n /** Emits when the index of the first element visible in the viewport changes. */\n this.scrolledIndexChange = new Observable(observer => this._scrollStrategy.scrolledIndexChange.subscribe(index => Promise.resolve().then(() => this.ngZone.run(() => observer.next(index)))));\n /** A stream that emits whenever the rendered range changes. */\n this.renderedRangeStream = this._renderedRangeSubject;\n /**\n * The total size of all content (in pixels), including content that is not currently rendered.\n */\n this._totalContentSize = 0;\n /** A string representing the `style.width` property value to be used for the spacer element. */\n this._totalContentWidth = '';\n /** A string representing the `style.height` property value to be used for the spacer element. */\n this._totalContentHeight = '';\n /** The currently rendered range of indices. */\n this._renderedRange = {\n start: 0,\n end: 0\n };\n /** The length of the data bound to this viewport (in number of items). */\n this._dataLength = 0;\n /** The size of the viewport (in pixels). */\n this._viewportSize = 0;\n /** The last rendered content offset that was set. */\n this._renderedContentOffset = 0;\n /**\n * Whether the last rendered content offset was to the end of the content (and therefore needs to\n * be rewritten as an offset to the start of the content).\n */\n this._renderedContentOffsetNeedsRewrite = false;\n /** Whether there is a pending change detection cycle. */\n this._isChangeDetectionPending = false;\n /** A list of functions to run after the next change detection cycle. */\n this._runAfterChangeDetection = [];\n /** Subscription to changes in the viewport size. */\n this._viewportChanges = Subscription.EMPTY;\n this._injector = inject(Injector);\n this._isDestroyed = false;\n if (!_scrollStrategy && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('Error: cdk-virtual-scroll-viewport requires the \"itemSize\" property to be set.');\n }\n this._viewportChanges = viewportRuler.change().subscribe(() => {\n this.checkViewportSize();\n });\n if (!this.scrollable) {\n // No scrollable is provided, so the virtual-scroll-viewport needs to become a scrollable\n this.elementRef.nativeElement.classList.add('cdk-virtual-scrollable');\n this.scrollable = this;\n }\n }\n ngOnInit() {\n // Scrolling depends on the element dimensions which we can't get during SSR.\n if (!this._platform.isBrowser) {\n return;\n }\n if (this.scrollable === this) {\n super.ngOnInit();\n }\n // It's still too early to measure the viewport at this point. Deferring with a promise allows\n // the Viewport to be rendered with the correct size before we measure. We run this outside the\n // zone to avoid causing more change detection cycles. We handle the change detection loop\n // ourselves instead.\n this.ngZone.runOutsideAngular(() => Promise.resolve().then(() => {\n this._measureViewportSize();\n this._scrollStrategy.attach(this);\n this.scrollable.elementScrolled().pipe(\n // Start off with a fake scroll event so we properly detect our initial position.\n startWith(null),\n // Collect multiple events into one until the next animation frame. This way if\n // there are multiple scroll events in the same frame we only need to recheck\n // our layout once.\n auditTime(0, SCROLL_SCHEDULER),\n // Usually `elementScrolled` is completed when the scrollable is destroyed, but\n // that may not be the case if a `CdkVirtualScrollableElement` is used so we have\n // to unsubscribe here just in case.\n takeUntil(this._destroyed)).subscribe(() => this._scrollStrategy.onContentScrolled());\n this._markChangeDetectionNeeded();\n }));\n }\n ngOnDestroy() {\n this.detach();\n this._scrollStrategy.detach();\n // Complete all subjects\n this._renderedRangeSubject.complete();\n this._detachedSubject.complete();\n this._viewportChanges.unsubscribe();\n this._isDestroyed = true;\n super.ngOnDestroy();\n }\n /** Attaches a `CdkVirtualScrollRepeater` to this viewport. */\n attach(forOf) {\n if (this._forOf && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('CdkVirtualScrollViewport is already attached.');\n }\n // Subscribe to the data stream of the CdkVirtualForOf to keep track of when the data length\n // changes. Run outside the zone to avoid triggering change detection, since we're managing the\n // change detection loop ourselves.\n this.ngZone.runOutsideAngular(() => {\n this._forOf = forOf;\n this._forOf.dataStream.pipe(takeUntil(this._detachedSubject)).subscribe(data => {\n const newLength = data.length;\n if (newLength !== this._dataLength) {\n this._dataLength = newLength;\n this._scrollStrategy.onDataLengthChanged();\n }\n this._doChangeDetection();\n });\n });\n }\n /** Detaches the current `CdkVirtualForOf`. */\n detach() {\n this._forOf = null;\n this._detachedSubject.next();\n }\n /** Gets the length of the data bound to this viewport (in number of items). */\n getDataLength() {\n return this._dataLength;\n }\n /** Gets the size of the viewport (in pixels). */\n getViewportSize() {\n return this._viewportSize;\n }\n // TODO(mmalerba): This is technically out of sync with what's really rendered until a render\n // cycle happens. I'm being careful to only call it after the render cycle is complete and before\n // setting it to something else, but its error prone and should probably be split into\n // `pendingRange` and `renderedRange`, the latter reflecting whats actually in the DOM.\n /** Get the current rendered range of items. */\n getRenderedRange() {\n return this._renderedRange;\n }\n measureBoundingClientRectWithScrollOffset(from) {\n return this.getElementRef().nativeElement.getBoundingClientRect()[from];\n }\n /**\n * Sets the total size of all content (in pixels), including content that is not currently\n * rendered.\n */\n setTotalContentSize(size) {\n if (this._totalContentSize !== size) {\n this._totalContentSize = size;\n this._calculateSpacerSize();\n this._markChangeDetectionNeeded();\n }\n }\n /** Sets the currently rendered range of indices. */\n setRenderedRange(range) {\n if (!rangesEqual(this._renderedRange, range)) {\n if (this.appendOnly) {\n range = {\n start: 0,\n end: Math.max(this._renderedRange.end, range.end)\n };\n }\n this._renderedRangeSubject.next(this._renderedRange = range);\n this._markChangeDetectionNeeded(() => this._scrollStrategy.onContentRendered());\n }\n }\n /**\n * Gets the offset from the start of the viewport to the start of the rendered data (in pixels).\n */\n getOffsetToRenderedContentStart() {\n return this._renderedContentOffsetNeedsRewrite ? null : this._renderedContentOffset;\n }\n /**\n * Sets the offset from the start of the viewport to either the start or end of the rendered data\n * (in pixels).\n */\n setRenderedContentOffset(offset, to = 'to-start') {\n // In appendOnly, we always start from the top\n offset = this.appendOnly && to === 'to-start' ? 0 : offset;\n // For a horizontal viewport in a right-to-left language we need to translate along the x-axis\n // in the negative direction.\n const isRtl = this.dir && this.dir.value == 'rtl';\n const isHorizontal = this.orientation == 'horizontal';\n const axis = isHorizontal ? 'X' : 'Y';\n const axisDirection = isHorizontal && isRtl ? -1 : 1;\n let transform = `translate${axis}(${Number(axisDirection * offset)}px)`;\n this._renderedContentOffset = offset;\n if (to === 'to-end') {\n transform += ` translate${axis}(-100%)`;\n // The viewport should rewrite this as a `to-start` offset on the next render cycle. Otherwise\n // elements will appear to expand in the wrong direction (e.g. `mat-expansion-panel` would\n // expand upward).\n this._renderedContentOffsetNeedsRewrite = true;\n }\n if (this._renderedContentTransform != transform) {\n // We know this value is safe because we parse `offset` with `Number()` before passing it\n // into the string.\n this._renderedContentTransform = transform;\n this._markChangeDetectionNeeded(() => {\n if (this._renderedContentOffsetNeedsRewrite) {\n this._renderedContentOffset -= this.measureRenderedContentSize();\n this._renderedContentOffsetNeedsRewrite = false;\n this.setRenderedContentOffset(this._renderedContentOffset);\n } else {\n this._scrollStrategy.onRenderedOffsetChanged();\n }\n });\n }\n }\n /**\n * Scrolls to the given offset from the start of the viewport. Please note that this is not always\n * the same as setting `scrollTop` or `scrollLeft`. In a horizontal viewport with right-to-left\n * direction, this would be the equivalent of setting a fictional `scrollRight` property.\n * @param offset The offset to scroll to.\n * @param behavior The ScrollBehavior to use when scrolling. Default is behavior is `auto`.\n */\n scrollToOffset(offset, behavior = 'auto') {\n const options = {\n behavior\n };\n if (this.orientation === 'horizontal') {\n options.start = offset;\n } else {\n options.top = offset;\n }\n this.scrollable.scrollTo(options);\n }\n /**\n * Scrolls to the offset for the given index.\n * @param index The index of the element to scroll to.\n * @param behavior The ScrollBehavior to use when scrolling. Default is behavior is `auto`.\n */\n scrollToIndex(index, behavior = 'auto') {\n this._scrollStrategy.scrollToIndex(index, behavior);\n }\n /**\n * Gets the current scroll offset from the start of the scrollable (in pixels).\n * @param from The edge to measure the offset from. Defaults to 'top' in vertical mode and 'start'\n * in horizontal mode.\n */\n measureScrollOffset(from) {\n // This is to break the call cycle\n let measureScrollOffset;\n if (this.scrollable == this) {\n measureScrollOffset = _from => super.measureScrollOffset(_from);\n } else {\n measureScrollOffset = _from => this.scrollable.measureScrollOffset(_from);\n }\n return Math.max(0, measureScrollOffset(from ?? (this.orientation === 'horizontal' ? 'start' : 'top')) - this.measureViewportOffset());\n }\n /**\n * Measures the offset of the viewport from the scrolling container\n * @param from The edge to measure from.\n */\n measureViewportOffset(from) {\n let fromRect;\n const LEFT = 'left';\n const RIGHT = 'right';\n const isRtl = this.dir?.value == 'rtl';\n if (from == 'start') {\n fromRect = isRtl ? RIGHT : LEFT;\n } else if (from == 'end') {\n fromRect = isRtl ? LEFT : RIGHT;\n } else if (from) {\n fromRect = from;\n } else {\n fromRect = this.orientation === 'horizontal' ? 'left' : 'top';\n }\n const scrollerClientRect = this.scrollable.measureBoundingClientRectWithScrollOffset(fromRect);\n const viewportClientRect = this.elementRef.nativeElement.getBoundingClientRect()[fromRect];\n return viewportClientRect - scrollerClientRect;\n }\n /** Measure the combined size of all of the rendered items. */\n measureRenderedContentSize() {\n const contentEl = this._contentWrapper.nativeElement;\n return this.orientation === 'horizontal' ? contentEl.offsetWidth : contentEl.offsetHeight;\n }\n /**\n * Measure the total combined size of the given range. Throws if the range includes items that are\n * not rendered.\n */\n measureRangeSize(range) {\n if (!this._forOf) {\n return 0;\n }\n return this._forOf.measureRangeSize(range, this.orientation);\n }\n /** Update the viewport dimensions and re-render. */\n checkViewportSize() {\n // TODO: Cleanup later when add logic for handling content resize\n this._measureViewportSize();\n this._scrollStrategy.onDataLengthChanged();\n }\n /** Measure the viewport size. */\n _measureViewportSize() {\n this._viewportSize = this.scrollable.measureViewportSize(this.orientation);\n }\n /** Queue up change detection to run. */\n _markChangeDetectionNeeded(runAfter) {\n if (runAfter) {\n this._runAfterChangeDetection.push(runAfter);\n }\n // Use a Promise to batch together calls to `_doChangeDetection`. This way if we set a bunch of\n // properties sequentially we only have to run `_doChangeDetection` once at the end.\n if (!this._isChangeDetectionPending) {\n this._isChangeDetectionPending = true;\n this.ngZone.runOutsideAngular(() => Promise.resolve().then(() => {\n this._doChangeDetection();\n }));\n }\n }\n /** Run change detection. */\n _doChangeDetection() {\n if (this._isDestroyed) {\n return;\n }\n this.ngZone.run(() => {\n // Apply changes to Angular bindings. Note: We must call `markForCheck` to run change detection\n // from the root, since the repeated items are content projected in. Calling `detectChanges`\n // instead does not properly check the projected content.\n this._changeDetectorRef.markForCheck();\n // Apply the content transform. The transform can't be set via an Angular binding because\n // bypassSecurityTrustStyle is banned in Google. However the value is safe, it's composed of\n // string literals, a variable that can only be 'X' or 'Y', and user input that is run through\n // the `Number` function first to coerce it to a numeric value.\n this._contentWrapper.nativeElement.style.transform = this._renderedContentTransform;\n afterNextRender(() => {\n this._isChangeDetectionPending = false;\n const runAfterChangeDetection = this._runAfterChangeDetection;\n this._runAfterChangeDetection = [];\n for (const fn of runAfterChangeDetection) {\n fn();\n }\n }, {\n injector: this._injector\n });\n });\n }\n /** Calculates the `style.width` and `style.height` for the spacer element. */\n _calculateSpacerSize() {\n this._totalContentHeight = this.orientation === 'horizontal' ? '' : `${this._totalContentSize}px`;\n this._totalContentWidth = this.orientation === 'horizontal' ? `${this._totalContentSize}px` : '';\n }\n static {\n this.ɵfac = function CdkVirtualScrollViewport_Factory(t) {\n return new (t || CdkVirtualScrollViewport)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(VIRTUAL_SCROLL_STRATEGY, 8), i0.ɵɵdirectiveInject(i2.Directionality, 8), i0.ɵɵdirectiveInject(ScrollDispatcher), i0.ɵɵdirectiveInject(ViewportRuler), i0.ɵɵdirectiveInject(VIRTUAL_SCROLLABLE, 8));\n };\n }\n static {\n this.ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: CdkVirtualScrollViewport,\n selectors: [[\"cdk-virtual-scroll-viewport\"]],\n viewQuery: function CdkVirtualScrollViewport_Query(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵviewQuery(_c0, 7);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._contentWrapper = _t.first);\n }\n },\n hostAttrs: [1, \"cdk-virtual-scroll-viewport\"],\n hostVars: 4,\n hostBindings: function CdkVirtualScrollViewport_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵclassProp(\"cdk-virtual-scroll-orientation-horizontal\", ctx.orientation === \"horizontal\")(\"cdk-virtual-scroll-orientation-vertical\", ctx.orientation !== \"horizontal\");\n }\n },\n inputs: {\n orientation: \"orientation\",\n appendOnly: [2, \"appendOnly\", \"appendOnly\", booleanAttribute]\n },\n outputs: {\n scrolledIndexChange: \"scrolledIndexChange\"\n },\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: CdkScrollable,\n useFactory: (virtualScrollable, viewport) => virtualScrollable || viewport,\n deps: [[new Optional(), new Inject(VIRTUAL_SCROLLABLE)], CdkVirtualScrollViewport]\n }]), i0.ɵɵInputTransformsFeature, i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature],\n ngContentSelectors: _c1,\n decls: 4,\n vars: 4,\n consts: [[\"contentWrapper\", \"\"], [1, \"cdk-virtual-scroll-content-wrapper\"], [1, \"cdk-virtual-scroll-spacer\"]],\n template: function CdkVirtualScrollViewport_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵprojectionDef();\n i0.ɵɵelementStart(0, \"div\", 1, 0);\n i0.ɵɵprojection(2);\n i0.ɵɵelementEnd();\n i0.ɵɵelement(3, \"div\", 2);\n }\n if (rf & 2) {\n i0.ɵɵadvance(3);\n i0.ɵɵstyleProp(\"width\", ctx._totalContentWidth)(\"height\", ctx._totalContentHeight);\n }\n },\n styles: [\"cdk-virtual-scroll-viewport{display:block;position:relative;transform:translateZ(0)}.cdk-virtual-scrollable{overflow:auto;will-change:scroll-position;contain:strict;-webkit-overflow-scrolling:touch}.cdk-virtual-scroll-content-wrapper{position:absolute;top:0;left:0;contain:content}[dir=rtl] .cdk-virtual-scroll-content-wrapper{right:0;left:auto}.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper{min-height:100%}.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-left:0;padding-right:0;margin-left:0;margin-right:0;border-left-width:0;border-right-width:0;outline:none}.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper{min-width:100%}.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-top:0;padding-bottom:0;margin-top:0;margin-bottom:0;border-top-width:0;border-bottom-width:0;outline:none}.cdk-virtual-scroll-spacer{height:1px;transform-origin:0 0;flex:0 0 auto}[dir=rtl] .cdk-virtual-scroll-spacer{transform-origin:100% 0}\"],\n encapsulation: 2,\n changeDetection: 0\n });\n }\n }\n return CdkVirtualScrollViewport;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Helper to extract the offset of a DOM Node in a certain direction. */\nfunction getOffset(orientation, direction, node) {\n const el = node;\n if (!el.getBoundingClientRect) {\n return 0;\n }\n const rect = el.getBoundingClientRect();\n if (orientation === 'horizontal') {\n return direction === 'start' ? rect.left : rect.right;\n }\n return direction === 'start' ? rect.top : rect.bottom;\n}\n/**\n * A directive similar to `ngForOf` to be used for rendering data inside a virtual scrolling\n * container.\n */\nlet CdkVirtualForOf = /*#__PURE__*/(() => {\n class CdkVirtualForOf {\n /** The DataSource to display. */\n get cdkVirtualForOf() {\n return this._cdkVirtualForOf;\n }\n set cdkVirtualForOf(value) {\n this._cdkVirtualForOf = value;\n if (isDataSource(value)) {\n this._dataSourceChanges.next(value);\n } else {\n // If value is an an NgIterable, convert it to an array.\n this._dataSourceChanges.next(new ArrayDataSource(isObservable(value) ? value : Array.from(value || [])));\n }\n }\n /**\n * The `TrackByFunction` to use for tracking changes. The `TrackByFunction` takes the index and\n * the item and produces a value to be used as the item's identity when tracking changes.\n */\n get cdkVirtualForTrackBy() {\n return this._cdkVirtualForTrackBy;\n }\n set cdkVirtualForTrackBy(fn) {\n this._needsUpdate = true;\n this._cdkVirtualForTrackBy = fn ? (index, item) => fn(index + (this._renderedRange ? this._renderedRange.start : 0), item) : undefined;\n }\n /** The template used to stamp out new elements. */\n set cdkVirtualForTemplate(value) {\n if (value) {\n this._needsUpdate = true;\n this._template = value;\n }\n }\n /**\n * The size of the cache used to store templates that are not being used for re-use later.\n * Setting the cache size to `0` will disable caching. Defaults to 20 templates.\n */\n get cdkVirtualForTemplateCacheSize() {\n return this._viewRepeater.viewCacheSize;\n }\n set cdkVirtualForTemplateCacheSize(size) {\n this._viewRepeater.viewCacheSize = coerceNumberProperty(size);\n }\n constructor( /** The view container to add items to. */\n _viewContainerRef, /** The template to use when stamping out new items. */\n _template, /** The set of available differs. */\n _differs, /** The strategy used to render items in the virtual scroll viewport. */\n _viewRepeater, /** The virtual scrolling viewport that these items are being rendered in. */\n _viewport, ngZone) {\n this._viewContainerRef = _viewContainerRef;\n this._template = _template;\n this._differs = _differs;\n this._viewRepeater = _viewRepeater;\n this._viewport = _viewport;\n /** Emits when the rendered view of the data changes. */\n this.viewChange = new Subject();\n /** Subject that emits when a new DataSource instance is given. */\n this._dataSourceChanges = new Subject();\n /** Emits whenever the data in the current DataSource changes. */\n this.dataStream = this._dataSourceChanges.pipe(\n // Start off with null `DataSource`.\n startWith(null),\n // Bundle up the previous and current data sources so we can work with both.\n pairwise(),\n // Use `_changeDataSource` to disconnect from the previous data source and connect to the\n // new one, passing back a stream of data changes which we run through `switchMap` to give\n // us a data stream that emits the latest data from whatever the current `DataSource` is.\n switchMap(([prev, cur]) => this._changeDataSource(prev, cur)),\n // Replay the last emitted data when someone subscribes.\n shareReplay(1));\n /** The differ used to calculate changes to the data. */\n this._differ = null;\n /** Whether the rendered data should be updated during the next ngDoCheck cycle. */\n this._needsUpdate = false;\n this._destroyed = new Subject();\n this.dataStream.subscribe(data => {\n this._data = data;\n this._onRenderedDataChange();\n });\n this._viewport.renderedRangeStream.pipe(takeUntil(this._destroyed)).subscribe(range => {\n this._renderedRange = range;\n if (this.viewChange.observers.length) {\n ngZone.run(() => this.viewChange.next(this._renderedRange));\n }\n this._onRenderedDataChange();\n });\n this._viewport.attach(this);\n }\n /**\n * Measures the combined size (width for horizontal orientation, height for vertical) of all items\n * in the specified range. Throws an error if the range includes items that are not currently\n * rendered.\n */\n measureRangeSize(range, orientation) {\n if (range.start >= range.end) {\n return 0;\n }\n if ((range.start < this._renderedRange.start || range.end > this._renderedRange.end) && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error(`Error: attempted to measure an item that isn't rendered.`);\n }\n // The index into the list of rendered views for the first item in the range.\n const renderedStartIndex = range.start - this._renderedRange.start;\n // The length of the range we're measuring.\n const rangeLen = range.end - range.start;\n // Loop over all the views, find the first and land node and compute the size by subtracting\n // the top of the first node from the bottom of the last one.\n let firstNode;\n let lastNode;\n // Find the first node by starting from the beginning and going forwards.\n for (let i = 0; i < rangeLen; i++) {\n const view = this._viewContainerRef.get(i + renderedStartIndex);\n if (view && view.rootNodes.length) {\n firstNode = lastNode = view.rootNodes[0];\n break;\n }\n }\n // Find the last node by starting from the end and going backwards.\n for (let i = rangeLen - 1; i > -1; i--) {\n const view = this._viewContainerRef.get(i + renderedStartIndex);\n if (view && view.rootNodes.length) {\n lastNode = view.rootNodes[view.rootNodes.length - 1];\n break;\n }\n }\n return firstNode && lastNode ? getOffset(orientation, 'end', lastNode) - getOffset(orientation, 'start', firstNode) : 0;\n }\n ngDoCheck() {\n if (this._differ && this._needsUpdate) {\n // TODO(mmalerba): We should differentiate needs update due to scrolling and a new portion of\n // this list being rendered (can use simpler algorithm) vs needs update due to data actually\n // changing (need to do this diff).\n const changes = this._differ.diff(this._renderedItems);\n if (!changes) {\n this._updateContext();\n } else {\n this._applyChanges(changes);\n }\n this._needsUpdate = false;\n }\n }\n ngOnDestroy() {\n this._viewport.detach();\n this._dataSourceChanges.next(undefined);\n this._dataSourceChanges.complete();\n this.viewChange.complete();\n this._destroyed.next();\n this._destroyed.complete();\n this._viewRepeater.detach();\n }\n /** React to scroll state changes in the viewport. */\n _onRenderedDataChange() {\n if (!this._renderedRange) {\n return;\n }\n this._renderedItems = this._data.slice(this._renderedRange.start, this._renderedRange.end);\n if (!this._differ) {\n // Use a wrapper function for the `trackBy` so any new values are\n // picked up automatically without having to recreate the differ.\n this._differ = this._differs.find(this._renderedItems).create((index, item) => {\n return this.cdkVirtualForTrackBy ? this.cdkVirtualForTrackBy(index, item) : item;\n });\n }\n this._needsUpdate = true;\n }\n /** Swap out one `DataSource` for another. */\n _changeDataSource(oldDs, newDs) {\n if (oldDs) {\n oldDs.disconnect(this);\n }\n this._needsUpdate = true;\n return newDs ? newDs.connect(this) : of();\n }\n /** Update the `CdkVirtualForOfContext` for all views. */\n _updateContext() {\n const count = this._data.length;\n let i = this._viewContainerRef.length;\n while (i--) {\n const view = this._viewContainerRef.get(i);\n view.context.index = this._renderedRange.start + i;\n view.context.count = count;\n this._updateComputedContextProperties(view.context);\n view.detectChanges();\n }\n }\n /** Apply changes to the DOM. */\n _applyChanges(changes) {\n this._viewRepeater.applyChanges(changes, this._viewContainerRef, (record, _adjustedPreviousIndex, currentIndex) => this._getEmbeddedViewArgs(record, currentIndex), record => record.item);\n // Update $implicit for any items that had an identity change.\n changes.forEachIdentityChange(record => {\n const view = this._viewContainerRef.get(record.currentIndex);\n view.context.$implicit = record.item;\n });\n // Update the context variables on all items.\n const count = this._data.length;\n let i = this._viewContainerRef.length;\n while (i--) {\n const view = this._viewContainerRef.get(i);\n view.context.index = this._renderedRange.start + i;\n view.context.count = count;\n this._updateComputedContextProperties(view.context);\n }\n }\n /** Update the computed properties on the `CdkVirtualForOfContext`. */\n _updateComputedContextProperties(context) {\n context.first = context.index === 0;\n context.last = context.index === context.count - 1;\n context.even = context.index % 2 === 0;\n context.odd = !context.even;\n }\n _getEmbeddedViewArgs(record, index) {\n // Note that it's important that we insert the item directly at the proper index,\n // rather than inserting it and the moving it in place, because if there's a directive\n // on the same node that injects the `ViewContainerRef`, Angular will insert another\n // comment node which can throw off the move when it's being repeated for all items.\n return {\n templateRef: this._template,\n context: {\n $implicit: record.item,\n // It's guaranteed that the iterable is not \"undefined\" or \"null\" because we only\n // generate views for elements if the \"cdkVirtualForOf\" iterable has elements.\n cdkVirtualForOf: this._cdkVirtualForOf,\n index: -1,\n count: -1,\n first: false,\n last: false,\n odd: false,\n even: false\n },\n index\n };\n }\n static {\n this.ɵfac = function CdkVirtualForOf_Factory(t) {\n return new (t || CdkVirtualForOf)(i0.ɵɵdirectiveInject(i0.ViewContainerRef), i0.ɵɵdirectiveInject(i0.TemplateRef), i0.ɵɵdirectiveInject(i0.IterableDiffers), i0.ɵɵdirectiveInject(_VIEW_REPEATER_STRATEGY), i0.ɵɵdirectiveInject(CdkVirtualScrollViewport, 4), i0.ɵɵdirectiveInject(i0.NgZone));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkVirtualForOf,\n selectors: [[\"\", \"cdkVirtualFor\", \"\", \"cdkVirtualForOf\", \"\"]],\n inputs: {\n cdkVirtualForOf: \"cdkVirtualForOf\",\n cdkVirtualForTrackBy: \"cdkVirtualForTrackBy\",\n cdkVirtualForTemplate: \"cdkVirtualForTemplate\",\n cdkVirtualForTemplateCacheSize: \"cdkVirtualForTemplateCacheSize\"\n },\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: _VIEW_REPEATER_STRATEGY,\n useClass: _RecycleViewRepeaterStrategy\n }])]\n });\n }\n }\n return CdkVirtualForOf;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Provides a virtual scrollable for the element it is attached to.\n */\nlet CdkVirtualScrollableElement = /*#__PURE__*/(() => {\n class CdkVirtualScrollableElement extends CdkVirtualScrollable {\n constructor(elementRef, scrollDispatcher, ngZone, dir) {\n super(elementRef, scrollDispatcher, ngZone, dir);\n }\n measureBoundingClientRectWithScrollOffset(from) {\n return this.getElementRef().nativeElement.getBoundingClientRect()[from] - this.measureScrollOffset(from);\n }\n static {\n this.ɵfac = function CdkVirtualScrollableElement_Factory(t) {\n return new (t || CdkVirtualScrollableElement)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(ScrollDispatcher), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i2.Directionality, 8));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkVirtualScrollableElement,\n selectors: [[\"\", \"cdkVirtualScrollingElement\", \"\"]],\n hostAttrs: [1, \"cdk-virtual-scrollable\"],\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: VIRTUAL_SCROLLABLE,\n useExisting: CdkVirtualScrollableElement\n }]), i0.ɵɵInheritDefinitionFeature]\n });\n }\n }\n return CdkVirtualScrollableElement;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Provides as virtual scrollable for the global / window scrollbar.\n */\nlet CdkVirtualScrollableWindow = /*#__PURE__*/(() => {\n class CdkVirtualScrollableWindow extends CdkVirtualScrollable {\n constructor(scrollDispatcher, ngZone, dir) {\n super(new ElementRef(document.documentElement), scrollDispatcher, ngZone, dir);\n this._elementScrolled = new Observable(observer => this.ngZone.runOutsideAngular(() => fromEvent(document, 'scroll').pipe(takeUntil(this._destroyed)).subscribe(observer)));\n }\n measureBoundingClientRectWithScrollOffset(from) {\n return this.getElementRef().nativeElement.getBoundingClientRect()[from];\n }\n static {\n this.ɵfac = function CdkVirtualScrollableWindow_Factory(t) {\n return new (t || CdkVirtualScrollableWindow)(i0.ɵɵdirectiveInject(ScrollDispatcher), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i2.Directionality, 8));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkVirtualScrollableWindow,\n selectors: [[\"cdk-virtual-scroll-viewport\", \"scrollWindow\", \"\"]],\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: VIRTUAL_SCROLLABLE,\n useExisting: CdkVirtualScrollableWindow\n }]), i0.ɵɵInheritDefinitionFeature]\n });\n }\n }\n return CdkVirtualScrollableWindow;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet CdkScrollableModule = /*#__PURE__*/(() => {\n class CdkScrollableModule {\n static {\n this.ɵfac = function CdkScrollableModule_Factory(t) {\n return new (t || CdkScrollableModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: CdkScrollableModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({});\n }\n }\n return CdkScrollableModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @docs-primary-export\n */\nlet ScrollingModule = /*#__PURE__*/(() => {\n class ScrollingModule {\n static {\n this.ɵfac = function ScrollingModule_Factory(t) {\n return new (t || ScrollingModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: ScrollingModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n imports: [BidiModule, CdkScrollableModule, BidiModule, CdkScrollableModule]\n });\n }\n }\n return ScrollingModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { CdkFixedSizeVirtualScroll, CdkScrollable, CdkScrollableModule, CdkVirtualForOf, CdkVirtualScrollViewport, CdkVirtualScrollable, CdkVirtualScrollableElement, CdkVirtualScrollableWindow, DEFAULT_RESIZE_TIME, DEFAULT_SCROLL_TIME, FixedSizeVirtualScrollStrategy, ScrollDispatcher, ScrollingModule, VIRTUAL_SCROLLABLE, VIRTUAL_SCROLL_STRATEGY, ViewportRuler, _fixedSizeVirtualScrollStrategyFactory };\n","import * as i0 from '@angular/core';\nimport { inject, NgZone, Injectable } from '@angular/core';\nimport { Subject, Observable } from 'rxjs';\nimport { filter, shareReplay, takeUntil } from 'rxjs/operators';\n\n/**\n * Handler that logs \"ResizeObserver loop limit exceeded\" errors.\n * These errors are not shown in the Chrome console, so we log them to ensure developers are aware.\n * @param e The error\n */\nconst loopLimitExceededErrorHandler = e => {\n if (e instanceof ErrorEvent && e.message === 'ResizeObserver loop limit exceeded') {\n console.error(`${e.message}. This could indicate a performance issue with your app. See https://github.com/WICG/resize-observer/blob/master/explainer.md#error-handling`);\n }\n};\n/**\n * A shared ResizeObserver to be used for a particular box type (content-box, border-box, or\n * device-pixel-content-box)\n */\nclass SingleBoxSharedResizeObserver {\n constructor( /** The box type to observe for resizes. */\n _box) {\n this._box = _box;\n /** Stream that emits when the shared observer is destroyed. */\n this._destroyed = new Subject();\n /** Stream of all events from the ResizeObserver. */\n this._resizeSubject = new Subject();\n /** A map of elements to streams of their resize events. */\n this._elementObservables = new Map();\n if (typeof ResizeObserver !== 'undefined') {\n this._resizeObserver = new ResizeObserver(entries => this._resizeSubject.next(entries));\n }\n }\n /**\n * Gets a stream of resize events for the given element.\n * @param target The element to observe.\n * @return The stream of resize events for the element.\n */\n observe(target) {\n if (!this._elementObservables.has(target)) {\n this._elementObservables.set(target, new Observable(observer => {\n const subscription = this._resizeSubject.subscribe(observer);\n this._resizeObserver?.observe(target, {\n box: this._box\n });\n return () => {\n this._resizeObserver?.unobserve(target);\n subscription.unsubscribe();\n this._elementObservables.delete(target);\n };\n }).pipe(filter(entries => entries.some(entry => entry.target === target)),\n // Share a replay of the last event so that subsequent calls to observe the same element\n // receive initial sizing info like the first one. Also enable ref counting so the\n // element will be automatically unobserved when there are no more subscriptions.\n shareReplay({\n bufferSize: 1,\n refCount: true\n }), takeUntil(this._destroyed)));\n }\n return this._elementObservables.get(target);\n }\n /** Destroys this instance. */\n destroy() {\n this._destroyed.next();\n this._destroyed.complete();\n this._resizeSubject.complete();\n this._elementObservables.clear();\n }\n}\n/**\n * Allows observing resize events on multiple elements using a shared set of ResizeObserver.\n * Sharing a ResizeObserver instance is recommended for better performance (see\n * https://github.com/WICG/resize-observer/issues/59).\n *\n * Rather than share a single `ResizeObserver`, this class creates one `ResizeObserver` per type\n * of observed box ('content-box', 'border-box', and 'device-pixel-content-box'). This avoids\n * later calls to `observe` with a different box type from influencing the events dispatched to\n * earlier calls.\n */\nlet SharedResizeObserver = /*#__PURE__*/(() => {\n class SharedResizeObserver {\n constructor() {\n /** Map of box type to shared resize observer. */\n this._observers = new Map();\n /** The Angular zone. */\n this._ngZone = inject(NgZone);\n if (typeof ResizeObserver !== 'undefined' && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n this._ngZone.runOutsideAngular(() => {\n window.addEventListener('error', loopLimitExceededErrorHandler);\n });\n }\n }\n ngOnDestroy() {\n for (const [, observer] of this._observers) {\n observer.destroy();\n }\n this._observers.clear();\n if (typeof ResizeObserver !== 'undefined' && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n window.removeEventListener('error', loopLimitExceededErrorHandler);\n }\n }\n /**\n * Gets a stream of resize events for the given target element and box type.\n * @param target The element to observe for resizes.\n * @param options Options to pass to the `ResizeObserver`\n * @return The stream of resize events for the element.\n */\n observe(target, options) {\n const box = options?.box || 'content-box';\n if (!this._observers.has(box)) {\n this._observers.set(box, new SingleBoxSharedResizeObserver(box));\n }\n return this._observers.get(box).observe(target);\n }\n static {\n this.ɵfac = function SharedResizeObserver_Factory(t) {\n return new (t || SharedResizeObserver)();\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: SharedResizeObserver,\n factory: SharedResizeObserver.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return SharedResizeObserver;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { SharedResizeObserver };\n","/**\n * @license Angular v18.1.1\n * (c) 2010-2024 Google LLC. https://angular.io/\n * License: MIT\n */\n\nimport { DOCUMENT } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { inject, Injectable, ANIMATION_MODULE_TYPE, ViewEncapsulation, ɵRuntimeError, Inject } from '@angular/core';\n\n/**\n * @description Constants for the categories of parameters that can be defined for animations.\n *\n * A corresponding function defines a set of parameters for each category, and\n * collects them into a corresponding `AnimationMetadata` object.\n *\n * @publicApi\n */\nvar AnimationMetadataType = /*#__PURE__*/function (AnimationMetadataType) {\n /**\n * Associates a named animation state with a set of CSS styles.\n * See [`state()`](api/animations/state)\n */\n AnimationMetadataType[AnimationMetadataType[\"State\"] = 0] = \"State\";\n /**\n * Data for a transition from one animation state to another.\n * See `transition()`\n */\n AnimationMetadataType[AnimationMetadataType[\"Transition\"] = 1] = \"Transition\";\n /**\n * Contains a set of animation steps.\n * See `sequence()`\n */\n AnimationMetadataType[AnimationMetadataType[\"Sequence\"] = 2] = \"Sequence\";\n /**\n * Contains a set of animation steps.\n * See `{@link animations/group group()}`\n */\n AnimationMetadataType[AnimationMetadataType[\"Group\"] = 3] = \"Group\";\n /**\n * Contains an animation step.\n * See `animate()`\n */\n AnimationMetadataType[AnimationMetadataType[\"Animate\"] = 4] = \"Animate\";\n /**\n * Contains a set of animation steps.\n * See `keyframes()`\n */\n AnimationMetadataType[AnimationMetadataType[\"Keyframes\"] = 5] = \"Keyframes\";\n /**\n * Contains a set of CSS property-value pairs into a named style.\n * See `style()`\n */\n AnimationMetadataType[AnimationMetadataType[\"Style\"] = 6] = \"Style\";\n /**\n * Associates an animation with an entry trigger that can be attached to an element.\n * See `trigger()`\n */\n AnimationMetadataType[AnimationMetadataType[\"Trigger\"] = 7] = \"Trigger\";\n /**\n * Contains a re-usable animation.\n * See `animation()`\n */\n AnimationMetadataType[AnimationMetadataType[\"Reference\"] = 8] = \"Reference\";\n /**\n * Contains data to use in executing child animations returned by a query.\n * See `animateChild()`\n */\n AnimationMetadataType[AnimationMetadataType[\"AnimateChild\"] = 9] = \"AnimateChild\";\n /**\n * Contains animation parameters for a re-usable animation.\n * See `useAnimation()`\n */\n AnimationMetadataType[AnimationMetadataType[\"AnimateRef\"] = 10] = \"AnimateRef\";\n /**\n * Contains child-animation query data.\n * See `query()`\n */\n AnimationMetadataType[AnimationMetadataType[\"Query\"] = 11] = \"Query\";\n /**\n * Contains data for staggering an animation sequence.\n * See `stagger()`\n */\n AnimationMetadataType[AnimationMetadataType[\"Stagger\"] = 12] = \"Stagger\";\n return AnimationMetadataType;\n}(AnimationMetadataType || {});\n/**\n * Specifies automatic styling.\n *\n * @publicApi\n */\nconst AUTO_STYLE = '*';\n/**\n * Creates a named animation trigger, containing a list of [`state()`](api/animations/state)\n * and `transition()` entries to be evaluated when the expression\n * bound to the trigger changes.\n *\n * @param name An identifying string.\n * @param definitions An animation definition object, containing an array of\n * [`state()`](api/animations/state) and `transition()` declarations.\n *\n * @return An object that encapsulates the trigger data.\n *\n * @usageNotes\n * Define an animation trigger in the `animations` section of `@Component` metadata.\n * In the template, reference the trigger by name and bind it to a trigger expression that\n * evaluates to a defined animation state, using the following format:\n *\n * `[@triggerName]=\"expression\"`\n *\n * Animation trigger bindings convert all values to strings, and then match the\n * previous and current values against any linked transitions.\n * Booleans can be specified as `1` or `true` and `0` or `false`.\n *\n * ### Usage Example\n *\n * The following example creates an animation trigger reference based on the provided\n * name value.\n * The provided animation value is expected to be an array consisting of state and\n * transition declarations.\n *\n * ```typescript\n * @Component({\n * selector: \"my-component\",\n * templateUrl: \"my-component-tpl.html\",\n * animations: [\n * trigger(\"myAnimationTrigger\", [\n * state(...),\n * state(...),\n * transition(...),\n * transition(...)\n * ])\n * ]\n * })\n * class MyComponent {\n * myStatusExp = \"something\";\n * }\n * ```\n *\n * The template associated with this component makes use of the defined trigger\n * by binding to an element within its template code.\n *\n * ```html\n * \n *
...
\n * ```\n *\n * ### Using an inline function\n * The `transition` animation method also supports reading an inline function which can decide\n * if its associated animation should be run.\n *\n * ```typescript\n * // this method is run each time the `myAnimationTrigger` trigger value changes.\n * function myInlineMatcherFn(fromState: string, toState: string, element: any, params: {[key:\n string]: any}): boolean {\n * // notice that `element` and `params` are also available here\n * return toState == 'yes-please-animate';\n * }\n *\n * @Component({\n * selector: 'my-component',\n * templateUrl: 'my-component-tpl.html',\n * animations: [\n * trigger('myAnimationTrigger', [\n * transition(myInlineMatcherFn, [\n * // the animation sequence code\n * ]),\n * ])\n * ]\n * })\n * class MyComponent {\n * myStatusExp = \"yes-please-animate\";\n * }\n * ```\n *\n * ### Disabling Animations\n * When true, the special animation control binding `@.disabled` binding prevents\n * all animations from rendering.\n * Place the `@.disabled` binding on an element to disable\n * animations on the element itself, as well as any inner animation triggers\n * within the element.\n *\n * The following example shows how to use this feature:\n *\n * ```typescript\n * @Component({\n * selector: 'my-component',\n * template: `\n *
\n *
\n *
\n * `,\n * animations: [\n * trigger(\"childAnimation\", [\n * // ...\n * ])\n * ]\n * })\n * class MyComponent {\n * isDisabled = true;\n * exp = '...';\n * }\n * ```\n *\n * When `@.disabled` is true, it prevents the `@childAnimation` trigger from animating,\n * along with any inner animations.\n *\n * ### Disable animations application-wide\n * When an area of the template is set to have animations disabled,\n * **all** inner components have their animations disabled as well.\n * This means that you can disable all animations for an app\n * by placing a host binding set on `@.disabled` on the topmost Angular component.\n *\n * ```typescript\n * import {Component, HostBinding} from '@angular/core';\n *\n * @Component({\n * selector: 'app-component',\n * templateUrl: 'app.component.html',\n * })\n * class AppComponent {\n * @HostBinding('@.disabled')\n * public animationsDisabled = true;\n * }\n * ```\n *\n * ### Overriding disablement of inner animations\n * Despite inner animations being disabled, a parent animation can `query()`\n * for inner elements located in disabled areas of the template and still animate\n * them if needed. This is also the case for when a sub animation is\n * queried by a parent and then later animated using `animateChild()`.\n *\n * ### Detecting when an animation is disabled\n * If a region of the DOM (or the entire application) has its animations disabled, the animation\n * trigger callbacks still fire, but for zero seconds. When the callback fires, it provides\n * an instance of an `AnimationEvent`. If animations are disabled,\n * the `.disabled` flag on the event is true.\n *\n * @publicApi\n */\nfunction trigger(name, definitions) {\n return {\n type: AnimationMetadataType.Trigger,\n name,\n definitions,\n options: {}\n };\n}\n/**\n * Defines an animation step that combines styling information with timing information.\n *\n * @param timings Sets `AnimateTimings` for the parent animation.\n * A string in the format \"duration [delay] [easing]\".\n * - Duration and delay are expressed as a number and optional time unit,\n * such as \"1s\" or \"10ms\" for one second and 10 milliseconds, respectively.\n * The default unit is milliseconds.\n * - The easing value controls how the animation accelerates and decelerates\n * during its runtime. Value is one of `ease`, `ease-in`, `ease-out`,\n * `ease-in-out`, or a `cubic-bezier()` function call.\n * If not supplied, no easing is applied.\n *\n * For example, the string \"1s 100ms ease-out\" specifies a duration of\n * 1000 milliseconds, and delay of 100 ms, and the \"ease-out\" easing style,\n * which decelerates near the end of the duration.\n * @param styles Sets AnimationStyles for the parent animation.\n * A function call to either `style()` or `keyframes()`\n * that returns a collection of CSS style entries to be applied to the parent animation.\n * When null, uses the styles from the destination state.\n * This is useful when describing an animation step that will complete an animation;\n * see \"Animating to the final state\" in `transitions()`.\n * @returns An object that encapsulates the animation step.\n *\n * @usageNotes\n * Call within an animation `sequence()`, `{@link animations/group group()}`, or\n * `transition()` call to specify an animation step\n * that applies given style data to the parent animation for a given amount of time.\n *\n * ### Syntax Examples\n * **Timing examples**\n *\n * The following examples show various `timings` specifications.\n * - `animate(500)` : Duration is 500 milliseconds.\n * - `animate(\"1s\")` : Duration is 1000 milliseconds.\n * - `animate(\"100ms 0.5s\")` : Duration is 100 milliseconds, delay is 500 milliseconds.\n * - `animate(\"5s ease-in\")` : Duration is 5000 milliseconds, easing in.\n * - `animate(\"5s 10ms cubic-bezier(.17,.67,.88,.1)\")` : Duration is 5000 milliseconds, delay is 10\n * milliseconds, easing according to a bezier curve.\n *\n * **Style examples**\n *\n * The following example calls `style()` to set a single CSS style.\n * ```typescript\n * animate(500, style({ background: \"red\" }))\n * ```\n * The following example calls `keyframes()` to set a CSS style\n * to different values for successive keyframes.\n * ```typescript\n * animate(500, keyframes(\n * [\n * style({ background: \"blue\" }),\n * style({ background: \"red\" })\n * ])\n * ```\n *\n * @publicApi\n */\nfunction animate(timings, styles = null) {\n return {\n type: AnimationMetadataType.Animate,\n styles,\n timings\n };\n}\n/**\n * @description Defines a list of animation steps to be run in parallel.\n *\n * @param steps An array of animation step objects.\n * - When steps are defined by `style()` or `animate()`\n * function calls, each call within the group is executed instantly.\n * - To specify offset styles to be applied at a later time, define steps with\n * `keyframes()`, or use `animate()` calls with a delay value.\n * For example:\n *\n * ```typescript\n * group([\n * animate(\"1s\", style({ background: \"black\" })),\n * animate(\"2s\", style({ color: \"white\" }))\n * ])\n * ```\n *\n * @param options An options object containing a delay and\n * developer-defined parameters that provide styling defaults and\n * can be overridden on invocation.\n *\n * @return An object that encapsulates the group data.\n *\n * @usageNotes\n * Grouped animations are useful when a series of styles must be\n * animated at different starting times and closed off at different ending times.\n *\n * When called within a `sequence()` or a\n * `transition()` call, does not continue to the next\n * instruction until all of the inner animation steps have completed.\n *\n * @publicApi\n */\nfunction group(steps, options = null) {\n return {\n type: AnimationMetadataType.Group,\n steps,\n options\n };\n}\n/**\n * Defines a list of animation steps to be run sequentially, one by one.\n *\n * @param steps An array of animation step objects.\n * - Steps defined by `style()` calls apply the styling data immediately.\n * - Steps defined by `animate()` calls apply the styling data over time\n * as specified by the timing data.\n *\n * ```typescript\n * sequence([\n * style({ opacity: 0 }),\n * animate(\"1s\", style({ opacity: 1 }))\n * ])\n * ```\n *\n * @param options An options object containing a delay and\n * developer-defined parameters that provide styling defaults and\n * can be overridden on invocation.\n *\n * @return An object that encapsulates the sequence data.\n *\n * @usageNotes\n * When you pass an array of steps to a\n * `transition()` call, the steps run sequentially by default.\n * Compare this to the `{@link animations/group group()}` call, which runs animation steps in\n *parallel.\n *\n * When a sequence is used within a `{@link animations/group group()}` or a `transition()` call,\n * execution continues to the next instruction only after each of the inner animation\n * steps have completed.\n *\n * @publicApi\n **/\nfunction sequence(steps, options = null) {\n return {\n type: AnimationMetadataType.Sequence,\n steps,\n options\n };\n}\n/**\n * Declares a key/value object containing CSS properties/styles that\n * can then be used for an animation [`state`](api/animations/state), within an animation\n *`sequence`, or as styling data for calls to `animate()` and `keyframes()`.\n *\n * @param tokens A set of CSS styles or HTML styles associated with an animation state.\n * The value can be any of the following:\n * - A key-value style pair associating a CSS property with a value.\n * - An array of key-value style pairs.\n * - An asterisk (*), to use auto-styling, where styles are derived from the element\n * being animated and applied to the animation when it starts.\n *\n * Auto-styling can be used to define a state that depends on layout or other\n * environmental factors.\n *\n * @return An object that encapsulates the style data.\n *\n * @usageNotes\n * The following examples create animation styles that collect a set of\n * CSS property values:\n *\n * ```typescript\n * // string values for CSS properties\n * style({ background: \"red\", color: \"blue\" })\n *\n * // numerical pixel values\n * style({ width: 100, height: 0 })\n * ```\n *\n * The following example uses auto-styling to allow an element to animate from\n * a height of 0 up to its full height:\n *\n * ```\n * style({ height: 0 }),\n * animate(\"1s\", style({ height: \"*\" }))\n * ```\n *\n * @publicApi\n **/\nfunction style(tokens) {\n return {\n type: AnimationMetadataType.Style,\n styles: tokens,\n offset: null\n };\n}\n/**\n * Declares an animation state within a trigger attached to an element.\n *\n * @param name One or more names for the defined state in a comma-separated string.\n * The following reserved state names can be supplied to define a style for specific use\n * cases:\n *\n * - `void` You can associate styles with this name to be used when\n * the element is detached from the application. For example, when an `ngIf` evaluates\n * to false, the state of the associated element is void.\n * - `*` (asterisk) Indicates the default state. You can associate styles with this name\n * to be used as the fallback when the state that is being animated is not declared\n * within the trigger.\n *\n * @param styles A set of CSS styles associated with this state, created using the\n * `style()` function.\n * This set of styles persists on the element once the state has been reached.\n * @param options Parameters that can be passed to the state when it is invoked.\n * 0 or more key-value pairs.\n * @return An object that encapsulates the new state data.\n *\n * @usageNotes\n * Use the `trigger()` function to register states to an animation trigger.\n * Use the `transition()` function to animate between states.\n * When a state is active within a component, its associated styles persist on the element,\n * even when the animation ends.\n *\n * @publicApi\n **/\nfunction state(name, styles, options) {\n return {\n type: AnimationMetadataType.State,\n name,\n styles,\n options\n };\n}\n/**\n * Defines a set of animation styles, associating each style with an optional `offset` value.\n *\n * @param steps A set of animation styles with optional offset data.\n * The optional `offset` value for a style specifies a percentage of the total animation\n * time at which that style is applied.\n * @returns An object that encapsulates the keyframes data.\n *\n * @usageNotes\n * Use with the `animate()` call. Instead of applying animations\n * from the current state\n * to the destination state, keyframes describe how each style entry is applied and at what point\n * within the animation arc.\n * Compare [CSS Keyframe Animations](https://www.w3schools.com/css/css3_animations.asp).\n *\n * ### Usage\n *\n * In the following example, the offset values describe\n * when each `backgroundColor` value is applied. The color is red at the start, and changes to\n * blue when 20% of the total time has elapsed.\n *\n * ```typescript\n * // the provided offset values\n * animate(\"5s\", keyframes([\n * style({ backgroundColor: \"red\", offset: 0 }),\n * style({ backgroundColor: \"blue\", offset: 0.2 }),\n * style({ backgroundColor: \"orange\", offset: 0.3 }),\n * style({ backgroundColor: \"black\", offset: 1 })\n * ]))\n * ```\n *\n * If there are no `offset` values specified in the style entries, the offsets\n * are calculated automatically.\n *\n * ```typescript\n * animate(\"5s\", keyframes([\n * style({ backgroundColor: \"red\" }) // offset = 0\n * style({ backgroundColor: \"blue\" }) // offset = 0.33\n * style({ backgroundColor: \"orange\" }) // offset = 0.66\n * style({ backgroundColor: \"black\" }) // offset = 1\n * ]))\n *```\n\n * @publicApi\n */\nfunction keyframes(steps) {\n return {\n type: AnimationMetadataType.Keyframes,\n steps\n };\n}\n/**\n * Declares an animation transition which is played when a certain specified condition is met.\n *\n * @param stateChangeExpr A string with a specific format or a function that specifies when the\n * animation transition should occur (see [State Change Expression](#state-change-expression)).\n *\n * @param steps One or more animation objects that represent the animation's instructions.\n *\n * @param options An options object that can be used to specify a delay for the animation or provide\n * custom parameters for it.\n *\n * @returns An object that encapsulates the transition data.\n *\n * @usageNotes\n *\n * ### State Change Expression\n *\n * The State Change Expression instructs Angular when to run the transition's animations, it can\n *either be\n * - a string with a specific syntax\n * - or a function that compares the previous and current state (value of the expression bound to\n * the element's trigger) and returns `true` if the transition should occur or `false` otherwise\n *\n * The string format can be:\n * - `fromState => toState`, which indicates that the transition's animations should occur then the\n * expression bound to the trigger's element goes from `fromState` to `toState`\n *\n * _Example:_\n * ```typescript\n * transition('open => closed', animate('.5s ease-out', style({ height: 0 }) ))\n * ```\n *\n * - `fromState <=> toState`, which indicates that the transition's animations should occur then\n * the expression bound to the trigger's element goes from `fromState` to `toState` or vice versa\n *\n * _Example:_\n * ```typescript\n * transition('enabled <=> disabled', animate('1s cubic-bezier(0.8,0.3,0,1)'))\n * ```\n *\n * - `:enter`/`:leave`, which indicates that the transition's animations should occur when the\n * element enters or exists the DOM\n *\n * _Example:_\n * ```typescript\n * transition(':enter', [\n * style({ opacity: 0 }),\n * animate('500ms', style({ opacity: 1 }))\n * ])\n * ```\n *\n * - `:increment`/`:decrement`, which indicates that the transition's animations should occur when\n * the numerical expression bound to the trigger's element has increased in value or decreased\n *\n * _Example:_\n * ```typescript\n * transition(':increment', query('@counter', animateChild()))\n * ```\n *\n * - a sequence of any of the above divided by commas, which indicates that transition's animations\n * should occur whenever one of the state change expressions matches\n *\n * _Example:_\n * ```typescript\n * transition(':increment, * => enabled, :enter', animate('1s ease', keyframes([\n * style({ transform: 'scale(1)', offset: 0}),\n * style({ transform: 'scale(1.1)', offset: 0.7}),\n * style({ transform: 'scale(1)', offset: 1})\n * ]))),\n * ```\n *\n * Also note that in such context:\n * - `void` can be used to indicate the absence of the element\n * - asterisks can be used as wildcards that match any state\n * - (as a consequence of the above, `void => *` is equivalent to `:enter` and `* => void` is\n * equivalent to `:leave`)\n * - `true` and `false` also match expression values of `1` and `0` respectively (but do not match\n * _truthy_ and _falsy_ values)\n *\n *
\n *\n * Be careful about entering end leaving elements as their transitions present a common\n * pitfall for developers.\n *\n * Note that when an element with a trigger enters the DOM its `:enter` transition always\n * gets executed, but its `:leave` transition will not be executed if the element is removed\n * alongside its parent (as it will be removed \"without warning\" before its transition has\n * a chance to be executed, the only way that such transition can occur is if the element\n * is exiting the DOM on its own).\n *\n *\n *
\n *\n * ### Animating to a Final State\n *\n * If the final step in a transition is a call to `animate()` that uses a timing value\n * with no `style` data, that step is automatically considered the final animation arc,\n * for the element to reach the final state, in such case Angular automatically adds or removes\n * CSS styles to ensure that the element is in the correct final state.\n *\n *\n * ### Usage Examples\n *\n * - Transition animations applied based on\n * the trigger's expression value\n *\n * ```HTML\n *
\n * ...\n *
\n * ```\n *\n * ```typescript\n * trigger(\"myAnimationTrigger\", [\n * ..., // states\n * transition(\"on => off, open => closed\", animate(500)),\n * transition(\"* <=> error\", query('.indicator', animateChild()))\n * ])\n * ```\n *\n * - Transition animations applied based on custom logic dependent\n * on the trigger's expression value and provided parameters\n *\n * ```HTML\n *
\n * ...\n *
\n * ```\n *\n * ```typescript\n * trigger(\"myAnimationTrigger\", [\n * ..., // states\n * transition(\n * (fromState, toState, _element, params) =>\n * ['firststep', 'laststep'].includes(fromState.toLowerCase())\n * && toState === params?.['target'],\n * animate('1s')\n * )\n * ])\n * ```\n *\n * @publicApi\n **/\nfunction transition(stateChangeExpr, steps, options = null) {\n return {\n type: AnimationMetadataType.Transition,\n expr: stateChangeExpr,\n animation: steps,\n options\n };\n}\n/**\n * Produces a reusable animation that can be invoked in another animation or sequence,\n * by calling the `useAnimation()` function.\n *\n * @param steps One or more animation objects, as returned by the `animate()`\n * or `sequence()` function, that form a transformation from one state to another.\n * A sequence is used by default when you pass an array.\n * @param options An options object that can contain a delay value for the start of the\n * animation, and additional developer-defined parameters.\n * Provided values for additional parameters are used as defaults,\n * and override values can be passed to the caller on invocation.\n * @returns An object that encapsulates the animation data.\n *\n * @usageNotes\n * The following example defines a reusable animation, providing some default parameter\n * values.\n *\n * ```typescript\n * var fadeAnimation = animation([\n * style({ opacity: '{{ start }}' }),\n * animate('{{ time }}',\n * style({ opacity: '{{ end }}'}))\n * ],\n * { params: { time: '1000ms', start: 0, end: 1 }});\n * ```\n *\n * The following invokes the defined animation with a call to `useAnimation()`,\n * passing in override parameter values.\n *\n * ```js\n * useAnimation(fadeAnimation, {\n * params: {\n * time: '2s',\n * start: 1,\n * end: 0\n * }\n * })\n * ```\n *\n * If any of the passed-in parameter values are missing from this call,\n * the default values are used. If one or more parameter values are missing before a step is\n * animated, `useAnimation()` throws an error.\n *\n * @publicApi\n */\nfunction animation(steps, options = null) {\n return {\n type: AnimationMetadataType.Reference,\n animation: steps,\n options\n };\n}\n/**\n * Executes a queried inner animation element within an animation sequence.\n *\n * @param options An options object that can contain a delay value for the start of the\n * animation, and additional override values for developer-defined parameters.\n * @return An object that encapsulates the child animation data.\n *\n * @usageNotes\n * Each time an animation is triggered in Angular, the parent animation\n * has priority and any child animations are blocked. In order\n * for a child animation to run, the parent animation must query each of the elements\n * containing child animations, and run them using this function.\n *\n * Note that this feature is designed to be used with `query()` and it will only work\n * with animations that are assigned using the Angular animation library. CSS keyframes\n * and transitions are not handled by this API.\n *\n * @publicApi\n */\nfunction animateChild(options = null) {\n return {\n type: AnimationMetadataType.AnimateChild,\n options\n };\n}\n/**\n * Starts a reusable animation that is created using the `animation()` function.\n *\n * @param animation The reusable animation to start.\n * @param options An options object that can contain a delay value for the start of\n * the animation, and additional override values for developer-defined parameters.\n * @return An object that contains the animation parameters.\n *\n * @publicApi\n */\nfunction useAnimation(animation, options = null) {\n return {\n type: AnimationMetadataType.AnimateRef,\n animation,\n options\n };\n}\n/**\n * Finds one or more inner elements within the current element that is\n * being animated within a sequence. Use with `animate()`.\n *\n * @param selector The element to query, or a set of elements that contain Angular-specific\n * characteristics, specified with one or more of the following tokens.\n * - `query(\":enter\")` or `query(\":leave\")` : Query for newly inserted/removed elements (not\n * all elements can be queried via these tokens, see\n * [Entering and Leaving Elements](#entering-and-leaving-elements))\n * - `query(\":animating\")` : Query all currently animating elements.\n * - `query(\"@triggerName\")` : Query elements that contain an animation trigger.\n * - `query(\"@*\")` : Query all elements that contain an animation triggers.\n * - `query(\":self\")` : Include the current element into the animation sequence.\n *\n * @param animation One or more animation steps to apply to the queried element or elements.\n * An array is treated as an animation sequence.\n * @param options An options object. Use the 'limit' field to limit the total number of\n * items to collect.\n * @return An object that encapsulates the query data.\n *\n * @usageNotes\n *\n * ### Multiple Tokens\n *\n * Tokens can be merged into a combined query selector string. For example:\n *\n * ```typescript\n * query(':self, .record:enter, .record:leave, @subTrigger', [...])\n * ```\n *\n * The `query()` function collects multiple elements and works internally by using\n * `element.querySelectorAll`. Use the `limit` field of an options object to limit\n * the total number of items to be collected. For example:\n *\n * ```js\n * query('div', [\n * animate(...),\n * animate(...)\n * ], { limit: 1 })\n * ```\n *\n * By default, throws an error when zero items are found. Set the\n * `optional` flag to ignore this error. For example:\n *\n * ```js\n * query('.some-element-that-may-not-be-there', [\n * animate(...),\n * animate(...)\n * ], { optional: true })\n * ```\n *\n * ### Entering and Leaving Elements\n *\n * Not all elements can be queried via the `:enter` and `:leave` tokens, the only ones\n * that can are those that Angular assumes can enter/leave based on their own logic\n * (if their insertion/removal is simply a consequence of that of their parent they\n * should be queried via a different token in their parent's `:enter`/`:leave` transitions).\n *\n * The only elements Angular assumes can enter/leave based on their own logic (thus the only\n * ones that can be queried via the `:enter` and `:leave` tokens) are:\n * - Those inserted dynamically (via `ViewContainerRef`)\n * - Those that have a structural directive (which, under the hood, are a subset of the above ones)\n *\n *
\n *\n * Note that elements will be successfully queried via `:enter`/`:leave` even if their\n * insertion/removal is not done manually via `ViewContainerRef`or caused by their structural\n * directive (e.g. they enter/exit alongside their parent).\n *\n *
\n *\n *
\n *\n * There is an exception to what previously mentioned, besides elements entering/leaving based on\n * their own logic, elements with an animation trigger can always be queried via `:leave` when\n * their parent is also leaving.\n *\n *
\n *\n * ### Usage Example\n *\n * The following example queries for inner elements and animates them\n * individually using `animate()`.\n *\n * ```typescript\n * @Component({\n * selector: 'inner',\n * template: `\n *
\n *

Title

\n *
\n * Blah blah blah\n *
\n *
\n * `,\n * animations: [\n * trigger('queryAnimation', [\n * transition('* => goAnimate', [\n * // hide the inner elements\n * query('h1', style({ opacity: 0 })),\n * query('.content', style({ opacity: 0 })),\n *\n * // animate the inner elements in, one by one\n * query('h1', animate(1000, style({ opacity: 1 }))),\n * query('.content', animate(1000, style({ opacity: 1 }))),\n * ])\n * ])\n * ]\n * })\n * class Cmp {\n * exp = '';\n *\n * goAnimate() {\n * this.exp = 'goAnimate';\n * }\n * }\n * ```\n *\n * @publicApi\n */\nfunction query(selector, animation, options = null) {\n return {\n type: AnimationMetadataType.Query,\n selector,\n animation,\n options\n };\n}\n/**\n * Use within an animation `query()` call to issue a timing gap after\n * each queried item is animated.\n *\n * @param timings A delay value.\n * @param animation One ore more animation steps.\n * @returns An object that encapsulates the stagger data.\n *\n * @usageNotes\n * In the following example, a container element wraps a list of items stamped out\n * by an `ngFor`. The container element contains an animation trigger that will later be set\n * to query for each of the inner items.\n *\n * Each time items are added, the opacity fade-in animation runs,\n * and each removed item is faded out.\n * When either of these animations occur, the stagger effect is\n * applied after each item's animation is started.\n *\n * ```html\n * \n * \n *
\n *
\n *
\n * {{ item }}\n *
\n *
\n * ```\n *\n * Here is the component code:\n *\n * ```typescript\n * import {trigger, transition, style, animate, query, stagger} from '@angular/animations';\n * @Component({\n * templateUrl: 'list.component.html',\n * animations: [\n * trigger('listAnimation', [\n * ...\n * ])\n * ]\n * })\n * class ListComponent {\n * items = [];\n *\n * showItems() {\n * this.items = [0,1,2,3,4];\n * }\n *\n * hideItems() {\n * this.items = [];\n * }\n *\n * toggle() {\n * this.items.length ? this.hideItems() : this.showItems();\n * }\n * }\n * ```\n *\n * Here is the animation trigger code:\n *\n * ```typescript\n * trigger('listAnimation', [\n * transition('* => *', [ // each time the binding value changes\n * query(':leave', [\n * stagger(100, [\n * animate('0.5s', style({ opacity: 0 }))\n * ])\n * ]),\n * query(':enter', [\n * style({ opacity: 0 }),\n * stagger(100, [\n * animate('0.5s', style({ opacity: 1 }))\n * ])\n * ])\n * ])\n * ])\n * ```\n *\n * @publicApi\n */\nfunction stagger(timings, animation) {\n return {\n type: AnimationMetadataType.Stagger,\n timings,\n animation\n };\n}\n\n/**\n * An injectable service that produces an animation sequence programmatically within an\n * Angular component or directive.\n * Provided by the `BrowserAnimationsModule` or `NoopAnimationsModule`.\n *\n * @usageNotes\n *\n * To use this service, add it to your component or directive as a dependency.\n * The service is instantiated along with your component.\n *\n * Apps do not typically need to create their own animation players, but if you\n * do need to, follow these steps:\n *\n * 1. Use the [AnimationBuilder.build](api/animations/AnimationBuilder#build)() method\n * to create a programmatic animation. The method returns an `AnimationFactory` instance.\n *\n * 2. Use the factory object to create an `AnimationPlayer` and attach it to a DOM element.\n *\n * 3. Use the player object to control the animation programmatically.\n *\n * For example:\n *\n * ```ts\n * // import the service from BrowserAnimationsModule\n * import {AnimationBuilder} from '@angular/animations';\n * // require the service as a dependency\n * class MyCmp {\n * constructor(private _builder: AnimationBuilder) {}\n *\n * makeAnimation(element: any) {\n * // first define a reusable animation\n * const myAnimation = this._builder.build([\n * style({ width: 0 }),\n * animate(1000, style({ width: '100px' }))\n * ]);\n *\n * // use the returned factory object to create a player\n * const player = myAnimation.create(element);\n *\n * player.play();\n * }\n * }\n * ```\n *\n * @publicApi\n */\nlet AnimationBuilder = /*#__PURE__*/(() => {\n class AnimationBuilder {\n static {\n this.ɵfac = function AnimationBuilder_Factory(t) {\n return new (t || AnimationBuilder)();\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: AnimationBuilder,\n factory: () => (() => inject(BrowserAnimationBuilder))(),\n providedIn: 'root'\n });\n }\n }\n return AnimationBuilder;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * A factory object returned from the\n * [AnimationBuilder.build](api/animations/AnimationBuilder#build)()\n * method.\n *\n * @publicApi\n */\nclass AnimationFactory {}\nlet BrowserAnimationBuilder = /*#__PURE__*/(() => {\n class BrowserAnimationBuilder extends AnimationBuilder {\n constructor(rootRenderer, doc) {\n super();\n this.animationModuleType = inject(ANIMATION_MODULE_TYPE, {\n optional: true\n });\n this._nextAnimationId = 0;\n const typeData = {\n id: '0',\n encapsulation: ViewEncapsulation.None,\n styles: [],\n data: {\n animation: []\n }\n };\n this._renderer = rootRenderer.createRenderer(doc.body, typeData);\n if (this.animationModuleType === null && !isAnimationRenderer(this._renderer)) {\n // We only support AnimationRenderer & DynamicDelegationRenderer for this AnimationBuilder\n throw new ɵRuntimeError(3600 /* RuntimeErrorCode.BROWSER_ANIMATION_BUILDER_INJECTED_WITHOUT_ANIMATIONS */, (typeof ngDevMode === 'undefined' || ngDevMode) && 'Angular detected that the `AnimationBuilder` was injected, but animation support was not enabled. ' + 'Please make sure that you enable animations in your application by calling `provideAnimations()` or `provideAnimationsAsync()` function.');\n }\n }\n build(animation) {\n const id = this._nextAnimationId;\n this._nextAnimationId++;\n const entry = Array.isArray(animation) ? sequence(animation) : animation;\n issueAnimationCommand(this._renderer, null, id, 'register', [entry]);\n return new BrowserAnimationFactory(id, this._renderer);\n }\n static {\n this.ɵfac = function BrowserAnimationBuilder_Factory(t) {\n return new (t || BrowserAnimationBuilder)(i0.ɵɵinject(i0.RendererFactory2), i0.ɵɵinject(DOCUMENT));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: BrowserAnimationBuilder,\n factory: BrowserAnimationBuilder.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return BrowserAnimationBuilder;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nclass BrowserAnimationFactory extends AnimationFactory {\n constructor(_id, _renderer) {\n super();\n this._id = _id;\n this._renderer = _renderer;\n }\n create(element, options) {\n return new RendererAnimationPlayer(this._id, element, options || {}, this._renderer);\n }\n}\nclass RendererAnimationPlayer {\n constructor(id, element, options, _renderer) {\n this.id = id;\n this.element = element;\n this._renderer = _renderer;\n this.parentPlayer = null;\n this._started = false;\n this.totalTime = 0;\n this._command('create', options);\n }\n _listen(eventName, callback) {\n return this._renderer.listen(this.element, `@@${this.id}:${eventName}`, callback);\n }\n _command(command, ...args) {\n issueAnimationCommand(this._renderer, this.element, this.id, command, args);\n }\n onDone(fn) {\n this._listen('done', fn);\n }\n onStart(fn) {\n this._listen('start', fn);\n }\n onDestroy(fn) {\n this._listen('destroy', fn);\n }\n init() {\n this._command('init');\n }\n hasStarted() {\n return this._started;\n }\n play() {\n this._command('play');\n this._started = true;\n }\n pause() {\n this._command('pause');\n }\n restart() {\n this._command('restart');\n }\n finish() {\n this._command('finish');\n }\n destroy() {\n this._command('destroy');\n }\n reset() {\n this._command('reset');\n this._started = false;\n }\n setPosition(p) {\n this._command('setPosition', p);\n }\n getPosition() {\n return unwrapAnimationRenderer(this._renderer)?.engine?.players[this.id]?.getPosition() ?? 0;\n }\n}\nfunction issueAnimationCommand(renderer, element, id, command, args) {\n renderer.setProperty(element, `@@${id}:${command}`, args);\n}\n/**\n * The following 2 methods cannot reference their correct types (AnimationRenderer &\n * DynamicDelegationRenderer) since this would introduce a import cycle.\n */\nfunction unwrapAnimationRenderer(renderer) {\n const type = renderer.ɵtype;\n if (type === 0 /* AnimationRendererType.Regular */) {\n return renderer;\n } else if (type === 1 /* AnimationRendererType.Delegated */) {\n return renderer.animationRenderer;\n }\n return null;\n}\nfunction isAnimationRenderer(renderer) {\n const type = renderer.ɵtype;\n return type === 0 /* AnimationRendererType.Regular */ || type === 1 /* AnimationRendererType.Delegated */;\n}\n\n/**\n * An empty programmatic controller for reusable animations.\n * Used internally when animations are disabled, to avoid\n * checking for the null case when an animation player is expected.\n *\n * @see {@link animate}\n * @see {@link AnimationPlayer}\n *\n * @publicApi\n */\nclass NoopAnimationPlayer {\n constructor(duration = 0, delay = 0) {\n this._onDoneFns = [];\n this._onStartFns = [];\n this._onDestroyFns = [];\n this._originalOnDoneFns = [];\n this._originalOnStartFns = [];\n this._started = false;\n this._destroyed = false;\n this._finished = false;\n this._position = 0;\n this.parentPlayer = null;\n this.totalTime = duration + delay;\n }\n _onFinish() {\n if (!this._finished) {\n this._finished = true;\n this._onDoneFns.forEach(fn => fn());\n this._onDoneFns = [];\n }\n }\n onStart(fn) {\n this._originalOnStartFns.push(fn);\n this._onStartFns.push(fn);\n }\n onDone(fn) {\n this._originalOnDoneFns.push(fn);\n this._onDoneFns.push(fn);\n }\n onDestroy(fn) {\n this._onDestroyFns.push(fn);\n }\n hasStarted() {\n return this._started;\n }\n init() {}\n play() {\n if (!this.hasStarted()) {\n this._onStart();\n this.triggerMicrotask();\n }\n this._started = true;\n }\n /** @internal */\n triggerMicrotask() {\n queueMicrotask(() => this._onFinish());\n }\n _onStart() {\n this._onStartFns.forEach(fn => fn());\n this._onStartFns = [];\n }\n pause() {}\n restart() {}\n finish() {\n this._onFinish();\n }\n destroy() {\n if (!this._destroyed) {\n this._destroyed = true;\n if (!this.hasStarted()) {\n this._onStart();\n }\n this.finish();\n this._onDestroyFns.forEach(fn => fn());\n this._onDestroyFns = [];\n }\n }\n reset() {\n this._started = false;\n this._finished = false;\n this._onStartFns = this._originalOnStartFns;\n this._onDoneFns = this._originalOnDoneFns;\n }\n setPosition(position) {\n this._position = this.totalTime ? position * this.totalTime : 1;\n }\n getPosition() {\n return this.totalTime ? this._position / this.totalTime : 1;\n }\n /** @internal */\n triggerCallback(phaseName) {\n const methods = phaseName == 'start' ? this._onStartFns : this._onDoneFns;\n methods.forEach(fn => fn());\n methods.length = 0;\n }\n}\n\n/**\n * A programmatic controller for a group of reusable animations.\n * Used internally to control animations.\n *\n * @see {@link AnimationPlayer}\n * @see {@link animations/group group}\n *\n */\nclass AnimationGroupPlayer {\n constructor(_players) {\n this._onDoneFns = [];\n this._onStartFns = [];\n this._finished = false;\n this._started = false;\n this._destroyed = false;\n this._onDestroyFns = [];\n this.parentPlayer = null;\n this.totalTime = 0;\n this.players = _players;\n let doneCount = 0;\n let destroyCount = 0;\n let startCount = 0;\n const total = this.players.length;\n if (total == 0) {\n queueMicrotask(() => this._onFinish());\n } else {\n this.players.forEach(player => {\n player.onDone(() => {\n if (++doneCount == total) {\n this._onFinish();\n }\n });\n player.onDestroy(() => {\n if (++destroyCount == total) {\n this._onDestroy();\n }\n });\n player.onStart(() => {\n if (++startCount == total) {\n this._onStart();\n }\n });\n });\n }\n this.totalTime = this.players.reduce((time, player) => Math.max(time, player.totalTime), 0);\n }\n _onFinish() {\n if (!this._finished) {\n this._finished = true;\n this._onDoneFns.forEach(fn => fn());\n this._onDoneFns = [];\n }\n }\n init() {\n this.players.forEach(player => player.init());\n }\n onStart(fn) {\n this._onStartFns.push(fn);\n }\n _onStart() {\n if (!this.hasStarted()) {\n this._started = true;\n this._onStartFns.forEach(fn => fn());\n this._onStartFns = [];\n }\n }\n onDone(fn) {\n this._onDoneFns.push(fn);\n }\n onDestroy(fn) {\n this._onDestroyFns.push(fn);\n }\n hasStarted() {\n return this._started;\n }\n play() {\n if (!this.parentPlayer) {\n this.init();\n }\n this._onStart();\n this.players.forEach(player => player.play());\n }\n pause() {\n this.players.forEach(player => player.pause());\n }\n restart() {\n this.players.forEach(player => player.restart());\n }\n finish() {\n this._onFinish();\n this.players.forEach(player => player.finish());\n }\n destroy() {\n this._onDestroy();\n }\n _onDestroy() {\n if (!this._destroyed) {\n this._destroyed = true;\n this._onFinish();\n this.players.forEach(player => player.destroy());\n this._onDestroyFns.forEach(fn => fn());\n this._onDestroyFns = [];\n }\n }\n reset() {\n this.players.forEach(player => player.reset());\n this._destroyed = false;\n this._finished = false;\n this._started = false;\n }\n setPosition(p) {\n const timeAtPosition = p * this.totalTime;\n this.players.forEach(player => {\n const position = player.totalTime ? Math.min(1, timeAtPosition / player.totalTime) : 1;\n player.setPosition(position);\n });\n }\n getPosition() {\n const longestPlayer = this.players.reduce((longestSoFar, player) => {\n const newPlayerIsLongest = longestSoFar === null || player.totalTime > longestSoFar.totalTime;\n return newPlayerIsLongest ? player : longestSoFar;\n }, null);\n return longestPlayer != null ? longestPlayer.getPosition() : 0;\n }\n beforeDestroy() {\n this.players.forEach(player => {\n if (player.beforeDestroy) {\n player.beforeDestroy();\n }\n });\n }\n /** @internal */\n triggerCallback(phaseName) {\n const methods = phaseName == 'start' ? this._onStartFns : this._onDoneFns;\n methods.forEach(fn => fn());\n methods.length = 0;\n }\n}\nconst ɵPRE_STYLE = '!';\n\n/**\n * @module\n * @description\n * Entry point for all animation APIs of the animation package.\n */\n\n/**\n * @module\n * @description\n * Entry point for all public APIs of this package.\n */\n\n// This file is not used to build this module. It is only used during editing\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { AUTO_STYLE, AnimationBuilder, AnimationFactory, AnimationMetadataType, NoopAnimationPlayer, animate, animateChild, animation, group, keyframes, query, sequence, stagger, state, style, transition, trigger, useAnimation, AnimationGroupPlayer as ɵAnimationGroupPlayer, BrowserAnimationBuilder as ɵBrowserAnimationBuilder, ɵPRE_STYLE };\n","import * as i0 from '@angular/core';\nimport { InjectionToken, Directive, Inject, Optional, booleanAttribute, TemplateRef, Component, ChangeDetectionStrategy, ViewEncapsulation, Input, ContentChild, ViewChild, inject, ElementRef, EventEmitter, Injector, afterNextRender, ANIMATION_MODULE_TYPE, numberAttribute, Output, ContentChildren, forwardRef, QueryList, Attribute, NgModule } from '@angular/core';\nimport { MatRipple, MAT_RIPPLE_GLOBAL_OPTIONS, MatCommonModule } from '@angular/material/core';\nimport { CdkPortal, TemplatePortal, CdkPortalOutlet } from '@angular/cdk/portal';\nimport { Subject, fromEvent, of, merge, EMPTY, Observable, timer, Subscription, BehaviorSubject } from 'rxjs';\nimport * as i1 from '@angular/cdk/scrolling';\nimport { CdkScrollable } from '@angular/cdk/scrolling';\nimport * as i3 from '@angular/cdk/platform';\nimport { normalizePassiveListenerOptions, Platform } from '@angular/cdk/platform';\nimport * as i2 from '@angular/cdk/bidi';\nimport * as i4 from '@angular/cdk/a11y';\nimport { FocusKeyManager, CdkMonitorFocus } from '@angular/cdk/a11y';\nimport { hasModifierKey, SPACE, ENTER } from '@angular/cdk/keycodes';\nimport { SharedResizeObserver } from '@angular/cdk/observers/private';\nimport { takeUntil, debounceTime, startWith, switchMap, skip, filter, distinctUntilChanged } from 'rxjs/operators';\nimport { CdkObserveContent } from '@angular/cdk/observers';\nimport { DOCUMENT } from '@angular/common';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\n\n/**\n * Injection token that can be used to reference instances of `MatTabContent`. It serves as\n * alternative token to the actual `MatTabContent` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst _c0 = [\"*\"];\nfunction MatTab_ng_template_0_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵprojection(0);\n }\n}\nconst _c1 = [\"tabListContainer\"];\nconst _c2 = [\"tabList\"];\nconst _c3 = [\"tabListInner\"];\nconst _c4 = [\"nextPaginator\"];\nconst _c5 = [\"previousPaginator\"];\nconst _c6 = a0 => ({\n animationDuration: a0\n});\nconst _c7 = (a0, a1) => ({\n value: a0,\n params: a1\n});\nfunction MatTabBody_ng_template_2_Template(rf, ctx) {}\nconst _c8 = [\"tabBodyWrapper\"];\nconst _c9 = [\"tabHeader\"];\nfunction MatTabGroup_For_3_Conditional_6_ng_template_0_Template(rf, ctx) {}\nfunction MatTabGroup_For_3_Conditional_6_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵtemplate(0, MatTabGroup_For_3_Conditional_6_ng_template_0_Template, 0, 0, \"ng-template\", 12);\n }\n if (rf & 2) {\n const tab_r4 = i0.ɵɵnextContext().$implicit;\n i0.ɵɵproperty(\"cdkPortalOutlet\", tab_r4.templateLabel);\n }\n}\nfunction MatTabGroup_For_3_Conditional_7_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵtext(0);\n }\n if (rf & 2) {\n const tab_r4 = i0.ɵɵnextContext().$implicit;\n i0.ɵɵtextInterpolate(tab_r4.textLabel);\n }\n}\nfunction MatTabGroup_For_3_Template(rf, ctx) {\n if (rf & 1) {\n const _r2 = i0.ɵɵgetCurrentView();\n i0.ɵɵelementStart(0, \"div\", 7, 2);\n i0.ɵɵlistener(\"click\", function MatTabGroup_For_3_Template_div_click_0_listener() {\n const ctx_r2 = i0.ɵɵrestoreView(_r2);\n const tab_r4 = ctx_r2.$implicit;\n const ɵ$index_3_r5 = ctx_r2.$index;\n const ctx_r5 = i0.ɵɵnextContext();\n const tabHeader_r7 = i0.ɵɵreference(1);\n return i0.ɵɵresetView(ctx_r5._handleClick(tab_r4, tabHeader_r7, ɵ$index_3_r5));\n })(\"cdkFocusChange\", function MatTabGroup_For_3_Template_div_cdkFocusChange_0_listener($event) {\n const ɵ$index_3_r5 = i0.ɵɵrestoreView(_r2).$index;\n const ctx_r5 = i0.ɵɵnextContext();\n return i0.ɵɵresetView(ctx_r5._tabFocusChanged($event, ɵ$index_3_r5));\n });\n i0.ɵɵelement(2, \"span\", 8)(3, \"div\", 9);\n i0.ɵɵelementStart(4, \"span\", 10)(5, \"span\", 11);\n i0.ɵɵtemplate(6, MatTabGroup_For_3_Conditional_6_Template, 1, 1, null, 12)(7, MatTabGroup_For_3_Conditional_7_Template, 1, 1);\n i0.ɵɵelementEnd()()();\n }\n if (rf & 2) {\n const tab_r4 = ctx.$implicit;\n const ɵ$index_3_r5 = ctx.$index;\n const tabNode_r8 = i0.ɵɵreference(1);\n const ctx_r5 = i0.ɵɵnextContext();\n i0.ɵɵclassMap(tab_r4.labelClass);\n i0.ɵɵclassProp(\"mdc-tab--active\", ctx_r5.selectedIndex === ɵ$index_3_r5);\n i0.ɵɵproperty(\"id\", ctx_r5._getTabLabelId(ɵ$index_3_r5))(\"disabled\", tab_r4.disabled)(\"fitInkBarToContent\", ctx_r5.fitInkBarToContent);\n i0.ɵɵattribute(\"tabIndex\", ctx_r5._getTabIndex(ɵ$index_3_r5))(\"aria-posinset\", ɵ$index_3_r5 + 1)(\"aria-setsize\", ctx_r5._tabs.length)(\"aria-controls\", ctx_r5._getTabContentId(ɵ$index_3_r5))(\"aria-selected\", ctx_r5.selectedIndex === ɵ$index_3_r5)(\"aria-label\", tab_r4.ariaLabel || null)(\"aria-labelledby\", !tab_r4.ariaLabel && tab_r4.ariaLabelledby ? tab_r4.ariaLabelledby : null);\n i0.ɵɵadvance(3);\n i0.ɵɵproperty(\"matRippleTrigger\", tabNode_r8)(\"matRippleDisabled\", tab_r4.disabled || ctx_r5.disableRipple);\n i0.ɵɵadvance(3);\n i0.ɵɵconditional(tab_r4.templateLabel ? 6 : 7);\n }\n}\nfunction MatTabGroup_Conditional_4_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵprojection(0);\n }\n}\nfunction MatTabGroup_For_8_Template(rf, ctx) {\n if (rf & 1) {\n const _r9 = i0.ɵɵgetCurrentView();\n i0.ɵɵelementStart(0, \"mat-tab-body\", 13);\n i0.ɵɵlistener(\"_onCentered\", function MatTabGroup_For_8_Template_mat_tab_body__onCentered_0_listener() {\n i0.ɵɵrestoreView(_r9);\n const ctx_r5 = i0.ɵɵnextContext();\n return i0.ɵɵresetView(ctx_r5._removeTabBodyWrapperHeight());\n })(\"_onCentering\", function MatTabGroup_For_8_Template_mat_tab_body__onCentering_0_listener($event) {\n i0.ɵɵrestoreView(_r9);\n const ctx_r5 = i0.ɵɵnextContext();\n return i0.ɵɵresetView(ctx_r5._setTabBodyWrapperHeight($event));\n });\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n const tab_r10 = ctx.$implicit;\n const ɵ$index_23_r11 = ctx.$index;\n const ctx_r5 = i0.ɵɵnextContext();\n i0.ɵɵclassMap(tab_r10.bodyClass);\n i0.ɵɵclassProp(\"mat-mdc-tab-body-active\", ctx_r5.selectedIndex === ɵ$index_23_r11);\n i0.ɵɵproperty(\"id\", ctx_r5._getTabContentId(ɵ$index_23_r11))(\"content\", tab_r10.content)(\"position\", tab_r10.position)(\"origin\", tab_r10.origin)(\"animationDuration\", ctx_r5.animationDuration)(\"preserveContent\", ctx_r5.preserveContent);\n i0.ɵɵattribute(\"tabindex\", ctx_r5.contentTabIndex != null && ctx_r5.selectedIndex === ɵ$index_23_r11 ? ctx_r5.contentTabIndex : null)(\"aria-labelledby\", ctx_r5._getTabLabelId(ɵ$index_23_r11))(\"aria-hidden\", ctx_r5.selectedIndex !== ɵ$index_23_r11);\n }\n}\nconst _c10 = [\"mat-tab-nav-bar\", \"\"];\nconst _c11 = [\"mat-tab-link\", \"\"];\nconst MAT_TAB_CONTENT = /*#__PURE__*/new InjectionToken('MatTabContent');\n/** Decorates the `ng-template` tags and reads out the template from it. */\nlet MatTabContent = /*#__PURE__*/(() => {\n class MatTabContent {\n constructor( /** Content for the tab. */template) {\n this.template = template;\n }\n static {\n this.ɵfac = function MatTabContent_Factory(t) {\n return new (t || MatTabContent)(i0.ɵɵdirectiveInject(i0.TemplateRef));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatTabContent,\n selectors: [[\"\", \"matTabContent\", \"\"]],\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: MAT_TAB_CONTENT,\n useExisting: MatTabContent\n }])]\n });\n }\n }\n return MatTabContent;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Injection token that can be used to reference instances of `MatTabLabel`. It serves as\n * alternative token to the actual `MatTabLabel` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst MAT_TAB_LABEL = /*#__PURE__*/new InjectionToken('MatTabLabel');\n/**\n * Used to provide a tab label to a tab without causing a circular dependency.\n * @docs-private\n */\nconst MAT_TAB = /*#__PURE__*/new InjectionToken('MAT_TAB');\n/** Used to flag tab labels for use with the portal directive */\nlet MatTabLabel = /*#__PURE__*/(() => {\n class MatTabLabel extends CdkPortal {\n constructor(templateRef, viewContainerRef, _closestTab) {\n super(templateRef, viewContainerRef);\n this._closestTab = _closestTab;\n }\n static {\n this.ɵfac = function MatTabLabel_Factory(t) {\n return new (t || MatTabLabel)(i0.ɵɵdirectiveInject(i0.TemplateRef), i0.ɵɵdirectiveInject(i0.ViewContainerRef), i0.ɵɵdirectiveInject(MAT_TAB, 8));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatTabLabel,\n selectors: [[\"\", \"mat-tab-label\", \"\"], [\"\", \"matTabLabel\", \"\"]],\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: MAT_TAB_LABEL,\n useExisting: MatTabLabel\n }]), i0.ɵɵInheritDefinitionFeature]\n });\n }\n }\n return MatTabLabel;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Used to provide a tab group to a tab without causing a circular dependency.\n * @docs-private\n */\nconst MAT_TAB_GROUP = /*#__PURE__*/new InjectionToken('MAT_TAB_GROUP');\nlet MatTab = /*#__PURE__*/(() => {\n class MatTab {\n /** Content for the tab label given by ``. */\n get templateLabel() {\n return this._templateLabel;\n }\n set templateLabel(value) {\n this._setTemplateLabelInput(value);\n }\n /** @docs-private */\n get content() {\n return this._contentPortal;\n }\n constructor(_viewContainerRef, _closestTabGroup) {\n this._viewContainerRef = _viewContainerRef;\n this._closestTabGroup = _closestTabGroup;\n /** whether the tab is disabled. */\n this.disabled = false;\n /**\n * Template provided in the tab content that will be used if present, used to enable lazy-loading\n */\n this._explicitContent = undefined;\n /** Plain text label for the tab, used when there is no template label. */\n this.textLabel = '';\n /** Portal that will be the hosted content of the tab */\n this._contentPortal = null;\n /** Emits whenever the internal state of the tab changes. */\n this._stateChanges = new Subject();\n /**\n * The relatively indexed position where 0 represents the center, negative is left, and positive\n * represents the right.\n */\n this.position = null;\n /**\n * The initial relatively index origin of the tab if it was created and selected after there\n * was already a selected tab. Provides context of what position the tab should originate from.\n */\n this.origin = null;\n /**\n * Whether the tab is currently active.\n */\n this.isActive = false;\n }\n ngOnChanges(changes) {\n if (changes.hasOwnProperty('textLabel') || changes.hasOwnProperty('disabled')) {\n this._stateChanges.next();\n }\n }\n ngOnDestroy() {\n this._stateChanges.complete();\n }\n ngOnInit() {\n this._contentPortal = new TemplatePortal(this._explicitContent || this._implicitContent, this._viewContainerRef);\n }\n /**\n * This has been extracted to a util because of TS 4 and VE.\n * View Engine doesn't support property rename inheritance.\n * TS 4.0 doesn't allow properties to override accessors or vice-versa.\n * @docs-private\n */\n _setTemplateLabelInput(value) {\n // Only update the label if the query managed to find one. This works around an issue where a\n // user may have manually set `templateLabel` during creation mode, which would then get\n // clobbered by `undefined` when the query resolves. Also note that we check that the closest\n // tab matches the current one so that we don't pick up labels from nested tabs.\n if (value && value._closestTab === this) {\n this._templateLabel = value;\n }\n }\n static {\n this.ɵfac = function MatTab_Factory(t) {\n return new (t || MatTab)(i0.ɵɵdirectiveInject(i0.ViewContainerRef), i0.ɵɵdirectiveInject(MAT_TAB_GROUP, 8));\n };\n }\n static {\n this.ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: MatTab,\n selectors: [[\"mat-tab\"]],\n contentQueries: function MatTab_ContentQueries(rf, ctx, dirIndex) {\n if (rf & 1) {\n i0.ɵɵcontentQuery(dirIndex, MatTabLabel, 5);\n i0.ɵɵcontentQuery(dirIndex, MatTabContent, 7, TemplateRef);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.templateLabel = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._explicitContent = _t.first);\n }\n },\n viewQuery: function MatTab_Query(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵviewQuery(TemplateRef, 7);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._implicitContent = _t.first);\n }\n },\n hostAttrs: [\"hidden\", \"\"],\n inputs: {\n disabled: [2, \"disabled\", \"disabled\", booleanAttribute],\n textLabel: [0, \"label\", \"textLabel\"],\n ariaLabel: [0, \"aria-label\", \"ariaLabel\"],\n ariaLabelledby: [0, \"aria-labelledby\", \"ariaLabelledby\"],\n labelClass: \"labelClass\",\n bodyClass: \"bodyClass\"\n },\n exportAs: [\"matTab\"],\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: MAT_TAB,\n useExisting: MatTab\n }]), i0.ɵɵInputTransformsFeature, i0.ɵɵNgOnChangesFeature, i0.ɵɵStandaloneFeature],\n ngContentSelectors: _c0,\n decls: 1,\n vars: 0,\n template: function MatTab_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵprojectionDef();\n i0.ɵɵtemplate(0, MatTab_ng_template_0_Template, 1, 0, \"ng-template\");\n }\n },\n encapsulation: 2\n });\n }\n }\n return MatTab;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Class that is applied when a tab indicator is active. */\nconst ACTIVE_CLASS = 'mdc-tab-indicator--active';\n/** Class that is applied when the tab indicator should not transition. */\nconst NO_TRANSITION_CLASS = 'mdc-tab-indicator--no-transition';\n/**\n * Abstraction around the MDC tab indicator that acts as the tab header's ink bar.\n * @docs-private\n */\nclass MatInkBar {\n constructor(_items) {\n this._items = _items;\n }\n /** Hides the ink bar. */\n hide() {\n this._items.forEach(item => item.deactivateInkBar());\n }\n /** Aligns the ink bar to a DOM node. */\n alignToElement(element) {\n const correspondingItem = this._items.find(item => item.elementRef.nativeElement === element);\n const currentItem = this._currentItem;\n if (correspondingItem === currentItem) {\n return;\n }\n currentItem?.deactivateInkBar();\n if (correspondingItem) {\n const domRect = currentItem?.elementRef.nativeElement.getBoundingClientRect?.();\n // The ink bar won't animate unless we give it the `DOMRect` of the previous item.\n correspondingItem.activateInkBar(domRect);\n this._currentItem = correspondingItem;\n }\n }\n}\nlet InkBarItem = /*#__PURE__*/(() => {\n class InkBarItem {\n constructor() {\n this._elementRef = inject(ElementRef);\n this._fitToContent = false;\n }\n /** Whether the ink bar should fit to the entire tab or just its content. */\n get fitInkBarToContent() {\n return this._fitToContent;\n }\n set fitInkBarToContent(newValue) {\n if (this._fitToContent !== newValue) {\n this._fitToContent = newValue;\n if (this._inkBarElement) {\n this._appendInkBarElement();\n }\n }\n }\n /** Aligns the ink bar to the current item. */\n activateInkBar(previousIndicatorClientRect) {\n const element = this._elementRef.nativeElement;\n // Early exit if no indicator is present to handle cases where an indicator\n // may be activated without a prior indicator state\n if (!previousIndicatorClientRect || !element.getBoundingClientRect || !this._inkBarContentElement) {\n element.classList.add(ACTIVE_CLASS);\n return;\n }\n // This animation uses the FLIP approach. You can read more about it at the link below:\n // https://aerotwist.com/blog/flip-your-animations/\n // Calculate the dimensions based on the dimensions of the previous indicator\n const currentClientRect = element.getBoundingClientRect();\n const widthDelta = previousIndicatorClientRect.width / currentClientRect.width;\n const xPosition = previousIndicatorClientRect.left - currentClientRect.left;\n element.classList.add(NO_TRANSITION_CLASS);\n this._inkBarContentElement.style.setProperty('transform', `translateX(${xPosition}px) scaleX(${widthDelta})`);\n // Force repaint before updating classes and transform to ensure the transform properly takes effect\n element.getBoundingClientRect();\n element.classList.remove(NO_TRANSITION_CLASS);\n element.classList.add(ACTIVE_CLASS);\n this._inkBarContentElement.style.setProperty('transform', '');\n }\n /** Removes the ink bar from the current item. */\n deactivateInkBar() {\n this._elementRef.nativeElement.classList.remove(ACTIVE_CLASS);\n }\n /** Initializes the foundation. */\n ngOnInit() {\n this._createInkBarElement();\n }\n /** Destroys the foundation. */\n ngOnDestroy() {\n this._inkBarElement?.remove();\n this._inkBarElement = this._inkBarContentElement = null;\n }\n /** Creates and appends the ink bar element. */\n _createInkBarElement() {\n const documentNode = this._elementRef.nativeElement.ownerDocument || document;\n const inkBarElement = this._inkBarElement = documentNode.createElement('span');\n const inkBarContentElement = this._inkBarContentElement = documentNode.createElement('span');\n inkBarElement.className = 'mdc-tab-indicator';\n inkBarContentElement.className = 'mdc-tab-indicator__content mdc-tab-indicator__content--underline';\n inkBarElement.appendChild(this._inkBarContentElement);\n this._appendInkBarElement();\n }\n /**\n * Appends the ink bar to the tab host element or content, depending on whether\n * the ink bar should fit to content.\n */\n _appendInkBarElement() {\n if (!this._inkBarElement && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('Ink bar element has not been created and cannot be appended');\n }\n const parentElement = this._fitToContent ? this._elementRef.nativeElement.querySelector('.mdc-tab__content') : this._elementRef.nativeElement;\n if (!parentElement && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('Missing element to host the ink bar');\n }\n parentElement.appendChild(this._inkBarElement);\n }\n static {\n this.ɵfac = function InkBarItem_Factory(t) {\n return new (t || InkBarItem)();\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: InkBarItem,\n inputs: {\n fitInkBarToContent: [2, \"fitInkBarToContent\", \"fitInkBarToContent\", booleanAttribute]\n },\n features: [i0.ɵɵInputTransformsFeature]\n });\n }\n }\n return InkBarItem;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * The default positioner function for the MatInkBar.\n * @docs-private\n */\nfunction _MAT_INK_BAR_POSITIONER_FACTORY() {\n const method = element => ({\n left: element ? (element.offsetLeft || 0) + 'px' : '0',\n width: element ? (element.offsetWidth || 0) + 'px' : '0'\n });\n return method;\n}\n/** Injection token for the MatInkBar's Positioner. */\nconst _MAT_INK_BAR_POSITIONER = /*#__PURE__*/new InjectionToken('MatInkBarPositioner', {\n providedIn: 'root',\n factory: _MAT_INK_BAR_POSITIONER_FACTORY\n});\n\n/**\n * Used in the `mat-tab-group` view to display tab labels.\n * @docs-private\n */\nlet MatTabLabelWrapper = /*#__PURE__*/(() => {\n class MatTabLabelWrapper extends InkBarItem {\n constructor(elementRef) {\n super();\n this.elementRef = elementRef;\n /** Whether the tab is disabled. */\n this.disabled = false;\n }\n /** Sets focus on the wrapper element */\n focus() {\n this.elementRef.nativeElement.focus();\n }\n getOffsetLeft() {\n return this.elementRef.nativeElement.offsetLeft;\n }\n getOffsetWidth() {\n return this.elementRef.nativeElement.offsetWidth;\n }\n static {\n this.ɵfac = function MatTabLabelWrapper_Factory(t) {\n return new (t || MatTabLabelWrapper)(i0.ɵɵdirectiveInject(i0.ElementRef));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatTabLabelWrapper,\n selectors: [[\"\", \"matTabLabelWrapper\", \"\"]],\n hostVars: 3,\n hostBindings: function MatTabLabelWrapper_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵattribute(\"aria-disabled\", !!ctx.disabled);\n i0.ɵɵclassProp(\"mat-mdc-tab-disabled\", ctx.disabled);\n }\n },\n inputs: {\n disabled: [2, \"disabled\", \"disabled\", booleanAttribute]\n },\n standalone: true,\n features: [i0.ɵɵInputTransformsFeature, i0.ɵɵInheritDefinitionFeature]\n });\n }\n }\n return MatTabLabelWrapper;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Config used to bind passive event listeners */\nconst passiveEventListenerOptions = /*#__PURE__*/normalizePassiveListenerOptions({\n passive: true\n});\n/**\n * Amount of milliseconds to wait before starting to scroll the header automatically.\n * Set a little conservatively in order to handle fake events dispatched on touch devices.\n */\nconst HEADER_SCROLL_DELAY = 650;\n/**\n * Interval in milliseconds at which to scroll the header\n * while the user is holding their pointer.\n */\nconst HEADER_SCROLL_INTERVAL = 100;\n/**\n * Base class for a tab header that supported pagination.\n * @docs-private\n */\nlet MatPaginatedTabHeader = /*#__PURE__*/(() => {\n class MatPaginatedTabHeader {\n /** The index of the active tab. */\n get selectedIndex() {\n return this._selectedIndex;\n }\n set selectedIndex(v) {\n const value = isNaN(v) ? 0 : v;\n if (this._selectedIndex != value) {\n this._selectedIndexChanged = true;\n this._selectedIndex = value;\n if (this._keyManager) {\n this._keyManager.updateActiveItem(value);\n }\n }\n }\n constructor(_elementRef, _changeDetectorRef, _viewportRuler, _dir, _ngZone, _platform, _animationMode) {\n this._elementRef = _elementRef;\n this._changeDetectorRef = _changeDetectorRef;\n this._viewportRuler = _viewportRuler;\n this._dir = _dir;\n this._ngZone = _ngZone;\n this._platform = _platform;\n this._animationMode = _animationMode;\n /** The distance in pixels that the tab labels should be translated to the left. */\n this._scrollDistance = 0;\n /** Whether the header should scroll to the selected index after the view has been checked. */\n this._selectedIndexChanged = false;\n /** Emits when the component is destroyed. */\n this._destroyed = new Subject();\n /** Whether the controls for pagination should be displayed */\n this._showPaginationControls = false;\n /** Whether the tab list can be scrolled more towards the end of the tab label list. */\n this._disableScrollAfter = true;\n /** Whether the tab list can be scrolled more towards the beginning of the tab label list. */\n this._disableScrollBefore = true;\n /** Stream that will stop the automated scrolling. */\n this._stopScrolling = new Subject();\n /**\n * Whether pagination should be disabled. This can be used to avoid unnecessary\n * layout recalculations if it's known that pagination won't be required.\n */\n this.disablePagination = false;\n this._selectedIndex = 0;\n /** Event emitted when the option is selected. */\n this.selectFocusedIndex = new EventEmitter();\n /** Event emitted when a label is focused. */\n this.indexFocused = new EventEmitter();\n this._sharedResizeObserver = inject(SharedResizeObserver);\n this._injector = inject(Injector);\n // Bind the `mouseleave` event on the outside since it doesn't change anything in the view.\n _ngZone.runOutsideAngular(() => {\n fromEvent(_elementRef.nativeElement, 'mouseleave').pipe(takeUntil(this._destroyed)).subscribe(() => {\n this._stopInterval();\n });\n });\n }\n ngAfterViewInit() {\n // We need to handle these events manually, because we want to bind passive event listeners.\n fromEvent(this._previousPaginator.nativeElement, 'touchstart', passiveEventListenerOptions).pipe(takeUntil(this._destroyed)).subscribe(() => {\n this._handlePaginatorPress('before');\n });\n fromEvent(this._nextPaginator.nativeElement, 'touchstart', passiveEventListenerOptions).pipe(takeUntil(this._destroyed)).subscribe(() => {\n this._handlePaginatorPress('after');\n });\n }\n ngAfterContentInit() {\n const dirChange = this._dir ? this._dir.change : of('ltr');\n // We need to debounce resize events because the alignment logic is expensive.\n // If someone animates the width of tabs, we don't want to realign on every animation frame.\n // Once we haven't seen any more resize events in the last 32ms (~2 animaion frames) we can\n // re-align.\n const resize = this._sharedResizeObserver.observe(this._elementRef.nativeElement).pipe(debounceTime(32), takeUntil(this._destroyed));\n // Note: We do not actually need to watch these events for proper functioning of the tabs,\n // the resize events above should capture any viewport resize that we care about. However,\n // removing this is fairly breaking for screenshot tests, so we're leaving it here for now.\n const viewportResize = this._viewportRuler.change(150).pipe(takeUntil(this._destroyed));\n const realign = () => {\n this.updatePagination();\n this._alignInkBarToSelectedTab();\n };\n this._keyManager = new FocusKeyManager(this._items).withHorizontalOrientation(this._getLayoutDirection()).withHomeAndEnd().withWrap()\n // Allow focus to land on disabled tabs, as per https://w3c.github.io/aria-practices/#kbd_disabled_controls\n .skipPredicate(() => false);\n this._keyManager.updateActiveItem(this._selectedIndex);\n // Note: We do not need to realign after the first render for proper functioning of the tabs\n // the resize events above should fire when we first start observing the element. However,\n // removing this is fairly breaking for screenshot tests, so we're leaving it here for now.\n afterNextRender(realign, {\n injector: this._injector\n });\n // On dir change or resize, realign the ink bar and update the orientation of\n // the key manager if the direction has changed.\n merge(dirChange, viewportResize, resize, this._items.changes, this._itemsResized()).pipe(takeUntil(this._destroyed)).subscribe(() => {\n // We need to defer this to give the browser some time to recalculate\n // the element dimensions. The call has to be wrapped in `NgZone.run`,\n // because the viewport change handler runs outside of Angular.\n this._ngZone.run(() => {\n Promise.resolve().then(() => {\n // Clamp the scroll distance, because it can change with the number of tabs.\n this._scrollDistance = Math.max(0, Math.min(this._getMaxScrollDistance(), this._scrollDistance));\n realign();\n });\n });\n this._keyManager.withHorizontalOrientation(this._getLayoutDirection());\n });\n // If there is a change in the focus key manager we need to emit the `indexFocused`\n // event in order to provide a public event that notifies about focus changes. Also we realign\n // the tabs container by scrolling the new focused tab into the visible section.\n this._keyManager.change.subscribe(newFocusIndex => {\n this.indexFocused.emit(newFocusIndex);\n this._setTabFocus(newFocusIndex);\n });\n }\n /** Sends any changes that could affect the layout of the items. */\n _itemsResized() {\n if (typeof ResizeObserver !== 'function') {\n return EMPTY;\n }\n return this._items.changes.pipe(startWith(this._items), switchMap(tabItems => new Observable(observer => this._ngZone.runOutsideAngular(() => {\n const resizeObserver = new ResizeObserver(entries => observer.next(entries));\n tabItems.forEach(item => resizeObserver.observe(item.elementRef.nativeElement));\n return () => {\n resizeObserver.disconnect();\n };\n }))),\n // Skip the first emit since the resize observer emits when an item\n // is observed for new items when the tab is already inserted\n skip(1),\n // Skip emissions where all the elements are invisible since we don't want\n // the header to try and re-render with invalid measurements. See #25574.\n filter(entries => entries.some(e => e.contentRect.width > 0 && e.contentRect.height > 0)));\n }\n ngAfterContentChecked() {\n // If the number of tab labels have changed, check if scrolling should be enabled\n if (this._tabLabelCount != this._items.length) {\n this.updatePagination();\n this._tabLabelCount = this._items.length;\n this._changeDetectorRef.markForCheck();\n }\n // If the selected index has changed, scroll to the label and check if the scrolling controls\n // should be disabled.\n if (this._selectedIndexChanged) {\n this._scrollToLabel(this._selectedIndex);\n this._checkScrollingControls();\n this._alignInkBarToSelectedTab();\n this._selectedIndexChanged = false;\n this._changeDetectorRef.markForCheck();\n }\n // If the scroll distance has been changed (tab selected, focused, scroll controls activated),\n // then translate the header to reflect this.\n if (this._scrollDistanceChanged) {\n this._updateTabScrollPosition();\n this._scrollDistanceChanged = false;\n this._changeDetectorRef.markForCheck();\n }\n }\n ngOnDestroy() {\n this._keyManager?.destroy();\n this._destroyed.next();\n this._destroyed.complete();\n this._stopScrolling.complete();\n }\n /** Handles keyboard events on the header. */\n _handleKeydown(event) {\n // We don't handle any key bindings with a modifier key.\n if (hasModifierKey(event)) {\n return;\n }\n switch (event.keyCode) {\n case ENTER:\n case SPACE:\n if (this.focusIndex !== this.selectedIndex) {\n const item = this._items.get(this.focusIndex);\n if (item && !item.disabled) {\n this.selectFocusedIndex.emit(this.focusIndex);\n this._itemSelected(event);\n }\n }\n break;\n default:\n this._keyManager.onKeydown(event);\n }\n }\n /**\n * Callback for when the MutationObserver detects that the content has changed.\n */\n _onContentChanges() {\n const textContent = this._elementRef.nativeElement.textContent;\n // We need to diff the text content of the header, because the MutationObserver callback\n // will fire even if the text content didn't change which is inefficient and is prone\n // to infinite loops if a poorly constructed expression is passed in (see #14249).\n if (textContent !== this._currentTextContent) {\n this._currentTextContent = textContent || '';\n // The content observer runs outside the `NgZone` by default, which\n // means that we need to bring the callback back in ourselves.\n this._ngZone.run(() => {\n this.updatePagination();\n this._alignInkBarToSelectedTab();\n this._changeDetectorRef.markForCheck();\n });\n }\n }\n /**\n * Updates the view whether pagination should be enabled or not.\n *\n * WARNING: Calling this method can be very costly in terms of performance. It should be called\n * as infrequently as possible from outside of the Tabs component as it causes a reflow of the\n * page.\n */\n updatePagination() {\n this._checkPaginationEnabled();\n this._checkScrollingControls();\n this._updateTabScrollPosition();\n }\n /** Tracks which element has focus; used for keyboard navigation */\n get focusIndex() {\n return this._keyManager ? this._keyManager.activeItemIndex : 0;\n }\n /** When the focus index is set, we must manually send focus to the correct label */\n set focusIndex(value) {\n if (!this._isValidIndex(value) || this.focusIndex === value || !this._keyManager) {\n return;\n }\n this._keyManager.setActiveItem(value);\n }\n /**\n * Determines if an index is valid. If the tabs are not ready yet, we assume that the user is\n * providing a valid index and return true.\n */\n _isValidIndex(index) {\n return this._items ? !!this._items.toArray()[index] : true;\n }\n /**\n * Sets focus on the HTML element for the label wrapper and scrolls it into the view if\n * scrolling is enabled.\n */\n _setTabFocus(tabIndex) {\n if (this._showPaginationControls) {\n this._scrollToLabel(tabIndex);\n }\n if (this._items && this._items.length) {\n this._items.toArray()[tabIndex].focus();\n // Do not let the browser manage scrolling to focus the element, this will be handled\n // by using translation. In LTR, the scroll left should be 0. In RTL, the scroll width\n // should be the full width minus the offset width.\n const containerEl = this._tabListContainer.nativeElement;\n const dir = this._getLayoutDirection();\n if (dir == 'ltr') {\n containerEl.scrollLeft = 0;\n } else {\n containerEl.scrollLeft = containerEl.scrollWidth - containerEl.offsetWidth;\n }\n }\n }\n /** The layout direction of the containing app. */\n _getLayoutDirection() {\n return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';\n }\n /** Performs the CSS transformation on the tab list that will cause the list to scroll. */\n _updateTabScrollPosition() {\n if (this.disablePagination) {\n return;\n }\n const scrollDistance = this.scrollDistance;\n const translateX = this._getLayoutDirection() === 'ltr' ? -scrollDistance : scrollDistance;\n // Don't use `translate3d` here because we don't want to create a new layer. A new layer\n // seems to cause flickering and overflow in Internet Explorer. For example, the ink bar\n // and ripples will exceed the boundaries of the visible tab bar.\n // See: https://github.com/angular/components/issues/10276\n // We round the `transform` here, because transforms with sub-pixel precision cause some\n // browsers to blur the content of the element.\n this._tabList.nativeElement.style.transform = `translateX(${Math.round(translateX)}px)`;\n // Setting the `transform` on IE will change the scroll offset of the parent, causing the\n // position to be thrown off in some cases. We have to reset it ourselves to ensure that\n // it doesn't get thrown off. Note that we scope it only to IE and Edge, because messing\n // with the scroll position throws off Chrome 71+ in RTL mode (see #14689).\n if (this._platform.TRIDENT || this._platform.EDGE) {\n this._tabListContainer.nativeElement.scrollLeft = 0;\n }\n }\n /** Sets the distance in pixels that the tab header should be transformed in the X-axis. */\n get scrollDistance() {\n return this._scrollDistance;\n }\n set scrollDistance(value) {\n this._scrollTo(value);\n }\n /**\n * Moves the tab list in the 'before' or 'after' direction (towards the beginning of the list or\n * the end of the list, respectively). The distance to scroll is computed to be a third of the\n * length of the tab list view window.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n _scrollHeader(direction) {\n const viewLength = this._tabListContainer.nativeElement.offsetWidth;\n // Move the scroll distance one-third the length of the tab list's viewport.\n const scrollAmount = (direction == 'before' ? -1 : 1) * viewLength / 3;\n return this._scrollTo(this._scrollDistance + scrollAmount);\n }\n /** Handles click events on the pagination arrows. */\n _handlePaginatorClick(direction) {\n this._stopInterval();\n this._scrollHeader(direction);\n }\n /**\n * Moves the tab list such that the desired tab label (marked by index) is moved into view.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n _scrollToLabel(labelIndex) {\n if (this.disablePagination) {\n return;\n }\n const selectedLabel = this._items ? this._items.toArray()[labelIndex] : null;\n if (!selectedLabel) {\n return;\n }\n // The view length is the visible width of the tab labels.\n const viewLength = this._tabListContainer.nativeElement.offsetWidth;\n const {\n offsetLeft,\n offsetWidth\n } = selectedLabel.elementRef.nativeElement;\n let labelBeforePos, labelAfterPos;\n if (this._getLayoutDirection() == 'ltr') {\n labelBeforePos = offsetLeft;\n labelAfterPos = labelBeforePos + offsetWidth;\n } else {\n labelAfterPos = this._tabListInner.nativeElement.offsetWidth - offsetLeft;\n labelBeforePos = labelAfterPos - offsetWidth;\n }\n const beforeVisiblePos = this.scrollDistance;\n const afterVisiblePos = this.scrollDistance + viewLength;\n if (labelBeforePos < beforeVisiblePos) {\n // Scroll header to move label to the before direction\n this.scrollDistance -= beforeVisiblePos - labelBeforePos;\n } else if (labelAfterPos > afterVisiblePos) {\n // Scroll header to move label to the after direction\n this.scrollDistance += Math.min(labelAfterPos - afterVisiblePos, labelBeforePos - beforeVisiblePos);\n }\n }\n /**\n * Evaluate whether the pagination controls should be displayed. If the scroll width of the\n * tab list is wider than the size of the header container, then the pagination controls should\n * be shown.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n _checkPaginationEnabled() {\n if (this.disablePagination) {\n this._showPaginationControls = false;\n } else {\n const scrollWidth = this._tabListInner.nativeElement.scrollWidth;\n const containerWidth = this._elementRef.nativeElement.offsetWidth;\n // Usually checking that the scroll width is greater than the container width should be\n // enough, but on Safari at specific widths the browser ends up rounding up when there's\n // no pagination and rounding down once the pagination is added. This can throw the component\n // into an infinite loop where the pagination shows up and disappears constantly. We work\n // around it by adding a threshold to the calculation. From manual testing the threshold\n // can be lowered to 2px and still resolve the issue, but we set a higher one to be safe.\n // This shouldn't cause any content to be clipped, because tabs have a 24px horizontal\n // padding. See b/316395154 for more information.\n const isEnabled = scrollWidth - containerWidth >= 5;\n if (!isEnabled) {\n this.scrollDistance = 0;\n }\n if (isEnabled !== this._showPaginationControls) {\n this._showPaginationControls = isEnabled;\n this._changeDetectorRef.markForCheck();\n }\n }\n }\n /**\n * Evaluate whether the before and after controls should be enabled or disabled.\n * If the header is at the beginning of the list (scroll distance is equal to 0) then disable the\n * before button. If the header is at the end of the list (scroll distance is equal to the\n * maximum distance we can scroll), then disable the after button.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n _checkScrollingControls() {\n if (this.disablePagination) {\n this._disableScrollAfter = this._disableScrollBefore = true;\n } else {\n // Check if the pagination arrows should be activated.\n this._disableScrollBefore = this.scrollDistance == 0;\n this._disableScrollAfter = this.scrollDistance == this._getMaxScrollDistance();\n this._changeDetectorRef.markForCheck();\n }\n }\n /**\n * Determines what is the maximum length in pixels that can be set for the scroll distance. This\n * is equal to the difference in width between the tab list container and tab header container.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n _getMaxScrollDistance() {\n const lengthOfTabList = this._tabListInner.nativeElement.scrollWidth;\n const viewLength = this._tabListContainer.nativeElement.offsetWidth;\n return lengthOfTabList - viewLength || 0;\n }\n /** Tells the ink-bar to align itself to the current label wrapper */\n _alignInkBarToSelectedTab() {\n const selectedItem = this._items && this._items.length ? this._items.toArray()[this.selectedIndex] : null;\n const selectedLabelWrapper = selectedItem ? selectedItem.elementRef.nativeElement : null;\n if (selectedLabelWrapper) {\n this._inkBar.alignToElement(selectedLabelWrapper);\n } else {\n this._inkBar.hide();\n }\n }\n /** Stops the currently-running paginator interval. */\n _stopInterval() {\n this._stopScrolling.next();\n }\n /**\n * Handles the user pressing down on one of the paginators.\n * Starts scrolling the header after a certain amount of time.\n * @param direction In which direction the paginator should be scrolled.\n */\n _handlePaginatorPress(direction, mouseEvent) {\n // Don't start auto scrolling for right mouse button clicks. Note that we shouldn't have to\n // null check the `button`, but we do it so we don't break tests that use fake events.\n if (mouseEvent && mouseEvent.button != null && mouseEvent.button !== 0) {\n return;\n }\n // Avoid overlapping timers.\n this._stopInterval();\n // Start a timer after the delay and keep firing based on the interval.\n timer(HEADER_SCROLL_DELAY, HEADER_SCROLL_INTERVAL)\n // Keep the timer going until something tells it to stop or the component is destroyed.\n .pipe(takeUntil(merge(this._stopScrolling, this._destroyed))).subscribe(() => {\n const {\n maxScrollDistance,\n distance\n } = this._scrollHeader(direction);\n // Stop the timer if we've reached the start or the end.\n if (distance === 0 || distance >= maxScrollDistance) {\n this._stopInterval();\n }\n });\n }\n /**\n * Scrolls the header to a given position.\n * @param position Position to which to scroll.\n * @returns Information on the current scroll distance and the maximum.\n */\n _scrollTo(position) {\n if (this.disablePagination) {\n return {\n maxScrollDistance: 0,\n distance: 0\n };\n }\n const maxScrollDistance = this._getMaxScrollDistance();\n this._scrollDistance = Math.max(0, Math.min(maxScrollDistance, position));\n // Mark that the scroll distance has changed so that after the view is checked, the CSS\n // transformation can move the header.\n this._scrollDistanceChanged = true;\n this._checkScrollingControls();\n return {\n maxScrollDistance,\n distance: this._scrollDistance\n };\n }\n static {\n this.ɵfac = function MatPaginatedTabHeader_Factory(t) {\n return new (t || MatPaginatedTabHeader)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.ViewportRuler), i0.ɵɵdirectiveInject(i2.Directionality, 8), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i3.Platform), i0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatPaginatedTabHeader,\n inputs: {\n disablePagination: [2, \"disablePagination\", \"disablePagination\", booleanAttribute],\n selectedIndex: [2, \"selectedIndex\", \"selectedIndex\", numberAttribute]\n },\n outputs: {\n selectFocusedIndex: \"selectFocusedIndex\",\n indexFocused: \"indexFocused\"\n },\n features: [i0.ɵɵInputTransformsFeature]\n });\n }\n }\n return MatPaginatedTabHeader;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * The header of the tab group which displays a list of all the tabs in the tab group. Includes\n * an ink bar that follows the currently selected tab. When the tabs list's width exceeds the\n * width of the header container, then arrows will be displayed to allow the user to scroll\n * left and right across the header.\n * @docs-private\n */\nlet MatTabHeader = /*#__PURE__*/(() => {\n class MatTabHeader extends MatPaginatedTabHeader {\n constructor(elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode) {\n super(elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode);\n /** Whether the ripple effect is disabled or not. */\n this.disableRipple = false;\n }\n ngAfterContentInit() {\n this._inkBar = new MatInkBar(this._items);\n super.ngAfterContentInit();\n }\n _itemSelected(event) {\n event.preventDefault();\n }\n static {\n this.ɵfac = function MatTabHeader_Factory(t) {\n return new (t || MatTabHeader)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.ViewportRuler), i0.ɵɵdirectiveInject(i2.Directionality, 8), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i3.Platform), i0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8));\n };\n }\n static {\n this.ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: MatTabHeader,\n selectors: [[\"mat-tab-header\"]],\n contentQueries: function MatTabHeader_ContentQueries(rf, ctx, dirIndex) {\n if (rf & 1) {\n i0.ɵɵcontentQuery(dirIndex, MatTabLabelWrapper, 4);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._items = _t);\n }\n },\n viewQuery: function MatTabHeader_Query(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵviewQuery(_c1, 7);\n i0.ɵɵviewQuery(_c2, 7);\n i0.ɵɵviewQuery(_c3, 7);\n i0.ɵɵviewQuery(_c4, 5);\n i0.ɵɵviewQuery(_c5, 5);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._tabListContainer = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._tabList = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._tabListInner = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._nextPaginator = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._previousPaginator = _t.first);\n }\n },\n hostAttrs: [1, \"mat-mdc-tab-header\"],\n hostVars: 4,\n hostBindings: function MatTabHeader_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵclassProp(\"mat-mdc-tab-header-pagination-controls-enabled\", ctx._showPaginationControls)(\"mat-mdc-tab-header-rtl\", ctx._getLayoutDirection() == \"rtl\");\n }\n },\n inputs: {\n disableRipple: [2, \"disableRipple\", \"disableRipple\", booleanAttribute]\n },\n standalone: true,\n features: [i0.ɵɵInputTransformsFeature, i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature],\n ngContentSelectors: _c0,\n decls: 13,\n vars: 10,\n consts: [[\"previousPaginator\", \"\"], [\"tabListContainer\", \"\"], [\"tabList\", \"\"], [\"tabListInner\", \"\"], [\"nextPaginator\", \"\"], [\"aria-hidden\", \"true\", \"type\", \"button\", \"mat-ripple\", \"\", \"tabindex\", \"-1\", 1, \"mat-mdc-tab-header-pagination\", \"mat-mdc-tab-header-pagination-before\", 3, \"click\", \"mousedown\", \"touchend\", \"matRippleDisabled\", \"disabled\"], [1, \"mat-mdc-tab-header-pagination-chevron\"], [1, \"mat-mdc-tab-label-container\", 3, \"keydown\"], [\"role\", \"tablist\", 1, \"mat-mdc-tab-list\", 3, \"cdkObserveContent\"], [1, \"mat-mdc-tab-labels\"], [\"aria-hidden\", \"true\", \"type\", \"button\", \"mat-ripple\", \"\", \"tabindex\", \"-1\", 1, \"mat-mdc-tab-header-pagination\", \"mat-mdc-tab-header-pagination-after\", 3, \"mousedown\", \"click\", \"touchend\", \"matRippleDisabled\", \"disabled\"]],\n template: function MatTabHeader_Template(rf, ctx) {\n if (rf & 1) {\n const _r1 = i0.ɵɵgetCurrentView();\n i0.ɵɵprojectionDef();\n i0.ɵɵelementStart(0, \"button\", 5, 0);\n i0.ɵɵlistener(\"click\", function MatTabHeader_Template_button_click_0_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._handlePaginatorClick(\"before\"));\n })(\"mousedown\", function MatTabHeader_Template_button_mousedown_0_listener($event) {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._handlePaginatorPress(\"before\", $event));\n })(\"touchend\", function MatTabHeader_Template_button_touchend_0_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._stopInterval());\n });\n i0.ɵɵelement(2, \"div\", 6);\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(3, \"div\", 7, 1);\n i0.ɵɵlistener(\"keydown\", function MatTabHeader_Template_div_keydown_3_listener($event) {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._handleKeydown($event));\n });\n i0.ɵɵelementStart(5, \"div\", 8, 2);\n i0.ɵɵlistener(\"cdkObserveContent\", function MatTabHeader_Template_div_cdkObserveContent_5_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._onContentChanges());\n });\n i0.ɵɵelementStart(7, \"div\", 9, 3);\n i0.ɵɵprojection(9);\n i0.ɵɵelementEnd()()();\n i0.ɵɵelementStart(10, \"button\", 10, 4);\n i0.ɵɵlistener(\"mousedown\", function MatTabHeader_Template_button_mousedown_10_listener($event) {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._handlePaginatorPress(\"after\", $event));\n })(\"click\", function MatTabHeader_Template_button_click_10_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._handlePaginatorClick(\"after\"));\n })(\"touchend\", function MatTabHeader_Template_button_touchend_10_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._stopInterval());\n });\n i0.ɵɵelement(12, \"div\", 6);\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n i0.ɵɵclassProp(\"mat-mdc-tab-header-pagination-disabled\", ctx._disableScrollBefore);\n i0.ɵɵproperty(\"matRippleDisabled\", ctx._disableScrollBefore || ctx.disableRipple)(\"disabled\", ctx._disableScrollBefore || null);\n i0.ɵɵadvance(3);\n i0.ɵɵclassProp(\"_mat-animation-noopable\", ctx._animationMode === \"NoopAnimations\");\n i0.ɵɵadvance(7);\n i0.ɵɵclassProp(\"mat-mdc-tab-header-pagination-disabled\", ctx._disableScrollAfter);\n i0.ɵɵproperty(\"matRippleDisabled\", ctx._disableScrollAfter || ctx.disableRipple)(\"disabled\", ctx._disableScrollAfter || null);\n }\n },\n dependencies: [MatRipple, CdkObserveContent],\n styles: [\".mat-mdc-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0}.mdc-tab-indicator .mdc-tab-indicator__content{transition-duration:var(--mat-tab-animation-duration, 250ms)}.mat-mdc-tab-header-pagination{-webkit-user-select:none;user-select:none;position:relative;display:none;justify-content:center;align-items:center;min-width:32px;cursor:pointer;z-index:2;-webkit-tap-highlight-color:rgba(0,0,0,0);touch-action:none;box-sizing:content-box;background:none;border:none;outline:0;padding:0}.mat-mdc-tab-header-pagination::-moz-focus-inner{border:0}.mat-mdc-tab-header-pagination .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-header-inactive-ripple-color)}.mat-mdc-tab-header-pagination-controls-enabled .mat-mdc-tab-header-pagination{display:flex}.mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after{padding-left:4px}.mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-pagination-after{padding-right:4px}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-mdc-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;height:8px;width:8px;border-color:var(--mat-tab-header-pagination-icon-color)}.mat-mdc-tab-header-pagination-disabled{box-shadow:none;cursor:default;pointer-events:none}.mat-mdc-tab-header-pagination-disabled .mat-mdc-tab-header-pagination-chevron{opacity:.4}.mat-mdc-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-mdc-tab-list{transition:none}.mat-mdc-tab-label-container{display:flex;flex-grow:1;overflow:hidden;z-index:1;border-bottom-style:solid;border-bottom-width:var(--mat-tab-header-divider-height);border-bottom-color:var(--mat-tab-header-divider-color)}.mat-mdc-tab-group-inverted-header .mat-mdc-tab-label-container{border-bottom:none;border-top-style:solid;border-top-width:var(--mat-tab-header-divider-height);border-top-color:var(--mat-tab-header-divider-color)}.mat-mdc-tab-labels{display:flex;flex:1 0 auto}[mat-align-tabs=center]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:center}[mat-align-tabs=end]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:flex-end}.cdk-drop-list .mat-mdc-tab-labels,.mat-mdc-tab-labels.cdk-drop-list{min-height:var(--mdc-secondary-navigation-tab-container-height)}.mat-mdc-tab::before{margin:5px}.cdk-high-contrast-active .mat-mdc-tab[aria-disabled=true]{color:GrayText}\"],\n encapsulation: 2\n });\n }\n }\n return MatTabHeader;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Injection token that can be used to provide the default options the tabs module. */\nconst MAT_TABS_CONFIG = /*#__PURE__*/new InjectionToken('MAT_TABS_CONFIG');\n\n/**\n * Animations used by the Material tabs.\n * @docs-private\n */\nconst matTabsAnimations = {\n /** Animation translates a tab along the X axis. */\n translateTab: /*#__PURE__*/trigger('translateTab', [\n /*#__PURE__*/\n // Transitions to `none` instead of 0, because some browsers might blur the content.\n state('center, void, left-origin-center, right-origin-center', /*#__PURE__*/style({\n transform: 'none',\n visibility: 'visible'\n })),\n /*#__PURE__*/\n // If the tab is either on the left or right, we additionally add a `min-height` of 1px\n // in order to ensure that the element has a height before its state changes. This is\n // necessary because Chrome does seem to skip the transition in RTL mode if the element does\n // not have a static height and is not rendered. See related issue: #9465\n state('left', /*#__PURE__*/style({\n transform: 'translate3d(-100%, 0, 0)',\n minHeight: '1px',\n // Normally this is redundant since we detach the content from the DOM, but if the user\n // opted into keeping the content in the DOM, we have to hide it so it isn't focusable.\n visibility: 'hidden'\n })), /*#__PURE__*/state('right', /*#__PURE__*/style({\n transform: 'translate3d(100%, 0, 0)',\n minHeight: '1px',\n visibility: 'hidden'\n })), /*#__PURE__*/transition('* => left, * => right, left => center, right => center', /*#__PURE__*/animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)')), /*#__PURE__*/transition('void => left-origin-center', [/*#__PURE__*/style({\n transform: 'translate3d(-100%, 0, 0)',\n visibility: 'hidden'\n }), /*#__PURE__*/animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)')]), /*#__PURE__*/transition('void => right-origin-center', [/*#__PURE__*/style({\n transform: 'translate3d(100%, 0, 0)',\n visibility: 'hidden'\n }), /*#__PURE__*/animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)')])])\n};\n\n/**\n * The portal host directive for the contents of the tab.\n * @docs-private\n */\nlet MatTabBodyPortal = /*#__PURE__*/(() => {\n class MatTabBodyPortal extends CdkPortalOutlet {\n constructor(componentFactoryResolver, viewContainerRef, _host, _document) {\n super(componentFactoryResolver, viewContainerRef, _document);\n this._host = _host;\n /** Subscription to events for when the tab body begins centering. */\n this._centeringSub = Subscription.EMPTY;\n /** Subscription to events for when the tab body finishes leaving from center position. */\n this._leavingSub = Subscription.EMPTY;\n }\n /** Set initial visibility or set up subscription for changing visibility. */\n ngOnInit() {\n super.ngOnInit();\n this._centeringSub = this._host._beforeCentering.pipe(startWith(this._host._isCenterPosition(this._host._position))).subscribe(isCentering => {\n if (this._host._content && isCentering && !this.hasAttached()) {\n this.attach(this._host._content);\n }\n });\n this._leavingSub = this._host._afterLeavingCenter.subscribe(() => {\n if (!this._host.preserveContent) {\n this.detach();\n }\n });\n }\n /** Clean up centering subscription. */\n ngOnDestroy() {\n super.ngOnDestroy();\n this._centeringSub.unsubscribe();\n this._leavingSub.unsubscribe();\n }\n static {\n this.ɵfac = function MatTabBodyPortal_Factory(t) {\n return new (t || MatTabBodyPortal)(i0.ɵɵdirectiveInject(i0.ComponentFactoryResolver), i0.ɵɵdirectiveInject(i0.ViewContainerRef), i0.ɵɵdirectiveInject(forwardRef(() => MatTabBody)), i0.ɵɵdirectiveInject(DOCUMENT));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatTabBodyPortal,\n selectors: [[\"\", \"matTabBodyHost\", \"\"]],\n standalone: true,\n features: [i0.ɵɵInheritDefinitionFeature]\n });\n }\n }\n return MatTabBodyPortal;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Wrapper for the contents of a tab.\n * @docs-private\n */\nlet MatTabBody = /*#__PURE__*/(() => {\n class MatTabBody {\n /** The shifted index position of the tab body, where zero represents the active center tab. */\n set position(position) {\n this._positionIndex = position;\n this._computePositionAnimationState();\n }\n constructor(_elementRef, _dir, changeDetectorRef) {\n this._elementRef = _elementRef;\n this._dir = _dir;\n /** Subscription to the directionality change observable. */\n this._dirChangeSubscription = Subscription.EMPTY;\n /** Emits when an animation on the tab is complete. */\n this._translateTabComplete = new Subject();\n /** Event emitted when the tab begins to animate towards the center as the active tab. */\n this._onCentering = new EventEmitter();\n /** Event emitted before the centering of the tab begins. */\n this._beforeCentering = new EventEmitter();\n /** Event emitted before the centering of the tab begins. */\n this._afterLeavingCenter = new EventEmitter();\n /** Event emitted when the tab completes its animation towards the center. */\n this._onCentered = new EventEmitter(true);\n // Note that the default value will always be overwritten by `MatTabBody`, but we need one\n // anyway to prevent the animations module from throwing an error if the body is used on its own.\n /** Duration for the tab's animation. */\n this.animationDuration = '500ms';\n /** Whether the tab's content should be kept in the DOM while it's off-screen. */\n this.preserveContent = false;\n if (_dir) {\n this._dirChangeSubscription = _dir.change.subscribe(dir => {\n this._computePositionAnimationState(dir);\n changeDetectorRef.markForCheck();\n });\n }\n // Ensure that we get unique animation events, because the `.done` callback can get\n // invoked twice in some browsers. See https://github.com/angular/angular/issues/24084.\n this._translateTabComplete.pipe(distinctUntilChanged((x, y) => {\n return x.fromState === y.fromState && x.toState === y.toState;\n })).subscribe(event => {\n // If the transition to the center is complete, emit an event.\n if (this._isCenterPosition(event.toState) && this._isCenterPosition(this._position)) {\n this._onCentered.emit();\n }\n if (this._isCenterPosition(event.fromState) && !this._isCenterPosition(this._position)) {\n this._afterLeavingCenter.emit();\n }\n });\n }\n /**\n * After initialized, check if the content is centered and has an origin. If so, set the\n * special position states that transition the tab from the left or right before centering.\n */\n ngOnInit() {\n if (this._position == 'center' && this.origin != null) {\n this._position = this._computePositionFromOrigin(this.origin);\n }\n }\n ngOnDestroy() {\n this._dirChangeSubscription.unsubscribe();\n this._translateTabComplete.complete();\n }\n _onTranslateTabStarted(event) {\n const isCentering = this._isCenterPosition(event.toState);\n this._beforeCentering.emit(isCentering);\n if (isCentering) {\n this._onCentering.emit(this._elementRef.nativeElement.clientHeight);\n }\n }\n /** The text direction of the containing app. */\n _getLayoutDirection() {\n return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';\n }\n /** Whether the provided position state is considered center, regardless of origin. */\n _isCenterPosition(position) {\n return position == 'center' || position == 'left-origin-center' || position == 'right-origin-center';\n }\n /** Computes the position state that will be used for the tab-body animation trigger. */\n _computePositionAnimationState(dir = this._getLayoutDirection()) {\n if (this._positionIndex < 0) {\n this._position = dir == 'ltr' ? 'left' : 'right';\n } else if (this._positionIndex > 0) {\n this._position = dir == 'ltr' ? 'right' : 'left';\n } else {\n this._position = 'center';\n }\n }\n /**\n * Computes the position state based on the specified origin position. This is used if the\n * tab is becoming visible immediately after creation.\n */\n _computePositionFromOrigin(origin) {\n const dir = this._getLayoutDirection();\n if (dir == 'ltr' && origin <= 0 || dir == 'rtl' && origin > 0) {\n return 'left-origin-center';\n }\n return 'right-origin-center';\n }\n static {\n this.ɵfac = function MatTabBody_Factory(t) {\n return new (t || MatTabBody)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i2.Directionality, 8), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef));\n };\n }\n static {\n this.ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: MatTabBody,\n selectors: [[\"mat-tab-body\"]],\n viewQuery: function MatTabBody_Query(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵviewQuery(CdkPortalOutlet, 5);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._portalHost = _t.first);\n }\n },\n hostAttrs: [1, \"mat-mdc-tab-body\"],\n inputs: {\n _content: [0, \"content\", \"_content\"],\n origin: \"origin\",\n animationDuration: \"animationDuration\",\n preserveContent: \"preserveContent\",\n position: \"position\"\n },\n outputs: {\n _onCentering: \"_onCentering\",\n _beforeCentering: \"_beforeCentering\",\n _afterLeavingCenter: \"_afterLeavingCenter\",\n _onCentered: \"_onCentered\"\n },\n standalone: true,\n features: [i0.ɵɵStandaloneFeature],\n decls: 3,\n vars: 6,\n consts: [[\"content\", \"\"], [\"cdkScrollable\", \"\", 1, \"mat-mdc-tab-body-content\"], [\"matTabBodyHost\", \"\"]],\n template: function MatTabBody_Template(rf, ctx) {\n if (rf & 1) {\n const _r1 = i0.ɵɵgetCurrentView();\n i0.ɵɵelementStart(0, \"div\", 1, 0);\n i0.ɵɵlistener(\"@translateTab.start\", function MatTabBody_Template_div_animation_translateTab_start_0_listener($event) {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._onTranslateTabStarted($event));\n })(\"@translateTab.done\", function MatTabBody_Template_div_animation_translateTab_done_0_listener($event) {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._translateTabComplete.next($event));\n });\n i0.ɵɵtemplate(2, MatTabBody_ng_template_2_Template, 0, 0, \"ng-template\", 2);\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n i0.ɵɵproperty(\"@translateTab\", i0.ɵɵpureFunction2(3, _c7, ctx._position, i0.ɵɵpureFunction1(1, _c6, ctx.animationDuration)));\n }\n },\n dependencies: [MatTabBodyPortal, CdkScrollable],\n styles: [\".mat-mdc-tab-body{top:0;left:0;right:0;bottom:0;position:absolute;display:block;overflow:hidden;outline:0;flex-basis:100%}.mat-mdc-tab-body.mat-mdc-tab-body-active{position:relative;overflow-x:hidden;overflow-y:auto;z-index:1;flex-grow:1}.mat-mdc-tab-group.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body.mat-mdc-tab-body-active{overflow-y:hidden}.mat-mdc-tab-body-content{height:100%;overflow:auto}.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body-content{overflow:hidden}.mat-mdc-tab-body-content[style*=\\\"visibility: hidden\\\"]{display:none}\"],\n encapsulation: 2,\n data: {\n animation: [matTabsAnimations.translateTab]\n }\n });\n }\n }\n return MatTabBody;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Used to generate unique ID's for each tab component */\nlet nextId = 0;\n/** Boolean constant that determines whether the tab group supports the `backgroundColor` input */\nconst ENABLE_BACKGROUND_INPUT = true;\n/**\n * Material design tab-group component. Supports basic tab pairs (label + content) and includes\n * animated ink-bar, keyboard navigation, and screen reader.\n * See: https://material.io/design/components/tabs.html\n */\nlet MatTabGroup = /*#__PURE__*/(() => {\n class MatTabGroup {\n /** Whether the ink bar should fit its width to the size of the tab label content. */\n get fitInkBarToContent() {\n return this._fitInkBarToContent;\n }\n set fitInkBarToContent(value) {\n this._fitInkBarToContent = value;\n this._changeDetectorRef.markForCheck();\n }\n /** The index of the active tab. */\n get selectedIndex() {\n return this._selectedIndex;\n }\n set selectedIndex(value) {\n this._indexToSelect = isNaN(value) ? null : value;\n }\n /** Duration for the tab animation. Will be normalized to milliseconds if no units are set. */\n get animationDuration() {\n return this._animationDuration;\n }\n set animationDuration(value) {\n const stringValue = value + '';\n this._animationDuration = /^\\d+$/.test(stringValue) ? value + 'ms' : stringValue;\n }\n /**\n * `tabindex` to be set on the inner element that wraps the tab content. Can be used for improved\n * accessibility when the tab does not have focusable elements or if it has scrollable content.\n * The `tabindex` will be removed automatically for inactive tabs.\n * Read more at https://www.w3.org/TR/wai-aria-practices/examples/tabs/tabs-2/tabs.html\n */\n get contentTabIndex() {\n return this._contentTabIndex;\n }\n set contentTabIndex(value) {\n this._contentTabIndex = isNaN(value) ? null : value;\n }\n /**\n * Theme color of the background of the tab group. This API is supported in M2 themes only, it\n * has no effect in M3 themes.\n *\n * For information on applying color variants in M3, see\n * https://material.angular.io/guide/theming#using-component-color-variants.\n *\n * @deprecated The background color should be customized through Sass theming APIs.\n * @breaking-change 20.0.0 Remove this input\n */\n get backgroundColor() {\n return this._backgroundColor;\n }\n set backgroundColor(value) {\n if (!ENABLE_BACKGROUND_INPUT) {\n throw new Error(`mat-tab-group background color must be set through the Sass theming API`);\n }\n const classList = this._elementRef.nativeElement.classList;\n classList.remove('mat-tabs-with-background', `mat-background-${this.backgroundColor}`);\n if (value) {\n classList.add('mat-tabs-with-background', `mat-background-${value}`);\n }\n this._backgroundColor = value;\n }\n constructor(_elementRef, _changeDetectorRef, defaultConfig, _animationMode) {\n this._elementRef = _elementRef;\n this._changeDetectorRef = _changeDetectorRef;\n this._animationMode = _animationMode;\n /** All of the tabs that belong to the group. */\n this._tabs = new QueryList();\n /** The tab index that should be selected after the content has been checked. */\n this._indexToSelect = 0;\n /** Index of the tab that was focused last. */\n this._lastFocusedTabIndex = null;\n /** Snapshot of the height of the tab body wrapper before another tab is activated. */\n this._tabBodyWrapperHeight = 0;\n /** Subscription to tabs being added/removed. */\n this._tabsSubscription = Subscription.EMPTY;\n /** Subscription to changes in the tab labels. */\n this._tabLabelSubscription = Subscription.EMPTY;\n this._fitInkBarToContent = false;\n /** Whether tabs should be stretched to fill the header. */\n this.stretchTabs = true;\n /** Whether the tab group should grow to the size of the active tab. */\n this.dynamicHeight = false;\n this._selectedIndex = null;\n /** Position of the tab header. */\n this.headerPosition = 'above';\n /**\n * Whether pagination should be disabled. This can be used to avoid unnecessary\n * layout recalculations if it's known that pagination won't be required.\n */\n this.disablePagination = false;\n /** Whether ripples in the tab group are disabled. */\n this.disableRipple = false;\n /**\n * By default tabs remove their content from the DOM while it's off-screen.\n * Setting this to `true` will keep it in the DOM which will prevent elements\n * like iframes and videos from reloading next time it comes back into the view.\n */\n this.preserveContent = false;\n /** Output to enable support for two-way binding on `[(selectedIndex)]` */\n this.selectedIndexChange = new EventEmitter();\n /** Event emitted when focus has changed within a tab group. */\n this.focusChange = new EventEmitter();\n /** Event emitted when the body animation has completed */\n this.animationDone = new EventEmitter();\n /** Event emitted when the tab selection has changed. */\n this.selectedTabChange = new EventEmitter(true);\n /** Whether the tab group is rendered on the server. */\n this._isServer = !inject(Platform).isBrowser;\n this._groupId = nextId++;\n this.animationDuration = defaultConfig && defaultConfig.animationDuration ? defaultConfig.animationDuration : '500ms';\n this.disablePagination = defaultConfig && defaultConfig.disablePagination != null ? defaultConfig.disablePagination : false;\n this.dynamicHeight = defaultConfig && defaultConfig.dynamicHeight != null ? defaultConfig.dynamicHeight : false;\n if (defaultConfig?.contentTabIndex != null) {\n this.contentTabIndex = defaultConfig.contentTabIndex;\n }\n this.preserveContent = !!defaultConfig?.preserveContent;\n this.fitInkBarToContent = defaultConfig && defaultConfig.fitInkBarToContent != null ? defaultConfig.fitInkBarToContent : false;\n this.stretchTabs = defaultConfig && defaultConfig.stretchTabs != null ? defaultConfig.stretchTabs : true;\n }\n /**\n * After the content is checked, this component knows what tabs have been defined\n * and what the selected index should be. This is where we can know exactly what position\n * each tab should be in according to the new selected index, and additionally we know how\n * a new selected tab should transition in (from the left or right).\n */\n ngAfterContentChecked() {\n // Don't clamp the `indexToSelect` immediately in the setter because it can happen that\n // the amount of tabs changes before the actual change detection runs.\n const indexToSelect = this._indexToSelect = this._clampTabIndex(this._indexToSelect);\n // If there is a change in selected index, emit a change event. Should not trigger if\n // the selected index has not yet been initialized.\n if (this._selectedIndex != indexToSelect) {\n const isFirstRun = this._selectedIndex == null;\n if (!isFirstRun) {\n this.selectedTabChange.emit(this._createChangeEvent(indexToSelect));\n // Preserve the height so page doesn't scroll up during tab change.\n // Fixes https://stackblitz.com/edit/mat-tabs-scroll-page-top-on-tab-change\n const wrapper = this._tabBodyWrapper.nativeElement;\n wrapper.style.minHeight = wrapper.clientHeight + 'px';\n }\n // Changing these values after change detection has run\n // since the checked content may contain references to them.\n Promise.resolve().then(() => {\n this._tabs.forEach((tab, index) => tab.isActive = index === indexToSelect);\n if (!isFirstRun) {\n this.selectedIndexChange.emit(indexToSelect);\n // Clear the min-height, this was needed during tab change to avoid\n // unnecessary scrolling.\n this._tabBodyWrapper.nativeElement.style.minHeight = '';\n }\n });\n }\n // Setup the position for each tab and optionally setup an origin on the next selected tab.\n this._tabs.forEach((tab, index) => {\n tab.position = index - indexToSelect;\n // If there is already a selected tab, then set up an origin for the next selected tab\n // if it doesn't have one already.\n if (this._selectedIndex != null && tab.position == 0 && !tab.origin) {\n tab.origin = indexToSelect - this._selectedIndex;\n }\n });\n if (this._selectedIndex !== indexToSelect) {\n this._selectedIndex = indexToSelect;\n this._lastFocusedTabIndex = null;\n this._changeDetectorRef.markForCheck();\n }\n }\n ngAfterContentInit() {\n this._subscribeToAllTabChanges();\n this._subscribeToTabLabels();\n // Subscribe to changes in the amount of tabs, in order to be\n // able to re-render the content as new tabs are added or removed.\n this._tabsSubscription = this._tabs.changes.subscribe(() => {\n const indexToSelect = this._clampTabIndex(this._indexToSelect);\n // Maintain the previously-selected tab if a new tab is added or removed and there is no\n // explicit change that selects a different tab.\n if (indexToSelect === this._selectedIndex) {\n const tabs = this._tabs.toArray();\n let selectedTab;\n for (let i = 0; i < tabs.length; i++) {\n if (tabs[i].isActive) {\n // Assign both to the `_indexToSelect` and `_selectedIndex` so we don't fire a changed\n // event, otherwise the consumer may end up in an infinite loop in some edge cases like\n // adding a tab within the `selectedIndexChange` event.\n this._indexToSelect = this._selectedIndex = i;\n this._lastFocusedTabIndex = null;\n selectedTab = tabs[i];\n break;\n }\n }\n // If we haven't found an active tab and a tab exists at the selected index, it means\n // that the active tab was swapped out. Since this won't be picked up by the rendering\n // loop in `ngAfterContentChecked`, we need to sync it up manually.\n if (!selectedTab && tabs[indexToSelect]) {\n Promise.resolve().then(() => {\n tabs[indexToSelect].isActive = true;\n this.selectedTabChange.emit(this._createChangeEvent(indexToSelect));\n });\n }\n }\n this._changeDetectorRef.markForCheck();\n });\n }\n /** Listens to changes in all of the tabs. */\n _subscribeToAllTabChanges() {\n // Since we use a query with `descendants: true` to pick up the tabs, we may end up catching\n // some that are inside of nested tab groups. We filter them out manually by checking that\n // the closest group to the tab is the current one.\n this._allTabs.changes.pipe(startWith(this._allTabs)).subscribe(tabs => {\n this._tabs.reset(tabs.filter(tab => {\n return tab._closestTabGroup === this || !tab._closestTabGroup;\n }));\n this._tabs.notifyOnChanges();\n });\n }\n ngOnDestroy() {\n this._tabs.destroy();\n this._tabsSubscription.unsubscribe();\n this._tabLabelSubscription.unsubscribe();\n }\n /** Re-aligns the ink bar to the selected tab element. */\n realignInkBar() {\n if (this._tabHeader) {\n this._tabHeader._alignInkBarToSelectedTab();\n }\n }\n /**\n * Recalculates the tab group's pagination dimensions.\n *\n * WARNING: Calling this method can be very costly in terms of performance. It should be called\n * as infrequently as possible from outside of the Tabs component as it causes a reflow of the\n * page.\n */\n updatePagination() {\n if (this._tabHeader) {\n this._tabHeader.updatePagination();\n }\n }\n /**\n * Sets focus to a particular tab.\n * @param index Index of the tab to be focused.\n */\n focusTab(index) {\n const header = this._tabHeader;\n if (header) {\n header.focusIndex = index;\n }\n }\n _focusChanged(index) {\n this._lastFocusedTabIndex = index;\n this.focusChange.emit(this._createChangeEvent(index));\n }\n _createChangeEvent(index) {\n const event = new MatTabChangeEvent();\n event.index = index;\n if (this._tabs && this._tabs.length) {\n event.tab = this._tabs.toArray()[index];\n }\n return event;\n }\n /**\n * Subscribes to changes in the tab labels. This is needed, because the @Input for the label is\n * on the MatTab component, whereas the data binding is inside the MatTabGroup. In order for the\n * binding to be updated, we need to subscribe to changes in it and trigger change detection\n * manually.\n */\n _subscribeToTabLabels() {\n if (this._tabLabelSubscription) {\n this._tabLabelSubscription.unsubscribe();\n }\n this._tabLabelSubscription = merge(...this._tabs.map(tab => tab._stateChanges)).subscribe(() => this._changeDetectorRef.markForCheck());\n }\n /** Clamps the given index to the bounds of 0 and the tabs length. */\n _clampTabIndex(index) {\n // Note the `|| 0`, which ensures that values like NaN can't get through\n // and which would otherwise throw the component into an infinite loop\n // (since Math.max(NaN, 0) === NaN).\n return Math.min(this._tabs.length - 1, Math.max(index || 0, 0));\n }\n /** Returns a unique id for each tab label element */\n _getTabLabelId(i) {\n return `mat-tab-label-${this._groupId}-${i}`;\n }\n /** Returns a unique id for each tab content element */\n _getTabContentId(i) {\n return `mat-tab-content-${this._groupId}-${i}`;\n }\n /**\n * Sets the height of the body wrapper to the height of the activating tab if dynamic\n * height property is true.\n */\n _setTabBodyWrapperHeight(tabHeight) {\n if (!this.dynamicHeight || !this._tabBodyWrapperHeight) {\n return;\n }\n const wrapper = this._tabBodyWrapper.nativeElement;\n wrapper.style.height = this._tabBodyWrapperHeight + 'px';\n // This conditional forces the browser to paint the height so that\n // the animation to the new height can have an origin.\n if (this._tabBodyWrapper.nativeElement.offsetHeight) {\n wrapper.style.height = tabHeight + 'px';\n }\n }\n /** Removes the height of the tab body wrapper. */\n _removeTabBodyWrapperHeight() {\n const wrapper = this._tabBodyWrapper.nativeElement;\n this._tabBodyWrapperHeight = wrapper.clientHeight;\n wrapper.style.height = '';\n this.animationDone.emit();\n }\n /** Handle click events, setting new selected index if appropriate. */\n _handleClick(tab, tabHeader, index) {\n tabHeader.focusIndex = index;\n if (!tab.disabled) {\n this.selectedIndex = index;\n }\n }\n /** Retrieves the tabindex for the tab. */\n _getTabIndex(index) {\n const targetIndex = this._lastFocusedTabIndex ?? this.selectedIndex;\n return index === targetIndex ? 0 : -1;\n }\n /** Callback for when the focused state of a tab has changed. */\n _tabFocusChanged(focusOrigin, index) {\n // Mouse/touch focus happens during the `mousedown`/`touchstart` phase which\n // can cause the tab to be moved out from under the pointer, interrupting the\n // click sequence (see #21898). We don't need to scroll the tab into view for\n // such cases anyway, because it will be done when the tab becomes selected.\n if (focusOrigin && focusOrigin !== 'mouse' && focusOrigin !== 'touch') {\n this._tabHeader.focusIndex = index;\n }\n }\n static {\n this.ɵfac = function MatTabGroup_Factory(t) {\n return new (t || MatTabGroup)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(MAT_TABS_CONFIG, 8), i0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8));\n };\n }\n static {\n this.ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: MatTabGroup,\n selectors: [[\"mat-tab-group\"]],\n contentQueries: function MatTabGroup_ContentQueries(rf, ctx, dirIndex) {\n if (rf & 1) {\n i0.ɵɵcontentQuery(dirIndex, MatTab, 5);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._allTabs = _t);\n }\n },\n viewQuery: function MatTabGroup_Query(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵviewQuery(_c8, 5);\n i0.ɵɵviewQuery(_c9, 5);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._tabBodyWrapper = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._tabHeader = _t.first);\n }\n },\n hostAttrs: [1, \"mat-mdc-tab-group\"],\n hostVars: 10,\n hostBindings: function MatTabGroup_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵclassMap(\"mat-\" + (ctx.color || \"primary\"));\n i0.ɵɵstyleProp(\"--mat-tab-animation-duration\", ctx.animationDuration);\n i0.ɵɵclassProp(\"mat-mdc-tab-group-dynamic-height\", ctx.dynamicHeight)(\"mat-mdc-tab-group-inverted-header\", ctx.headerPosition === \"below\")(\"mat-mdc-tab-group-stretch-tabs\", ctx.stretchTabs);\n }\n },\n inputs: {\n color: \"color\",\n fitInkBarToContent: [2, \"fitInkBarToContent\", \"fitInkBarToContent\", booleanAttribute],\n stretchTabs: [2, \"mat-stretch-tabs\", \"stretchTabs\", booleanAttribute],\n dynamicHeight: [2, \"dynamicHeight\", \"dynamicHeight\", booleanAttribute],\n selectedIndex: [2, \"selectedIndex\", \"selectedIndex\", numberAttribute],\n headerPosition: \"headerPosition\",\n animationDuration: \"animationDuration\",\n contentTabIndex: [2, \"contentTabIndex\", \"contentTabIndex\", numberAttribute],\n disablePagination: [2, \"disablePagination\", \"disablePagination\", booleanAttribute],\n disableRipple: [2, \"disableRipple\", \"disableRipple\", booleanAttribute],\n preserveContent: [2, \"preserveContent\", \"preserveContent\", booleanAttribute],\n backgroundColor: \"backgroundColor\"\n },\n outputs: {\n selectedIndexChange: \"selectedIndexChange\",\n focusChange: \"focusChange\",\n animationDone: \"animationDone\",\n selectedTabChange: \"selectedTabChange\"\n },\n exportAs: [\"matTabGroup\"],\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: MAT_TAB_GROUP,\n useExisting: MatTabGroup\n }]), i0.ɵɵInputTransformsFeature, i0.ɵɵStandaloneFeature],\n ngContentSelectors: _c0,\n decls: 9,\n vars: 6,\n consts: [[\"tabHeader\", \"\"], [\"tabBodyWrapper\", \"\"], [\"tabNode\", \"\"], [3, \"indexFocused\", \"selectFocusedIndex\", \"selectedIndex\", \"disableRipple\", \"disablePagination\"], [\"role\", \"tab\", \"matTabLabelWrapper\", \"\", \"cdkMonitorElementFocus\", \"\", 1, \"mdc-tab\", \"mat-mdc-tab\", \"mat-mdc-focus-indicator\", 3, \"id\", \"mdc-tab--active\", \"class\", \"disabled\", \"fitInkBarToContent\"], [1, \"mat-mdc-tab-body-wrapper\"], [\"role\", \"tabpanel\", 3, \"id\", \"mat-mdc-tab-body-active\", \"class\", \"content\", \"position\", \"origin\", \"animationDuration\", \"preserveContent\"], [\"role\", \"tab\", \"matTabLabelWrapper\", \"\", \"cdkMonitorElementFocus\", \"\", 1, \"mdc-tab\", \"mat-mdc-tab\", \"mat-mdc-focus-indicator\", 3, \"click\", \"cdkFocusChange\", \"id\", \"disabled\", \"fitInkBarToContent\"], [1, \"mdc-tab__ripple\"], [\"mat-ripple\", \"\", 1, \"mat-mdc-tab-ripple\", 3, \"matRippleTrigger\", \"matRippleDisabled\"], [1, \"mdc-tab__content\"], [1, \"mdc-tab__text-label\"], [3, \"cdkPortalOutlet\"], [\"role\", \"tabpanel\", 3, \"_onCentered\", \"_onCentering\", \"id\", \"content\", \"position\", \"origin\", \"animationDuration\", \"preserveContent\"]],\n template: function MatTabGroup_Template(rf, ctx) {\n if (rf & 1) {\n const _r1 = i0.ɵɵgetCurrentView();\n i0.ɵɵprojectionDef();\n i0.ɵɵelementStart(0, \"mat-tab-header\", 3, 0);\n i0.ɵɵlistener(\"indexFocused\", function MatTabGroup_Template_mat_tab_header_indexFocused_0_listener($event) {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._focusChanged($event));\n })(\"selectFocusedIndex\", function MatTabGroup_Template_mat_tab_header_selectFocusedIndex_0_listener($event) {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx.selectedIndex = $event);\n });\n i0.ɵɵrepeaterCreate(2, MatTabGroup_For_3_Template, 8, 17, \"div\", 4, i0.ɵɵrepeaterTrackByIdentity);\n i0.ɵɵelementEnd();\n i0.ɵɵtemplate(4, MatTabGroup_Conditional_4_Template, 1, 0);\n i0.ɵɵelementStart(5, \"div\", 5, 1);\n i0.ɵɵrepeaterCreate(7, MatTabGroup_For_8_Template, 1, 13, \"mat-tab-body\", 6, i0.ɵɵrepeaterTrackByIdentity);\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n i0.ɵɵproperty(\"selectedIndex\", ctx.selectedIndex || 0)(\"disableRipple\", ctx.disableRipple)(\"disablePagination\", ctx.disablePagination);\n i0.ɵɵadvance(2);\n i0.ɵɵrepeater(ctx._tabs);\n i0.ɵɵadvance(2);\n i0.ɵɵconditional(ctx._isServer ? 4 : -1);\n i0.ɵɵadvance();\n i0.ɵɵclassProp(\"_mat-animation-noopable\", ctx._animationMode === \"NoopAnimations\");\n i0.ɵɵadvance(2);\n i0.ɵɵrepeater(ctx._tabs);\n }\n },\n dependencies: [MatTabHeader, MatTabLabelWrapper, CdkMonitorFocus, MatRipple, CdkPortalOutlet, MatTabBody],\n styles: [\".mdc-tab{min-width:90px;padding:0 24px;display:flex;flex:1 0 auto;justify-content:center;box-sizing:border-box;border:none;outline:none;text-align:center;white-space:nowrap;cursor:pointer;z-index:1}.mdc-tab__content{display:flex;align-items:center;justify-content:center;height:inherit;pointer-events:none}.mdc-tab__text-label{transition:150ms color linear;display:inline-block;line-height:1;z-index:2}.mdc-tab--active .mdc-tab__text-label{transition-delay:100ms}._mat-animation-noopable .mdc-tab__text-label{transition:none}.mdc-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.mdc-tab-indicator__content{transition:var(--mat-tab-animation-duration, 250ms) transform cubic-bezier(0.4, 0, 0.2, 1);transform-origin:left;opacity:0}.mdc-tab-indicator__content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:1}._mat-animation-noopable .mdc-tab-indicator__content,.mdc-tab-indicator--no-transition .mdc-tab-indicator__content{transition:none}.mat-mdc-tab-ripple{position:absolute;top:0;left:0;bottom:0;right:0;pointer-events:none}.mat-mdc-tab{-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none;background:none;height:var(--mdc-secondary-navigation-tab-container-height);font-family:var(--mat-tab-header-label-text-font);font-size:var(--mat-tab-header-label-text-size);letter-spacing:var(--mat-tab-header-label-text-tracking);line-height:var(--mat-tab-header-label-text-line-height);font-weight:var(--mat-tab-header-label-text-weight)}.mat-mdc-tab.mdc-tab{flex-grow:0}.mat-mdc-tab .mdc-tab-indicator__content--underline{border-color:var(--mdc-tab-indicator-active-indicator-color);border-top-width:var(--mdc-tab-indicator-active-indicator-height);border-radius:var(--mdc-tab-indicator-active-indicator-shape)}.mat-mdc-tab:hover .mdc-tab__text-label{color:var(--mat-tab-header-inactive-hover-label-text-color)}.mat-mdc-tab:focus .mdc-tab__text-label{color:var(--mat-tab-header-inactive-focus-label-text-color)}.mat-mdc-tab.mdc-tab--active .mdc-tab__text-label{color:var(--mat-tab-header-active-label-text-color)}.mat-mdc-tab.mdc-tab--active .mdc-tab__ripple::before,.mat-mdc-tab.mdc-tab--active .mat-ripple-element{background-color:var(--mat-tab-header-active-ripple-color)}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab__text-label{color:var(--mat-tab-header-active-hover-label-text-color)}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-active-hover-indicator-color)}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab__text-label{color:var(--mat-tab-header-active-focus-label-text-color)}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-active-focus-indicator-color)}.mat-mdc-tab.mat-mdc-tab-disabled{opacity:.4;pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__content{pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__ripple::before,.mat-mdc-tab.mat-mdc-tab-disabled .mat-ripple-element{background-color:var(--mat-tab-header-disabled-ripple-color)}.mat-mdc-tab .mdc-tab__ripple::before{content:\\\"\\\";display:block;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;background-color:var(--mat-tab-header-inactive-ripple-color)}.mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-header-inactive-label-text-color);display:inline-flex;align-items:center}.mat-mdc-tab .mdc-tab__content{position:relative;pointer-events:auto}.mat-mdc-tab:hover .mdc-tab__ripple::before{opacity:.04}.mat-mdc-tab.cdk-program-focused .mdc-tab__ripple::before,.mat-mdc-tab.cdk-keyboard-focused .mdc-tab__ripple::before{opacity:.12}.mat-mdc-tab .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-header-inactive-ripple-color)}.mat-mdc-tab-group.mat-mdc-tab-group-stretch-tabs>.mat-mdc-tab-header .mat-mdc-tab{flex-grow:1}.mat-mdc-tab-group{display:flex;flex-direction:column;max-width:100%}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination{background-color:var(--mat-tab-header-with-background-background-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-focus-indicator::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-focus-indicator::before{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mdc-tab__ripple::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mdc-tab__ripple::before{background-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header{flex-direction:column-reverse}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header .mdc-tab-indicator__content--underline{align-self:flex-start}.mat-mdc-tab-body-wrapper{position:relative;overflow:hidden;display:flex;transition:height 500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-mdc-tab-body-wrapper._mat-animation-noopable{transition:none !important;animation:none !important}\"],\n encapsulation: 2\n });\n }\n }\n return MatTabGroup;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** A simple change event emitted on focus or selection changes. */\nclass MatTabChangeEvent {}\n\n// Increasing integer for generating unique ids for tab nav components.\nlet nextUniqueId = 0;\n/**\n * Navigation component matching the styles of the tab group header.\n * Provides anchored navigation with animated ink bar.\n */\nlet MatTabNav = /*#__PURE__*/(() => {\n class MatTabNav extends MatPaginatedTabHeader {\n /** Whether the ink bar should fit its width to the size of the tab label content. */\n get fitInkBarToContent() {\n return this._fitInkBarToContent.value;\n }\n set fitInkBarToContent(value) {\n this._fitInkBarToContent.next(value);\n this._changeDetectorRef.markForCheck();\n }\n get animationDuration() {\n return this._animationDuration;\n }\n set animationDuration(value) {\n const stringValue = value + '';\n this._animationDuration = /^\\d+$/.test(stringValue) ? value + 'ms' : stringValue;\n }\n /**\n * Theme color of the background of the tab nav. This API is supported in M2 themes only, it\n * has no effect in M3 themes.\n *\n * For information on applying color variants in M3, see\n * https://material.angular.io/guide/theming#using-component-color-variants.\n */\n get backgroundColor() {\n return this._backgroundColor;\n }\n set backgroundColor(value) {\n const classList = this._elementRef.nativeElement.classList;\n classList.remove('mat-tabs-with-background', `mat-background-${this.backgroundColor}`);\n if (value) {\n classList.add('mat-tabs-with-background', `mat-background-${value}`);\n }\n this._backgroundColor = value;\n }\n constructor(elementRef, dir, ngZone, changeDetectorRef, viewportRuler, platform, animationMode, defaultConfig) {\n super(elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode);\n this._fitInkBarToContent = new BehaviorSubject(false);\n /** Whether tabs should be stretched to fill the header. */\n this.stretchTabs = true;\n /** Whether the ripple effect is disabled or not. */\n this.disableRipple = false;\n /**\n * Theme color of the nav bar. This API is supported in M2 themes only, it has\n * no effect in M3 themes.\n *\n * For information on applying color variants in M3, see\n * https://material.angular.io/guide/theming#using-component-color-variants.\n */\n this.color = 'primary';\n this.disablePagination = defaultConfig && defaultConfig.disablePagination != null ? defaultConfig.disablePagination : false;\n this.fitInkBarToContent = defaultConfig && defaultConfig.fitInkBarToContent != null ? defaultConfig.fitInkBarToContent : false;\n this.stretchTabs = defaultConfig && defaultConfig.stretchTabs != null ? defaultConfig.stretchTabs : true;\n }\n _itemSelected() {\n // noop\n }\n ngAfterContentInit() {\n this._inkBar = new MatInkBar(this._items);\n // We need this to run before the `changes` subscription in parent to ensure that the\n // selectedIndex is up-to-date by the time the super class starts looking for it.\n this._items.changes.pipe(startWith(null), takeUntil(this._destroyed)).subscribe(() => {\n this.updateActiveLink();\n });\n super.ngAfterContentInit();\n }\n ngAfterViewInit() {\n if (!this.tabPanel && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw new Error('A mat-tab-nav-panel must be specified via [tabPanel].');\n }\n super.ngAfterViewInit();\n }\n /** Notifies the component that the active link has been changed. */\n updateActiveLink() {\n if (!this._items) {\n return;\n }\n const items = this._items.toArray();\n for (let i = 0; i < items.length; i++) {\n if (items[i].active) {\n this.selectedIndex = i;\n this._changeDetectorRef.markForCheck();\n if (this.tabPanel) {\n this.tabPanel._activeTabId = items[i].id;\n }\n return;\n }\n }\n // The ink bar should hide itself if no items are active.\n this.selectedIndex = -1;\n this._inkBar.hide();\n }\n _getRole() {\n return this.tabPanel ? 'tablist' : this._elementRef.nativeElement.getAttribute('role');\n }\n static {\n this.ɵfac = function MatTabNav_Factory(t) {\n return new (t || MatTabNav)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i2.Directionality, 8), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.ViewportRuler), i0.ɵɵdirectiveInject(i3.Platform), i0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8), i0.ɵɵdirectiveInject(MAT_TABS_CONFIG, 8));\n };\n }\n static {\n this.ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: MatTabNav,\n selectors: [[\"\", \"mat-tab-nav-bar\", \"\"]],\n contentQueries: function MatTabNav_ContentQueries(rf, ctx, dirIndex) {\n if (rf & 1) {\n i0.ɵɵcontentQuery(dirIndex, MatTabLink, 5);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._items = _t);\n }\n },\n viewQuery: function MatTabNav_Query(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵviewQuery(_c1, 7);\n i0.ɵɵviewQuery(_c2, 7);\n i0.ɵɵviewQuery(_c3, 7);\n i0.ɵɵviewQuery(_c4, 5);\n i0.ɵɵviewQuery(_c5, 5);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._tabListContainer = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._tabList = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._tabListInner = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._nextPaginator = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._previousPaginator = _t.first);\n }\n },\n hostAttrs: [1, \"mat-mdc-tab-nav-bar\", \"mat-mdc-tab-header\"],\n hostVars: 17,\n hostBindings: function MatTabNav_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵattribute(\"role\", ctx._getRole());\n i0.ɵɵstyleProp(\"--mat-tab-animation-duration\", ctx.animationDuration);\n i0.ɵɵclassProp(\"mat-mdc-tab-header-pagination-controls-enabled\", ctx._showPaginationControls)(\"mat-mdc-tab-header-rtl\", ctx._getLayoutDirection() == \"rtl\")(\"mat-mdc-tab-nav-bar-stretch-tabs\", ctx.stretchTabs)(\"mat-primary\", ctx.color !== \"warn\" && ctx.color !== \"accent\")(\"mat-accent\", ctx.color === \"accent\")(\"mat-warn\", ctx.color === \"warn\")(\"_mat-animation-noopable\", ctx._animationMode === \"NoopAnimations\");\n }\n },\n inputs: {\n fitInkBarToContent: [2, \"fitInkBarToContent\", \"fitInkBarToContent\", booleanAttribute],\n stretchTabs: [2, \"mat-stretch-tabs\", \"stretchTabs\", booleanAttribute],\n animationDuration: \"animationDuration\",\n backgroundColor: \"backgroundColor\",\n disableRipple: [2, \"disableRipple\", \"disableRipple\", booleanAttribute],\n color: \"color\",\n tabPanel: \"tabPanel\"\n },\n exportAs: [\"matTabNavBar\", \"matTabNav\"],\n standalone: true,\n features: [i0.ɵɵInputTransformsFeature, i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature],\n attrs: _c10,\n ngContentSelectors: _c0,\n decls: 13,\n vars: 8,\n consts: [[\"previousPaginator\", \"\"], [\"tabListContainer\", \"\"], [\"tabList\", \"\"], [\"tabListInner\", \"\"], [\"nextPaginator\", \"\"], [\"aria-hidden\", \"true\", \"type\", \"button\", \"mat-ripple\", \"\", \"tabindex\", \"-1\", 1, \"mat-mdc-tab-header-pagination\", \"mat-mdc-tab-header-pagination-before\", 3, \"click\", \"mousedown\", \"touchend\", \"matRippleDisabled\", \"disabled\"], [1, \"mat-mdc-tab-header-pagination-chevron\"], [1, \"mat-mdc-tab-link-container\", 3, \"keydown\"], [1, \"mat-mdc-tab-list\", 3, \"cdkObserveContent\"], [1, \"mat-mdc-tab-links\"], [\"aria-hidden\", \"true\", \"type\", \"button\", \"mat-ripple\", \"\", \"tabindex\", \"-1\", 1, \"mat-mdc-tab-header-pagination\", \"mat-mdc-tab-header-pagination-after\", 3, \"mousedown\", \"click\", \"touchend\", \"matRippleDisabled\", \"disabled\"]],\n template: function MatTabNav_Template(rf, ctx) {\n if (rf & 1) {\n const _r1 = i0.ɵɵgetCurrentView();\n i0.ɵɵprojectionDef();\n i0.ɵɵelementStart(0, \"button\", 5, 0);\n i0.ɵɵlistener(\"click\", function MatTabNav_Template_button_click_0_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._handlePaginatorClick(\"before\"));\n })(\"mousedown\", function MatTabNav_Template_button_mousedown_0_listener($event) {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._handlePaginatorPress(\"before\", $event));\n })(\"touchend\", function MatTabNav_Template_button_touchend_0_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._stopInterval());\n });\n i0.ɵɵelement(2, \"div\", 6);\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(3, \"div\", 7, 1);\n i0.ɵɵlistener(\"keydown\", function MatTabNav_Template_div_keydown_3_listener($event) {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._handleKeydown($event));\n });\n i0.ɵɵelementStart(5, \"div\", 8, 2);\n i0.ɵɵlistener(\"cdkObserveContent\", function MatTabNav_Template_div_cdkObserveContent_5_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._onContentChanges());\n });\n i0.ɵɵelementStart(7, \"div\", 9, 3);\n i0.ɵɵprojection(9);\n i0.ɵɵelementEnd()()();\n i0.ɵɵelementStart(10, \"button\", 10, 4);\n i0.ɵɵlistener(\"mousedown\", function MatTabNav_Template_button_mousedown_10_listener($event) {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._handlePaginatorPress(\"after\", $event));\n })(\"click\", function MatTabNav_Template_button_click_10_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._handlePaginatorClick(\"after\"));\n })(\"touchend\", function MatTabNav_Template_button_touchend_10_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._stopInterval());\n });\n i0.ɵɵelement(12, \"div\", 6);\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n i0.ɵɵclassProp(\"mat-mdc-tab-header-pagination-disabled\", ctx._disableScrollBefore);\n i0.ɵɵproperty(\"matRippleDisabled\", ctx._disableScrollBefore || ctx.disableRipple)(\"disabled\", ctx._disableScrollBefore || null);\n i0.ɵɵadvance(10);\n i0.ɵɵclassProp(\"mat-mdc-tab-header-pagination-disabled\", ctx._disableScrollAfter);\n i0.ɵɵproperty(\"matRippleDisabled\", ctx._disableScrollAfter || ctx.disableRipple)(\"disabled\", ctx._disableScrollAfter || null);\n }\n },\n dependencies: [MatRipple, CdkObserveContent],\n styles: [\".mdc-tab{min-width:90px;padding:0 24px;display:flex;flex:1 0 auto;justify-content:center;box-sizing:border-box;border:none;outline:none;text-align:center;white-space:nowrap;cursor:pointer;z-index:1}.mdc-tab__content{display:flex;align-items:center;justify-content:center;height:inherit;pointer-events:none}.mdc-tab__text-label{transition:150ms color linear;display:inline-block;line-height:1;z-index:2}.mdc-tab--active .mdc-tab__text-label{transition-delay:100ms}._mat-animation-noopable .mdc-tab__text-label{transition:none}.mdc-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.mdc-tab-indicator__content{transition:var(--mat-tab-animation-duration, 250ms) transform cubic-bezier(0.4, 0, 0.2, 1);transform-origin:left;opacity:0}.mdc-tab-indicator__content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:1}._mat-animation-noopable .mdc-tab-indicator__content,.mdc-tab-indicator--no-transition .mdc-tab-indicator__content{transition:none}.mat-mdc-tab-ripple{position:absolute;top:0;left:0;bottom:0;right:0;pointer-events:none}.mat-mdc-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0}.mdc-tab-indicator .mdc-tab-indicator__content{transition-duration:var(--mat-tab-animation-duration, 250ms)}.mat-mdc-tab-header-pagination{-webkit-user-select:none;user-select:none;position:relative;display:none;justify-content:center;align-items:center;min-width:32px;cursor:pointer;z-index:2;-webkit-tap-highlight-color:rgba(0,0,0,0);touch-action:none;box-sizing:content-box;background:none;border:none;outline:0;padding:0}.mat-mdc-tab-header-pagination::-moz-focus-inner{border:0}.mat-mdc-tab-header-pagination .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-header-inactive-ripple-color)}.mat-mdc-tab-header-pagination-controls-enabled .mat-mdc-tab-header-pagination{display:flex}.mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after{padding-left:4px}.mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-pagination-after{padding-right:4px}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-mdc-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;height:8px;width:8px;border-color:var(--mat-tab-header-pagination-icon-color)}.mat-mdc-tab-header-pagination-disabled{box-shadow:none;cursor:default;pointer-events:none}.mat-mdc-tab-header-pagination-disabled .mat-mdc-tab-header-pagination-chevron{opacity:.4}.mat-mdc-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-mdc-tab-list{transition:none}.mat-mdc-tab-links{display:flex;flex:1 0 auto}[mat-align-tabs=center]>.mat-mdc-tab-link-container .mat-mdc-tab-links{justify-content:center}[mat-align-tabs=end]>.mat-mdc-tab-link-container .mat-mdc-tab-links{justify-content:flex-end}.cdk-drop-list .mat-mdc-tab-links,.mat-mdc-tab-links.cdk-drop-list{min-height:var(--mdc-secondary-navigation-tab-container-height)}.mat-mdc-tab-link-container{display:flex;flex-grow:1;overflow:hidden;z-index:1;border-bottom-style:solid;border-bottom-width:var(--mat-tab-header-divider-height);border-bottom-color:var(--mat-tab-header-divider-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-link-container,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-header-pagination{background-color:var(--mat-tab-header-with-background-background-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background.mat-primary>.mat-mdc-tab-link-container .mat-mdc-tab-link .mdc-tab__text-label{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background.mat-primary>.mat-mdc-tab-link-container .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-link-container .mat-mdc-tab-link:not(.mdc-tab--active) .mdc-tab__text-label{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-link-container .mat-mdc-tab-link:not(.mdc-tab--active) .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-link-container .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-link-container .mat-mdc-focus-indicator::before,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-focus-indicator::before{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-link-container .mat-ripple-element,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-link-container .mdc-tab__ripple::before,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-ripple-element,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mdc-tab__ripple::before{background-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-link-container .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron{color:var(--mat-tab-header-with-background-foreground-color)}\"],\n encapsulation: 2\n });\n }\n }\n return MatTabNav;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Link inside a `mat-tab-nav-bar`.\n */\nlet MatTabLink = /*#__PURE__*/(() => {\n class MatTabLink extends InkBarItem {\n /** Whether the link is active. */\n get active() {\n return this._isActive;\n }\n set active(value) {\n if (value !== this._isActive) {\n this._isActive = value;\n this._tabNavBar.updateActiveLink();\n }\n }\n /**\n * Whether ripples are disabled on interaction.\n * @docs-private\n */\n get rippleDisabled() {\n return this.disabled || this.disableRipple || this._tabNavBar.disableRipple || !!this.rippleConfig.disabled;\n }\n constructor(_tabNavBar, /** @docs-private */elementRef, globalRippleOptions, tabIndex, _focusMonitor, animationMode) {\n super();\n this._tabNavBar = _tabNavBar;\n this.elementRef = elementRef;\n this._focusMonitor = _focusMonitor;\n this._destroyed = new Subject();\n /** Whether the tab link is active or not. */\n this._isActive = false;\n /** Whether the tab link is disabled. */\n this.disabled = false;\n /** Whether ripples are disabled on the tab link. */\n this.disableRipple = false;\n this.tabIndex = 0;\n /** Unique id for the tab. */\n this.id = `mat-tab-link-${nextUniqueId++}`;\n this.rippleConfig = globalRippleOptions || {};\n this.tabIndex = parseInt(tabIndex) || 0;\n if (animationMode === 'NoopAnimations') {\n this.rippleConfig.animation = {\n enterDuration: 0,\n exitDuration: 0\n };\n }\n _tabNavBar._fitInkBarToContent.pipe(takeUntil(this._destroyed)).subscribe(fitInkBarToContent => {\n this.fitInkBarToContent = fitInkBarToContent;\n });\n }\n /** Focuses the tab link. */\n focus() {\n this.elementRef.nativeElement.focus();\n }\n ngAfterViewInit() {\n this._focusMonitor.monitor(this.elementRef);\n }\n ngOnDestroy() {\n this._destroyed.next();\n this._destroyed.complete();\n super.ngOnDestroy();\n this._focusMonitor.stopMonitoring(this.elementRef);\n }\n _handleFocus() {\n // Since we allow navigation through tabbing in the nav bar, we\n // have to update the focused index whenever the link receives focus.\n this._tabNavBar.focusIndex = this._tabNavBar._items.toArray().indexOf(this);\n }\n _handleKeydown(event) {\n if (event.keyCode === SPACE || event.keyCode === ENTER) {\n if (this.disabled) {\n event.preventDefault();\n } else if (this._tabNavBar.tabPanel) {\n // Only prevent the default action on space since it can scroll the page.\n // Don't prevent enter since it can break link navigation.\n if (event.keyCode === SPACE) {\n event.preventDefault();\n }\n this.elementRef.nativeElement.click();\n }\n }\n }\n _getAriaControls() {\n return this._tabNavBar.tabPanel ? this._tabNavBar.tabPanel?.id : this.elementRef.nativeElement.getAttribute('aria-controls');\n }\n _getAriaSelected() {\n if (this._tabNavBar.tabPanel) {\n return this.active ? 'true' : 'false';\n } else {\n return this.elementRef.nativeElement.getAttribute('aria-selected');\n }\n }\n _getAriaCurrent() {\n return this.active && !this._tabNavBar.tabPanel ? 'page' : null;\n }\n _getRole() {\n return this._tabNavBar.tabPanel ? 'tab' : this.elementRef.nativeElement.getAttribute('role');\n }\n _getTabIndex() {\n if (this._tabNavBar.tabPanel) {\n return this._isActive && !this.disabled ? 0 : -1;\n } else {\n return this.disabled ? -1 : this.tabIndex;\n }\n }\n static {\n this.ɵfac = function MatTabLink_Factory(t) {\n return new (t || MatTabLink)(i0.ɵɵdirectiveInject(MatTabNav), i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(MAT_RIPPLE_GLOBAL_OPTIONS, 8), i0.ɵɵinjectAttribute('tabindex'), i0.ɵɵdirectiveInject(i4.FocusMonitor), i0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8));\n };\n }\n static {\n this.ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: MatTabLink,\n selectors: [[\"\", \"mat-tab-link\", \"\"], [\"\", \"matTabLink\", \"\"]],\n hostAttrs: [1, \"mdc-tab\", \"mat-mdc-tab-link\", \"mat-mdc-focus-indicator\"],\n hostVars: 11,\n hostBindings: function MatTabLink_HostBindings(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵlistener(\"focus\", function MatTabLink_focus_HostBindingHandler() {\n return ctx._handleFocus();\n })(\"keydown\", function MatTabLink_keydown_HostBindingHandler($event) {\n return ctx._handleKeydown($event);\n });\n }\n if (rf & 2) {\n i0.ɵɵattribute(\"aria-controls\", ctx._getAriaControls())(\"aria-current\", ctx._getAriaCurrent())(\"aria-disabled\", ctx.disabled)(\"aria-selected\", ctx._getAriaSelected())(\"id\", ctx.id)(\"tabIndex\", ctx._getTabIndex())(\"role\", ctx._getRole());\n i0.ɵɵclassProp(\"mat-mdc-tab-disabled\", ctx.disabled)(\"mdc-tab--active\", ctx.active);\n }\n },\n inputs: {\n active: [2, \"active\", \"active\", booleanAttribute],\n disabled: [2, \"disabled\", \"disabled\", booleanAttribute],\n disableRipple: [2, \"disableRipple\", \"disableRipple\", booleanAttribute],\n tabIndex: [2, \"tabIndex\", \"tabIndex\", value => value == null ? 0 : numberAttribute(value)],\n id: \"id\"\n },\n exportAs: [\"matTabLink\"],\n standalone: true,\n features: [i0.ɵɵInputTransformsFeature, i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature],\n attrs: _c11,\n ngContentSelectors: _c0,\n decls: 5,\n vars: 2,\n consts: [[1, \"mdc-tab__ripple\"], [\"mat-ripple\", \"\", 1, \"mat-mdc-tab-ripple\", 3, \"matRippleTrigger\", \"matRippleDisabled\"], [1, \"mdc-tab__content\"], [1, \"mdc-tab__text-label\"]],\n template: function MatTabLink_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵprojectionDef();\n i0.ɵɵelement(0, \"span\", 0)(1, \"div\", 1);\n i0.ɵɵelementStart(2, \"span\", 2)(3, \"span\", 3);\n i0.ɵɵprojection(4);\n i0.ɵɵelementEnd()();\n }\n if (rf & 2) {\n i0.ɵɵadvance();\n i0.ɵɵproperty(\"matRippleTrigger\", ctx.elementRef.nativeElement)(\"matRippleDisabled\", ctx.rippleDisabled);\n }\n },\n dependencies: [MatRipple],\n styles: [\".mat-mdc-tab-link{-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none;background:none;height:var(--mdc-secondary-navigation-tab-container-height);font-family:var(--mat-tab-header-label-text-font);font-size:var(--mat-tab-header-label-text-size);letter-spacing:var(--mat-tab-header-label-text-tracking);line-height:var(--mat-tab-header-label-text-line-height);font-weight:var(--mat-tab-header-label-text-weight)}.mat-mdc-tab-link.mdc-tab{flex-grow:0}.mat-mdc-tab-link .mdc-tab-indicator__content--underline{border-color:var(--mdc-tab-indicator-active-indicator-color);border-top-width:var(--mdc-tab-indicator-active-indicator-height);border-radius:var(--mdc-tab-indicator-active-indicator-shape)}.mat-mdc-tab-link:hover .mdc-tab__text-label{color:var(--mat-tab-header-inactive-hover-label-text-color)}.mat-mdc-tab-link:focus .mdc-tab__text-label{color:var(--mat-tab-header-inactive-focus-label-text-color)}.mat-mdc-tab-link.mdc-tab--active .mdc-tab__text-label{color:var(--mat-tab-header-active-label-text-color)}.mat-mdc-tab-link.mdc-tab--active .mdc-tab__ripple::before,.mat-mdc-tab-link.mdc-tab--active .mat-ripple-element{background-color:var(--mat-tab-header-active-ripple-color)}.mat-mdc-tab-link.mdc-tab--active:hover .mdc-tab__text-label{color:var(--mat-tab-header-active-hover-label-text-color)}.mat-mdc-tab-link.mdc-tab--active:hover .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-active-hover-indicator-color)}.mat-mdc-tab-link.mdc-tab--active:focus .mdc-tab__text-label{color:var(--mat-tab-header-active-focus-label-text-color)}.mat-mdc-tab-link.mdc-tab--active:focus .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-active-focus-indicator-color)}.mat-mdc-tab-link.mat-mdc-tab-disabled{opacity:.4;pointer-events:none}.mat-mdc-tab-link.mat-mdc-tab-disabled .mdc-tab__content{pointer-events:none}.mat-mdc-tab-link.mat-mdc-tab-disabled .mdc-tab__ripple::before,.mat-mdc-tab-link.mat-mdc-tab-disabled .mat-ripple-element{background-color:var(--mat-tab-header-disabled-ripple-color)}.mat-mdc-tab-link .mdc-tab__ripple::before{content:\\\"\\\";display:block;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;background-color:var(--mat-tab-header-inactive-ripple-color)}.mat-mdc-tab-link .mdc-tab__text-label{color:var(--mat-tab-header-inactive-label-text-color);display:inline-flex;align-items:center}.mat-mdc-tab-link .mdc-tab__content{position:relative;pointer-events:auto}.mat-mdc-tab-link:hover .mdc-tab__ripple::before{opacity:.04}.mat-mdc-tab-link.cdk-program-focused .mdc-tab__ripple::before,.mat-mdc-tab-link.cdk-keyboard-focused .mdc-tab__ripple::before{opacity:.12}.mat-mdc-tab-link .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-header-inactive-ripple-color)}.mat-mdc-tab-header.mat-mdc-tab-nav-bar-stretch-tabs .mat-mdc-tab-link{flex-grow:1}.mat-mdc-tab-link::before{margin:5px}@media(max-width: 599px){.mat-mdc-tab-link{min-width:72px}}\"],\n encapsulation: 2,\n changeDetection: 0\n });\n }\n }\n return MatTabLink;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Tab panel component associated with MatTabNav.\n */\nlet MatTabNavPanel = /*#__PURE__*/(() => {\n class MatTabNavPanel {\n constructor() {\n /** Unique id for the tab panel. */\n this.id = `mat-tab-nav-panel-${nextUniqueId++}`;\n }\n static {\n this.ɵfac = function MatTabNavPanel_Factory(t) {\n return new (t || MatTabNavPanel)();\n };\n }\n static {\n this.ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: MatTabNavPanel,\n selectors: [[\"mat-tab-nav-panel\"]],\n hostAttrs: [\"role\", \"tabpanel\", 1, \"mat-mdc-tab-nav-panel\"],\n hostVars: 2,\n hostBindings: function MatTabNavPanel_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵattribute(\"aria-labelledby\", ctx._activeTabId)(\"id\", ctx.id);\n }\n },\n inputs: {\n id: \"id\"\n },\n exportAs: [\"matTabNavPanel\"],\n standalone: true,\n features: [i0.ɵɵStandaloneFeature],\n ngContentSelectors: _c0,\n decls: 1,\n vars: 0,\n template: function MatTabNavPanel_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵprojectionDef();\n i0.ɵɵprojection(0);\n }\n },\n encapsulation: 2,\n changeDetection: 0\n });\n }\n }\n return MatTabNavPanel;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet MatTabsModule = /*#__PURE__*/(() => {\n class MatTabsModule {\n static {\n this.ɵfac = function MatTabsModule_Factory(t) {\n return new (t || MatTabsModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: MatTabsModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n imports: [MatCommonModule, MatCommonModule]\n });\n }\n }\n return MatTabsModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MAT_TAB, MAT_TABS_CONFIG, MAT_TAB_CONTENT, MAT_TAB_GROUP, MAT_TAB_LABEL, MatInkBar, MatPaginatedTabHeader, MatTab, MatTabBody, MatTabBodyPortal, MatTabChangeEvent, MatTabContent, MatTabGroup, MatTabHeader, MatTabLabel, MatTabLabelWrapper, MatTabLink, MatTabNav, MatTabNavPanel, MatTabsModule, _MAT_INK_BAR_POSITIONER, _MAT_INK_BAR_POSITIONER_FACTORY, matTabsAnimations };\n","import * as i0 from '@angular/core';\nimport { Directive, InjectionToken, Attribute, Input, inject, NgZone, Component, ChangeDetectionStrategy, ViewEncapsulation, ViewChild, contentChild, Injector, computed, afterRender, ANIMATION_MODULE_TYPE, Optional, Inject, ContentChild, ContentChildren, NgModule } from '@angular/core';\nimport * as i1 from '@angular/cdk/bidi';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport * as i2 from '@angular/cdk/platform';\nimport { DOCUMENT, NgTemplateOutlet, CommonModule } from '@angular/common';\nimport { Subscription, Subject, merge } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { SharedResizeObserver } from '@angular/cdk/observers/private';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\nimport { ObserversModule } from '@angular/cdk/observers';\nimport { MatCommonModule } from '@angular/material/core';\n\n/** The floating label for a `mat-form-field`. */\nconst _c0 = [\"notch\"];\nconst _c1 = [\"matFormFieldNotchedOutline\", \"\"];\nconst _c2 = [\"*\"];\nconst _c3 = [\"textField\"];\nconst _c4 = [\"iconPrefixContainer\"];\nconst _c5 = [\"textPrefixContainer\"];\nconst _c6 = [\"*\", [[\"mat-label\"]], [[\"\", \"matPrefix\", \"\"], [\"\", \"matIconPrefix\", \"\"]], [[\"\", \"matTextPrefix\", \"\"]], [[\"\", \"matTextSuffix\", \"\"]], [[\"\", \"matSuffix\", \"\"], [\"\", \"matIconSuffix\", \"\"]], [[\"mat-error\"], [\"\", \"matError\", \"\"]], [[\"mat-hint\", 3, \"align\", \"end\"]], [[\"mat-hint\", \"align\", \"end\"]]];\nconst _c7 = [\"*\", \"mat-label\", \"[matPrefix], [matIconPrefix]\", \"[matTextPrefix]\", \"[matTextSuffix]\", \"[matSuffix], [matIconSuffix]\", \"mat-error, [matError]\", \"mat-hint:not([align='end'])\", \"mat-hint[align='end']\"];\nfunction MatFormField_ng_template_0_Conditional_0_Conditional_2_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelement(0, \"span\", 19);\n }\n}\nfunction MatFormField_ng_template_0_Conditional_0_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"label\", 18);\n i0.ɵɵprojection(1, 1);\n i0.ɵɵtemplate(2, MatFormField_ng_template_0_Conditional_0_Conditional_2_Template, 1, 0, \"span\", 19);\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n const ctx_r1 = i0.ɵɵnextContext(2);\n i0.ɵɵproperty(\"floating\", ctx_r1._shouldLabelFloat())(\"monitorResize\", ctx_r1._hasOutline())(\"id\", ctx_r1._labelId);\n i0.ɵɵattribute(\"for\", ctx_r1._control.disableAutomaticLabeling ? null : ctx_r1._control.id);\n i0.ɵɵadvance(2);\n i0.ɵɵconditional(!ctx_r1.hideRequiredMarker && ctx_r1._control.required ? 2 : -1);\n }\n}\nfunction MatFormField_ng_template_0_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵtemplate(0, MatFormField_ng_template_0_Conditional_0_Template, 3, 5, \"label\", 18);\n }\n if (rf & 2) {\n const ctx_r1 = i0.ɵɵnextContext();\n i0.ɵɵconditional(ctx_r1._hasFloatingLabel() ? 0 : -1);\n }\n}\nfunction MatFormField_Conditional_4_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelement(0, \"div\", 5);\n }\n}\nfunction MatFormField_Conditional_6_Conditional_1_ng_template_0_Template(rf, ctx) {}\nfunction MatFormField_Conditional_6_Conditional_1_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵtemplate(0, MatFormField_Conditional_6_Conditional_1_ng_template_0_Template, 0, 0, \"ng-template\", 11);\n }\n if (rf & 2) {\n i0.ɵɵnextContext(2);\n const labelTemplate_r3 = i0.ɵɵreference(1);\n i0.ɵɵproperty(\"ngTemplateOutlet\", labelTemplate_r3);\n }\n}\nfunction MatFormField_Conditional_6_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"div\", 7);\n i0.ɵɵtemplate(1, MatFormField_Conditional_6_Conditional_1_Template, 1, 1, null, 11);\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n const ctx_r1 = i0.ɵɵnextContext();\n i0.ɵɵproperty(\"matFormFieldNotchedOutlineOpen\", ctx_r1._shouldLabelFloat());\n i0.ɵɵadvance();\n i0.ɵɵconditional(!ctx_r1._forceDisplayInfixLabel() ? 1 : -1);\n }\n}\nfunction MatFormField_Conditional_7_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"div\", 8, 2);\n i0.ɵɵprojection(2, 2);\n i0.ɵɵelementEnd();\n }\n}\nfunction MatFormField_Conditional_8_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"div\", 9, 3);\n i0.ɵɵprojection(2, 3);\n i0.ɵɵelementEnd();\n }\n}\nfunction MatFormField_Conditional_10_ng_template_0_Template(rf, ctx) {}\nfunction MatFormField_Conditional_10_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵtemplate(0, MatFormField_Conditional_10_ng_template_0_Template, 0, 0, \"ng-template\", 11);\n }\n if (rf & 2) {\n i0.ɵɵnextContext();\n const labelTemplate_r3 = i0.ɵɵreference(1);\n i0.ɵɵproperty(\"ngTemplateOutlet\", labelTemplate_r3);\n }\n}\nfunction MatFormField_Conditional_12_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"div\", 12);\n i0.ɵɵprojection(1, 4);\n i0.ɵɵelementEnd();\n }\n}\nfunction MatFormField_Conditional_13_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"div\", 13);\n i0.ɵɵprojection(1, 5);\n i0.ɵɵelementEnd();\n }\n}\nfunction MatFormField_Conditional_14_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelement(0, \"div\", 14);\n }\n}\nfunction MatFormField_Case_16_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"div\", 16);\n i0.ɵɵprojection(1, 6);\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n const ctx_r1 = i0.ɵɵnextContext();\n i0.ɵɵproperty(\"@transitionMessages\", ctx_r1._subscriptAnimationState);\n }\n}\nfunction MatFormField_Case_17_Conditional_1_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"mat-hint\", 20);\n i0.ɵɵtext(1);\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n const ctx_r1 = i0.ɵɵnextContext(2);\n i0.ɵɵproperty(\"id\", ctx_r1._hintLabelId);\n i0.ɵɵadvance();\n i0.ɵɵtextInterpolate(ctx_r1.hintLabel);\n }\n}\nfunction MatFormField_Case_17_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"div\", 17);\n i0.ɵɵtemplate(1, MatFormField_Case_17_Conditional_1_Template, 2, 2, \"mat-hint\", 20);\n i0.ɵɵprojection(2, 7);\n i0.ɵɵelement(3, \"div\", 21);\n i0.ɵɵprojection(4, 8);\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n const ctx_r1 = i0.ɵɵnextContext();\n i0.ɵɵproperty(\"@transitionMessages\", ctx_r1._subscriptAnimationState);\n i0.ɵɵadvance();\n i0.ɵɵconditional(ctx_r1.hintLabel ? 1 : -1);\n }\n}\nlet MatLabel = /*#__PURE__*/(() => {\n class MatLabel {\n static {\n this.ɵfac = function MatLabel_Factory(t) {\n return new (t || MatLabel)();\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatLabel,\n selectors: [[\"mat-label\"]],\n standalone: true\n });\n }\n }\n return MatLabel;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet nextUniqueId$2 = 0;\n/**\n * Injection token that can be used to reference instances of `MatError`. It serves as\n * alternative token to the actual `MatError` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst MAT_ERROR = /*#__PURE__*/new InjectionToken('MatError');\n/** Single error message to be shown underneath the form-field. */\nlet MatError = /*#__PURE__*/(() => {\n class MatError {\n constructor(ariaLive, elementRef) {\n this.id = `mat-mdc-error-${nextUniqueId$2++}`;\n // If no aria-live value is set add 'polite' as a default. This is preferred over setting\n // role='alert' so that screen readers do not interrupt the current task to read this aloud.\n if (!ariaLive) {\n elementRef.nativeElement.setAttribute('aria-live', 'polite');\n }\n }\n static {\n this.ɵfac = function MatError_Factory(t) {\n return new (t || MatError)(i0.ɵɵinjectAttribute('aria-live'), i0.ɵɵdirectiveInject(i0.ElementRef));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatError,\n selectors: [[\"mat-error\"], [\"\", \"matError\", \"\"]],\n hostAttrs: [\"aria-atomic\", \"true\", 1, \"mat-mdc-form-field-error\", \"mat-mdc-form-field-bottom-align\"],\n hostVars: 1,\n hostBindings: function MatError_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵhostProperty(\"id\", ctx.id);\n }\n },\n inputs: {\n id: \"id\"\n },\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: MAT_ERROR,\n useExisting: MatError\n }])]\n });\n }\n }\n return MatError;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet nextUniqueId$1 = 0;\n/** Hint text to be shown underneath the form field control. */\nlet MatHint = /*#__PURE__*/(() => {\n class MatHint {\n constructor() {\n /** Whether to align the hint label at the start or end of the line. */\n this.align = 'start';\n /** Unique ID for the hint. Used for the aria-describedby on the form field control. */\n this.id = `mat-mdc-hint-${nextUniqueId$1++}`;\n }\n static {\n this.ɵfac = function MatHint_Factory(t) {\n return new (t || MatHint)();\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatHint,\n selectors: [[\"mat-hint\"]],\n hostAttrs: [1, \"mat-mdc-form-field-hint\", \"mat-mdc-form-field-bottom-align\"],\n hostVars: 4,\n hostBindings: function MatHint_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵhostProperty(\"id\", ctx.id);\n i0.ɵɵattribute(\"align\", null);\n i0.ɵɵclassProp(\"mat-mdc-form-field-hint-end\", ctx.align === \"end\");\n }\n },\n inputs: {\n align: \"align\",\n id: \"id\"\n },\n standalone: true\n });\n }\n }\n return MatHint;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Injection token that can be used to reference instances of `MatPrefix`. It serves as\n * alternative token to the actual `MatPrefix` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst MAT_PREFIX = /*#__PURE__*/new InjectionToken('MatPrefix');\n/** Prefix to be placed in front of the form field. */\nlet MatPrefix = /*#__PURE__*/(() => {\n class MatPrefix {\n constructor() {\n this._isText = false;\n }\n set _isTextSelector(value) {\n this._isText = true;\n }\n static {\n this.ɵfac = function MatPrefix_Factory(t) {\n return new (t || MatPrefix)();\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatPrefix,\n selectors: [[\"\", \"matPrefix\", \"\"], [\"\", \"matIconPrefix\", \"\"], [\"\", \"matTextPrefix\", \"\"]],\n inputs: {\n _isTextSelector: [0, \"matTextPrefix\", \"_isTextSelector\"]\n },\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: MAT_PREFIX,\n useExisting: MatPrefix\n }])]\n });\n }\n }\n return MatPrefix;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Injection token that can be used to reference instances of `MatSuffix`. It serves as\n * alternative token to the actual `MatSuffix` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst MAT_SUFFIX = /*#__PURE__*/new InjectionToken('MatSuffix');\n/** Suffix to be placed at the end of the form field. */\nlet MatSuffix = /*#__PURE__*/(() => {\n class MatSuffix {\n constructor() {\n this._isText = false;\n }\n set _isTextSelector(value) {\n this._isText = true;\n }\n static {\n this.ɵfac = function MatSuffix_Factory(t) {\n return new (t || MatSuffix)();\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatSuffix,\n selectors: [[\"\", \"matSuffix\", \"\"], [\"\", \"matIconSuffix\", \"\"], [\"\", \"matTextSuffix\", \"\"]],\n inputs: {\n _isTextSelector: [0, \"matTextSuffix\", \"_isTextSelector\"]\n },\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: MAT_SUFFIX,\n useExisting: MatSuffix\n }])]\n });\n }\n }\n return MatSuffix;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** An injion token for the parent form-field. */\nconst FLOATING_LABEL_PARENT = /*#__PURE__*/new InjectionToken('FloatingLabelParent');\n/**\n * Internal directive that maintains a MDC floating label. This directive does not\n * use the `MDCFloatingLabelFoundation` class, as it is not worth the size cost of\n * including it just to measure the label width and toggle some classes.\n *\n * The use of a directive allows us to conditionally render a floating label in the\n * template without having to manually manage instantiation and destruction of the\n * floating label component based on.\n *\n * The component is responsible for setting up the floating label styles, measuring label\n * width for the outline notch, and providing inputs that can be used to toggle the\n * label's floating or required state.\n */\nlet MatFormFieldFloatingLabel = /*#__PURE__*/(() => {\n class MatFormFieldFloatingLabel {\n /** Whether the label is floating. */\n get floating() {\n return this._floating;\n }\n set floating(value) {\n this._floating = value;\n if (this.monitorResize) {\n this._handleResize();\n }\n }\n /** Whether to monitor for resize events on the floating label. */\n get monitorResize() {\n return this._monitorResize;\n }\n set monitorResize(value) {\n this._monitorResize = value;\n if (this._monitorResize) {\n this._subscribeToResize();\n } else {\n this._resizeSubscription.unsubscribe();\n }\n }\n constructor(_elementRef) {\n this._elementRef = _elementRef;\n this._floating = false;\n this._monitorResize = false;\n /** The shared ResizeObserver. */\n this._resizeObserver = inject(SharedResizeObserver);\n /** The Angular zone. */\n this._ngZone = inject(NgZone);\n /** The parent form-field. */\n this._parent = inject(FLOATING_LABEL_PARENT);\n /** The current resize event subscription. */\n this._resizeSubscription = new Subscription();\n }\n ngOnDestroy() {\n this._resizeSubscription.unsubscribe();\n }\n /** Gets the width of the label. Used for the outline notch. */\n getWidth() {\n return estimateScrollWidth(this._elementRef.nativeElement);\n }\n /** Gets the HTML element for the floating label. */\n get element() {\n return this._elementRef.nativeElement;\n }\n /** Handles resize events from the ResizeObserver. */\n _handleResize() {\n // In the case where the label grows in size, the following sequence of events occurs:\n // 1. The label grows by 1px triggering the ResizeObserver\n // 2. The notch is expanded to accommodate the entire label\n // 3. The label expands to its full width, triggering the ResizeObserver again\n //\n // This is expected, but If we allow this to all happen within the same macro task it causes an\n // error: `ResizeObserver loop limit exceeded`. Therefore we push the notch resize out until\n // the next macro task.\n setTimeout(() => this._parent._handleLabelResized());\n }\n /** Subscribes to resize events. */\n _subscribeToResize() {\n this._resizeSubscription.unsubscribe();\n this._ngZone.runOutsideAngular(() => {\n this._resizeSubscription = this._resizeObserver.observe(this._elementRef.nativeElement, {\n box: 'border-box'\n }).subscribe(() => this._handleResize());\n });\n }\n static {\n this.ɵfac = function MatFormFieldFloatingLabel_Factory(t) {\n return new (t || MatFormFieldFloatingLabel)(i0.ɵɵdirectiveInject(i0.ElementRef));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatFormFieldFloatingLabel,\n selectors: [[\"label\", \"matFormFieldFloatingLabel\", \"\"]],\n hostAttrs: [1, \"mdc-floating-label\", \"mat-mdc-floating-label\"],\n hostVars: 2,\n hostBindings: function MatFormFieldFloatingLabel_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵclassProp(\"mdc-floating-label--float-above\", ctx.floating);\n }\n },\n inputs: {\n floating: \"floating\",\n monitorResize: \"monitorResize\"\n },\n standalone: true\n });\n }\n }\n return MatFormFieldFloatingLabel;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Estimates the scroll width of an element.\n * via https://github.com/material-components/material-components-web/blob/c0a11ef0d000a098fd0c372be8f12d6a99302855/packages/mdc-dom/ponyfill.ts\n */\nfunction estimateScrollWidth(element) {\n // Check the offsetParent. If the element inherits display: none from any\n // parent, the offsetParent property will be null (see\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent).\n // This check ensures we only clone the node when necessary.\n const htmlEl = element;\n if (htmlEl.offsetParent !== null) {\n return htmlEl.scrollWidth;\n }\n const clone = htmlEl.cloneNode(true);\n clone.style.setProperty('position', 'absolute');\n clone.style.setProperty('transform', 'translate(-9999px, -9999px)');\n document.documentElement.appendChild(clone);\n const scrollWidth = clone.scrollWidth;\n clone.remove();\n return scrollWidth;\n}\n\n/** Class added when the line ripple is active. */\nconst ACTIVATE_CLASS = 'mdc-line-ripple--active';\n/** Class added when the line ripple is being deactivated. */\nconst DEACTIVATING_CLASS = 'mdc-line-ripple--deactivating';\n/**\n * Internal directive that creates an instance of the MDC line-ripple component. Using a\n * directive allows us to conditionally render a line-ripple in the template without having\n * to manually create and destroy the `MDCLineRipple` component whenever the condition changes.\n *\n * The directive sets up the styles for the line-ripple and provides an API for activating\n * and deactivating the line-ripple.\n */\nlet MatFormFieldLineRipple = /*#__PURE__*/(() => {\n class MatFormFieldLineRipple {\n constructor(_elementRef, ngZone) {\n this._elementRef = _elementRef;\n this._handleTransitionEnd = event => {\n const classList = this._elementRef.nativeElement.classList;\n const isDeactivating = classList.contains(DEACTIVATING_CLASS);\n if (event.propertyName === 'opacity' && isDeactivating) {\n classList.remove(ACTIVATE_CLASS, DEACTIVATING_CLASS);\n }\n };\n ngZone.runOutsideAngular(() => {\n _elementRef.nativeElement.addEventListener('transitionend', this._handleTransitionEnd);\n });\n }\n activate() {\n const classList = this._elementRef.nativeElement.classList;\n classList.remove(DEACTIVATING_CLASS);\n classList.add(ACTIVATE_CLASS);\n }\n deactivate() {\n this._elementRef.nativeElement.classList.add(DEACTIVATING_CLASS);\n }\n ngOnDestroy() {\n this._elementRef.nativeElement.removeEventListener('transitionend', this._handleTransitionEnd);\n }\n static {\n this.ɵfac = function MatFormFieldLineRipple_Factory(t) {\n return new (t || MatFormFieldLineRipple)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.NgZone));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatFormFieldLineRipple,\n selectors: [[\"div\", \"matFormFieldLineRipple\", \"\"]],\n hostAttrs: [1, \"mdc-line-ripple\"],\n standalone: true\n });\n }\n }\n return MatFormFieldLineRipple;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Internal component that creates an instance of the MDC notched-outline component.\n *\n * The component sets up the HTML structure and styles for the notched-outline. It provides\n * inputs to toggle the notch state and width.\n */\nlet MatFormFieldNotchedOutline = /*#__PURE__*/(() => {\n class MatFormFieldNotchedOutline {\n constructor(_elementRef, _ngZone) {\n this._elementRef = _elementRef;\n this._ngZone = _ngZone;\n /** Whether the notch should be opened. */\n this.open = false;\n }\n ngAfterViewInit() {\n const label = this._elementRef.nativeElement.querySelector('.mdc-floating-label');\n if (label) {\n this._elementRef.nativeElement.classList.add('mdc-notched-outline--upgraded');\n if (typeof requestAnimationFrame === 'function') {\n label.style.transitionDuration = '0s';\n this._ngZone.runOutsideAngular(() => {\n requestAnimationFrame(() => label.style.transitionDuration = '');\n });\n }\n } else {\n this._elementRef.nativeElement.classList.add('mdc-notched-outline--no-label');\n }\n }\n _setNotchWidth(labelWidth) {\n if (!this.open || !labelWidth) {\n this._notch.nativeElement.style.width = '';\n } else {\n const NOTCH_ELEMENT_PADDING = 8;\n const NOTCH_ELEMENT_BORDER = 1;\n this._notch.nativeElement.style.width = `calc(${labelWidth}px * var(--mat-mdc-form-field-floating-label-scale, 0.75) + ${NOTCH_ELEMENT_PADDING + NOTCH_ELEMENT_BORDER}px)`;\n }\n }\n static {\n this.ɵfac = function MatFormFieldNotchedOutline_Factory(t) {\n return new (t || MatFormFieldNotchedOutline)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.NgZone));\n };\n }\n static {\n this.ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: MatFormFieldNotchedOutline,\n selectors: [[\"div\", \"matFormFieldNotchedOutline\", \"\"]],\n viewQuery: function MatFormFieldNotchedOutline_Query(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵviewQuery(_c0, 5);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._notch = _t.first);\n }\n },\n hostAttrs: [1, \"mdc-notched-outline\"],\n hostVars: 2,\n hostBindings: function MatFormFieldNotchedOutline_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵclassProp(\"mdc-notched-outline--notched\", ctx.open);\n }\n },\n inputs: {\n open: [0, \"matFormFieldNotchedOutlineOpen\", \"open\"]\n },\n standalone: true,\n features: [i0.ɵɵStandaloneFeature],\n attrs: _c1,\n ngContentSelectors: _c2,\n decls: 5,\n vars: 0,\n consts: [[\"notch\", \"\"], [1, \"mat-mdc-notch-piece\", \"mdc-notched-outline__leading\"], [1, \"mat-mdc-notch-piece\", \"mdc-notched-outline__notch\"], [1, \"mat-mdc-notch-piece\", \"mdc-notched-outline__trailing\"]],\n template: function MatFormFieldNotchedOutline_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵprojectionDef();\n i0.ɵɵelement(0, \"div\", 1);\n i0.ɵɵelementStart(1, \"div\", 2, 0);\n i0.ɵɵprojection(3);\n i0.ɵɵelementEnd();\n i0.ɵɵelement(4, \"div\", 3);\n }\n },\n encapsulation: 2,\n changeDetection: 0\n });\n }\n }\n return MatFormFieldNotchedOutline;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Animations used by the MatFormField.\n * @docs-private\n */\nconst matFormFieldAnimations = {\n /** Animation that transitions the form field's error and hint messages. */\n transitionMessages: /*#__PURE__*/trigger('transitionMessages', [\n /*#__PURE__*/\n // TODO(mmalerba): Use angular animations for label animation as well.\n state('enter', /*#__PURE__*/style({\n opacity: 1,\n transform: 'translateY(0%)'\n })), /*#__PURE__*/transition('void => enter', [/*#__PURE__*/style({\n opacity: 0,\n transform: 'translateY(-5px)'\n }), /*#__PURE__*/animate('300ms cubic-bezier(0.55, 0, 0.55, 0.2)')])])\n};\n\n/** An interface which allows a control to work inside of a `MatFormField`. */\nlet MatFormFieldControl = /*#__PURE__*/(() => {\n class MatFormFieldControl {\n static {\n this.ɵfac = function MatFormFieldControl_Factory(t) {\n return new (t || MatFormFieldControl)();\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatFormFieldControl\n });\n }\n }\n return MatFormFieldControl;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** @docs-private */\nfunction getMatFormFieldPlaceholderConflictError() {\n return Error('Placeholder attribute and child element were both specified.');\n}\n/** @docs-private */\nfunction getMatFormFieldDuplicatedHintError(align) {\n return Error(`A hint was already declared for 'align=\"${align}\"'.`);\n}\n/** @docs-private */\nfunction getMatFormFieldMissingControlError() {\n return Error('mat-form-field must contain a MatFormFieldControl.');\n}\n\n/**\n * Injection token that can be used to inject an instances of `MatFormField`. It serves\n * as alternative token to the actual `MatFormField` class which would cause unnecessary\n * retention of the `MatFormField` class and its component metadata.\n */\nconst MAT_FORM_FIELD = /*#__PURE__*/new InjectionToken('MatFormField');\n/**\n * Injection token that can be used to configure the\n * default options for all form field within an app.\n */\nconst MAT_FORM_FIELD_DEFAULT_OPTIONS = /*#__PURE__*/new InjectionToken('MAT_FORM_FIELD_DEFAULT_OPTIONS');\nlet nextUniqueId = 0;\n/** Default appearance used by the form field. */\nconst DEFAULT_APPEARANCE = 'fill';\n/**\n * Whether the label for form fields should by default float `always`,\n * `never`, or `auto`.\n */\nconst DEFAULT_FLOAT_LABEL = 'auto';\n/** Default way that the subscript element height is set. */\nconst DEFAULT_SUBSCRIPT_SIZING = 'fixed';\n/**\n * Default transform for docked floating labels in a MDC text-field. This value has been\n * extracted from the MDC text-field styles because we programmatically modify the docked\n * label transform, but do not want to accidentally discard the default label transform.\n */\nconst FLOATING_LABEL_DEFAULT_DOCKED_TRANSFORM = `translateY(-50%)`;\n/** Container for form controls that applies Material Design styling and behavior. */\nlet MatFormField = /*#__PURE__*/(() => {\n class MatFormField {\n /** Whether the required marker should be hidden. */\n get hideRequiredMarker() {\n return this._hideRequiredMarker;\n }\n set hideRequiredMarker(value) {\n this._hideRequiredMarker = coerceBooleanProperty(value);\n }\n /** Whether the label should always float or float as the user types. */\n get floatLabel() {\n return this._floatLabel || this._defaults?.floatLabel || DEFAULT_FLOAT_LABEL;\n }\n set floatLabel(value) {\n if (value !== this._floatLabel) {\n this._floatLabel = value;\n // For backwards compatibility. Custom form field controls or directives might set\n // the \"floatLabel\" input and expect the form field view to be updated automatically.\n // e.g. autocomplete trigger. Ideally we'd get rid of this and the consumers would just\n // emit the \"stateChanges\" observable. TODO(devversion): consider removing.\n this._changeDetectorRef.markForCheck();\n }\n }\n /** The form field appearance style. */\n get appearance() {\n return this._appearance;\n }\n set appearance(value) {\n const oldValue = this._appearance;\n const newAppearance = value || this._defaults?.appearance || DEFAULT_APPEARANCE;\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (newAppearance !== 'fill' && newAppearance !== 'outline') {\n throw new Error(`MatFormField: Invalid appearance \"${newAppearance}\", valid values are \"fill\" or \"outline\".`);\n }\n }\n this._appearance = newAppearance;\n if (this._appearance === 'outline' && this._appearance !== oldValue) {\n // If the appearance has been switched to `outline`, the label offset needs to be updated.\n // The update can happen once the view has been re-checked, but not immediately because\n // the view has not been updated and the notched-outline floating label is not present.\n this._needsOutlineLabelOffsetUpdate = true;\n }\n }\n /**\n * Whether the form field should reserve space for one line of hint/error text (default)\n * or to have the spacing grow from 0px as needed based on the size of the hint/error content.\n * Note that when using dynamic sizing, layout shifts will occur when hint/error text changes.\n */\n get subscriptSizing() {\n return this._subscriptSizing || this._defaults?.subscriptSizing || DEFAULT_SUBSCRIPT_SIZING;\n }\n set subscriptSizing(value) {\n this._subscriptSizing = value || this._defaults?.subscriptSizing || DEFAULT_SUBSCRIPT_SIZING;\n }\n /** Text for the form field hint. */\n get hintLabel() {\n return this._hintLabel;\n }\n set hintLabel(value) {\n this._hintLabel = value;\n this._processHints();\n }\n /** Gets the current form field control */\n get _control() {\n return this._explicitFormFieldControl || this._formFieldControl;\n }\n set _control(value) {\n this._explicitFormFieldControl = value;\n }\n constructor(_elementRef, _changeDetectorRef,\n /**\n * @deprecated not needed, to be removed.\n * @breaking-change 19.0.0 remove this param\n */\n _unusedNgZone, _dir, _platform, _defaults, _animationMode,\n /**\n * @deprecated not needed, to be removed.\n * @breaking-change 17.0.0 remove this param\n */\n _unusedDocument) {\n this._elementRef = _elementRef;\n this._changeDetectorRef = _changeDetectorRef;\n this._dir = _dir;\n this._platform = _platform;\n this._defaults = _defaults;\n this._animationMode = _animationMode;\n this._labelChild = contentChild(MatLabel);\n this._hideRequiredMarker = false;\n /**\n * Theme color of the form field. This API is supported in M2 themes only, it\n * has no effect in M3 themes.\n *\n * For information on applying color variants in M3, see\n * https://material.angular.io/guide/theming#using-component-color-variants.\n */\n this.color = 'primary';\n this._appearance = DEFAULT_APPEARANCE;\n this._subscriptSizing = null;\n this._hintLabel = '';\n this._hasIconPrefix = false;\n this._hasTextPrefix = false;\n this._hasIconSuffix = false;\n this._hasTextSuffix = false;\n // Unique id for the internal form field label.\n this._labelId = `mat-mdc-form-field-label-${nextUniqueId++}`;\n // Unique id for the hint label.\n this._hintLabelId = `mat-mdc-hint-${nextUniqueId++}`;\n /** State of the mat-hint and mat-error animations. */\n this._subscriptAnimationState = '';\n this._destroyed = new Subject();\n this._isFocused = null;\n this._needsOutlineLabelOffsetUpdate = false;\n this._injector = inject(Injector);\n /**\n * Gets the id of the label element. If no label is present, returns `null`.\n */\n this.getLabelId = computed(() => this._hasFloatingLabel() ? this._labelId : null);\n this._hasFloatingLabel = computed(() => !!this._labelChild());\n if (_defaults) {\n if (_defaults.appearance) {\n this.appearance = _defaults.appearance;\n }\n this._hideRequiredMarker = Boolean(_defaults?.hideRequiredMarker);\n if (_defaults.color) {\n this.color = _defaults.color;\n }\n }\n }\n ngAfterViewInit() {\n // Initial focus state sync. This happens rarely, but we want to account for\n // it in case the form field control has \"focused\" set to true on init.\n this._updateFocusState();\n // Enable animations now. This ensures we don't animate on initial render.\n this._subscriptAnimationState = 'enter';\n // Because the above changes a value used in the template after it was checked, we need\n // to trigger CD or the change might not be reflected if there is no other CD scheduled.\n this._changeDetectorRef.detectChanges();\n }\n ngAfterContentInit() {\n this._assertFormFieldControl();\n this._initializeControl();\n this._initializeSubscript();\n this._initializePrefixAndSuffix();\n this._initializeOutlineLabelOffsetSubscriptions();\n }\n ngAfterContentChecked() {\n this._assertFormFieldControl();\n }\n ngOnDestroy() {\n this._destroyed.next();\n this._destroyed.complete();\n }\n /**\n * Gets an ElementRef for the element that a overlay attached to the form field\n * should be positioned relative to.\n */\n getConnectedOverlayOrigin() {\n return this._textField || this._elementRef;\n }\n /** Animates the placeholder up and locks it in position. */\n _animateAndLockLabel() {\n // This is for backwards compatibility only. Consumers of the form field might use\n // this method. e.g. the autocomplete trigger. This method has been added to the non-MDC\n // form field because setting \"floatLabel\" to \"always\" caused the label to float without\n // animation. This is different in MDC where the label always animates, so this method\n // is no longer necessary. There doesn't seem any benefit in adding logic to allow changing\n // the floating label state without animations. The non-MDC implementation was inconsistent\n // because it always animates if \"floatLabel\" is set away from \"always\".\n // TODO(devversion): consider removing this method when releasing the MDC form field.\n if (this._hasFloatingLabel()) {\n this.floatLabel = 'always';\n }\n }\n /** Initializes the registered form field control. */\n _initializeControl() {\n const control = this._control;\n if (control.controlType) {\n this._elementRef.nativeElement.classList.add(`mat-mdc-form-field-type-${control.controlType}`);\n }\n // Subscribe to changes in the child control state in order to update the form field UI.\n control.stateChanges.subscribe(() => {\n this._updateFocusState();\n this._syncDescribedByIds();\n this._changeDetectorRef.markForCheck();\n });\n // Run change detection if the value changes.\n if (control.ngControl && control.ngControl.valueChanges) {\n control.ngControl.valueChanges.pipe(takeUntil(this._destroyed)).subscribe(() => this._changeDetectorRef.markForCheck());\n }\n }\n _checkPrefixAndSuffixTypes() {\n this._hasIconPrefix = !!this._prefixChildren.find(p => !p._isText);\n this._hasTextPrefix = !!this._prefixChildren.find(p => p._isText);\n this._hasIconSuffix = !!this._suffixChildren.find(s => !s._isText);\n this._hasTextSuffix = !!this._suffixChildren.find(s => s._isText);\n }\n /** Initializes the prefix and suffix containers. */\n _initializePrefixAndSuffix() {\n this._checkPrefixAndSuffixTypes();\n // Mark the form field as dirty whenever the prefix or suffix children change. This\n // is necessary because we conditionally display the prefix/suffix containers based\n // on whether there is projected content.\n merge(this._prefixChildren.changes, this._suffixChildren.changes).subscribe(() => {\n this._checkPrefixAndSuffixTypes();\n this._changeDetectorRef.markForCheck();\n });\n }\n /**\n * Initializes the subscript by validating hints and synchronizing \"aria-describedby\" ids\n * with the custom form field control. Also subscribes to hint and error changes in order\n * to be able to validate and synchronize ids on change.\n */\n _initializeSubscript() {\n // Re-validate when the number of hints changes.\n this._hintChildren.changes.subscribe(() => {\n this._processHints();\n this._changeDetectorRef.markForCheck();\n });\n // Update the aria-described by when the number of errors changes.\n this._errorChildren.changes.subscribe(() => {\n this._syncDescribedByIds();\n this._changeDetectorRef.markForCheck();\n });\n // Initial mat-hint validation and subscript describedByIds sync.\n this._validateHints();\n this._syncDescribedByIds();\n }\n /** Throws an error if the form field's control is missing. */\n _assertFormFieldControl() {\n if (!this._control && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getMatFormFieldMissingControlError();\n }\n }\n _updateFocusState() {\n // Usually the MDC foundation would call \"activateFocus\" and \"deactivateFocus\" whenever\n // certain DOM events are emitted. This is not possible in our implementation of the\n // form field because we support abstract form field controls which are not necessarily\n // of type input, nor do we have a reference to a native form field control element. Instead\n // we handle the focus by checking if the abstract form field control focused state changes.\n if (this._control.focused && !this._isFocused) {\n this._isFocused = true;\n this._lineRipple?.activate();\n } else if (!this._control.focused && (this._isFocused || this._isFocused === null)) {\n this._isFocused = false;\n this._lineRipple?.deactivate();\n }\n this._textField?.nativeElement.classList.toggle('mdc-text-field--focused', this._control.focused);\n }\n /**\n * The floating label in the docked state needs to account for prefixes. The horizontal offset\n * is calculated whenever the appearance changes to `outline`, the prefixes change, or when the\n * form field is added to the DOM. This method sets up all subscriptions which are needed to\n * trigger the label offset update.\n */\n _initializeOutlineLabelOffsetSubscriptions() {\n // Whenever the prefix changes, schedule an update of the label offset.\n // TODO(mmalerba): Use ResizeObserver to better support dynamically changing prefix content.\n this._prefixChildren.changes.subscribe(() => this._needsOutlineLabelOffsetUpdate = true);\n // TODO(mmalerba): Split this into separate `afterRender` calls using the `EarlyRead` and\n // `Write` phases.\n afterRender(() => {\n if (this._needsOutlineLabelOffsetUpdate) {\n this._needsOutlineLabelOffsetUpdate = false;\n this._updateOutlineLabelOffset();\n }\n }, {\n injector: this._injector\n });\n this._dir.change.pipe(takeUntil(this._destroyed)).subscribe(() => this._needsOutlineLabelOffsetUpdate = true);\n }\n /** Whether the floating label should always float or not. */\n _shouldAlwaysFloat() {\n return this.floatLabel === 'always';\n }\n _hasOutline() {\n return this.appearance === 'outline';\n }\n /**\n * Whether the label should display in the infix. Labels in the outline appearance are\n * displayed as part of the notched-outline and are horizontally offset to account for\n * form field prefix content. This won't work in server side rendering since we cannot\n * measure the width of the prefix container. To make the docked label appear as if the\n * right offset has been calculated, we forcibly render the label inside the infix. Since\n * the label is part of the infix, the label cannot overflow the prefix content.\n */\n _forceDisplayInfixLabel() {\n return !this._platform.isBrowser && this._prefixChildren.length && !this._shouldLabelFloat();\n }\n _shouldLabelFloat() {\n return this._control.shouldLabelFloat || this._shouldAlwaysFloat();\n }\n /**\n * Determines whether a class from the AbstractControlDirective\n * should be forwarded to the host element.\n */\n _shouldForward(prop) {\n const control = this._control ? this._control.ngControl : null;\n return control && control[prop];\n }\n /** Determines whether to display hints or errors. */\n _getDisplayedMessages() {\n return this._errorChildren && this._errorChildren.length > 0 && this._control.errorState ? 'error' : 'hint';\n }\n /** Handle label resize events. */\n _handleLabelResized() {\n this._refreshOutlineNotchWidth();\n }\n /** Refreshes the width of the outline-notch, if present. */\n _refreshOutlineNotchWidth() {\n if (!this._hasOutline() || !this._floatingLabel || !this._shouldLabelFloat()) {\n this._notchedOutline?._setNotchWidth(0);\n } else {\n this._notchedOutline?._setNotchWidth(this._floatingLabel.getWidth());\n }\n }\n /** Does any extra processing that is required when handling the hints. */\n _processHints() {\n this._validateHints();\n this._syncDescribedByIds();\n }\n /**\n * Ensure that there is a maximum of one of each \"mat-hint\" alignment specified. The hint\n * label specified set through the input is being considered as \"start\" aligned.\n *\n * This method is a noop if Angular runs in production mode.\n */\n _validateHints() {\n if (this._hintChildren && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n let startHint;\n let endHint;\n this._hintChildren.forEach(hint => {\n if (hint.align === 'start') {\n if (startHint || this.hintLabel) {\n throw getMatFormFieldDuplicatedHintError('start');\n }\n startHint = hint;\n } else if (hint.align === 'end') {\n if (endHint) {\n throw getMatFormFieldDuplicatedHintError('end');\n }\n endHint = hint;\n }\n });\n }\n }\n /**\n * Sets the list of element IDs that describe the child control. This allows the control to update\n * its `aria-describedby` attribute accordingly.\n */\n _syncDescribedByIds() {\n if (this._control) {\n let ids = [];\n // TODO(wagnermaciel): Remove the type check when we find the root cause of this bug.\n if (this._control.userAriaDescribedBy && typeof this._control.userAriaDescribedBy === 'string') {\n ids.push(...this._control.userAriaDescribedBy.split(' '));\n }\n if (this._getDisplayedMessages() === 'hint') {\n const startHint = this._hintChildren ? this._hintChildren.find(hint => hint.align === 'start') : null;\n const endHint = this._hintChildren ? this._hintChildren.find(hint => hint.align === 'end') : null;\n if (startHint) {\n ids.push(startHint.id);\n } else if (this._hintLabel) {\n ids.push(this._hintLabelId);\n }\n if (endHint) {\n ids.push(endHint.id);\n }\n } else if (this._errorChildren) {\n ids.push(...this._errorChildren.map(error => error.id));\n }\n this._control.setDescribedByIds(ids);\n }\n }\n /**\n * Updates the horizontal offset of the label in the outline appearance. In the outline\n * appearance, the notched-outline and label are not relative to the infix container because\n * the outline intends to surround prefixes, suffixes and the infix. This means that the\n * floating label by default overlaps prefixes in the docked state. To avoid this, we need to\n * horizontally offset the label by the width of the prefix container. The MDC text-field does\n * not need to do this because they use a fixed width for prefixes. Hence, they can simply\n * incorporate the horizontal offset into their default text-field styles.\n */\n _updateOutlineLabelOffset() {\n if (!this._hasOutline() || !this._floatingLabel) {\n return;\n }\n const floatingLabel = this._floatingLabel.element;\n // If no prefix is displayed, reset the outline label offset from potential\n // previous label offset updates.\n if (!(this._iconPrefixContainer || this._textPrefixContainer)) {\n floatingLabel.style.transform = '';\n return;\n }\n // If the form field is not attached to the DOM yet (e.g. in a tab), we defer\n // the label offset update until the zone stabilizes.\n if (!this._isAttachedToDom()) {\n this._needsOutlineLabelOffsetUpdate = true;\n return;\n }\n const iconPrefixContainer = this._iconPrefixContainer?.nativeElement;\n const textPrefixContainer = this._textPrefixContainer?.nativeElement;\n const iconPrefixContainerWidth = iconPrefixContainer?.getBoundingClientRect().width ?? 0;\n const textPrefixContainerWidth = textPrefixContainer?.getBoundingClientRect().width ?? 0;\n // If the directionality is RTL, the x-axis transform needs to be inverted. This\n // is because `transformX` does not change based on the page directionality.\n const negate = this._dir.value === 'rtl' ? '-1' : '1';\n const prefixWidth = `${iconPrefixContainerWidth + textPrefixContainerWidth}px`;\n const labelOffset = `var(--mat-mdc-form-field-label-offset-x, 0px)`;\n const labelHorizontalOffset = `calc(${negate} * (${prefixWidth} + ${labelOffset}))`;\n // Update the translateX of the floating label to account for the prefix container,\n // but allow the CSS to override this setting via a CSS variable when the label is\n // floating.\n floatingLabel.style.transform = `var(\n --mat-mdc-form-field-label-transform,\n ${FLOATING_LABEL_DEFAULT_DOCKED_TRANSFORM} translateX(${labelHorizontalOffset})\n )`;\n }\n /** Checks whether the form field is attached to the DOM. */\n _isAttachedToDom() {\n const element = this._elementRef.nativeElement;\n if (element.getRootNode) {\n const rootNode = element.getRootNode();\n // If the element is inside the DOM the root node will be either the document\n // or the closest shadow root, otherwise it'll be the element itself.\n return rootNode && rootNode !== element;\n }\n // Otherwise fall back to checking if it's in the document. This doesn't account for\n // shadow DOM, however browser that support shadow DOM should support `getRootNode` as well.\n return document.documentElement.contains(element);\n }\n static {\n this.ɵfac = function MatFormField_Factory(t) {\n return new (t || MatFormField)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i1.Directionality), i0.ɵɵdirectiveInject(i2.Platform), i0.ɵɵdirectiveInject(MAT_FORM_FIELD_DEFAULT_OPTIONS, 8), i0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8), i0.ɵɵdirectiveInject(DOCUMENT));\n };\n }\n static {\n this.ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: MatFormField,\n selectors: [[\"mat-form-field\"]],\n contentQueries: function MatFormField_ContentQueries(rf, ctx, dirIndex) {\n if (rf & 1) {\n i0.ɵɵcontentQuerySignal(dirIndex, ctx._labelChild, MatLabel, 5);\n i0.ɵɵcontentQuery(dirIndex, MatFormFieldControl, 5);\n i0.ɵɵcontentQuery(dirIndex, MAT_PREFIX, 5);\n i0.ɵɵcontentQuery(dirIndex, MAT_SUFFIX, 5);\n i0.ɵɵcontentQuery(dirIndex, MAT_ERROR, 5);\n i0.ɵɵcontentQuery(dirIndex, MatHint, 5);\n }\n if (rf & 2) {\n i0.ɵɵqueryAdvance();\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._formFieldControl = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._prefixChildren = _t);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._suffixChildren = _t);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._errorChildren = _t);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._hintChildren = _t);\n }\n },\n viewQuery: function MatFormField_Query(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵviewQuery(_c3, 5);\n i0.ɵɵviewQuery(_c4, 5);\n i0.ɵɵviewQuery(_c5, 5);\n i0.ɵɵviewQuery(MatFormFieldFloatingLabel, 5);\n i0.ɵɵviewQuery(MatFormFieldNotchedOutline, 5);\n i0.ɵɵviewQuery(MatFormFieldLineRipple, 5);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._textField = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._iconPrefixContainer = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._textPrefixContainer = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._floatingLabel = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._notchedOutline = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._lineRipple = _t.first);\n }\n },\n hostAttrs: [1, \"mat-mdc-form-field\"],\n hostVars: 42,\n hostBindings: function MatFormField_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵclassProp(\"mat-mdc-form-field-label-always-float\", ctx._shouldAlwaysFloat())(\"mat-mdc-form-field-has-icon-prefix\", ctx._hasIconPrefix)(\"mat-mdc-form-field-has-icon-suffix\", ctx._hasIconSuffix)(\"mat-form-field-invalid\", ctx._control.errorState)(\"mat-form-field-disabled\", ctx._control.disabled)(\"mat-form-field-autofilled\", ctx._control.autofilled)(\"mat-form-field-no-animations\", ctx._animationMode === \"NoopAnimations\")(\"mat-form-field-appearance-fill\", ctx.appearance == \"fill\")(\"mat-form-field-appearance-outline\", ctx.appearance == \"outline\")(\"mat-form-field-hide-placeholder\", ctx._hasFloatingLabel() && !ctx._shouldLabelFloat())(\"mat-focused\", ctx._control.focused)(\"mat-primary\", ctx.color !== \"accent\" && ctx.color !== \"warn\")(\"mat-accent\", ctx.color === \"accent\")(\"mat-warn\", ctx.color === \"warn\")(\"ng-untouched\", ctx._shouldForward(\"untouched\"))(\"ng-touched\", ctx._shouldForward(\"touched\"))(\"ng-pristine\", ctx._shouldForward(\"pristine\"))(\"ng-dirty\", ctx._shouldForward(\"dirty\"))(\"ng-valid\", ctx._shouldForward(\"valid\"))(\"ng-invalid\", ctx._shouldForward(\"invalid\"))(\"ng-pending\", ctx._shouldForward(\"pending\"));\n }\n },\n inputs: {\n hideRequiredMarker: \"hideRequiredMarker\",\n color: \"color\",\n floatLabel: \"floatLabel\",\n appearance: \"appearance\",\n subscriptSizing: \"subscriptSizing\",\n hintLabel: \"hintLabel\"\n },\n exportAs: [\"matFormField\"],\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: MAT_FORM_FIELD,\n useExisting: MatFormField\n }, {\n provide: FLOATING_LABEL_PARENT,\n useExisting: MatFormField\n }]), i0.ɵɵStandaloneFeature],\n ngContentSelectors: _c7,\n decls: 18,\n vars: 21,\n consts: [[\"labelTemplate\", \"\"], [\"textField\", \"\"], [\"iconPrefixContainer\", \"\"], [\"textPrefixContainer\", \"\"], [1, \"mat-mdc-text-field-wrapper\", \"mdc-text-field\", 3, \"click\"], [1, \"mat-mdc-form-field-focus-overlay\"], [1, \"mat-mdc-form-field-flex\"], [\"matFormFieldNotchedOutline\", \"\", 3, \"matFormFieldNotchedOutlineOpen\"], [1, \"mat-mdc-form-field-icon-prefix\"], [1, \"mat-mdc-form-field-text-prefix\"], [1, \"mat-mdc-form-field-infix\"], [3, \"ngTemplateOutlet\"], [1, \"mat-mdc-form-field-text-suffix\"], [1, \"mat-mdc-form-field-icon-suffix\"], [\"matFormFieldLineRipple\", \"\"], [1, \"mat-mdc-form-field-subscript-wrapper\", \"mat-mdc-form-field-bottom-align\"], [1, \"mat-mdc-form-field-error-wrapper\"], [1, \"mat-mdc-form-field-hint-wrapper\"], [\"matFormFieldFloatingLabel\", \"\", 3, \"floating\", \"monitorResize\", \"id\"], [\"aria-hidden\", \"true\", 1, \"mat-mdc-form-field-required-marker\", \"mdc-floating-label--required\"], [3, \"id\"], [1, \"mat-mdc-form-field-hint-spacer\"]],\n template: function MatFormField_Template(rf, ctx) {\n if (rf & 1) {\n const _r1 = i0.ɵɵgetCurrentView();\n i0.ɵɵprojectionDef(_c6);\n i0.ɵɵtemplate(0, MatFormField_ng_template_0_Template, 1, 1, \"ng-template\", null, 0, i0.ɵɵtemplateRefExtractor);\n i0.ɵɵelementStart(2, \"div\", 4, 1);\n i0.ɵɵlistener(\"click\", function MatFormField_Template_div_click_2_listener($event) {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._control.onContainerClick($event));\n });\n i0.ɵɵtemplate(4, MatFormField_Conditional_4_Template, 1, 0, \"div\", 5);\n i0.ɵɵelementStart(5, \"div\", 6);\n i0.ɵɵtemplate(6, MatFormField_Conditional_6_Template, 2, 2, \"div\", 7)(7, MatFormField_Conditional_7_Template, 3, 0, \"div\", 8)(8, MatFormField_Conditional_8_Template, 3, 0, \"div\", 9);\n i0.ɵɵelementStart(9, \"div\", 10);\n i0.ɵɵtemplate(10, MatFormField_Conditional_10_Template, 1, 1, null, 11);\n i0.ɵɵprojection(11);\n i0.ɵɵelementEnd();\n i0.ɵɵtemplate(12, MatFormField_Conditional_12_Template, 2, 0, \"div\", 12)(13, MatFormField_Conditional_13_Template, 2, 0, \"div\", 13);\n i0.ɵɵelementEnd();\n i0.ɵɵtemplate(14, MatFormField_Conditional_14_Template, 1, 0, \"div\", 14);\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(15, \"div\", 15);\n i0.ɵɵtemplate(16, MatFormField_Case_16_Template, 2, 1, \"div\", 16)(17, MatFormField_Case_17_Template, 5, 2, \"div\", 17);\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n let tmp_16_0;\n i0.ɵɵadvance(2);\n i0.ɵɵclassProp(\"mdc-text-field--filled\", !ctx._hasOutline())(\"mdc-text-field--outlined\", ctx._hasOutline())(\"mdc-text-field--no-label\", !ctx._hasFloatingLabel())(\"mdc-text-field--disabled\", ctx._control.disabled)(\"mdc-text-field--invalid\", ctx._control.errorState);\n i0.ɵɵadvance(2);\n i0.ɵɵconditional(!ctx._hasOutline() && !ctx._control.disabled ? 4 : -1);\n i0.ɵɵadvance(2);\n i0.ɵɵconditional(ctx._hasOutline() ? 6 : -1);\n i0.ɵɵadvance();\n i0.ɵɵconditional(ctx._hasIconPrefix ? 7 : -1);\n i0.ɵɵadvance();\n i0.ɵɵconditional(ctx._hasTextPrefix ? 8 : -1);\n i0.ɵɵadvance(2);\n i0.ɵɵconditional(!ctx._hasOutline() || ctx._forceDisplayInfixLabel() ? 10 : -1);\n i0.ɵɵadvance(2);\n i0.ɵɵconditional(ctx._hasTextSuffix ? 12 : -1);\n i0.ɵɵadvance();\n i0.ɵɵconditional(ctx._hasIconSuffix ? 13 : -1);\n i0.ɵɵadvance();\n i0.ɵɵconditional(!ctx._hasOutline() ? 14 : -1);\n i0.ɵɵadvance();\n i0.ɵɵclassProp(\"mat-mdc-form-field-subscript-dynamic-size\", ctx.subscriptSizing === \"dynamic\");\n i0.ɵɵadvance();\n i0.ɵɵconditional((tmp_16_0 = ctx._getDisplayedMessages()) === \"error\" ? 16 : tmp_16_0 === \"hint\" ? 17 : -1);\n }\n },\n dependencies: [MatFormFieldFloatingLabel, MatFormFieldNotchedOutline, NgTemplateOutlet, MatFormFieldLineRipple, MatHint],\n styles: [\".mdc-text-field{display:inline-flex;align-items:baseline;padding:0 16px;position:relative;box-sizing:border-box;overflow:hidden;will-change:opacity,transform,color;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.mdc-text-field__input{width:100%;min-width:0;border:none;border-radius:0;background:none;padding:0;-moz-appearance:none;-webkit-appearance:none;height:28px}.mdc-text-field__input::-webkit-calendar-picker-indicator{display:none}.mdc-text-field__input::-ms-clear{display:none}.mdc-text-field__input:focus{outline:none}.mdc-text-field__input:invalid{box-shadow:none}.mdc-text-field__input::placeholder{opacity:0}.mdc-text-field__input::-moz-placeholder{opacity:0}.mdc-text-field__input::-webkit-input-placeholder{opacity:0}.mdc-text-field__input:-ms-input-placeholder{opacity:0}.mdc-text-field--no-label .mdc-text-field__input::placeholder,.mdc-text-field--focused .mdc-text-field__input::placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input::-moz-placeholder,.mdc-text-field--focused .mdc-text-field__input::-moz-placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input::-webkit-input-placeholder,.mdc-text-field--focused .mdc-text-field__input::-webkit-input-placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder,.mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder{opacity:1}.mdc-text-field--outlined .mdc-text-field__input,.mdc-text-field--filled.mdc-text-field--no-label .mdc-text-field__input{height:100%}.mdc-text-field--outlined .mdc-text-field__input{display:flex;border:none !important;background-color:rgba(0,0,0,0)}.mdc-text-field--disabled .mdc-text-field__input{pointer-events:auto}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input{color:var(--mdc-filled-text-field-input-text-color);caret-color:var(--mdc-filled-text-field-caret-color)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::placeholder{color:var(--mdc-filled-text-field-input-text-placeholder-color)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::-moz-placeholder{color:var(--mdc-filled-text-field-input-text-placeholder-color)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::-webkit-input-placeholder{color:var(--mdc-filled-text-field-input-text-placeholder-color)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder{color:var(--mdc-filled-text-field-input-text-placeholder-color)}.mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-text-field__input{caret-color:var(--mdc-filled-text-field-error-caret-color)}.mdc-text-field--filled.mdc-text-field--disabled .mdc-text-field__input{color:var(--mdc-filled-text-field-disabled-input-text-color)}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input{color:var(--mdc-outlined-text-field-input-text-color);caret-color:var(--mdc-outlined-text-field-caret-color)}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::placeholder{color:var(--mdc-outlined-text-field-input-text-placeholder-color)}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::-moz-placeholder{color:var(--mdc-outlined-text-field-input-text-placeholder-color)}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::-webkit-input-placeholder{color:var(--mdc-outlined-text-field-input-text-placeholder-color)}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder{color:var(--mdc-outlined-text-field-input-text-placeholder-color)}.mdc-text-field--outlined.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-text-field__input{caret-color:var(--mdc-outlined-text-field-error-caret-color)}.mdc-text-field--outlined.mdc-text-field--disabled .mdc-text-field__input{color:var(--mdc-outlined-text-field-disabled-input-text-color)}.mdc-text-field--disabled .cdk-high-contrast-active .mdc-text-field__input{background-color:Window}.mdc-text-field--filled{height:56px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:var(--mdc-filled-text-field-container-shape);border-top-right-radius:var(--mdc-filled-text-field-container-shape)}.mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:var(--mdc-filled-text-field-container-color)}.mdc-text-field--filled.mdc-text-field--disabled{background-color:var(--mdc-filled-text-field-disabled-container-color)}.mdc-text-field--outlined{height:56px;overflow:visible;padding-left:16px;padding-right:16px}@supports(top: max(0%)){.mdc-text-field--outlined{padding-right:max(16px,var(--mdc-outlined-text-field-container-shape));padding-left:max(16px,var(--mdc-outlined-text-field-container-shape) + 4px)}[dir=rtl] .mdc-text-field--outlined{padding-right:max(16px,var(--mdc-outlined-text-field-container-shape) + 4px);padding-left:max(16px,var(--mdc-outlined-text-field-container-shape))}}.mdc-floating-label{position:absolute;left:0;transform-origin:left top;line-height:1.15rem;text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:text;overflow:hidden;will-change:transform}[dir=rtl] .mdc-floating-label{right:0;left:auto;transform-origin:right top;text-align:right}.mdc-text-field .mdc-floating-label{top:50%;transform:translateY(-50%);pointer-events:none}.mdc-notched-outline .mdc-floating-label{display:inline-block;position:relative;max-width:100%}.mdc-text-field--outlined .mdc-floating-label{left:4px;right:auto}[dir=rtl] .mdc-text-field--outlined .mdc-floating-label{left:auto;right:4px}.mdc-text-field--filled .mdc-floating-label{left:16px;right:auto}[dir=rtl] .mdc-text-field--filled .mdc-floating-label{left:auto;right:16px}.mdc-text-field--disabled .mdc-floating-label{cursor:default}.cdk-high-contrast-active .mdc-text-field--disabled .mdc-floating-label{z-index:1}.mdc-text-field--filled.mdc-text-field--no-label .mdc-floating-label{display:none}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mdc-filled-text-field-label-text-color)}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-floating-label{color:var(--mdc-filled-text-field-focus-label-text-color)}.mdc-text-field--filled:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-floating-label{color:var(--mdc-filled-text-field-hover-label-text-color)}.mdc-text-field--filled.mdc-text-field--disabled .mdc-floating-label{color:var(--mdc-filled-text-field-disabled-label-text-color)}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-floating-label{color:var(--mdc-filled-text-field-error-label-text-color)}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mdc-floating-label{color:var(--mdc-filled-text-field-error-focus-label-text-color)}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--disabled):hover .mdc-floating-label{color:var(--mdc-filled-text-field-error-hover-label-text-color)}.mdc-text-field--filled .mdc-floating-label{font-family:var(--mdc-filled-text-field-label-text-font);font-size:var(--mdc-filled-text-field-label-text-size);font-weight:var(--mdc-filled-text-field-label-text-weight);letter-spacing:var(--mdc-filled-text-field-label-text-tracking)}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mdc-outlined-text-field-label-text-color)}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-floating-label{color:var(--mdc-outlined-text-field-focus-label-text-color)}.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-floating-label{color:var(--mdc-outlined-text-field-hover-label-text-color)}.mdc-text-field--outlined.mdc-text-field--disabled .mdc-floating-label{color:var(--mdc-outlined-text-field-disabled-label-text-color)}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-floating-label{color:var(--mdc-outlined-text-field-error-label-text-color)}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mdc-floating-label{color:var(--mdc-outlined-text-field-error-focus-label-text-color)}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--disabled):hover .mdc-floating-label{color:var(--mdc-outlined-text-field-error-hover-label-text-color)}.mdc-text-field--outlined .mdc-floating-label{font-family:var(--mdc-outlined-text-field-label-text-font);font-size:var(--mdc-outlined-text-field-label-text-size);font-weight:var(--mdc-outlined-text-field-label-text-weight);letter-spacing:var(--mdc-outlined-text-field-label-text-tracking)}.mdc-floating-label--float-above{cursor:auto;transform:translateY(-106%) scale(0.75)}.mdc-text-field--filled .mdc-floating-label--float-above{transform:translateY(-106%) scale(0.75)}.mdc-text-field--outlined .mdc-floating-label--float-above{transform:translateY(-37.25px) scale(1);font-size:.75rem}.mdc-notched-outline .mdc-floating-label--float-above{text-overflow:clip}.mdc-notched-outline--upgraded .mdc-floating-label--float-above{max-width:133.3333333333%}.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{transform:translateY(-34.75px) scale(0.75)}.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:1rem}.mdc-floating-label--required:not(.mdc-floating-label--hide-required-marker)::after{margin-left:1px;margin-right:0;content:\\\"*\\\"}[dir=rtl] .mdc-floating-label--required:not(.mdc-floating-label--hide-required-marker)::after{margin-left:0;margin-right:1px}.mdc-notched-outline{display:flex;position:absolute;top:0;right:0;left:0;box-sizing:border-box;width:100%;max-width:100%;height:100%;text-align:left;pointer-events:none}[dir=rtl] .mdc-notched-outline{text-align:right}.mdc-text-field--outlined .mdc-notched-outline{z-index:1}.mat-mdc-notch-piece{box-sizing:border-box;height:100%;pointer-events:none;border-top:1px solid;border-bottom:1px solid}.mdc-text-field--focused .mat-mdc-notch-piece{border-width:2px}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-outline-color);border-width:var(--mdc-outlined-text-field-outline-width)}.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-hover-outline-color)}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-focus-outline-color)}.mdc-text-field--outlined.mdc-text-field--disabled .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-disabled-outline-color)}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-error-outline-color)}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--focused):hover .mdc-notched-outline .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-error-hover-outline-color)}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-error-focus-outline-color)}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline .mat-mdc-notch-piece{border-width:var(--mdc-outlined-text-field-focus-outline-width)}.mdc-notched-outline__leading{border-left:1px solid;border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;width:12px;border-top-left-radius:var(--mdc-outlined-text-field-container-shape);border-bottom-left-radius:var(--mdc-outlined-text-field-container-shape)}@supports(top: max(0%)){.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__leading{width:max(12px,var(--mdc-outlined-text-field-container-shape))}}[dir=rtl] .mdc-notched-outline__leading{border-left:none;border-right:1px solid;border-bottom-left-radius:0;border-top-left-radius:0;border-top-right-radius:var(--mdc-outlined-text-field-container-shape);border-bottom-right-radius:var(--mdc-outlined-text-field-container-shape)}.mdc-notched-outline__trailing{flex-grow:1;border-left:none;border-right:1px solid;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:var(--mdc-outlined-text-field-container-shape);border-bottom-right-radius:var(--mdc-outlined-text-field-container-shape)}[dir=rtl] .mdc-notched-outline__trailing{border-left:1px solid;border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--mdc-outlined-text-field-container-shape);border-bottom-left-radius:var(--mdc-outlined-text-field-container-shape)}.mdc-notched-outline__notch{flex:0 0 auto;width:auto;max-width:calc(100% - 24px)}@supports(top: max(0%)){.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__notch{max-width:calc(100% - max(12px,var(--mdc-outlined-text-field-container-shape))*2)}}.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:1px}.mdc-text-field--focused.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:2px}.mdc-notched-outline--notched .mdc-notched-outline__notch{padding-left:0;padding-right:8px;border-top:none}[dir=rtl] .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-left:8px;padding-right:0}.mdc-notched-outline--no-label .mdc-notched-outline__notch{display:none}.mdc-line-ripple::before,.mdc-line-ripple::after{position:absolute;bottom:0;left:0;width:100%;border-bottom-style:solid;content:\\\"\\\"}.mdc-line-ripple::before{z-index:1;border-bottom-width:var(--mdc-filled-text-field-active-indicator-height)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::before{border-bottom-color:var(--mdc-filled-text-field-active-indicator-color)}.mdc-text-field--filled:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-line-ripple::before{border-bottom-color:var(--mdc-filled-text-field-hover-active-indicator-color)}.mdc-text-field--filled.mdc-text-field--disabled .mdc-line-ripple::before{border-bottom-color:var(--mdc-filled-text-field-disabled-active-indicator-color)}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-line-ripple::before{border-bottom-color:var(--mdc-filled-text-field-error-active-indicator-color)}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--focused):hover .mdc-line-ripple::before{border-bottom-color:var(--mdc-filled-text-field-error-hover-active-indicator-color)}.mdc-line-ripple::after{transform:scaleX(0);opacity:0;z-index:2}.mdc-text-field--filled .mdc-line-ripple::after{border-bottom-width:var(--mdc-filled-text-field-focus-active-indicator-height)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::after{border-bottom-color:var(--mdc-filled-text-field-focus-active-indicator-color)}.mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-line-ripple::after{border-bottom-color:var(--mdc-filled-text-field-error-focus-active-indicator-color)}.mdc-line-ripple--active::after{transform:scaleX(1);opacity:1}.mdc-line-ripple--deactivating::after{opacity:0}.mdc-text-field--disabled{pointer-events:none}.mat-mdc-form-field-textarea-control{vertical-align:middle;resize:vertical;box-sizing:border-box;height:auto;margin:0;padding:0;border:none;overflow:auto}.mat-mdc-form-field-input-control.mat-mdc-form-field-input-control{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font:inherit;letter-spacing:inherit;text-decoration:inherit;text-transform:inherit;border:none}.mat-mdc-form-field .mat-mdc-floating-label.mdc-floating-label{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;line-height:normal;pointer-events:all;will-change:auto}.mat-mdc-form-field:not(.mat-form-field-disabled) .mat-mdc-floating-label.mdc-floating-label{cursor:inherit}.mdc-text-field--no-label:not(.mdc-text-field--textarea) .mat-mdc-form-field-input-control.mdc-text-field__input,.mat-mdc-text-field-wrapper .mat-mdc-form-field-input-control{height:auto}.mat-mdc-text-field-wrapper .mat-mdc-form-field-input-control.mdc-text-field__input[type=color]{height:23px}.mat-mdc-text-field-wrapper{height:auto;flex:auto;will-change:auto}.mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding-left:0;--mat-mdc-form-field-label-offset-x: -16px}.mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-right:0}[dir=rtl] .mat-mdc-text-field-wrapper{padding-left:16px;padding-right:16px}[dir=rtl] .mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-left:0}[dir=rtl] .mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding-right:0}.mat-form-field-disabled .mdc-text-field__input::placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color)}.mat-form-field-disabled .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color)}.mat-form-field-disabled .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color)}.mat-form-field-disabled .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color)}.mat-mdc-form-field-label-always-float .mdc-text-field__input::placeholder{transition-delay:40ms;transition-duration:110ms;opacity:1}.mat-mdc-text-field-wrapper .mat-mdc-form-field-infix .mat-mdc-floating-label{left:auto;right:auto}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-text-field__input{display:inline-block}.mat-mdc-form-field .mat-mdc-text-field-wrapper.mdc-text-field .mdc-notched-outline__notch{padding-top:0}.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field .mdc-notched-outline__notch{border-left:1px solid rgba(0,0,0,0)}[dir=rtl] .mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field .mdc-notched-outline__notch{border-left:none;border-right:1px solid rgba(0,0,0,0)}.mat-mdc-form-field-infix{min-height:var(--mat-form-field-container-height);padding-top:var(--mat-form-field-filled-with-label-container-padding-top);padding-bottom:var(--mat-form-field-filled-with-label-container-padding-bottom)}.mdc-text-field--outlined .mat-mdc-form-field-infix,.mdc-text-field--no-label .mat-mdc-form-field-infix{padding-top:var(--mat-form-field-container-vertical-padding);padding-bottom:var(--mat-form-field-container-vertical-padding)}.mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:calc(var(--mat-form-field-container-height)/2)}.mdc-text-field--filled .mat-mdc-floating-label{display:var(--mat-form-field-filled-label-display, block)}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{--mat-mdc-form-field-label-transform: translateY(calc(calc(6.75px + var(--mat-form-field-container-height) / 2) * -1)) scale(var(--mat-mdc-form-field-floating-label-scale, 0.75));transform:var(--mat-mdc-form-field-label-transform)}.mat-mdc-form-field-subscript-wrapper{box-sizing:border-box;width:100%;position:relative}.mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field-error-wrapper{position:absolute;top:0;left:0;right:0;padding:0 16px}.mat-mdc-form-field-subscript-dynamic-size .mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field-subscript-dynamic-size .mat-mdc-form-field-error-wrapper{position:static}.mat-mdc-form-field-bottom-align::before{content:\\\"\\\";display:inline-block;height:16px}.mat-mdc-form-field-bottom-align.mat-mdc-form-field-subscript-dynamic-size::before{content:unset}.mat-mdc-form-field-hint-end{order:1}.mat-mdc-form-field-hint-wrapper{display:flex}.mat-mdc-form-field-hint-spacer{flex:1 0 1em}.mat-mdc-form-field-error{display:block;color:var(--mat-form-field-error-text-color)}.mat-mdc-form-field-subscript-wrapper,.mat-mdc-form-field-bottom-align::before{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-form-field-subscript-text-font);line-height:var(--mat-form-field-subscript-text-line-height);font-size:var(--mat-form-field-subscript-text-size);letter-spacing:var(--mat-form-field-subscript-text-tracking);font-weight:var(--mat-form-field-subscript-text-weight)}.mat-mdc-form-field-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;opacity:0;pointer-events:none;background-color:var(--mat-form-field-state-layer-color)}.mat-mdc-text-field-wrapper:hover .mat-mdc-form-field-focus-overlay{opacity:var(--mat-form-field-hover-state-layer-opacity)}.mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay{opacity:var(--mat-form-field-focus-state-layer-opacity)}select.mat-mdc-form-field-input-control{-moz-appearance:none;-webkit-appearance:none;background-color:rgba(0,0,0,0);display:inline-flex;box-sizing:border-box}select.mat-mdc-form-field-input-control:not(:disabled){cursor:pointer}select.mat-mdc-form-field-input-control:not(.mat-mdc-native-select-inline) option{color:var(--mat-form-field-select-option-text-color)}select.mat-mdc-form-field-input-control:not(.mat-mdc-native-select-inline) option:disabled{color:var(--mat-form-field-select-disabled-option-text-color)}.mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-infix::after{content:\\\"\\\";width:0;height:0;border-left:5px solid rgba(0,0,0,0);border-right:5px solid rgba(0,0,0,0);border-top:5px solid;position:absolute;right:0;top:50%;margin-top:-2.5px;pointer-events:none;color:var(--mat-form-field-enabled-select-arrow-color)}[dir=rtl] .mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-infix::after{right:auto;left:0}.mat-mdc-form-field-type-mat-native-select.mat-focused .mat-mdc-form-field-infix::after{color:var(--mat-form-field-focus-select-arrow-color)}.mat-mdc-form-field-type-mat-native-select.mat-form-field-disabled .mat-mdc-form-field-infix::after{color:var(--mat-form-field-disabled-select-arrow-color)}.mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-input-control{padding-right:15px}[dir=rtl] .mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-input-control{padding-right:0;padding-left:15px}.cdk-high-contrast-active .mat-form-field-appearance-fill .mat-mdc-text-field-wrapper{outline:solid 1px}.cdk-high-contrast-active .mat-form-field-appearance-fill.mat-form-field-disabled .mat-mdc-text-field-wrapper{outline-color:GrayText}.cdk-high-contrast-active .mat-form-field-appearance-fill.mat-focused .mat-mdc-text-field-wrapper{outline:dashed 3px}.cdk-high-contrast-active .mat-mdc-form-field.mat-focused .mdc-notched-outline{border:dashed 3px}.mat-mdc-form-field-input-control[type=date],.mat-mdc-form-field-input-control[type=datetime],.mat-mdc-form-field-input-control[type=datetime-local],.mat-mdc-form-field-input-control[type=month],.mat-mdc-form-field-input-control[type=week],.mat-mdc-form-field-input-control[type=time]{line-height:1}.mat-mdc-form-field-input-control::-webkit-datetime-edit{line-height:1;padding:0;margin-bottom:-2px}.mat-mdc-form-field{--mat-mdc-form-field-floating-label-scale: 0.75;display:inline-flex;flex-direction:column;min-width:0;text-align:left;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-form-field-container-text-font);line-height:var(--mat-form-field-container-text-line-height);font-size:var(--mat-form-field-container-text-size);letter-spacing:var(--mat-form-field-container-text-tracking);font-weight:var(--mat-form-field-container-text-weight)}[dir=rtl] .mat-mdc-form-field{text-align:right}.mat-mdc-form-field .mdc-text-field--outlined .mdc-floating-label--float-above{font-size:calc(var(--mat-form-field-outlined-label-text-populated-size)*var(--mat-mdc-form-field-floating-label-scale))}.mat-mdc-form-field .mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:var(--mat-form-field-outlined-label-text-populated-size)}.mat-mdc-form-field-flex{display:inline-flex;align-items:baseline;box-sizing:border-box;width:100%}.mat-mdc-text-field-wrapper{width:100%;z-index:0}.mat-mdc-form-field-icon-prefix,.mat-mdc-form-field-icon-suffix{align-self:center;line-height:0;pointer-events:auto;position:relative;z-index:1}.mat-mdc-form-field-icon-prefix>.mat-icon,.mat-mdc-form-field-icon-suffix>.mat-icon{padding:0 12px;box-sizing:content-box}.mat-mdc-form-field-icon-prefix{color:var(--mat-form-field-leading-icon-color)}.mat-form-field-disabled .mat-mdc-form-field-icon-prefix{color:var(--mat-form-field-disabled-leading-icon-color)}.mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-trailing-icon-color)}.mat-form-field-disabled .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-disabled-trailing-icon-color)}.mat-form-field-invalid .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-trailing-icon-color)}.mat-form-field-invalid:not(.mat-focused):not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper:hover .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-hover-trailing-icon-color)}.mat-form-field-invalid.mat-focused .mat-mdc-text-field-wrapper .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-focus-trailing-icon-color)}.mat-mdc-form-field-icon-prefix,[dir=rtl] .mat-mdc-form-field-icon-suffix{padding:0 4px 0 0}.mat-mdc-form-field-icon-suffix,[dir=rtl] .mat-mdc-form-field-icon-prefix{padding:0 0 0 4px}.mat-mdc-form-field-subscript-wrapper .mat-icon,.mat-mdc-form-field label .mat-icon{width:1em;height:1em;font-size:inherit}.mat-mdc-form-field-infix{flex:auto;min-width:0;width:180px;position:relative;box-sizing:border-box}.mat-mdc-form-field .mdc-notched-outline__notch{margin-left:-1px;-webkit-clip-path:inset(-9em -999em -9em 1px);clip-path:inset(-9em -999em -9em 1px)}[dir=rtl] .mat-mdc-form-field .mdc-notched-outline__notch{margin-left:0;margin-right:-1px;-webkit-clip-path:inset(-9em 1px -9em -999em);clip-path:inset(-9em 1px -9em -999em)}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:transform 150ms cubic-bezier(0.4, 0, 0.2, 1),color 150ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-text-field__input{transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-text-field__input::placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-text-field__input::-moz-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-text-field__input::-webkit-input-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-text-field__input:-ms-input-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--no-label .mdc-text-field__input::placeholder,.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--focused .mdc-text-field__input::placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--no-label .mdc-text-field__input::-moz-placeholder,.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--focused .mdc-text-field__input::-moz-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--no-label .mdc-text-field__input::-webkit-input-placeholder,.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--focused .mdc-text-field__input::-webkit-input-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder,.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-text-field--filled:not(.mdc-ripple-upgraded):focus .mdc-text-field__ripple::before{transition-duration:75ms}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-line-ripple::after{transition:transform 180ms cubic-bezier(0.4, 0, 0.2, 1),opacity 180ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-notched-outline .mdc-floating-label{max-width:calc(100% + 1px)}.mdc-notched-outline--upgraded .mdc-floating-label--float-above{max-width:calc(133.3333333333% + 1px)}\"],\n encapsulation: 2,\n data: {\n animation: [matFormFieldAnimations.transitionMessages]\n },\n changeDetection: 0\n });\n }\n }\n return MatFormField;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet MatFormFieldModule = /*#__PURE__*/(() => {\n class MatFormFieldModule {\n static {\n this.ɵfac = function MatFormFieldModule_Factory(t) {\n return new (t || MatFormFieldModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: MatFormFieldModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n imports: [MatCommonModule, CommonModule, ObserversModule, MatCommonModule]\n });\n }\n }\n return MatFormFieldModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MAT_ERROR, MAT_FORM_FIELD, MAT_FORM_FIELD_DEFAULT_OPTIONS, MAT_PREFIX, MAT_SUFFIX, MatError, MatFormField, MatFormFieldControl, MatFormFieldModule, MatHint, MatLabel, MatPrefix, MatSuffix, getMatFormFieldDuplicatedHintError, getMatFormFieldMissingControlError, getMatFormFieldPlaceholderConflictError, matFormFieldAnimations };\n","import { Directive } from \"@angular/core\";\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\r\n\r\n@Directive({\r\n\tstandalone: true,\r\n\tproviders: [\r\n\t\t{\r\n\t\t\tprovide: NG_VALUE_ACCESSOR,\r\n\t\t\tmulti: true,\r\n\t\t\tuseExisting: NoopValueAccessorDirective,\r\n\t\t},\r\n\t],\r\n})\r\nexport class NoopValueAccessorDirective implements ControlValueAccessor {\r\n\t// eslint-disable-next-line @typescript-eslint/no-empty-function\r\n\twriteValue(obj: any): void {}\r\n\t// eslint-disable-next-line @typescript-eslint/no-empty-function\r\n\tregisterOnChange(fn: any): void {}\r\n\t// eslint-disable-next-line @typescript-eslint/no-empty-function\r\n\tregisterOnTouched(fn: any): void {}\r\n}\r\n","import { ChangeDetectionStrategy, Component, Input, inject } from \"@angular/core\";\r\nimport { FormControlDirective, FormControlName, NgControl } from \"@angular/forms\";\r\nimport { MAT_FORM_FIELD_DEFAULT_OPTIONS, MatFormFieldModule } from \"@angular/material/form-field\";\r\nimport { NoopValueAccessorDirective } from \"./noop-value-accessor/noop-value-accessor.directive\";\r\n\r\n@Component({\r\n\tselector: \"eth-base-control-input\",\r\n\tstandalone: true,\r\n\timports: [MatFormFieldModule],\r\n\ttemplate: \"\",\r\n\thostDirectives: [NoopValueAccessorDirective],\r\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\r\n\tproviders: [\r\n\t\t{\r\n\t\t\tprovide: MAT_FORM_FIELD_DEFAULT_OPTIONS,\r\n\t\t\tuseValue: {\r\n\t\t\t\tsubscriptSizing: \"dynamic\",\r\n\t\t\t},\r\n\t\t},\r\n\t],\r\n})\r\nexport class EthBaseControlInputComponent {\r\n\t@Input() label?: string;\r\n\t@Input() name?: string;\r\n\t@Input() placeholder?: string;\r\n\t@Input() fill: \"solid\" | \"translucid\" | \"empty\" | \"dashed\" = \"translucid\";\r\n\r\n\tget placeholderOrLabel(): string {\r\n\t\treturn this.placeholder ?? this.label ?? \"\";\r\n\t}\r\n\r\n\tngControl = this.injectNgControl();\r\n\r\n\tprivate injectNgControl(): FormControlDirective | FormControlName {\r\n\t\tconst ngControl = inject(NgControl, { self: true, optional: true });\r\n\t\tif (!ngControl) throw new Error(\"...\");\r\n\t\tif (ngControl instanceof FormControlDirective || ngControl instanceof FormControlName) {\r\n\t\t\treturn ngControl;\r\n\t\t}\r\n\t\tthrow new Error(\"...\");\r\n\t}\r\n}\r\n","import * as i1 from '@angular/cdk/scrolling';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nexport { CdkScrollable, ScrollDispatcher, ViewportRuler } from '@angular/cdk/scrolling';\nimport * as i6 from '@angular/common';\nimport { DOCUMENT } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { Injectable, Inject, Optional, untracked, afterRender, afterNextRender, ElementRef, EnvironmentInjector, ApplicationRef, ANIMATION_MODULE_TYPE, InjectionToken, inject, Directive, NgZone, EventEmitter, booleanAttribute, Input, Output, NgModule } from '@angular/core';\nimport { coerceCssPixelValue, coerceArray } from '@angular/cdk/coercion';\nimport * as i1$1 from '@angular/cdk/platform';\nimport { supportsScrollBehavior, _getEventTarget, _isTestEnvironment } from '@angular/cdk/platform';\nimport { filter, takeUntil, takeWhile } from 'rxjs/operators';\nimport * as i5 from '@angular/cdk/bidi';\nimport { BidiModule } from '@angular/cdk/bidi';\nimport { DomPortalOutlet, TemplatePortal, PortalModule } from '@angular/cdk/portal';\nimport { Subject, Subscription, merge } from 'rxjs';\nimport { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes';\nconst scrollBehaviorSupported = /*#__PURE__*/supportsScrollBehavior();\n/**\n * Strategy that will prevent the user from scrolling while the overlay is visible.\n */\nclass BlockScrollStrategy {\n constructor(_viewportRuler, document) {\n this._viewportRuler = _viewportRuler;\n this._previousHTMLStyles = {\n top: '',\n left: ''\n };\n this._isEnabled = false;\n this._document = document;\n }\n /** Attaches this scroll strategy to an overlay. */\n attach() {}\n /** Blocks page-level scroll while the attached overlay is open. */\n enable() {\n if (this._canBeEnabled()) {\n const root = this._document.documentElement;\n this._previousScrollPosition = this._viewportRuler.getViewportScrollPosition();\n // Cache the previous inline styles in case the user had set them.\n this._previousHTMLStyles.left = root.style.left || '';\n this._previousHTMLStyles.top = root.style.top || '';\n // Note: we're using the `html` node, instead of the `body`, because the `body` may\n // have the user agent margin, whereas the `html` is guaranteed not to have one.\n root.style.left = coerceCssPixelValue(-this._previousScrollPosition.left);\n root.style.top = coerceCssPixelValue(-this._previousScrollPosition.top);\n root.classList.add('cdk-global-scrollblock');\n this._isEnabled = true;\n }\n }\n /** Unblocks page-level scroll while the attached overlay is open. */\n disable() {\n if (this._isEnabled) {\n const html = this._document.documentElement;\n const body = this._document.body;\n const htmlStyle = html.style;\n const bodyStyle = body.style;\n const previousHtmlScrollBehavior = htmlStyle.scrollBehavior || '';\n const previousBodyScrollBehavior = bodyStyle.scrollBehavior || '';\n this._isEnabled = false;\n htmlStyle.left = this._previousHTMLStyles.left;\n htmlStyle.top = this._previousHTMLStyles.top;\n html.classList.remove('cdk-global-scrollblock');\n // Disable user-defined smooth scrolling temporarily while we restore the scroll position.\n // See https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-behavior\n // Note that we don't mutate the property if the browser doesn't support `scroll-behavior`,\n // because it can throw off feature detections in `supportsScrollBehavior` which\n // checks for `'scrollBehavior' in documentElement.style`.\n if (scrollBehaviorSupported) {\n htmlStyle.scrollBehavior = bodyStyle.scrollBehavior = 'auto';\n }\n window.scroll(this._previousScrollPosition.left, this._previousScrollPosition.top);\n if (scrollBehaviorSupported) {\n htmlStyle.scrollBehavior = previousHtmlScrollBehavior;\n bodyStyle.scrollBehavior = previousBodyScrollBehavior;\n }\n }\n }\n _canBeEnabled() {\n // Since the scroll strategies can't be singletons, we have to use a global CSS class\n // (`cdk-global-scrollblock`) to make sure that we don't try to disable global\n // scrolling multiple times.\n const html = this._document.documentElement;\n if (html.classList.contains('cdk-global-scrollblock') || this._isEnabled) {\n return false;\n }\n const body = this._document.body;\n const viewport = this._viewportRuler.getViewportSize();\n return body.scrollHeight > viewport.height || body.scrollWidth > viewport.width;\n }\n}\n\n/**\n * Returns an error to be thrown when attempting to attach an already-attached scroll strategy.\n */\nfunction getMatScrollStrategyAlreadyAttachedError() {\n return Error(`Scroll strategy has already been attached.`);\n}\n\n/**\n * Strategy that will close the overlay as soon as the user starts scrolling.\n */\nclass CloseScrollStrategy {\n constructor(_scrollDispatcher, _ngZone, _viewportRuler, _config) {\n this._scrollDispatcher = _scrollDispatcher;\n this._ngZone = _ngZone;\n this._viewportRuler = _viewportRuler;\n this._config = _config;\n this._scrollSubscription = null;\n /** Detaches the overlay ref and disables the scroll strategy. */\n this._detach = () => {\n this.disable();\n if (this._overlayRef.hasAttached()) {\n this._ngZone.run(() => this._overlayRef.detach());\n }\n };\n }\n /** Attaches this scroll strategy to an overlay. */\n attach(overlayRef) {\n if (this._overlayRef && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getMatScrollStrategyAlreadyAttachedError();\n }\n this._overlayRef = overlayRef;\n }\n /** Enables the closing of the attached overlay on scroll. */\n enable() {\n if (this._scrollSubscription) {\n return;\n }\n const stream = this._scrollDispatcher.scrolled(0).pipe(filter(scrollable => {\n return !scrollable || !this._overlayRef.overlayElement.contains(scrollable.getElementRef().nativeElement);\n }));\n if (this._config && this._config.threshold && this._config.threshold > 1) {\n this._initialScrollPosition = this._viewportRuler.getViewportScrollPosition().top;\n this._scrollSubscription = stream.subscribe(() => {\n const scrollPosition = this._viewportRuler.getViewportScrollPosition().top;\n if (Math.abs(scrollPosition - this._initialScrollPosition) > this._config.threshold) {\n this._detach();\n } else {\n this._overlayRef.updatePosition();\n }\n });\n } else {\n this._scrollSubscription = stream.subscribe(this._detach);\n }\n }\n /** Disables the closing the attached overlay on scroll. */\n disable() {\n if (this._scrollSubscription) {\n this._scrollSubscription.unsubscribe();\n this._scrollSubscription = null;\n }\n }\n detach() {\n this.disable();\n this._overlayRef = null;\n }\n}\n\n/** Scroll strategy that doesn't do anything. */\nclass NoopScrollStrategy {\n /** Does nothing, as this scroll strategy is a no-op. */\n enable() {}\n /** Does nothing, as this scroll strategy is a no-op. */\n disable() {}\n /** Does nothing, as this scroll strategy is a no-op. */\n attach() {}\n}\n\n/**\n * Gets whether an element is scrolled outside of view by any of its parent scrolling containers.\n * @param element Dimensions of the element (from getBoundingClientRect)\n * @param scrollContainers Dimensions of element's scrolling containers (from getBoundingClientRect)\n * @returns Whether the element is scrolled out of view\n * @docs-private\n */\nfunction isElementScrolledOutsideView(element, scrollContainers) {\n return scrollContainers.some(containerBounds => {\n const outsideAbove = element.bottom < containerBounds.top;\n const outsideBelow = element.top > containerBounds.bottom;\n const outsideLeft = element.right < containerBounds.left;\n const outsideRight = element.left > containerBounds.right;\n return outsideAbove || outsideBelow || outsideLeft || outsideRight;\n });\n}\n/**\n * Gets whether an element is clipped by any of its scrolling containers.\n * @param element Dimensions of the element (from getBoundingClientRect)\n * @param scrollContainers Dimensions of element's scrolling containers (from getBoundingClientRect)\n * @returns Whether the element is clipped\n * @docs-private\n */\nfunction isElementClippedByScrolling(element, scrollContainers) {\n return scrollContainers.some(scrollContainerRect => {\n const clippedAbove = element.top < scrollContainerRect.top;\n const clippedBelow = element.bottom > scrollContainerRect.bottom;\n const clippedLeft = element.left < scrollContainerRect.left;\n const clippedRight = element.right > scrollContainerRect.right;\n return clippedAbove || clippedBelow || clippedLeft || clippedRight;\n });\n}\n\n/**\n * Strategy that will update the element position as the user is scrolling.\n */\nclass RepositionScrollStrategy {\n constructor(_scrollDispatcher, _viewportRuler, _ngZone, _config) {\n this._scrollDispatcher = _scrollDispatcher;\n this._viewportRuler = _viewportRuler;\n this._ngZone = _ngZone;\n this._config = _config;\n this._scrollSubscription = null;\n }\n /** Attaches this scroll strategy to an overlay. */\n attach(overlayRef) {\n if (this._overlayRef && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getMatScrollStrategyAlreadyAttachedError();\n }\n this._overlayRef = overlayRef;\n }\n /** Enables repositioning of the attached overlay on scroll. */\n enable() {\n if (!this._scrollSubscription) {\n const throttle = this._config ? this._config.scrollThrottle : 0;\n this._scrollSubscription = this._scrollDispatcher.scrolled(throttle).subscribe(() => {\n this._overlayRef.updatePosition();\n // TODO(crisbeto): make `close` on by default once all components can handle it.\n if (this._config && this._config.autoClose) {\n const overlayRect = this._overlayRef.overlayElement.getBoundingClientRect();\n const {\n width,\n height\n } = this._viewportRuler.getViewportSize();\n // TODO(crisbeto): include all ancestor scroll containers here once\n // we have a way of exposing the trigger element to the scroll strategy.\n const parentRects = [{\n width,\n height,\n bottom: height,\n right: width,\n top: 0,\n left: 0\n }];\n if (isElementScrolledOutsideView(overlayRect, parentRects)) {\n this.disable();\n this._ngZone.run(() => this._overlayRef.detach());\n }\n }\n });\n }\n }\n /** Disables repositioning of the attached overlay on scroll. */\n disable() {\n if (this._scrollSubscription) {\n this._scrollSubscription.unsubscribe();\n this._scrollSubscription = null;\n }\n }\n detach() {\n this.disable();\n this._overlayRef = null;\n }\n}\n\n/**\n * Options for how an overlay will handle scrolling.\n *\n * Users can provide a custom value for `ScrollStrategyOptions` to replace the default\n * behaviors. This class primarily acts as a factory for ScrollStrategy instances.\n */\nlet ScrollStrategyOptions = /*#__PURE__*/(() => {\n class ScrollStrategyOptions {\n constructor(_scrollDispatcher, _viewportRuler, _ngZone, document) {\n this._scrollDispatcher = _scrollDispatcher;\n this._viewportRuler = _viewportRuler;\n this._ngZone = _ngZone;\n /** Do nothing on scroll. */\n this.noop = () => new NoopScrollStrategy();\n /**\n * Close the overlay as soon as the user scrolls.\n * @param config Configuration to be used inside the scroll strategy.\n */\n this.close = config => new CloseScrollStrategy(this._scrollDispatcher, this._ngZone, this._viewportRuler, config);\n /** Block scrolling. */\n this.block = () => new BlockScrollStrategy(this._viewportRuler, this._document);\n /**\n * Update the overlay's position on scroll.\n * @param config Configuration to be used inside the scroll strategy.\n * Allows debouncing the reposition calls.\n */\n this.reposition = config => new RepositionScrollStrategy(this._scrollDispatcher, this._viewportRuler, this._ngZone, config);\n this._document = document;\n }\n static {\n this.ɵfac = function ScrollStrategyOptions_Factory(t) {\n return new (t || ScrollStrategyOptions)(i0.ɵɵinject(i1.ScrollDispatcher), i0.ɵɵinject(i1.ViewportRuler), i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(DOCUMENT));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: ScrollStrategyOptions,\n factory: ScrollStrategyOptions.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return ScrollStrategyOptions;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Initial configuration used when creating an overlay. */\nclass OverlayConfig {\n constructor(config) {\n /** Strategy to be used when handling scroll events while the overlay is open. */\n this.scrollStrategy = new NoopScrollStrategy();\n /** Custom class to add to the overlay pane. */\n this.panelClass = '';\n /** Whether the overlay has a backdrop. */\n this.hasBackdrop = false;\n /** Custom class to add to the backdrop */\n this.backdropClass = 'cdk-overlay-dark-backdrop';\n /**\n * Whether the overlay should be disposed of when the user goes backwards/forwards in history.\n * Note that this usually doesn't include clicking on links (unless the user is using\n * the `HashLocationStrategy`).\n */\n this.disposeOnNavigation = false;\n if (config) {\n // Use `Iterable` instead of `Array` because TypeScript, as of 3.6.3,\n // loses the array generic type in the `for of`. But we *also* have to use `Array` because\n // typescript won't iterate over an `Iterable` unless you compile with `--downlevelIteration`\n const configKeys = Object.keys(config);\n for (const key of configKeys) {\n if (config[key] !== undefined) {\n // TypeScript, as of version 3.5, sees the left-hand-side of this expression\n // as \"I don't know *which* key this is, so the only valid value is the intersection\n // of all the possible values.\" In this case, that happens to be `undefined`. TypeScript\n // is not smart enough to see that the right-hand-side is actually an access of the same\n // exact type with the same exact key, meaning that the value type must be identical.\n // So we use `any` to work around this.\n this[key] = config[key];\n }\n }\n }\n }\n}\n\n/** The points of the origin element and the overlay element to connect. */\nclass ConnectionPositionPair {\n constructor(origin, overlay, /** Offset along the X axis. */\n offsetX, /** Offset along the Y axis. */\n offsetY, /** Class(es) to be applied to the panel while this position is active. */\n panelClass) {\n this.offsetX = offsetX;\n this.offsetY = offsetY;\n this.panelClass = panelClass;\n this.originX = origin.originX;\n this.originY = origin.originY;\n this.overlayX = overlay.overlayX;\n this.overlayY = overlay.overlayY;\n }\n}\n/**\n * Set of properties regarding the position of the origin and overlay relative to the viewport\n * with respect to the containing Scrollable elements.\n *\n * The overlay and origin are clipped if any part of their bounding client rectangle exceeds the\n * bounds of any one of the strategy's Scrollable's bounding client rectangle.\n *\n * The overlay and origin are outside view if there is no overlap between their bounding client\n * rectangle and any one of the strategy's Scrollable's bounding client rectangle.\n *\n * ----------- -----------\n * | outside | | clipped |\n * | view | --------------------------\n * | | | | | |\n * ---------- | ----------- |\n * -------------------------- | |\n * | | | Scrollable |\n * | | | |\n * | | --------------------------\n * | Scrollable |\n * | |\n * --------------------------\n *\n * @docs-private\n */\nclass ScrollingVisibility {}\n/** The change event emitted by the strategy when a fallback position is used. */\nclass ConnectedOverlayPositionChange {\n constructor( /** The position used as a result of this change. */\n connectionPair, /** @docs-private */\n scrollableViewProperties) {\n this.connectionPair = connectionPair;\n this.scrollableViewProperties = scrollableViewProperties;\n }\n}\n/**\n * Validates whether a vertical position property matches the expected values.\n * @param property Name of the property being validated.\n * @param value Value of the property being validated.\n * @docs-private\n */\nfunction validateVerticalPosition(property, value) {\n if (value !== 'top' && value !== 'bottom' && value !== 'center') {\n throw Error(`ConnectedPosition: Invalid ${property} \"${value}\". ` + `Expected \"top\", \"bottom\" or \"center\".`);\n }\n}\n/**\n * Validates whether a horizontal position property matches the expected values.\n * @param property Name of the property being validated.\n * @param value Value of the property being validated.\n * @docs-private\n */\nfunction validateHorizontalPosition(property, value) {\n if (value !== 'start' && value !== 'end' && value !== 'center') {\n throw Error(`ConnectedPosition: Invalid ${property} \"${value}\". ` + `Expected \"start\", \"end\" or \"center\".`);\n }\n}\n\n/**\n * Service for dispatching events that land on the body to appropriate overlay ref,\n * if any. It maintains a list of attached overlays to determine best suited overlay based\n * on event target and order of overlay opens.\n */\nlet BaseOverlayDispatcher = /*#__PURE__*/(() => {\n class BaseOverlayDispatcher {\n constructor(document) {\n /** Currently attached overlays in the order they were attached. */\n this._attachedOverlays = [];\n this._document = document;\n }\n ngOnDestroy() {\n this.detach();\n }\n /** Add a new overlay to the list of attached overlay refs. */\n add(overlayRef) {\n // Ensure that we don't get the same overlay multiple times.\n this.remove(overlayRef);\n this._attachedOverlays.push(overlayRef);\n }\n /** Remove an overlay from the list of attached overlay refs. */\n remove(overlayRef) {\n const index = this._attachedOverlays.indexOf(overlayRef);\n if (index > -1) {\n this._attachedOverlays.splice(index, 1);\n }\n // Remove the global listener once there are no more overlays.\n if (this._attachedOverlays.length === 0) {\n this.detach();\n }\n }\n static {\n this.ɵfac = function BaseOverlayDispatcher_Factory(t) {\n return new (t || BaseOverlayDispatcher)(i0.ɵɵinject(DOCUMENT));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: BaseOverlayDispatcher,\n factory: BaseOverlayDispatcher.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return BaseOverlayDispatcher;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Service for dispatching keyboard events that land on the body to appropriate overlay ref,\n * if any. It maintains a list of attached overlays to determine best suited overlay based\n * on event target and order of overlay opens.\n */\nlet OverlayKeyboardDispatcher = /*#__PURE__*/(() => {\n class OverlayKeyboardDispatcher extends BaseOverlayDispatcher {\n constructor(document, /** @breaking-change 14.0.0 _ngZone will be required. */\n _ngZone) {\n super(document);\n this._ngZone = _ngZone;\n /** Keyboard event listener that will be attached to the body. */\n this._keydownListener = event => {\n const overlays = this._attachedOverlays;\n for (let i = overlays.length - 1; i > -1; i--) {\n // Dispatch the keydown event to the top overlay which has subscribers to its keydown events.\n // We want to target the most recent overlay, rather than trying to match where the event came\n // from, because some components might open an overlay, but keep focus on a trigger element\n // (e.g. for select and autocomplete). We skip overlays without keydown event subscriptions,\n // because we don't want overlays that don't handle keyboard events to block the ones below\n // them that do.\n if (overlays[i]._keydownEvents.observers.length > 0) {\n const keydownEvents = overlays[i]._keydownEvents;\n /** @breaking-change 14.0.0 _ngZone will be required. */\n if (this._ngZone) {\n this._ngZone.run(() => keydownEvents.next(event));\n } else {\n keydownEvents.next(event);\n }\n break;\n }\n }\n };\n }\n /** Add a new overlay to the list of attached overlay refs. */\n add(overlayRef) {\n super.add(overlayRef);\n // Lazily start dispatcher once first overlay is added\n if (!this._isAttached) {\n /** @breaking-change 14.0.0 _ngZone will be required. */\n if (this._ngZone) {\n this._ngZone.runOutsideAngular(() => this._document.body.addEventListener('keydown', this._keydownListener));\n } else {\n this._document.body.addEventListener('keydown', this._keydownListener);\n }\n this._isAttached = true;\n }\n }\n /** Detaches the global keyboard event listener. */\n detach() {\n if (this._isAttached) {\n this._document.body.removeEventListener('keydown', this._keydownListener);\n this._isAttached = false;\n }\n }\n static {\n this.ɵfac = function OverlayKeyboardDispatcher_Factory(t) {\n return new (t || OverlayKeyboardDispatcher)(i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(i0.NgZone, 8));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: OverlayKeyboardDispatcher,\n factory: OverlayKeyboardDispatcher.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return OverlayKeyboardDispatcher;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Service for dispatching mouse click events that land on the body to appropriate overlay ref,\n * if any. It maintains a list of attached overlays to determine best suited overlay based\n * on event target and order of overlay opens.\n */\nlet OverlayOutsideClickDispatcher = /*#__PURE__*/(() => {\n class OverlayOutsideClickDispatcher extends BaseOverlayDispatcher {\n constructor(document, _platform, /** @breaking-change 14.0.0 _ngZone will be required. */\n _ngZone) {\n super(document);\n this._platform = _platform;\n this._ngZone = _ngZone;\n this._cursorStyleIsSet = false;\n /** Store pointerdown event target to track origin of click. */\n this._pointerDownListener = event => {\n this._pointerDownEventTarget = _getEventTarget(event);\n };\n /** Click event listener that will be attached to the body propagate phase. */\n this._clickListener = event => {\n const target = _getEventTarget(event);\n // In case of a click event, we want to check the origin of the click\n // (e.g. in case where a user starts a click inside the overlay and\n // releases the click outside of it).\n // This is done by using the event target of the preceding pointerdown event.\n // Every click event caused by a pointer device has a preceding pointerdown\n // event, unless the click was programmatically triggered (e.g. in a unit test).\n const origin = event.type === 'click' && this._pointerDownEventTarget ? this._pointerDownEventTarget : target;\n // Reset the stored pointerdown event target, to avoid having it interfere\n // in subsequent events.\n this._pointerDownEventTarget = null;\n // We copy the array because the original may be modified asynchronously if the\n // outsidePointerEvents listener decides to detach overlays resulting in index errors inside\n // the for loop.\n const overlays = this._attachedOverlays.slice();\n // Dispatch the mouse event to the top overlay which has subscribers to its mouse events.\n // We want to target all overlays for which the click could be considered as outside click.\n // As soon as we reach an overlay for which the click is not outside click we break off\n // the loop.\n for (let i = overlays.length - 1; i > -1; i--) {\n const overlayRef = overlays[i];\n if (overlayRef._outsidePointerEvents.observers.length < 1 || !overlayRef.hasAttached()) {\n continue;\n }\n // If it's a click inside the overlay, just break - we should do nothing\n // If it's an outside click (both origin and target of the click) dispatch the mouse event,\n // and proceed with the next overlay\n if (containsPierceShadowDom(overlayRef.overlayElement, target) || containsPierceShadowDom(overlayRef.overlayElement, origin)) {\n break;\n }\n const outsidePointerEvents = overlayRef._outsidePointerEvents;\n /** @breaking-change 14.0.0 _ngZone will be required. */\n if (this._ngZone) {\n this._ngZone.run(() => outsidePointerEvents.next(event));\n } else {\n outsidePointerEvents.next(event);\n }\n }\n };\n }\n /** Add a new overlay to the list of attached overlay refs. */\n add(overlayRef) {\n super.add(overlayRef);\n // Safari on iOS does not generate click events for non-interactive\n // elements. However, we want to receive a click for any element outside\n // the overlay. We can force a \"clickable\" state by setting\n // `cursor: pointer` on the document body. See:\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/click_event#Safari_Mobile\n // https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html\n if (!this._isAttached) {\n const body = this._document.body;\n /** @breaking-change 14.0.0 _ngZone will be required. */\n if (this._ngZone) {\n this._ngZone.runOutsideAngular(() => this._addEventListeners(body));\n } else {\n this._addEventListeners(body);\n }\n // click event is not fired on iOS. To make element \"clickable\" we are\n // setting the cursor to pointer\n if (this._platform.IOS && !this._cursorStyleIsSet) {\n this._cursorOriginalValue = body.style.cursor;\n body.style.cursor = 'pointer';\n this._cursorStyleIsSet = true;\n }\n this._isAttached = true;\n }\n }\n /** Detaches the global keyboard event listener. */\n detach() {\n if (this._isAttached) {\n const body = this._document.body;\n body.removeEventListener('pointerdown', this._pointerDownListener, true);\n body.removeEventListener('click', this._clickListener, true);\n body.removeEventListener('auxclick', this._clickListener, true);\n body.removeEventListener('contextmenu', this._clickListener, true);\n if (this._platform.IOS && this._cursorStyleIsSet) {\n body.style.cursor = this._cursorOriginalValue;\n this._cursorStyleIsSet = false;\n }\n this._isAttached = false;\n }\n }\n _addEventListeners(body) {\n body.addEventListener('pointerdown', this._pointerDownListener, true);\n body.addEventListener('click', this._clickListener, true);\n body.addEventListener('auxclick', this._clickListener, true);\n body.addEventListener('contextmenu', this._clickListener, true);\n }\n static {\n this.ɵfac = function OverlayOutsideClickDispatcher_Factory(t) {\n return new (t || OverlayOutsideClickDispatcher)(i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(i1$1.Platform), i0.ɵɵinject(i0.NgZone, 8));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: OverlayOutsideClickDispatcher,\n factory: OverlayOutsideClickDispatcher.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return OverlayOutsideClickDispatcher;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Version of `Element.contains` that transcends shadow DOM boundaries. */\nfunction containsPierceShadowDom(parent, child) {\n const supportsShadowRoot = typeof ShadowRoot !== 'undefined' && ShadowRoot;\n let current = child;\n while (current) {\n if (current === parent) {\n return true;\n }\n current = supportsShadowRoot && current instanceof ShadowRoot ? current.host : current.parentNode;\n }\n return false;\n}\n\n/** Container inside which all overlays will render. */\nlet OverlayContainer = /*#__PURE__*/(() => {\n class OverlayContainer {\n constructor(document, _platform) {\n this._platform = _platform;\n this._document = document;\n }\n ngOnDestroy() {\n this._containerElement?.remove();\n }\n /**\n * This method returns the overlay container element. It will lazily\n * create the element the first time it is called to facilitate using\n * the container in non-browser environments.\n * @returns the container element\n */\n getContainerElement() {\n if (!this._containerElement) {\n this._createContainer();\n }\n return this._containerElement;\n }\n /**\n * Create the overlay container element, which is simply a div\n * with the 'cdk-overlay-container' class on the document body.\n */\n _createContainer() {\n const containerClass = 'cdk-overlay-container';\n // TODO(crisbeto): remove the testing check once we have an overlay testing\n // module or Angular starts tearing down the testing `NgModule`. See:\n // https://github.com/angular/angular/issues/18831\n if (this._platform.isBrowser || _isTestEnvironment()) {\n const oppositePlatformContainers = this._document.querySelectorAll(`.${containerClass}[platform=\"server\"], ` + `.${containerClass}[platform=\"test\"]`);\n // Remove any old containers from the opposite platform.\n // This can happen when transitioning from the server to the client.\n for (let i = 0; i < oppositePlatformContainers.length; i++) {\n oppositePlatformContainers[i].remove();\n }\n }\n const container = this._document.createElement('div');\n container.classList.add(containerClass);\n // A long time ago we kept adding new overlay containers whenever a new app was instantiated,\n // but at some point we added logic which clears the duplicate ones in order to avoid leaks.\n // The new logic was a little too aggressive since it was breaking some legitimate use cases.\n // To mitigate the problem we made it so that only containers from a different platform are\n // cleared, but the side-effect was that people started depending on the overly-aggressive\n // logic to clean up their tests for them. Until we can introduce an overlay-specific testing\n // module which does the cleanup, we try to detect that we're in a test environment and we\n // always clear the container. See #17006.\n // TODO(crisbeto): remove the test environment check once we have an overlay testing module.\n if (_isTestEnvironment()) {\n container.setAttribute('platform', 'test');\n } else if (!this._platform.isBrowser) {\n container.setAttribute('platform', 'server');\n }\n this._document.body.appendChild(container);\n this._containerElement = container;\n }\n static {\n this.ɵfac = function OverlayContainer_Factory(t) {\n return new (t || OverlayContainer)(i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(i1$1.Platform));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: OverlayContainer,\n factory: OverlayContainer.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return OverlayContainer;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Reference to an overlay that has been created with the Overlay service.\n * Used to manipulate or dispose of said overlay.\n */\nclass OverlayRef {\n constructor(_portalOutlet, _host, _pane, _config, _ngZone, _keyboardDispatcher, _document, _location, _outsideClickDispatcher, _animationsDisabled = false, _injector) {\n this._portalOutlet = _portalOutlet;\n this._host = _host;\n this._pane = _pane;\n this._config = _config;\n this._ngZone = _ngZone;\n this._keyboardDispatcher = _keyboardDispatcher;\n this._document = _document;\n this._location = _location;\n this._outsideClickDispatcher = _outsideClickDispatcher;\n this._animationsDisabled = _animationsDisabled;\n this._injector = _injector;\n this._backdropElement = null;\n this._backdropClick = new Subject();\n this._attachments = new Subject();\n this._detachments = new Subject();\n this._locationChanges = Subscription.EMPTY;\n this._backdropClickHandler = event => this._backdropClick.next(event);\n this._backdropTransitionendHandler = event => {\n this._disposeBackdrop(event.target);\n };\n /** Stream of keydown events dispatched to this overlay. */\n this._keydownEvents = new Subject();\n /** Stream of mouse outside events dispatched to this overlay. */\n this._outsidePointerEvents = new Subject();\n this._renders = new Subject();\n if (_config.scrollStrategy) {\n this._scrollStrategy = _config.scrollStrategy;\n this._scrollStrategy.attach(this);\n }\n this._positionStrategy = _config.positionStrategy;\n // Users could open the overlay from an `effect`, in which case we need to\n // run the `afterRender` as `untracked`. We don't recommend that users do\n // this, but we also don't want to break users who are doing it.\n this._afterRenderRef = untracked(() => afterRender(() => {\n this._renders.next();\n }, {\n injector: this._injector\n }));\n }\n /** The overlay's HTML element */\n get overlayElement() {\n return this._pane;\n }\n /** The overlay's backdrop HTML element. */\n get backdropElement() {\n return this._backdropElement;\n }\n /**\n * Wrapper around the panel element. Can be used for advanced\n * positioning where a wrapper with specific styling is\n * required around the overlay pane.\n */\n get hostElement() {\n return this._host;\n }\n /**\n * Attaches content, given via a Portal, to the overlay.\n * If the overlay is configured to have a backdrop, it will be created.\n *\n * @param portal Portal instance to which to attach the overlay.\n * @returns The portal attachment result.\n */\n attach(portal) {\n // Insert the host into the DOM before attaching the portal, otherwise\n // the animations module will skip animations on repeat attachments.\n if (!this._host.parentElement && this._previousHostParent) {\n this._previousHostParent.appendChild(this._host);\n }\n const attachResult = this._portalOutlet.attach(portal);\n if (this._positionStrategy) {\n this._positionStrategy.attach(this);\n }\n this._updateStackingOrder();\n this._updateElementSize();\n this._updateElementDirection();\n if (this._scrollStrategy) {\n this._scrollStrategy.enable();\n }\n // Update the position once the overlay is fully rendered before attempting to position it,\n // as the position may depend on the size of the rendered content.\n afterNextRender(() => {\n // The overlay could've been detached before the callback executed.\n if (this.hasAttached()) {\n this.updatePosition();\n }\n }, {\n injector: this._injector\n });\n // Enable pointer events for the overlay pane element.\n this._togglePointerEvents(true);\n if (this._config.hasBackdrop) {\n this._attachBackdrop();\n }\n if (this._config.panelClass) {\n this._toggleClasses(this._pane, this._config.panelClass, true);\n }\n // Only emit the `attachments` event once all other setup is done.\n this._attachments.next();\n // Track this overlay by the keyboard dispatcher\n this._keyboardDispatcher.add(this);\n if (this._config.disposeOnNavigation) {\n this._locationChanges = this._location.subscribe(() => this.dispose());\n }\n this._outsideClickDispatcher.add(this);\n // TODO(crisbeto): the null check is here, because the portal outlet returns `any`.\n // We should be guaranteed for the result to be `ComponentRef | EmbeddedViewRef`, but\n // `instanceof EmbeddedViewRef` doesn't appear to work at the moment.\n if (typeof attachResult?.onDestroy === 'function') {\n // In most cases we control the portal and we know when it is being detached so that\n // we can finish the disposal process. The exception is if the user passes in a custom\n // `ViewContainerRef` that isn't destroyed through the overlay API. Note that we use\n // `detach` here instead of `dispose`, because we don't know if the user intends to\n // reattach the overlay at a later point. It also has the advantage of waiting for animations.\n attachResult.onDestroy(() => {\n if (this.hasAttached()) {\n // We have to delay the `detach` call, because detaching immediately prevents\n // other destroy hooks from running. This is likely a framework bug similar to\n // https://github.com/angular/angular/issues/46119\n this._ngZone.runOutsideAngular(() => Promise.resolve().then(() => this.detach()));\n }\n });\n }\n return attachResult;\n }\n /**\n * Detaches an overlay from a portal.\n * @returns The portal detachment result.\n */\n detach() {\n if (!this.hasAttached()) {\n return;\n }\n this.detachBackdrop();\n // When the overlay is detached, the pane element should disable pointer events.\n // This is necessary because otherwise the pane element will cover the page and disable\n // pointer events therefore. Depends on the position strategy and the applied pane boundaries.\n this._togglePointerEvents(false);\n if (this._positionStrategy && this._positionStrategy.detach) {\n this._positionStrategy.detach();\n }\n if (this._scrollStrategy) {\n this._scrollStrategy.disable();\n }\n const detachmentResult = this._portalOutlet.detach();\n // Only emit after everything is detached.\n this._detachments.next();\n // Remove this overlay from keyboard dispatcher tracking.\n this._keyboardDispatcher.remove(this);\n // Keeping the host element in the DOM can cause scroll jank, because it still gets\n // rendered, even though it's transparent and unclickable which is why we remove it.\n this._detachContentWhenEmpty();\n this._locationChanges.unsubscribe();\n this._outsideClickDispatcher.remove(this);\n return detachmentResult;\n }\n /** Cleans up the overlay from the DOM. */\n dispose() {\n const isAttached = this.hasAttached();\n if (this._positionStrategy) {\n this._positionStrategy.dispose();\n }\n this._disposeScrollStrategy();\n this._disposeBackdrop(this._backdropElement);\n this._locationChanges.unsubscribe();\n this._keyboardDispatcher.remove(this);\n this._portalOutlet.dispose();\n this._attachments.complete();\n this._backdropClick.complete();\n this._keydownEvents.complete();\n this._outsidePointerEvents.complete();\n this._outsideClickDispatcher.remove(this);\n this._host?.remove();\n this._previousHostParent = this._pane = this._host = null;\n if (isAttached) {\n this._detachments.next();\n }\n this._detachments.complete();\n this._afterRenderRef.destroy();\n this._renders.complete();\n }\n /** Whether the overlay has attached content. */\n hasAttached() {\n return this._portalOutlet.hasAttached();\n }\n /** Gets an observable that emits when the backdrop has been clicked. */\n backdropClick() {\n return this._backdropClick;\n }\n /** Gets an observable that emits when the overlay has been attached. */\n attachments() {\n return this._attachments;\n }\n /** Gets an observable that emits when the overlay has been detached. */\n detachments() {\n return this._detachments;\n }\n /** Gets an observable of keydown events targeted to this overlay. */\n keydownEvents() {\n return this._keydownEvents;\n }\n /** Gets an observable of pointer events targeted outside this overlay. */\n outsidePointerEvents() {\n return this._outsidePointerEvents;\n }\n /** Gets the current overlay configuration, which is immutable. */\n getConfig() {\n return this._config;\n }\n /** Updates the position of the overlay based on the position strategy. */\n updatePosition() {\n if (this._positionStrategy) {\n this._positionStrategy.apply();\n }\n }\n /** Switches to a new position strategy and updates the overlay position. */\n updatePositionStrategy(strategy) {\n if (strategy === this._positionStrategy) {\n return;\n }\n if (this._positionStrategy) {\n this._positionStrategy.dispose();\n }\n this._positionStrategy = strategy;\n if (this.hasAttached()) {\n strategy.attach(this);\n this.updatePosition();\n }\n }\n /** Update the size properties of the overlay. */\n updateSize(sizeConfig) {\n this._config = {\n ...this._config,\n ...sizeConfig\n };\n this._updateElementSize();\n }\n /** Sets the LTR/RTL direction for the overlay. */\n setDirection(dir) {\n this._config = {\n ...this._config,\n direction: dir\n };\n this._updateElementDirection();\n }\n /** Add a CSS class or an array of classes to the overlay pane. */\n addPanelClass(classes) {\n if (this._pane) {\n this._toggleClasses(this._pane, classes, true);\n }\n }\n /** Remove a CSS class or an array of classes from the overlay pane. */\n removePanelClass(classes) {\n if (this._pane) {\n this._toggleClasses(this._pane, classes, false);\n }\n }\n /**\n * Returns the layout direction of the overlay panel.\n */\n getDirection() {\n const direction = this._config.direction;\n if (!direction) {\n return 'ltr';\n }\n return typeof direction === 'string' ? direction : direction.value;\n }\n /** Switches to a new scroll strategy. */\n updateScrollStrategy(strategy) {\n if (strategy === this._scrollStrategy) {\n return;\n }\n this._disposeScrollStrategy();\n this._scrollStrategy = strategy;\n if (this.hasAttached()) {\n strategy.attach(this);\n strategy.enable();\n }\n }\n /** Updates the text direction of the overlay panel. */\n _updateElementDirection() {\n this._host.setAttribute('dir', this.getDirection());\n }\n /** Updates the size of the overlay element based on the overlay config. */\n _updateElementSize() {\n if (!this._pane) {\n return;\n }\n const style = this._pane.style;\n style.width = coerceCssPixelValue(this._config.width);\n style.height = coerceCssPixelValue(this._config.height);\n style.minWidth = coerceCssPixelValue(this._config.minWidth);\n style.minHeight = coerceCssPixelValue(this._config.minHeight);\n style.maxWidth = coerceCssPixelValue(this._config.maxWidth);\n style.maxHeight = coerceCssPixelValue(this._config.maxHeight);\n }\n /** Toggles the pointer events for the overlay pane element. */\n _togglePointerEvents(enablePointer) {\n this._pane.style.pointerEvents = enablePointer ? '' : 'none';\n }\n /** Attaches a backdrop for this overlay. */\n _attachBackdrop() {\n const showingClass = 'cdk-overlay-backdrop-showing';\n this._backdropElement = this._document.createElement('div');\n this._backdropElement.classList.add('cdk-overlay-backdrop');\n if (this._animationsDisabled) {\n this._backdropElement.classList.add('cdk-overlay-backdrop-noop-animation');\n }\n if (this._config.backdropClass) {\n this._toggleClasses(this._backdropElement, this._config.backdropClass, true);\n }\n // Insert the backdrop before the pane in the DOM order,\n // in order to handle stacked overlays properly.\n this._host.parentElement.insertBefore(this._backdropElement, this._host);\n // Forward backdrop clicks such that the consumer of the overlay can perform whatever\n // action desired when such a click occurs (usually closing the overlay).\n this._backdropElement.addEventListener('click', this._backdropClickHandler);\n // Add class to fade-in the backdrop after one frame.\n if (!this._animationsDisabled && typeof requestAnimationFrame !== 'undefined') {\n this._ngZone.runOutsideAngular(() => {\n requestAnimationFrame(() => {\n if (this._backdropElement) {\n this._backdropElement.classList.add(showingClass);\n }\n });\n });\n } else {\n this._backdropElement.classList.add(showingClass);\n }\n }\n /**\n * Updates the stacking order of the element, moving it to the top if necessary.\n * This is required in cases where one overlay was detached, while another one,\n * that should be behind it, was destroyed. The next time both of them are opened,\n * the stacking will be wrong, because the detached element's pane will still be\n * in its original DOM position.\n */\n _updateStackingOrder() {\n if (this._host.nextSibling) {\n this._host.parentNode.appendChild(this._host);\n }\n }\n /** Detaches the backdrop (if any) associated with the overlay. */\n detachBackdrop() {\n const backdropToDetach = this._backdropElement;\n if (!backdropToDetach) {\n return;\n }\n if (this._animationsDisabled) {\n this._disposeBackdrop(backdropToDetach);\n return;\n }\n backdropToDetach.classList.remove('cdk-overlay-backdrop-showing');\n this._ngZone.runOutsideAngular(() => {\n backdropToDetach.addEventListener('transitionend', this._backdropTransitionendHandler);\n });\n // If the backdrop doesn't have a transition, the `transitionend` event won't fire.\n // In this case we make it unclickable and we try to remove it after a delay.\n backdropToDetach.style.pointerEvents = 'none';\n // Run this outside the Angular zone because there's nothing that Angular cares about.\n // If it were to run inside the Angular zone, every test that used Overlay would have to be\n // either async or fakeAsync.\n this._backdropTimeout = this._ngZone.runOutsideAngular(() => setTimeout(() => {\n this._disposeBackdrop(backdropToDetach);\n }, 500));\n }\n /** Toggles a single CSS class or an array of classes on an element. */\n _toggleClasses(element, cssClasses, isAdd) {\n const classes = coerceArray(cssClasses || []).filter(c => !!c);\n if (classes.length) {\n isAdd ? element.classList.add(...classes) : element.classList.remove(...classes);\n }\n }\n /** Detaches the overlay content next time the zone stabilizes. */\n _detachContentWhenEmpty() {\n // Normally we wouldn't have to explicitly run this outside the `NgZone`, however\n // if the consumer is using `zone-patch-rxjs`, the `Subscription.unsubscribe` call will\n // be patched to run inside the zone, which will throw us into an infinite loop.\n this._ngZone.runOutsideAngular(() => {\n // We can't remove the host here immediately, because the overlay pane's content\n // might still be animating. This stream helps us avoid interrupting the animation\n // by waiting for the pane to become empty.\n const subscription = this._renders.pipe(takeUntil(merge(this._attachments, this._detachments))).subscribe(() => {\n // Needs a couple of checks for the pane and host, because\n // they may have been removed by the time the zone stabilizes.\n if (!this._pane || !this._host || this._pane.children.length === 0) {\n if (this._pane && this._config.panelClass) {\n this._toggleClasses(this._pane, this._config.panelClass, false);\n }\n if (this._host && this._host.parentElement) {\n this._previousHostParent = this._host.parentElement;\n this._host.remove();\n }\n subscription.unsubscribe();\n }\n });\n });\n }\n /** Disposes of a scroll strategy. */\n _disposeScrollStrategy() {\n const scrollStrategy = this._scrollStrategy;\n if (scrollStrategy) {\n scrollStrategy.disable();\n if (scrollStrategy.detach) {\n scrollStrategy.detach();\n }\n }\n }\n /** Removes a backdrop element from the DOM. */\n _disposeBackdrop(backdrop) {\n if (backdrop) {\n backdrop.removeEventListener('click', this._backdropClickHandler);\n backdrop.removeEventListener('transitionend', this._backdropTransitionendHandler);\n backdrop.remove();\n // It is possible that a new portal has been attached to this overlay since we started\n // removing the backdrop. If that is the case, only clear the backdrop reference if it\n // is still the same instance that we started to remove.\n if (this._backdropElement === backdrop) {\n this._backdropElement = null;\n }\n }\n if (this._backdropTimeout) {\n clearTimeout(this._backdropTimeout);\n this._backdropTimeout = undefined;\n }\n }\n}\n\n// TODO: refactor clipping detection into a separate thing (part of scrolling module)\n// TODO: doesn't handle both flexible width and height when it has to scroll along both axis.\n/** Class to be added to the overlay bounding box. */\nconst boundingBoxClass = 'cdk-overlay-connected-position-bounding-box';\n/** Regex used to split a string on its CSS units. */\nconst cssUnitPattern = /([A-Za-z%]+)$/;\n/**\n * A strategy for positioning overlays. Using this strategy, an overlay is given an\n * implicit position relative some origin element. The relative position is defined in terms of\n * a point on the origin element that is connected to a point on the overlay element. For example,\n * a basic dropdown is connecting the bottom-left corner of the origin to the top-left corner\n * of the overlay.\n */\nclass FlexibleConnectedPositionStrategy {\n /** Ordered list of preferred positions, from most to least desirable. */\n get positions() {\n return this._preferredPositions;\n }\n constructor(connectedTo, _viewportRuler, _document, _platform, _overlayContainer) {\n this._viewportRuler = _viewportRuler;\n this._document = _document;\n this._platform = _platform;\n this._overlayContainer = _overlayContainer;\n /** Last size used for the bounding box. Used to avoid resizing the overlay after open. */\n this._lastBoundingBoxSize = {\n width: 0,\n height: 0\n };\n /** Whether the overlay was pushed in a previous positioning. */\n this._isPushed = false;\n /** Whether the overlay can be pushed on-screen on the initial open. */\n this._canPush = true;\n /** Whether the overlay can grow via flexible width/height after the initial open. */\n this._growAfterOpen = false;\n /** Whether the overlay's width and height can be constrained to fit within the viewport. */\n this._hasFlexibleDimensions = true;\n /** Whether the overlay position is locked. */\n this._positionLocked = false;\n /** Amount of space that must be maintained between the overlay and the edge of the viewport. */\n this._viewportMargin = 0;\n /** The Scrollable containers used to check scrollable view properties on position change. */\n this._scrollables = [];\n /** Ordered list of preferred positions, from most to least desirable. */\n this._preferredPositions = [];\n /** Subject that emits whenever the position changes. */\n this._positionChanges = new Subject();\n /** Subscription to viewport size changes. */\n this._resizeSubscription = Subscription.EMPTY;\n /** Default offset for the overlay along the x axis. */\n this._offsetX = 0;\n /** Default offset for the overlay along the y axis. */\n this._offsetY = 0;\n /** Keeps track of the CSS classes that the position strategy has applied on the overlay panel. */\n this._appliedPanelClasses = [];\n /** Observable sequence of position changes. */\n this.positionChanges = this._positionChanges;\n this.setOrigin(connectedTo);\n }\n /** Attaches this position strategy to an overlay. */\n attach(overlayRef) {\n if (this._overlayRef && overlayRef !== this._overlayRef && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('This position strategy is already attached to an overlay');\n }\n this._validatePositions();\n overlayRef.hostElement.classList.add(boundingBoxClass);\n this._overlayRef = overlayRef;\n this._boundingBox = overlayRef.hostElement;\n this._pane = overlayRef.overlayElement;\n this._isDisposed = false;\n this._isInitialRender = true;\n this._lastPosition = null;\n this._resizeSubscription.unsubscribe();\n this._resizeSubscription = this._viewportRuler.change().subscribe(() => {\n // When the window is resized, we want to trigger the next reposition as if it\n // was an initial render, in order for the strategy to pick a new optimal position,\n // otherwise position locking will cause it to stay at the old one.\n this._isInitialRender = true;\n this.apply();\n });\n }\n /**\n * Updates the position of the overlay element, using whichever preferred position relative\n * to the origin best fits on-screen.\n *\n * The selection of a position goes as follows:\n * - If any positions fit completely within the viewport as-is,\n * choose the first position that does so.\n * - If flexible dimensions are enabled and at least one satisfies the given minimum width/height,\n * choose the position with the greatest available size modified by the positions' weight.\n * - If pushing is enabled, take the position that went off-screen the least and push it\n * on-screen.\n * - If none of the previous criteria were met, use the position that goes off-screen the least.\n * @docs-private\n */\n apply() {\n // We shouldn't do anything if the strategy was disposed or we're on the server.\n if (this._isDisposed || !this._platform.isBrowser) {\n return;\n }\n // If the position has been applied already (e.g. when the overlay was opened) and the\n // consumer opted into locking in the position, re-use the old position, in order to\n // prevent the overlay from jumping around.\n if (!this._isInitialRender && this._positionLocked && this._lastPosition) {\n this.reapplyLastPosition();\n return;\n }\n this._clearPanelClasses();\n this._resetOverlayElementStyles();\n this._resetBoundingBoxStyles();\n // We need the bounding rects for the origin, the overlay and the container to determine how to position\n // the overlay relative to the origin.\n // We use the viewport rect to determine whether a position would go off-screen.\n this._viewportRect = this._getNarrowedViewportRect();\n this._originRect = this._getOriginRect();\n this._overlayRect = this._pane.getBoundingClientRect();\n this._containerRect = this._overlayContainer.getContainerElement().getBoundingClientRect();\n const originRect = this._originRect;\n const overlayRect = this._overlayRect;\n const viewportRect = this._viewportRect;\n const containerRect = this._containerRect;\n // Positions where the overlay will fit with flexible dimensions.\n const flexibleFits = [];\n // Fallback if none of the preferred positions fit within the viewport.\n let fallback;\n // Go through each of the preferred positions looking for a good fit.\n // If a good fit is found, it will be applied immediately.\n for (let pos of this._preferredPositions) {\n // Get the exact (x, y) coordinate for the point-of-origin on the origin element.\n let originPoint = this._getOriginPoint(originRect, containerRect, pos);\n // From that point-of-origin, get the exact (x, y) coordinate for the top-left corner of the\n // overlay in this position. We use the top-left corner for calculations and later translate\n // this into an appropriate (top, left, bottom, right) style.\n let overlayPoint = this._getOverlayPoint(originPoint, overlayRect, pos);\n // Calculate how well the overlay would fit into the viewport with this point.\n let overlayFit = this._getOverlayFit(overlayPoint, overlayRect, viewportRect, pos);\n // If the overlay, without any further work, fits into the viewport, use this position.\n if (overlayFit.isCompletelyWithinViewport) {\n this._isPushed = false;\n this._applyPosition(pos, originPoint);\n return;\n }\n // If the overlay has flexible dimensions, we can use this position\n // so long as there's enough space for the minimum dimensions.\n if (this._canFitWithFlexibleDimensions(overlayFit, overlayPoint, viewportRect)) {\n // Save positions where the overlay will fit with flexible dimensions. We will use these\n // if none of the positions fit *without* flexible dimensions.\n flexibleFits.push({\n position: pos,\n origin: originPoint,\n overlayRect,\n boundingBoxRect: this._calculateBoundingBoxRect(originPoint, pos)\n });\n continue;\n }\n // If the current preferred position does not fit on the screen, remember the position\n // if it has more visible area on-screen than we've seen and move onto the next preferred\n // position.\n if (!fallback || fallback.overlayFit.visibleArea < overlayFit.visibleArea) {\n fallback = {\n overlayFit,\n overlayPoint,\n originPoint,\n position: pos,\n overlayRect\n };\n }\n }\n // If there are any positions where the overlay would fit with flexible dimensions, choose the\n // one that has the greatest area available modified by the position's weight\n if (flexibleFits.length) {\n let bestFit = null;\n let bestScore = -1;\n for (const fit of flexibleFits) {\n const score = fit.boundingBoxRect.width * fit.boundingBoxRect.height * (fit.position.weight || 1);\n if (score > bestScore) {\n bestScore = score;\n bestFit = fit;\n }\n }\n this._isPushed = false;\n this._applyPosition(bestFit.position, bestFit.origin);\n return;\n }\n // When none of the preferred positions fit within the viewport, take the position\n // that went off-screen the least and attempt to push it on-screen.\n if (this._canPush) {\n // TODO(jelbourn): after pushing, the opening \"direction\" of the overlay might not make sense.\n this._isPushed = true;\n this._applyPosition(fallback.position, fallback.originPoint);\n return;\n }\n // All options for getting the overlay within the viewport have been exhausted, so go with the\n // position that went off-screen the least.\n this._applyPosition(fallback.position, fallback.originPoint);\n }\n detach() {\n this._clearPanelClasses();\n this._lastPosition = null;\n this._previousPushAmount = null;\n this._resizeSubscription.unsubscribe();\n }\n /** Cleanup after the element gets destroyed. */\n dispose() {\n if (this._isDisposed) {\n return;\n }\n // We can't use `_resetBoundingBoxStyles` here, because it resets\n // some properties to zero, rather than removing them.\n if (this._boundingBox) {\n extendStyles(this._boundingBox.style, {\n top: '',\n left: '',\n right: '',\n bottom: '',\n height: '',\n width: '',\n alignItems: '',\n justifyContent: ''\n });\n }\n if (this._pane) {\n this._resetOverlayElementStyles();\n }\n if (this._overlayRef) {\n this._overlayRef.hostElement.classList.remove(boundingBoxClass);\n }\n this.detach();\n this._positionChanges.complete();\n this._overlayRef = this._boundingBox = null;\n this._isDisposed = true;\n }\n /**\n * This re-aligns the overlay element with the trigger in its last calculated position,\n * even if a position higher in the \"preferred positions\" list would now fit. This\n * allows one to re-align the panel without changing the orientation of the panel.\n */\n reapplyLastPosition() {\n if (this._isDisposed || !this._platform.isBrowser) {\n return;\n }\n const lastPosition = this._lastPosition;\n if (lastPosition) {\n this._originRect = this._getOriginRect();\n this._overlayRect = this._pane.getBoundingClientRect();\n this._viewportRect = this._getNarrowedViewportRect();\n this._containerRect = this._overlayContainer.getContainerElement().getBoundingClientRect();\n const originPoint = this._getOriginPoint(this._originRect, this._containerRect, lastPosition);\n this._applyPosition(lastPosition, originPoint);\n } else {\n this.apply();\n }\n }\n /**\n * Sets the list of Scrollable containers that host the origin element so that\n * on reposition we can evaluate if it or the overlay has been clipped or outside view. Every\n * Scrollable must be an ancestor element of the strategy's origin element.\n */\n withScrollableContainers(scrollables) {\n this._scrollables = scrollables;\n return this;\n }\n /**\n * Adds new preferred positions.\n * @param positions List of positions options for this overlay.\n */\n withPositions(positions) {\n this._preferredPositions = positions;\n // If the last calculated position object isn't part of the positions anymore, clear\n // it in order to avoid it being picked up if the consumer tries to re-apply.\n if (positions.indexOf(this._lastPosition) === -1) {\n this._lastPosition = null;\n }\n this._validatePositions();\n return this;\n }\n /**\n * Sets a minimum distance the overlay may be positioned to the edge of the viewport.\n * @param margin Required margin between the overlay and the viewport edge in pixels.\n */\n withViewportMargin(margin) {\n this._viewportMargin = margin;\n return this;\n }\n /** Sets whether the overlay's width and height can be constrained to fit within the viewport. */\n withFlexibleDimensions(flexibleDimensions = true) {\n this._hasFlexibleDimensions = flexibleDimensions;\n return this;\n }\n /** Sets whether the overlay can grow after the initial open via flexible width/height. */\n withGrowAfterOpen(growAfterOpen = true) {\n this._growAfterOpen = growAfterOpen;\n return this;\n }\n /** Sets whether the overlay can be pushed on-screen if none of the provided positions fit. */\n withPush(canPush = true) {\n this._canPush = canPush;\n return this;\n }\n /**\n * Sets whether the overlay's position should be locked in after it is positioned\n * initially. When an overlay is locked in, it won't attempt to reposition itself\n * when the position is re-applied (e.g. when the user scrolls away).\n * @param isLocked Whether the overlay should locked in.\n */\n withLockedPosition(isLocked = true) {\n this._positionLocked = isLocked;\n return this;\n }\n /**\n * Sets the origin, relative to which to position the overlay.\n * Using an element origin is useful for building components that need to be positioned\n * relatively to a trigger (e.g. dropdown menus or tooltips), whereas using a point can be\n * used for cases like contextual menus which open relative to the user's pointer.\n * @param origin Reference to the new origin.\n */\n setOrigin(origin) {\n this._origin = origin;\n return this;\n }\n /**\n * Sets the default offset for the overlay's connection point on the x-axis.\n * @param offset New offset in the X axis.\n */\n withDefaultOffsetX(offset) {\n this._offsetX = offset;\n return this;\n }\n /**\n * Sets the default offset for the overlay's connection point on the y-axis.\n * @param offset New offset in the Y axis.\n */\n withDefaultOffsetY(offset) {\n this._offsetY = offset;\n return this;\n }\n /**\n * Configures that the position strategy should set a `transform-origin` on some elements\n * inside the overlay, depending on the current position that is being applied. This is\n * useful for the cases where the origin of an animation can change depending on the\n * alignment of the overlay.\n * @param selector CSS selector that will be used to find the target\n * elements onto which to set the transform origin.\n */\n withTransformOriginOn(selector) {\n this._transformOriginSelector = selector;\n return this;\n }\n /**\n * Gets the (x, y) coordinate of a connection point on the origin based on a relative position.\n */\n _getOriginPoint(originRect, containerRect, pos) {\n let x;\n if (pos.originX == 'center') {\n // Note: when centering we should always use the `left`\n // offset, otherwise the position will be wrong in RTL.\n x = originRect.left + originRect.width / 2;\n } else {\n const startX = this._isRtl() ? originRect.right : originRect.left;\n const endX = this._isRtl() ? originRect.left : originRect.right;\n x = pos.originX == 'start' ? startX : endX;\n }\n // When zooming in Safari the container rectangle contains negative values for the position\n // and we need to re-add them to the calculated coordinates.\n if (containerRect.left < 0) {\n x -= containerRect.left;\n }\n let y;\n if (pos.originY == 'center') {\n y = originRect.top + originRect.height / 2;\n } else {\n y = pos.originY == 'top' ? originRect.top : originRect.bottom;\n }\n // Normally the containerRect's top value would be zero, however when the overlay is attached to an input\n // (e.g. in an autocomplete), mobile browsers will shift everything in order to put the input in the middle\n // of the screen and to make space for the virtual keyboard. We need to account for this offset,\n // otherwise our positioning will be thrown off.\n // Additionally, when zooming in Safari this fixes the vertical position.\n if (containerRect.top < 0) {\n y -= containerRect.top;\n }\n return {\n x,\n y\n };\n }\n /**\n * Gets the (x, y) coordinate of the top-left corner of the overlay given a given position and\n * origin point to which the overlay should be connected.\n */\n _getOverlayPoint(originPoint, overlayRect, pos) {\n // Calculate the (overlayStartX, overlayStartY), the start of the\n // potential overlay position relative to the origin point.\n let overlayStartX;\n if (pos.overlayX == 'center') {\n overlayStartX = -overlayRect.width / 2;\n } else if (pos.overlayX === 'start') {\n overlayStartX = this._isRtl() ? -overlayRect.width : 0;\n } else {\n overlayStartX = this._isRtl() ? 0 : -overlayRect.width;\n }\n let overlayStartY;\n if (pos.overlayY == 'center') {\n overlayStartY = -overlayRect.height / 2;\n } else {\n overlayStartY = pos.overlayY == 'top' ? 0 : -overlayRect.height;\n }\n // The (x, y) coordinates of the overlay.\n return {\n x: originPoint.x + overlayStartX,\n y: originPoint.y + overlayStartY\n };\n }\n /** Gets how well an overlay at the given point will fit within the viewport. */\n _getOverlayFit(point, rawOverlayRect, viewport, position) {\n // Round the overlay rect when comparing against the\n // viewport, because the viewport is always rounded.\n const overlay = getRoundedBoundingClientRect(rawOverlayRect);\n let {\n x,\n y\n } = point;\n let offsetX = this._getOffset(position, 'x');\n let offsetY = this._getOffset(position, 'y');\n // Account for the offsets since they could push the overlay out of the viewport.\n if (offsetX) {\n x += offsetX;\n }\n if (offsetY) {\n y += offsetY;\n }\n // How much the overlay would overflow at this position, on each side.\n let leftOverflow = 0 - x;\n let rightOverflow = x + overlay.width - viewport.width;\n let topOverflow = 0 - y;\n let bottomOverflow = y + overlay.height - viewport.height;\n // Visible parts of the element on each axis.\n let visibleWidth = this._subtractOverflows(overlay.width, leftOverflow, rightOverflow);\n let visibleHeight = this._subtractOverflows(overlay.height, topOverflow, bottomOverflow);\n let visibleArea = visibleWidth * visibleHeight;\n return {\n visibleArea,\n isCompletelyWithinViewport: overlay.width * overlay.height === visibleArea,\n fitsInViewportVertically: visibleHeight === overlay.height,\n fitsInViewportHorizontally: visibleWidth == overlay.width\n };\n }\n /**\n * Whether the overlay can fit within the viewport when it may resize either its width or height.\n * @param fit How well the overlay fits in the viewport at some position.\n * @param point The (x, y) coordinates of the overlay at some position.\n * @param viewport The geometry of the viewport.\n */\n _canFitWithFlexibleDimensions(fit, point, viewport) {\n if (this._hasFlexibleDimensions) {\n const availableHeight = viewport.bottom - point.y;\n const availableWidth = viewport.right - point.x;\n const minHeight = getPixelValue(this._overlayRef.getConfig().minHeight);\n const minWidth = getPixelValue(this._overlayRef.getConfig().minWidth);\n const verticalFit = fit.fitsInViewportVertically || minHeight != null && minHeight <= availableHeight;\n const horizontalFit = fit.fitsInViewportHorizontally || minWidth != null && minWidth <= availableWidth;\n return verticalFit && horizontalFit;\n }\n return false;\n }\n /**\n * Gets the point at which the overlay can be \"pushed\" on-screen. If the overlay is larger than\n * the viewport, the top-left corner will be pushed on-screen (with overflow occurring on the\n * right and bottom).\n *\n * @param start Starting point from which the overlay is pushed.\n * @param rawOverlayRect Dimensions of the overlay.\n * @param scrollPosition Current viewport scroll position.\n * @returns The point at which to position the overlay after pushing. This is effectively a new\n * originPoint.\n */\n _pushOverlayOnScreen(start, rawOverlayRect, scrollPosition) {\n // If the position is locked and we've pushed the overlay already, reuse the previous push\n // amount, rather than pushing it again. If we were to continue pushing, the element would\n // remain in the viewport, which goes against the expectations when position locking is enabled.\n if (this._previousPushAmount && this._positionLocked) {\n return {\n x: start.x + this._previousPushAmount.x,\n y: start.y + this._previousPushAmount.y\n };\n }\n // Round the overlay rect when comparing against the\n // viewport, because the viewport is always rounded.\n const overlay = getRoundedBoundingClientRect(rawOverlayRect);\n const viewport = this._viewportRect;\n // Determine how much the overlay goes outside the viewport on each\n // side, which we'll use to decide which direction to push it.\n const overflowRight = Math.max(start.x + overlay.width - viewport.width, 0);\n const overflowBottom = Math.max(start.y + overlay.height - viewport.height, 0);\n const overflowTop = Math.max(viewport.top - scrollPosition.top - start.y, 0);\n const overflowLeft = Math.max(viewport.left - scrollPosition.left - start.x, 0);\n // Amount by which to push the overlay in each axis such that it remains on-screen.\n let pushX = 0;\n let pushY = 0;\n // If the overlay fits completely within the bounds of the viewport, push it from whichever\n // direction is goes off-screen. Otherwise, push the top-left corner such that its in the\n // viewport and allow for the trailing end of the overlay to go out of bounds.\n if (overlay.width <= viewport.width) {\n pushX = overflowLeft || -overflowRight;\n } else {\n pushX = start.x < this._viewportMargin ? viewport.left - scrollPosition.left - start.x : 0;\n }\n if (overlay.height <= viewport.height) {\n pushY = overflowTop || -overflowBottom;\n } else {\n pushY = start.y < this._viewportMargin ? viewport.top - scrollPosition.top - start.y : 0;\n }\n this._previousPushAmount = {\n x: pushX,\n y: pushY\n };\n return {\n x: start.x + pushX,\n y: start.y + pushY\n };\n }\n /**\n * Applies a computed position to the overlay and emits a position change.\n * @param position The position preference\n * @param originPoint The point on the origin element where the overlay is connected.\n */\n _applyPosition(position, originPoint) {\n this._setTransformOrigin(position);\n this._setOverlayElementStyles(originPoint, position);\n this._setBoundingBoxStyles(originPoint, position);\n if (position.panelClass) {\n this._addPanelClasses(position.panelClass);\n }\n // Notify that the position has been changed along with its change properties.\n // We only emit if we've got any subscriptions, because the scroll visibility\n // calculations can be somewhat expensive.\n if (this._positionChanges.observers.length) {\n const scrollVisibility = this._getScrollVisibility();\n // We're recalculating on scroll, but we only want to emit if anything\n // changed since downstream code might be hitting the `NgZone`.\n if (position !== this._lastPosition || !this._lastScrollVisibility || !compareScrollVisibility(this._lastScrollVisibility, scrollVisibility)) {\n const changeEvent = new ConnectedOverlayPositionChange(position, scrollVisibility);\n this._positionChanges.next(changeEvent);\n }\n this._lastScrollVisibility = scrollVisibility;\n }\n // Save the last connected position in case the position needs to be re-calculated.\n this._lastPosition = position;\n this._isInitialRender = false;\n }\n /** Sets the transform origin based on the configured selector and the passed-in position. */\n _setTransformOrigin(position) {\n if (!this._transformOriginSelector) {\n return;\n }\n const elements = this._boundingBox.querySelectorAll(this._transformOriginSelector);\n let xOrigin;\n let yOrigin = position.overlayY;\n if (position.overlayX === 'center') {\n xOrigin = 'center';\n } else if (this._isRtl()) {\n xOrigin = position.overlayX === 'start' ? 'right' : 'left';\n } else {\n xOrigin = position.overlayX === 'start' ? 'left' : 'right';\n }\n for (let i = 0; i < elements.length; i++) {\n elements[i].style.transformOrigin = `${xOrigin} ${yOrigin}`;\n }\n }\n /**\n * Gets the position and size of the overlay's sizing container.\n *\n * This method does no measuring and applies no styles so that we can cheaply compute the\n * bounds for all positions and choose the best fit based on these results.\n */\n _calculateBoundingBoxRect(origin, position) {\n const viewport = this._viewportRect;\n const isRtl = this._isRtl();\n let height, top, bottom;\n if (position.overlayY === 'top') {\n // Overlay is opening \"downward\" and thus is bound by the bottom viewport edge.\n top = origin.y;\n height = viewport.height - top + this._viewportMargin;\n } else if (position.overlayY === 'bottom') {\n // Overlay is opening \"upward\" and thus is bound by the top viewport edge. We need to add\n // the viewport margin back in, because the viewport rect is narrowed down to remove the\n // margin, whereas the `origin` position is calculated based on its `DOMRect`.\n bottom = viewport.height - origin.y + this._viewportMargin * 2;\n height = viewport.height - bottom + this._viewportMargin;\n } else {\n // If neither top nor bottom, it means that the overlay is vertically centered on the\n // origin point. Note that we want the position relative to the viewport, rather than\n // the page, which is why we don't use something like `viewport.bottom - origin.y` and\n // `origin.y - viewport.top`.\n const smallestDistanceToViewportEdge = Math.min(viewport.bottom - origin.y + viewport.top, origin.y);\n const previousHeight = this._lastBoundingBoxSize.height;\n height = smallestDistanceToViewportEdge * 2;\n top = origin.y - smallestDistanceToViewportEdge;\n if (height > previousHeight && !this._isInitialRender && !this._growAfterOpen) {\n top = origin.y - previousHeight / 2;\n }\n }\n // The overlay is opening 'right-ward' (the content flows to the right).\n const isBoundedByRightViewportEdge = position.overlayX === 'start' && !isRtl || position.overlayX === 'end' && isRtl;\n // The overlay is opening 'left-ward' (the content flows to the left).\n const isBoundedByLeftViewportEdge = position.overlayX === 'end' && !isRtl || position.overlayX === 'start' && isRtl;\n let width, left, right;\n if (isBoundedByLeftViewportEdge) {\n right = viewport.width - origin.x + this._viewportMargin * 2;\n width = origin.x - this._viewportMargin;\n } else if (isBoundedByRightViewportEdge) {\n left = origin.x;\n width = viewport.right - origin.x;\n } else {\n // If neither start nor end, it means that the overlay is horizontally centered on the\n // origin point. Note that we want the position relative to the viewport, rather than\n // the page, which is why we don't use something like `viewport.right - origin.x` and\n // `origin.x - viewport.left`.\n const smallestDistanceToViewportEdge = Math.min(viewport.right - origin.x + viewport.left, origin.x);\n const previousWidth = this._lastBoundingBoxSize.width;\n width = smallestDistanceToViewportEdge * 2;\n left = origin.x - smallestDistanceToViewportEdge;\n if (width > previousWidth && !this._isInitialRender && !this._growAfterOpen) {\n left = origin.x - previousWidth / 2;\n }\n }\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width,\n height\n };\n }\n /**\n * Sets the position and size of the overlay's sizing wrapper. The wrapper is positioned on the\n * origin's connection point and stretches to the bounds of the viewport.\n *\n * @param origin The point on the origin element where the overlay is connected.\n * @param position The position preference\n */\n _setBoundingBoxStyles(origin, position) {\n const boundingBoxRect = this._calculateBoundingBoxRect(origin, position);\n // It's weird if the overlay *grows* while scrolling, so we take the last size into account\n // when applying a new size.\n if (!this._isInitialRender && !this._growAfterOpen) {\n boundingBoxRect.height = Math.min(boundingBoxRect.height, this._lastBoundingBoxSize.height);\n boundingBoxRect.width = Math.min(boundingBoxRect.width, this._lastBoundingBoxSize.width);\n }\n const styles = {};\n if (this._hasExactPosition()) {\n styles.top = styles.left = '0';\n styles.bottom = styles.right = styles.maxHeight = styles.maxWidth = '';\n styles.width = styles.height = '100%';\n } else {\n const maxHeight = this._overlayRef.getConfig().maxHeight;\n const maxWidth = this._overlayRef.getConfig().maxWidth;\n styles.height = coerceCssPixelValue(boundingBoxRect.height);\n styles.top = coerceCssPixelValue(boundingBoxRect.top);\n styles.bottom = coerceCssPixelValue(boundingBoxRect.bottom);\n styles.width = coerceCssPixelValue(boundingBoxRect.width);\n styles.left = coerceCssPixelValue(boundingBoxRect.left);\n styles.right = coerceCssPixelValue(boundingBoxRect.right);\n // Push the pane content towards the proper direction.\n if (position.overlayX === 'center') {\n styles.alignItems = 'center';\n } else {\n styles.alignItems = position.overlayX === 'end' ? 'flex-end' : 'flex-start';\n }\n if (position.overlayY === 'center') {\n styles.justifyContent = 'center';\n } else {\n styles.justifyContent = position.overlayY === 'bottom' ? 'flex-end' : 'flex-start';\n }\n if (maxHeight) {\n styles.maxHeight = coerceCssPixelValue(maxHeight);\n }\n if (maxWidth) {\n styles.maxWidth = coerceCssPixelValue(maxWidth);\n }\n }\n this._lastBoundingBoxSize = boundingBoxRect;\n extendStyles(this._boundingBox.style, styles);\n }\n /** Resets the styles for the bounding box so that a new positioning can be computed. */\n _resetBoundingBoxStyles() {\n extendStyles(this._boundingBox.style, {\n top: '0',\n left: '0',\n right: '0',\n bottom: '0',\n height: '',\n width: '',\n alignItems: '',\n justifyContent: ''\n });\n }\n /** Resets the styles for the overlay pane so that a new positioning can be computed. */\n _resetOverlayElementStyles() {\n extendStyles(this._pane.style, {\n top: '',\n left: '',\n bottom: '',\n right: '',\n position: '',\n transform: ''\n });\n }\n /** Sets positioning styles to the overlay element. */\n _setOverlayElementStyles(originPoint, position) {\n const styles = {};\n const hasExactPosition = this._hasExactPosition();\n const hasFlexibleDimensions = this._hasFlexibleDimensions;\n const config = this._overlayRef.getConfig();\n if (hasExactPosition) {\n const scrollPosition = this._viewportRuler.getViewportScrollPosition();\n extendStyles(styles, this._getExactOverlayY(position, originPoint, scrollPosition));\n extendStyles(styles, this._getExactOverlayX(position, originPoint, scrollPosition));\n } else {\n styles.position = 'static';\n }\n // Use a transform to apply the offsets. We do this because the `center` positions rely on\n // being in the normal flex flow and setting a `top` / `left` at all will completely throw\n // off the position. We also can't use margins, because they won't have an effect in some\n // cases where the element doesn't have anything to \"push off of\". Finally, this works\n // better both with flexible and non-flexible positioning.\n let transformString = '';\n let offsetX = this._getOffset(position, 'x');\n let offsetY = this._getOffset(position, 'y');\n if (offsetX) {\n transformString += `translateX(${offsetX}px) `;\n }\n if (offsetY) {\n transformString += `translateY(${offsetY}px)`;\n }\n styles.transform = transformString.trim();\n // If a maxWidth or maxHeight is specified on the overlay, we remove them. We do this because\n // we need these values to both be set to \"100%\" for the automatic flexible sizing to work.\n // The maxHeight and maxWidth are set on the boundingBox in order to enforce the constraint.\n // Note that this doesn't apply when we have an exact position, in which case we do want to\n // apply them because they'll be cleared from the bounding box.\n if (config.maxHeight) {\n if (hasExactPosition) {\n styles.maxHeight = coerceCssPixelValue(config.maxHeight);\n } else if (hasFlexibleDimensions) {\n styles.maxHeight = '';\n }\n }\n if (config.maxWidth) {\n if (hasExactPosition) {\n styles.maxWidth = coerceCssPixelValue(config.maxWidth);\n } else if (hasFlexibleDimensions) {\n styles.maxWidth = '';\n }\n }\n extendStyles(this._pane.style, styles);\n }\n /** Gets the exact top/bottom for the overlay when not using flexible sizing or when pushing. */\n _getExactOverlayY(position, originPoint, scrollPosition) {\n // Reset any existing styles. This is necessary in case the\n // preferred position has changed since the last `apply`.\n let styles = {\n top: '',\n bottom: ''\n };\n let overlayPoint = this._getOverlayPoint(originPoint, this._overlayRect, position);\n if (this._isPushed) {\n overlayPoint = this._pushOverlayOnScreen(overlayPoint, this._overlayRect, scrollPosition);\n }\n // We want to set either `top` or `bottom` based on whether the overlay wants to appear\n // above or below the origin and the direction in which the element will expand.\n if (position.overlayY === 'bottom') {\n // When using `bottom`, we adjust the y position such that it is the distance\n // from the bottom of the viewport rather than the top.\n const documentHeight = this._document.documentElement.clientHeight;\n styles.bottom = `${documentHeight - (overlayPoint.y + this._overlayRect.height)}px`;\n } else {\n styles.top = coerceCssPixelValue(overlayPoint.y);\n }\n return styles;\n }\n /** Gets the exact left/right for the overlay when not using flexible sizing or when pushing. */\n _getExactOverlayX(position, originPoint, scrollPosition) {\n // Reset any existing styles. This is necessary in case the preferred position has\n // changed since the last `apply`.\n let styles = {\n left: '',\n right: ''\n };\n let overlayPoint = this._getOverlayPoint(originPoint, this._overlayRect, position);\n if (this._isPushed) {\n overlayPoint = this._pushOverlayOnScreen(overlayPoint, this._overlayRect, scrollPosition);\n }\n // We want to set either `left` or `right` based on whether the overlay wants to appear \"before\"\n // or \"after\" the origin, which determines the direction in which the element will expand.\n // For the horizontal axis, the meaning of \"before\" and \"after\" change based on whether the\n // page is in RTL or LTR.\n let horizontalStyleProperty;\n if (this._isRtl()) {\n horizontalStyleProperty = position.overlayX === 'end' ? 'left' : 'right';\n } else {\n horizontalStyleProperty = position.overlayX === 'end' ? 'right' : 'left';\n }\n // When we're setting `right`, we adjust the x position such that it is the distance\n // from the right edge of the viewport rather than the left edge.\n if (horizontalStyleProperty === 'right') {\n const documentWidth = this._document.documentElement.clientWidth;\n styles.right = `${documentWidth - (overlayPoint.x + this._overlayRect.width)}px`;\n } else {\n styles.left = coerceCssPixelValue(overlayPoint.x);\n }\n return styles;\n }\n /**\n * Gets the view properties of the trigger and overlay, including whether they are clipped\n * or completely outside the view of any of the strategy's scrollables.\n */\n _getScrollVisibility() {\n // Note: needs fresh rects since the position could've changed.\n const originBounds = this._getOriginRect();\n const overlayBounds = this._pane.getBoundingClientRect();\n // TODO(jelbourn): instead of needing all of the client rects for these scrolling containers\n // every time, we should be able to use the scrollTop of the containers if the size of those\n // containers hasn't changed.\n const scrollContainerBounds = this._scrollables.map(scrollable => {\n return scrollable.getElementRef().nativeElement.getBoundingClientRect();\n });\n return {\n isOriginClipped: isElementClippedByScrolling(originBounds, scrollContainerBounds),\n isOriginOutsideView: isElementScrolledOutsideView(originBounds, scrollContainerBounds),\n isOverlayClipped: isElementClippedByScrolling(overlayBounds, scrollContainerBounds),\n isOverlayOutsideView: isElementScrolledOutsideView(overlayBounds, scrollContainerBounds)\n };\n }\n /** Subtracts the amount that an element is overflowing on an axis from its length. */\n _subtractOverflows(length, ...overflows) {\n return overflows.reduce((currentValue, currentOverflow) => {\n return currentValue - Math.max(currentOverflow, 0);\n }, length);\n }\n /** Narrows the given viewport rect by the current _viewportMargin. */\n _getNarrowedViewportRect() {\n // We recalculate the viewport rect here ourselves, rather than using the ViewportRuler,\n // because we want to use the `clientWidth` and `clientHeight` as the base. The difference\n // being that the client properties don't include the scrollbar, as opposed to `innerWidth`\n // and `innerHeight` that do. This is necessary, because the overlay container uses\n // 100% `width` and `height` which don't include the scrollbar either.\n const width = this._document.documentElement.clientWidth;\n const height = this._document.documentElement.clientHeight;\n const scrollPosition = this._viewportRuler.getViewportScrollPosition();\n return {\n top: scrollPosition.top + this._viewportMargin,\n left: scrollPosition.left + this._viewportMargin,\n right: scrollPosition.left + width - this._viewportMargin,\n bottom: scrollPosition.top + height - this._viewportMargin,\n width: width - 2 * this._viewportMargin,\n height: height - 2 * this._viewportMargin\n };\n }\n /** Whether the we're dealing with an RTL context */\n _isRtl() {\n return this._overlayRef.getDirection() === 'rtl';\n }\n /** Determines whether the overlay uses exact or flexible positioning. */\n _hasExactPosition() {\n return !this._hasFlexibleDimensions || this._isPushed;\n }\n /** Retrieves the offset of a position along the x or y axis. */\n _getOffset(position, axis) {\n if (axis === 'x') {\n // We don't do something like `position['offset' + axis]` in\n // order to avoid breaking minifiers that rename properties.\n return position.offsetX == null ? this._offsetX : position.offsetX;\n }\n return position.offsetY == null ? this._offsetY : position.offsetY;\n }\n /** Validates that the current position match the expected values. */\n _validatePositions() {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (!this._preferredPositions.length) {\n throw Error('FlexibleConnectedPositionStrategy: At least one position is required.');\n }\n // TODO(crisbeto): remove these once Angular's template type\n // checking is advanced enough to catch these cases.\n this._preferredPositions.forEach(pair => {\n validateHorizontalPosition('originX', pair.originX);\n validateVerticalPosition('originY', pair.originY);\n validateHorizontalPosition('overlayX', pair.overlayX);\n validateVerticalPosition('overlayY', pair.overlayY);\n });\n }\n }\n /** Adds a single CSS class or an array of classes on the overlay panel. */\n _addPanelClasses(cssClasses) {\n if (this._pane) {\n coerceArray(cssClasses).forEach(cssClass => {\n if (cssClass !== '' && this._appliedPanelClasses.indexOf(cssClass) === -1) {\n this._appliedPanelClasses.push(cssClass);\n this._pane.classList.add(cssClass);\n }\n });\n }\n }\n /** Clears the classes that the position strategy has applied from the overlay panel. */\n _clearPanelClasses() {\n if (this._pane) {\n this._appliedPanelClasses.forEach(cssClass => {\n this._pane.classList.remove(cssClass);\n });\n this._appliedPanelClasses = [];\n }\n }\n /** Returns the DOMRect of the current origin. */\n _getOriginRect() {\n const origin = this._origin;\n if (origin instanceof ElementRef) {\n return origin.nativeElement.getBoundingClientRect();\n }\n // Check for Element so SVG elements are also supported.\n if (origin instanceof Element) {\n return origin.getBoundingClientRect();\n }\n const width = origin.width || 0;\n const height = origin.height || 0;\n // If the origin is a point, return a client rect as if it was a 0x0 element at the point.\n return {\n top: origin.y,\n bottom: origin.y + height,\n left: origin.x,\n right: origin.x + width,\n height,\n width\n };\n }\n}\n/** Shallow-extends a stylesheet object with another stylesheet object. */\nfunction extendStyles(destination, source) {\n for (let key in source) {\n if (source.hasOwnProperty(key)) {\n destination[key] = source[key];\n }\n }\n return destination;\n}\n/**\n * Extracts the pixel value as a number from a value, if it's a number\n * or a CSS pixel string (e.g. `1337px`). Otherwise returns null.\n */\nfunction getPixelValue(input) {\n if (typeof input !== 'number' && input != null) {\n const [value, units] = input.split(cssUnitPattern);\n return !units || units === 'px' ? parseFloat(value) : null;\n }\n return input || null;\n}\n/**\n * Gets a version of an element's bounding `DOMRect` where all the values are rounded down to\n * the nearest pixel. This allows us to account for the cases where there may be sub-pixel\n * deviations in the `DOMRect` returned by the browser (e.g. when zoomed in with a percentage\n * size, see #21350).\n */\nfunction getRoundedBoundingClientRect(clientRect) {\n return {\n top: Math.floor(clientRect.top),\n right: Math.floor(clientRect.right),\n bottom: Math.floor(clientRect.bottom),\n left: Math.floor(clientRect.left),\n width: Math.floor(clientRect.width),\n height: Math.floor(clientRect.height)\n };\n}\n/** Returns whether two `ScrollingVisibility` objects are identical. */\nfunction compareScrollVisibility(a, b) {\n if (a === b) {\n return true;\n }\n return a.isOriginClipped === b.isOriginClipped && a.isOriginOutsideView === b.isOriginOutsideView && a.isOverlayClipped === b.isOverlayClipped && a.isOverlayOutsideView === b.isOverlayOutsideView;\n}\nconst STANDARD_DROPDOWN_BELOW_POSITIONS = [{\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top'\n}, {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom'\n}, {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top'\n}, {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom'\n}];\nconst STANDARD_DROPDOWN_ADJACENT_POSITIONS = [{\n originX: 'end',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'top'\n}, {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'bottom'\n}, {\n originX: 'start',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'top'\n}, {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'bottom'\n}];\n\n/** Class to be added to the overlay pane wrapper. */\nconst wrapperClass = 'cdk-global-overlay-wrapper';\n/**\n * A strategy for positioning overlays. Using this strategy, an overlay is given an\n * explicit position relative to the browser's viewport. We use flexbox, instead of\n * transforms, in order to avoid issues with subpixel rendering which can cause the\n * element to become blurry.\n */\nclass GlobalPositionStrategy {\n constructor() {\n this._cssPosition = 'static';\n this._topOffset = '';\n this._bottomOffset = '';\n this._alignItems = '';\n this._xPosition = '';\n this._xOffset = '';\n this._width = '';\n this._height = '';\n this._isDisposed = false;\n }\n attach(overlayRef) {\n const config = overlayRef.getConfig();\n this._overlayRef = overlayRef;\n if (this._width && !config.width) {\n overlayRef.updateSize({\n width: this._width\n });\n }\n if (this._height && !config.height) {\n overlayRef.updateSize({\n height: this._height\n });\n }\n overlayRef.hostElement.classList.add(wrapperClass);\n this._isDisposed = false;\n }\n /**\n * Sets the top position of the overlay. Clears any previously set vertical position.\n * @param value New top offset.\n */\n top(value = '') {\n this._bottomOffset = '';\n this._topOffset = value;\n this._alignItems = 'flex-start';\n return this;\n }\n /**\n * Sets the left position of the overlay. Clears any previously set horizontal position.\n * @param value New left offset.\n */\n left(value = '') {\n this._xOffset = value;\n this._xPosition = 'left';\n return this;\n }\n /**\n * Sets the bottom position of the overlay. Clears any previously set vertical position.\n * @param value New bottom offset.\n */\n bottom(value = '') {\n this._topOffset = '';\n this._bottomOffset = value;\n this._alignItems = 'flex-end';\n return this;\n }\n /**\n * Sets the right position of the overlay. Clears any previously set horizontal position.\n * @param value New right offset.\n */\n right(value = '') {\n this._xOffset = value;\n this._xPosition = 'right';\n return this;\n }\n /**\n * Sets the overlay to the start of the viewport, depending on the overlay direction.\n * This will be to the left in LTR layouts and to the right in RTL.\n * @param offset Offset from the edge of the screen.\n */\n start(value = '') {\n this._xOffset = value;\n this._xPosition = 'start';\n return this;\n }\n /**\n * Sets the overlay to the end of the viewport, depending on the overlay direction.\n * This will be to the right in LTR layouts and to the left in RTL.\n * @param offset Offset from the edge of the screen.\n */\n end(value = '') {\n this._xOffset = value;\n this._xPosition = 'end';\n return this;\n }\n /**\n * Sets the overlay width and clears any previously set width.\n * @param value New width for the overlay\n * @deprecated Pass the `width` through the `OverlayConfig`.\n * @breaking-change 8.0.0\n */\n width(value = '') {\n if (this._overlayRef) {\n this._overlayRef.updateSize({\n width: value\n });\n } else {\n this._width = value;\n }\n return this;\n }\n /**\n * Sets the overlay height and clears any previously set height.\n * @param value New height for the overlay\n * @deprecated Pass the `height` through the `OverlayConfig`.\n * @breaking-change 8.0.0\n */\n height(value = '') {\n if (this._overlayRef) {\n this._overlayRef.updateSize({\n height: value\n });\n } else {\n this._height = value;\n }\n return this;\n }\n /**\n * Centers the overlay horizontally with an optional offset.\n * Clears any previously set horizontal position.\n *\n * @param offset Overlay offset from the horizontal center.\n */\n centerHorizontally(offset = '') {\n this.left(offset);\n this._xPosition = 'center';\n return this;\n }\n /**\n * Centers the overlay vertically with an optional offset.\n * Clears any previously set vertical position.\n *\n * @param offset Overlay offset from the vertical center.\n */\n centerVertically(offset = '') {\n this.top(offset);\n this._alignItems = 'center';\n return this;\n }\n /**\n * Apply the position to the element.\n * @docs-private\n */\n apply() {\n // Since the overlay ref applies the strategy asynchronously, it could\n // have been disposed before it ends up being applied. If that is the\n // case, we shouldn't do anything.\n if (!this._overlayRef || !this._overlayRef.hasAttached()) {\n return;\n }\n const styles = this._overlayRef.overlayElement.style;\n const parentStyles = this._overlayRef.hostElement.style;\n const config = this._overlayRef.getConfig();\n const {\n width,\n height,\n maxWidth,\n maxHeight\n } = config;\n const shouldBeFlushHorizontally = (width === '100%' || width === '100vw') && (!maxWidth || maxWidth === '100%' || maxWidth === '100vw');\n const shouldBeFlushVertically = (height === '100%' || height === '100vh') && (!maxHeight || maxHeight === '100%' || maxHeight === '100vh');\n const xPosition = this._xPosition;\n const xOffset = this._xOffset;\n const isRtl = this._overlayRef.getConfig().direction === 'rtl';\n let marginLeft = '';\n let marginRight = '';\n let justifyContent = '';\n if (shouldBeFlushHorizontally) {\n justifyContent = 'flex-start';\n } else if (xPosition === 'center') {\n justifyContent = 'center';\n if (isRtl) {\n marginRight = xOffset;\n } else {\n marginLeft = xOffset;\n }\n } else if (isRtl) {\n if (xPosition === 'left' || xPosition === 'end') {\n justifyContent = 'flex-end';\n marginLeft = xOffset;\n } else if (xPosition === 'right' || xPosition === 'start') {\n justifyContent = 'flex-start';\n marginRight = xOffset;\n }\n } else if (xPosition === 'left' || xPosition === 'start') {\n justifyContent = 'flex-start';\n marginLeft = xOffset;\n } else if (xPosition === 'right' || xPosition === 'end') {\n justifyContent = 'flex-end';\n marginRight = xOffset;\n }\n styles.position = this._cssPosition;\n styles.marginLeft = shouldBeFlushHorizontally ? '0' : marginLeft;\n styles.marginTop = shouldBeFlushVertically ? '0' : this._topOffset;\n styles.marginBottom = this._bottomOffset;\n styles.marginRight = shouldBeFlushHorizontally ? '0' : marginRight;\n parentStyles.justifyContent = justifyContent;\n parentStyles.alignItems = shouldBeFlushVertically ? 'flex-start' : this._alignItems;\n }\n /**\n * Cleans up the DOM changes from the position strategy.\n * @docs-private\n */\n dispose() {\n if (this._isDisposed || !this._overlayRef) {\n return;\n }\n const styles = this._overlayRef.overlayElement.style;\n const parent = this._overlayRef.hostElement;\n const parentStyles = parent.style;\n parent.classList.remove(wrapperClass);\n parentStyles.justifyContent = parentStyles.alignItems = styles.marginTop = styles.marginBottom = styles.marginLeft = styles.marginRight = styles.position = '';\n this._overlayRef = null;\n this._isDisposed = true;\n }\n}\n\n/** Builder for overlay position strategy. */\nlet OverlayPositionBuilder = /*#__PURE__*/(() => {\n class OverlayPositionBuilder {\n constructor(_viewportRuler, _document, _platform, _overlayContainer) {\n this._viewportRuler = _viewportRuler;\n this._document = _document;\n this._platform = _platform;\n this._overlayContainer = _overlayContainer;\n }\n /**\n * Creates a global position strategy.\n */\n global() {\n return new GlobalPositionStrategy();\n }\n /**\n * Creates a flexible position strategy.\n * @param origin Origin relative to which to position the overlay.\n */\n flexibleConnectedTo(origin) {\n return new FlexibleConnectedPositionStrategy(origin, this._viewportRuler, this._document, this._platform, this._overlayContainer);\n }\n static {\n this.ɵfac = function OverlayPositionBuilder_Factory(t) {\n return new (t || OverlayPositionBuilder)(i0.ɵɵinject(i1.ViewportRuler), i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(i1$1.Platform), i0.ɵɵinject(OverlayContainer));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: OverlayPositionBuilder,\n factory: OverlayPositionBuilder.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return OverlayPositionBuilder;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Next overlay unique ID. */\nlet nextUniqueId = 0;\n// Note that Overlay is *not* scoped to the app root because of the ComponentFactoryResolver\n// which needs to be different depending on where OverlayModule is imported.\n/**\n * Service to create Overlays. Overlays are dynamically added pieces of floating UI, meant to be\n * used as a low-level building block for other components. Dialogs, tooltips, menus,\n * selects, etc. can all be built using overlays. The service should primarily be used by authors\n * of re-usable components rather than developers building end-user applications.\n *\n * An overlay *is* a PortalOutlet, so any kind of Portal can be loaded into one.\n */\nlet Overlay = /*#__PURE__*/(() => {\n class Overlay {\n constructor( /** Scrolling strategies that can be used when creating an overlay. */\n scrollStrategies, _overlayContainer, _componentFactoryResolver, _positionBuilder, _keyboardDispatcher, _injector, _ngZone, _document, _directionality, _location, _outsideClickDispatcher, _animationsModuleType) {\n this.scrollStrategies = scrollStrategies;\n this._overlayContainer = _overlayContainer;\n this._componentFactoryResolver = _componentFactoryResolver;\n this._positionBuilder = _positionBuilder;\n this._keyboardDispatcher = _keyboardDispatcher;\n this._injector = _injector;\n this._ngZone = _ngZone;\n this._document = _document;\n this._directionality = _directionality;\n this._location = _location;\n this._outsideClickDispatcher = _outsideClickDispatcher;\n this._animationsModuleType = _animationsModuleType;\n }\n /**\n * Creates an overlay.\n * @param config Configuration applied to the overlay.\n * @returns Reference to the created overlay.\n */\n create(config) {\n const host = this._createHostElement();\n const pane = this._createPaneElement(host);\n const portalOutlet = this._createPortalOutlet(pane);\n const overlayConfig = new OverlayConfig(config);\n overlayConfig.direction = overlayConfig.direction || this._directionality.value;\n return new OverlayRef(portalOutlet, host, pane, overlayConfig, this._ngZone, this._keyboardDispatcher, this._document, this._location, this._outsideClickDispatcher, this._animationsModuleType === 'NoopAnimations', this._injector.get(EnvironmentInjector));\n }\n /**\n * Gets a position builder that can be used, via fluent API,\n * to construct and configure a position strategy.\n * @returns An overlay position builder.\n */\n position() {\n return this._positionBuilder;\n }\n /**\n * Creates the DOM element for an overlay and appends it to the overlay container.\n * @returns Newly-created pane element\n */\n _createPaneElement(host) {\n const pane = this._document.createElement('div');\n pane.id = `cdk-overlay-${nextUniqueId++}`;\n pane.classList.add('cdk-overlay-pane');\n host.appendChild(pane);\n return pane;\n }\n /**\n * Creates the host element that wraps around an overlay\n * and can be used for advanced positioning.\n * @returns Newly-create host element.\n */\n _createHostElement() {\n const host = this._document.createElement('div');\n this._overlayContainer.getContainerElement().appendChild(host);\n return host;\n }\n /**\n * Create a DomPortalOutlet into which the overlay content can be loaded.\n * @param pane The DOM element to turn into a portal outlet.\n * @returns A portal outlet for the given DOM element.\n */\n _createPortalOutlet(pane) {\n // We have to resolve the ApplicationRef later in order to allow people\n // to use overlay-based providers during app initialization.\n if (!this._appRef) {\n this._appRef = this._injector.get(ApplicationRef);\n }\n return new DomPortalOutlet(pane, this._componentFactoryResolver, this._appRef, this._injector, this._document);\n }\n static {\n this.ɵfac = function Overlay_Factory(t) {\n return new (t || Overlay)(i0.ɵɵinject(ScrollStrategyOptions), i0.ɵɵinject(OverlayContainer), i0.ɵɵinject(i0.ComponentFactoryResolver), i0.ɵɵinject(OverlayPositionBuilder), i0.ɵɵinject(OverlayKeyboardDispatcher), i0.ɵɵinject(i0.Injector), i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(i5.Directionality), i0.ɵɵinject(i6.Location), i0.ɵɵinject(OverlayOutsideClickDispatcher), i0.ɵɵinject(ANIMATION_MODULE_TYPE, 8));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: Overlay,\n factory: Overlay.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return Overlay;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Default set of positions for the overlay. Follows the behavior of a dropdown. */\nconst defaultPositionList = [{\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top'\n}, {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom'\n}, {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom'\n}, {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top'\n}];\n/** Injection token that determines the scroll handling while the connected overlay is open. */\nconst CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY = /*#__PURE__*/new InjectionToken('cdk-connected-overlay-scroll-strategy', {\n providedIn: 'root',\n factory: () => {\n const overlay = inject(Overlay);\n return () => overlay.scrollStrategies.reposition();\n }\n});\n/**\n * Directive applied to an element to make it usable as an origin for an Overlay using a\n * ConnectedPositionStrategy.\n */\nlet CdkOverlayOrigin = /*#__PURE__*/(() => {\n class CdkOverlayOrigin {\n constructor( /** Reference to the element on which the directive is applied. */\n elementRef) {\n this.elementRef = elementRef;\n }\n static {\n this.ɵfac = function CdkOverlayOrigin_Factory(t) {\n return new (t || CdkOverlayOrigin)(i0.ɵɵdirectiveInject(i0.ElementRef));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkOverlayOrigin,\n selectors: [[\"\", \"cdk-overlay-origin\", \"\"], [\"\", \"overlay-origin\", \"\"], [\"\", \"cdkOverlayOrigin\", \"\"]],\n exportAs: [\"cdkOverlayOrigin\"],\n standalone: true\n });\n }\n }\n return CdkOverlayOrigin;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Directive to facilitate declarative creation of an\n * Overlay using a FlexibleConnectedPositionStrategy.\n */\nlet CdkConnectedOverlay = /*#__PURE__*/(() => {\n class CdkConnectedOverlay {\n /** The offset in pixels for the overlay connection point on the x-axis */\n get offsetX() {\n return this._offsetX;\n }\n set offsetX(offsetX) {\n this._offsetX = offsetX;\n if (this._position) {\n this._updatePositionStrategy(this._position);\n }\n }\n /** The offset in pixels for the overlay connection point on the y-axis */\n get offsetY() {\n return this._offsetY;\n }\n set offsetY(offsetY) {\n this._offsetY = offsetY;\n if (this._position) {\n this._updatePositionStrategy(this._position);\n }\n }\n /** Whether the overlay should be disposed of when the user goes backwards/forwards in history. */\n get disposeOnNavigation() {\n return this._disposeOnNavigation;\n }\n set disposeOnNavigation(value) {\n this._disposeOnNavigation = value;\n }\n // TODO(jelbourn): inputs for size, scroll behavior, animation, etc.\n constructor(_overlay, templateRef, viewContainerRef, scrollStrategyFactory, _dir) {\n this._overlay = _overlay;\n this._dir = _dir;\n this._backdropSubscription = Subscription.EMPTY;\n this._attachSubscription = Subscription.EMPTY;\n this._detachSubscription = Subscription.EMPTY;\n this._positionSubscription = Subscription.EMPTY;\n this._disposeOnNavigation = false;\n this._ngZone = inject(NgZone);\n /** Margin between the overlay and the viewport edges. */\n this.viewportMargin = 0;\n /** Whether the overlay is open. */\n this.open = false;\n /** Whether the overlay can be closed by user interaction. */\n this.disableClose = false;\n /** Whether or not the overlay should attach a backdrop. */\n this.hasBackdrop = false;\n /** Whether or not the overlay should be locked when scrolling. */\n this.lockPosition = false;\n /** Whether the overlay's width and height can be constrained to fit within the viewport. */\n this.flexibleDimensions = false;\n /** Whether the overlay can grow after the initial open when flexible positioning is turned on. */\n this.growAfterOpen = false;\n /** Whether the overlay can be pushed on-screen if none of the provided positions fit. */\n this.push = false;\n /** Event emitted when the backdrop is clicked. */\n this.backdropClick = new EventEmitter();\n /** Event emitted when the position has changed. */\n this.positionChange = new EventEmitter();\n /** Event emitted when the overlay has been attached. */\n this.attach = new EventEmitter();\n /** Event emitted when the overlay has been detached. */\n this.detach = new EventEmitter();\n /** Emits when there are keyboard events that are targeted at the overlay. */\n this.overlayKeydown = new EventEmitter();\n /** Emits when there are mouse outside click events that are targeted at the overlay. */\n this.overlayOutsideClick = new EventEmitter();\n this._templatePortal = new TemplatePortal(templateRef, viewContainerRef);\n this._scrollStrategyFactory = scrollStrategyFactory;\n this.scrollStrategy = this._scrollStrategyFactory();\n }\n /** The associated overlay reference. */\n get overlayRef() {\n return this._overlayRef;\n }\n /** The element's layout direction. */\n get dir() {\n return this._dir ? this._dir.value : 'ltr';\n }\n ngOnDestroy() {\n this._attachSubscription.unsubscribe();\n this._detachSubscription.unsubscribe();\n this._backdropSubscription.unsubscribe();\n this._positionSubscription.unsubscribe();\n if (this._overlayRef) {\n this._overlayRef.dispose();\n }\n }\n ngOnChanges(changes) {\n if (this._position) {\n this._updatePositionStrategy(this._position);\n this._overlayRef.updateSize({\n width: this.width,\n minWidth: this.minWidth,\n height: this.height,\n minHeight: this.minHeight\n });\n if (changes['origin'] && this.open) {\n this._position.apply();\n }\n }\n if (changes['open']) {\n this.open ? this._attachOverlay() : this._detachOverlay();\n }\n }\n /** Creates an overlay */\n _createOverlay() {\n if (!this.positions || !this.positions.length) {\n this.positions = defaultPositionList;\n }\n const overlayRef = this._overlayRef = this._overlay.create(this._buildConfig());\n this._attachSubscription = overlayRef.attachments().subscribe(() => this.attach.emit());\n this._detachSubscription = overlayRef.detachments().subscribe(() => this.detach.emit());\n overlayRef.keydownEvents().subscribe(event => {\n this.overlayKeydown.next(event);\n if (event.keyCode === ESCAPE && !this.disableClose && !hasModifierKey(event)) {\n event.preventDefault();\n this._detachOverlay();\n }\n });\n this._overlayRef.outsidePointerEvents().subscribe(event => {\n const origin = this._getOriginElement();\n const target = _getEventTarget(event);\n if (!origin || origin !== target && !origin.contains(target)) {\n this.overlayOutsideClick.next(event);\n }\n });\n }\n /** Builds the overlay config based on the directive's inputs */\n _buildConfig() {\n const positionStrategy = this._position = this.positionStrategy || this._createPositionStrategy();\n const overlayConfig = new OverlayConfig({\n direction: this._dir,\n positionStrategy,\n scrollStrategy: this.scrollStrategy,\n hasBackdrop: this.hasBackdrop,\n disposeOnNavigation: this.disposeOnNavigation\n });\n if (this.width || this.width === 0) {\n overlayConfig.width = this.width;\n }\n if (this.height || this.height === 0) {\n overlayConfig.height = this.height;\n }\n if (this.minWidth || this.minWidth === 0) {\n overlayConfig.minWidth = this.minWidth;\n }\n if (this.minHeight || this.minHeight === 0) {\n overlayConfig.minHeight = this.minHeight;\n }\n if (this.backdropClass) {\n overlayConfig.backdropClass = this.backdropClass;\n }\n if (this.panelClass) {\n overlayConfig.panelClass = this.panelClass;\n }\n return overlayConfig;\n }\n /** Updates the state of a position strategy, based on the values of the directive inputs. */\n _updatePositionStrategy(positionStrategy) {\n const positions = this.positions.map(currentPosition => ({\n originX: currentPosition.originX,\n originY: currentPosition.originY,\n overlayX: currentPosition.overlayX,\n overlayY: currentPosition.overlayY,\n offsetX: currentPosition.offsetX || this.offsetX,\n offsetY: currentPosition.offsetY || this.offsetY,\n panelClass: currentPosition.panelClass || undefined\n }));\n return positionStrategy.setOrigin(this._getOrigin()).withPositions(positions).withFlexibleDimensions(this.flexibleDimensions).withPush(this.push).withGrowAfterOpen(this.growAfterOpen).withViewportMargin(this.viewportMargin).withLockedPosition(this.lockPosition).withTransformOriginOn(this.transformOriginSelector);\n }\n /** Returns the position strategy of the overlay to be set on the overlay config */\n _createPositionStrategy() {\n const strategy = this._overlay.position().flexibleConnectedTo(this._getOrigin());\n this._updatePositionStrategy(strategy);\n return strategy;\n }\n _getOrigin() {\n if (this.origin instanceof CdkOverlayOrigin) {\n return this.origin.elementRef;\n } else {\n return this.origin;\n }\n }\n _getOriginElement() {\n if (this.origin instanceof CdkOverlayOrigin) {\n return this.origin.elementRef.nativeElement;\n }\n if (this.origin instanceof ElementRef) {\n return this.origin.nativeElement;\n }\n if (typeof Element !== 'undefined' && this.origin instanceof Element) {\n return this.origin;\n }\n return null;\n }\n /** Attaches the overlay and subscribes to backdrop clicks if backdrop exists */\n _attachOverlay() {\n if (!this._overlayRef) {\n this._createOverlay();\n } else {\n // Update the overlay size, in case the directive's inputs have changed\n this._overlayRef.getConfig().hasBackdrop = this.hasBackdrop;\n }\n if (!this._overlayRef.hasAttached()) {\n this._overlayRef.attach(this._templatePortal);\n }\n if (this.hasBackdrop) {\n this._backdropSubscription = this._overlayRef.backdropClick().subscribe(event => {\n this.backdropClick.emit(event);\n });\n } else {\n this._backdropSubscription.unsubscribe();\n }\n this._positionSubscription.unsubscribe();\n // Only subscribe to `positionChanges` if requested, because putting\n // together all the information for it can be expensive.\n if (this.positionChange.observers.length > 0) {\n this._positionSubscription = this._position.positionChanges.pipe(takeWhile(() => this.positionChange.observers.length > 0)).subscribe(position => {\n this._ngZone.run(() => this.positionChange.emit(position));\n if (this.positionChange.observers.length === 0) {\n this._positionSubscription.unsubscribe();\n }\n });\n }\n }\n /** Detaches the overlay and unsubscribes to backdrop clicks if backdrop exists */\n _detachOverlay() {\n if (this._overlayRef) {\n this._overlayRef.detach();\n }\n this._backdropSubscription.unsubscribe();\n this._positionSubscription.unsubscribe();\n }\n static {\n this.ɵfac = function CdkConnectedOverlay_Factory(t) {\n return new (t || CdkConnectedOverlay)(i0.ɵɵdirectiveInject(Overlay), i0.ɵɵdirectiveInject(i0.TemplateRef), i0.ɵɵdirectiveInject(i0.ViewContainerRef), i0.ɵɵdirectiveInject(CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY), i0.ɵɵdirectiveInject(i5.Directionality, 8));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkConnectedOverlay,\n selectors: [[\"\", \"cdk-connected-overlay\", \"\"], [\"\", \"connected-overlay\", \"\"], [\"\", \"cdkConnectedOverlay\", \"\"]],\n inputs: {\n origin: [0, \"cdkConnectedOverlayOrigin\", \"origin\"],\n positions: [0, \"cdkConnectedOverlayPositions\", \"positions\"],\n positionStrategy: [0, \"cdkConnectedOverlayPositionStrategy\", \"positionStrategy\"],\n offsetX: [0, \"cdkConnectedOverlayOffsetX\", \"offsetX\"],\n offsetY: [0, \"cdkConnectedOverlayOffsetY\", \"offsetY\"],\n width: [0, \"cdkConnectedOverlayWidth\", \"width\"],\n height: [0, \"cdkConnectedOverlayHeight\", \"height\"],\n minWidth: [0, \"cdkConnectedOverlayMinWidth\", \"minWidth\"],\n minHeight: [0, \"cdkConnectedOverlayMinHeight\", \"minHeight\"],\n backdropClass: [0, \"cdkConnectedOverlayBackdropClass\", \"backdropClass\"],\n panelClass: [0, \"cdkConnectedOverlayPanelClass\", \"panelClass\"],\n viewportMargin: [0, \"cdkConnectedOverlayViewportMargin\", \"viewportMargin\"],\n scrollStrategy: [0, \"cdkConnectedOverlayScrollStrategy\", \"scrollStrategy\"],\n open: [0, \"cdkConnectedOverlayOpen\", \"open\"],\n disableClose: [0, \"cdkConnectedOverlayDisableClose\", \"disableClose\"],\n transformOriginSelector: [0, \"cdkConnectedOverlayTransformOriginOn\", \"transformOriginSelector\"],\n hasBackdrop: [2, \"cdkConnectedOverlayHasBackdrop\", \"hasBackdrop\", booleanAttribute],\n lockPosition: [2, \"cdkConnectedOverlayLockPosition\", \"lockPosition\", booleanAttribute],\n flexibleDimensions: [2, \"cdkConnectedOverlayFlexibleDimensions\", \"flexibleDimensions\", booleanAttribute],\n growAfterOpen: [2, \"cdkConnectedOverlayGrowAfterOpen\", \"growAfterOpen\", booleanAttribute],\n push: [2, \"cdkConnectedOverlayPush\", \"push\", booleanAttribute],\n disposeOnNavigation: [2, \"cdkConnectedOverlayDisposeOnNavigation\", \"disposeOnNavigation\", booleanAttribute]\n },\n outputs: {\n backdropClick: \"backdropClick\",\n positionChange: \"positionChange\",\n attach: \"attach\",\n detach: \"detach\",\n overlayKeydown: \"overlayKeydown\",\n overlayOutsideClick: \"overlayOutsideClick\"\n },\n exportAs: [\"cdkConnectedOverlay\"],\n standalone: true,\n features: [i0.ɵɵInputTransformsFeature, i0.ɵɵNgOnChangesFeature]\n });\n }\n }\n return CdkConnectedOverlay;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** @docs-private */\nfunction CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER_FACTORY(overlay) {\n return () => overlay.scrollStrategies.reposition();\n}\n/** @docs-private */\nconst CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER = {\n provide: CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER_FACTORY\n};\nlet OverlayModule = /*#__PURE__*/(() => {\n class OverlayModule {\n static {\n this.ɵfac = function OverlayModule_Factory(t) {\n return new (t || OverlayModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: OverlayModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n providers: [Overlay, CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER],\n imports: [BidiModule, PortalModule, ScrollingModule, ScrollingModule]\n });\n }\n }\n return OverlayModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Alternative to OverlayContainer that supports correct displaying of overlay elements in\n * Fullscreen mode\n * https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullScreen\n *\n * Should be provided in the root component.\n */\nlet FullscreenOverlayContainer = /*#__PURE__*/(() => {\n class FullscreenOverlayContainer extends OverlayContainer {\n constructor(_document, platform) {\n super(_document, platform);\n }\n ngOnDestroy() {\n super.ngOnDestroy();\n if (this._fullScreenEventName && this._fullScreenListener) {\n this._document.removeEventListener(this._fullScreenEventName, this._fullScreenListener);\n }\n }\n _createContainer() {\n super._createContainer();\n this._adjustParentForFullscreenChange();\n this._addFullscreenChangeListener(() => this._adjustParentForFullscreenChange());\n }\n _adjustParentForFullscreenChange() {\n if (!this._containerElement) {\n return;\n }\n const fullscreenElement = this.getFullscreenElement();\n const parent = fullscreenElement || this._document.body;\n parent.appendChild(this._containerElement);\n }\n _addFullscreenChangeListener(fn) {\n const eventName = this._getEventName();\n if (eventName) {\n if (this._fullScreenListener) {\n this._document.removeEventListener(eventName, this._fullScreenListener);\n }\n this._document.addEventListener(eventName, fn);\n this._fullScreenListener = fn;\n }\n }\n _getEventName() {\n if (!this._fullScreenEventName) {\n const _document = this._document;\n if (_document.fullscreenEnabled) {\n this._fullScreenEventName = 'fullscreenchange';\n } else if (_document.webkitFullscreenEnabled) {\n this._fullScreenEventName = 'webkitfullscreenchange';\n } else if (_document.mozFullScreenEnabled) {\n this._fullScreenEventName = 'mozfullscreenchange';\n } else if (_document.msFullscreenEnabled) {\n this._fullScreenEventName = 'MSFullscreenChange';\n }\n }\n return this._fullScreenEventName;\n }\n /**\n * When the page is put into fullscreen mode, a specific element is specified.\n * Only that element and its children are visible when in fullscreen mode.\n */\n getFullscreenElement() {\n const _document = this._document;\n return _document.fullscreenElement || _document.webkitFullscreenElement || _document.mozFullScreenElement || _document.msFullscreenElement || null;\n }\n static {\n this.ɵfac = function FullscreenOverlayContainer_Factory(t) {\n return new (t || FullscreenOverlayContainer)(i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(i1$1.Platform));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: FullscreenOverlayContainer,\n factory: FullscreenOverlayContainer.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return FullscreenOverlayContainer;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { BlockScrollStrategy, CdkConnectedOverlay, CdkOverlayOrigin, CloseScrollStrategy, ConnectedOverlayPositionChange, ConnectionPositionPair, FlexibleConnectedPositionStrategy, FullscreenOverlayContainer, GlobalPositionStrategy, NoopScrollStrategy, Overlay, OverlayConfig, OverlayContainer, OverlayKeyboardDispatcher, OverlayModule, OverlayOutsideClickDispatcher, OverlayPositionBuilder, OverlayRef, RepositionScrollStrategy, STANDARD_DROPDOWN_ADJACENT_POSITIONS, STANDARD_DROPDOWN_BELOW_POSITIONS, ScrollStrategyOptions, ScrollingVisibility, validateHorizontalPosition, validateVerticalPosition };\n","import * as i0 from '@angular/core';\nimport { InjectionToken, EventEmitter, booleanAttribute, TemplateRef, Component, ViewEncapsulation, ChangeDetectionStrategy, Inject, ViewChild, ContentChildren, Input, Output, Directive, forwardRef, inject, Injector, afterNextRender, Optional, Host, NgModule } from '@angular/core';\nimport { MAT_OPTION_PARENT_COMPONENT, MatOption, MAT_OPTGROUP, MatOptionSelectionChange, _countGroupLabelsBeforeOption, _getOptionScrollPosition, MatOptionModule, MatCommonModule } from '@angular/material/core';\nconst _c0 = [\"panel\"];\nconst _c1 = [\"*\"];\nfunction MatAutocomplete_ng_template_0_Template(rf, ctx) {\n if (rf & 1) {\n const _r1 = i0.ɵɵgetCurrentView();\n i0.ɵɵelementStart(0, \"div\", 1, 0);\n i0.ɵɵlistener(\"@panelAnimation.done\", function MatAutocomplete_ng_template_0_Template_div_animation_panelAnimation_done_0_listener($event) {\n i0.ɵɵrestoreView(_r1);\n const ctx_r1 = i0.ɵɵnextContext();\n return i0.ɵɵresetView(ctx_r1._animationDone.next($event));\n });\n i0.ɵɵprojection(2);\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n const formFieldId_r3 = ctx.id;\n const ctx_r1 = i0.ɵɵnextContext();\n i0.ɵɵclassMap(ctx_r1._classList);\n i0.ɵɵclassProp(\"mat-mdc-autocomplete-visible\", ctx_r1.showPanel)(\"mat-mdc-autocomplete-hidden\", !ctx_r1.showPanel)(\"mat-primary\", ctx_r1._color === \"primary\")(\"mat-accent\", ctx_r1._color === \"accent\")(\"mat-warn\", ctx_r1._color === \"warn\");\n i0.ɵɵproperty(\"id\", ctx_r1.id)(\"@panelAnimation\", ctx_r1.isOpen ? \"visible\" : \"hidden\");\n i0.ɵɵattribute(\"aria-label\", ctx_r1.ariaLabel || null)(\"aria-labelledby\", ctx_r1._getPanelAriaLabelledby(formFieldId_r3));\n }\n}\nexport { MatOptgroup, MatOption } from '@angular/material/core';\nimport { DOCUMENT, CommonModule } from '@angular/common';\nimport * as i3 from '@angular/cdk/scrolling';\nimport { CdkScrollableModule } from '@angular/cdk/scrolling';\nimport * as i1$1 from '@angular/cdk/overlay';\nimport { Overlay, OverlayConfig, OverlayModule } from '@angular/cdk/overlay';\nimport { ActiveDescendantKeyManager, removeAriaReferencedId, addAriaReferencedId } from '@angular/cdk/a11y';\nimport * as i1 from '@angular/cdk/platform';\nimport { _getEventTarget } from '@angular/cdk/platform';\nimport { trigger, state, style, transition, group, animate } from '@angular/animations';\nimport { Subscription, Subject, defer, merge, of, fromEvent, Observable } from 'rxjs';\nimport { ESCAPE, hasModifierKey, UP_ARROW, ENTER, DOWN_ARROW, TAB } from '@angular/cdk/keycodes';\nimport { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport * as i4 from '@angular/material/form-field';\nimport { MAT_FORM_FIELD } from '@angular/material/form-field';\nimport { startWith, switchMap, filter, map, tap, delay, take } from 'rxjs/operators';\nimport * as i2 from '@angular/cdk/bidi';\n\n// Animation values come from\n// https://github.com/material-components/material-components-web/blob/master/packages/mdc-menu-surface/_mixins.scss\n// TODO(mmalerba): Ideally find a way to import the values from MDC's code.\nconst panelAnimation = /*#__PURE__*/trigger('panelAnimation', [/*#__PURE__*/state('void, hidden', /*#__PURE__*/style({\n opacity: 0,\n transform: 'scaleY(0.8)'\n})), /*#__PURE__*/transition(':enter, hidden => visible', [/*#__PURE__*/group([/*#__PURE__*/animate('0.03s linear', /*#__PURE__*/style({\n opacity: 1\n})), /*#__PURE__*/animate('0.12s cubic-bezier(0, 0, 0.2, 1)', /*#__PURE__*/style({\n transform: 'scaleY(1)'\n}))])]), /*#__PURE__*/transition(':leave, visible => hidden', [/*#__PURE__*/animate('0.075s linear', /*#__PURE__*/style({\n opacity: 0\n}))])]);\n\n/**\n * Autocomplete IDs need to be unique across components, so this counter exists outside of\n * the component definition.\n */\nlet _uniqueAutocompleteIdCounter = 0;\n/** Event object that is emitted when an autocomplete option is selected. */\nclass MatAutocompleteSelectedEvent {\n constructor( /** Reference to the autocomplete panel that emitted the event. */\n source, /** Option that was selected. */\n option) {\n this.source = source;\n this.option = option;\n }\n}\n/** Injection token to be used to override the default options for `mat-autocomplete`. */\nconst MAT_AUTOCOMPLETE_DEFAULT_OPTIONS = /*#__PURE__*/new InjectionToken('mat-autocomplete-default-options', {\n providedIn: 'root',\n factory: MAT_AUTOCOMPLETE_DEFAULT_OPTIONS_FACTORY\n});\n/** @docs-private */\nfunction MAT_AUTOCOMPLETE_DEFAULT_OPTIONS_FACTORY() {\n return {\n autoActiveFirstOption: false,\n autoSelectActiveOption: false,\n hideSingleSelectionIndicator: false,\n requireSelection: false\n };\n}\n/** Autocomplete component. */\nlet MatAutocomplete = /*#__PURE__*/(() => {\n class MatAutocomplete {\n /** Whether the autocomplete panel is open. */\n get isOpen() {\n return this._isOpen && this.showPanel;\n }\n /** @docs-private Sets the theme color of the panel. */\n _setColor(value) {\n this._color = value;\n this._changeDetectorRef.markForCheck();\n }\n /**\n * Takes classes set on the host mat-autocomplete element and applies them to the panel\n * inside the overlay container to allow for easy styling.\n */\n set classList(value) {\n this._classList = value;\n this._elementRef.nativeElement.className = '';\n }\n /** Whether checkmark indicator for single-selection options is hidden. */\n get hideSingleSelectionIndicator() {\n return this._hideSingleSelectionIndicator;\n }\n set hideSingleSelectionIndicator(value) {\n this._hideSingleSelectionIndicator = value;\n this._syncParentProperties();\n }\n /** Syncs the parent state with the individual options. */\n _syncParentProperties() {\n if (this.options) {\n for (const option of this.options) {\n option._changeDetectorRef.markForCheck();\n }\n }\n }\n constructor(_changeDetectorRef, _elementRef, _defaults, platform) {\n this._changeDetectorRef = _changeDetectorRef;\n this._elementRef = _elementRef;\n this._defaults = _defaults;\n this._activeOptionChanges = Subscription.EMPTY;\n /** Emits when the panel animation is done. Null if the panel doesn't animate. */\n this._animationDone = new EventEmitter();\n /** Whether the autocomplete panel should be visible, depending on option length. */\n this.showPanel = false;\n this._isOpen = false;\n /** Function that maps an option's control value to its display value in the trigger. */\n this.displayWith = null;\n /** Event that is emitted whenever an option from the list is selected. */\n this.optionSelected = new EventEmitter();\n /** Event that is emitted when the autocomplete panel is opened. */\n this.opened = new EventEmitter();\n /** Event that is emitted when the autocomplete panel is closed. */\n this.closed = new EventEmitter();\n /** Emits whenever an option is activated. */\n this.optionActivated = new EventEmitter();\n /** Unique ID to be used by autocomplete trigger's \"aria-owns\" property. */\n this.id = `mat-autocomplete-${_uniqueAutocompleteIdCounter++}`;\n // TODO(crisbeto): the problem that the `inertGroups` option resolves is only present on\n // Safari using VoiceOver. We should occasionally check back to see whether the bug\n // wasn't resolved in VoiceOver, and if it has, we can remove this and the `inertGroups`\n // option altogether.\n this.inertGroups = platform?.SAFARI || false;\n this.autoActiveFirstOption = !!_defaults.autoActiveFirstOption;\n this.autoSelectActiveOption = !!_defaults.autoSelectActiveOption;\n this.requireSelection = !!_defaults.requireSelection;\n this._hideSingleSelectionIndicator = this._defaults.hideSingleSelectionIndicator ?? false;\n }\n ngAfterContentInit() {\n this._keyManager = new ActiveDescendantKeyManager(this.options).withWrap().skipPredicate(this._skipPredicate);\n this._activeOptionChanges = this._keyManager.change.subscribe(index => {\n if (this.isOpen) {\n this.optionActivated.emit({\n source: this,\n option: this.options.toArray()[index] || null\n });\n }\n });\n // Set the initial visibility state.\n this._setVisibility();\n }\n ngOnDestroy() {\n this._keyManager?.destroy();\n this._activeOptionChanges.unsubscribe();\n this._animationDone.complete();\n }\n /**\n * Sets the panel scrollTop. This allows us to manually scroll to display options\n * above or below the fold, as they are not actually being focused when active.\n */\n _setScrollTop(scrollTop) {\n if (this.panel) {\n this.panel.nativeElement.scrollTop = scrollTop;\n }\n }\n /** Returns the panel's scrollTop. */\n _getScrollTop() {\n return this.panel ? this.panel.nativeElement.scrollTop : 0;\n }\n /** Panel should hide itself when the option list is empty. */\n _setVisibility() {\n this.showPanel = !!this.options.length;\n this._changeDetectorRef.markForCheck();\n }\n /** Emits the `select` event. */\n _emitSelectEvent(option) {\n const event = new MatAutocompleteSelectedEvent(this, option);\n this.optionSelected.emit(event);\n }\n /** Gets the aria-labelledby for the autocomplete panel. */\n _getPanelAriaLabelledby(labelId) {\n if (this.ariaLabel) {\n return null;\n }\n const labelExpression = labelId ? labelId + ' ' : '';\n return this.ariaLabelledby ? labelExpression + this.ariaLabelledby : labelId;\n }\n // `skipPredicate` determines if key manager should avoid putting a given option in the tab\n // order. Allow disabled list items to receive focus via keyboard to align with WAI ARIA\n // recommendation.\n //\n // Normally WAI ARIA's instructions are to exclude disabled items from the tab order, but it\n // makes a few exceptions for compound widgets.\n //\n // From [Developing a Keyboard Interface](\n // https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/):\n // \"For the following composite widget elements, keep them focusable when disabled: Options in a\n // Listbox...\"\n //\n // The user can focus disabled options using the keyboard, but the user cannot click disabled\n // options.\n _skipPredicate() {\n return false;\n }\n static {\n this.ɵfac = function MatAutocomplete_Factory(t) {\n return new (t || MatAutocomplete)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(MAT_AUTOCOMPLETE_DEFAULT_OPTIONS), i0.ɵɵdirectiveInject(i1.Platform));\n };\n }\n static {\n this.ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: MatAutocomplete,\n selectors: [[\"mat-autocomplete\"]],\n contentQueries: function MatAutocomplete_ContentQueries(rf, ctx, dirIndex) {\n if (rf & 1) {\n i0.ɵɵcontentQuery(dirIndex, MatOption, 5);\n i0.ɵɵcontentQuery(dirIndex, MAT_OPTGROUP, 5);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.options = _t);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.optionGroups = _t);\n }\n },\n viewQuery: function MatAutocomplete_Query(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵviewQuery(TemplateRef, 7);\n i0.ɵɵviewQuery(_c0, 5);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.template = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.panel = _t.first);\n }\n },\n hostAttrs: [1, \"mat-mdc-autocomplete\"],\n inputs: {\n ariaLabel: [0, \"aria-label\", \"ariaLabel\"],\n ariaLabelledby: [0, \"aria-labelledby\", \"ariaLabelledby\"],\n displayWith: \"displayWith\",\n autoActiveFirstOption: [2, \"autoActiveFirstOption\", \"autoActiveFirstOption\", booleanAttribute],\n autoSelectActiveOption: [2, \"autoSelectActiveOption\", \"autoSelectActiveOption\", booleanAttribute],\n requireSelection: [2, \"requireSelection\", \"requireSelection\", booleanAttribute],\n panelWidth: \"panelWidth\",\n disableRipple: [2, \"disableRipple\", \"disableRipple\", booleanAttribute],\n classList: [0, \"class\", \"classList\"],\n hideSingleSelectionIndicator: [2, \"hideSingleSelectionIndicator\", \"hideSingleSelectionIndicator\", booleanAttribute]\n },\n outputs: {\n optionSelected: \"optionSelected\",\n opened: \"opened\",\n closed: \"closed\",\n optionActivated: \"optionActivated\"\n },\n exportAs: [\"matAutocomplete\"],\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: MAT_OPTION_PARENT_COMPONENT,\n useExisting: MatAutocomplete\n }]), i0.ɵɵInputTransformsFeature, i0.ɵɵStandaloneFeature],\n ngContentSelectors: _c1,\n decls: 1,\n vars: 0,\n consts: [[\"panel\", \"\"], [\"role\", \"listbox\", 1, \"mat-mdc-autocomplete-panel\", \"mdc-menu-surface\", \"mdc-menu-surface--open\", 3, \"id\"]],\n template: function MatAutocomplete_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵprojectionDef();\n i0.ɵɵtemplate(0, MatAutocomplete_ng_template_0_Template, 3, 16, \"ng-template\");\n }\n },\n styles: [\"div.mat-mdc-autocomplete-panel{width:100%;max-height:256px;visibility:hidden;transform-origin:center top;overflow:auto;padding:8px 0;box-sizing:border-box;position:static;border-radius:var(--mat-autocomplete-container-shape);box-shadow:var(--mat-autocomplete-container-elevation-shadow);background-color:var(--mat-autocomplete-background-color)}.cdk-high-contrast-active div.mat-mdc-autocomplete-panel{outline:solid 1px}.cdk-overlay-pane:not(.mat-mdc-autocomplete-panel-above) div.mat-mdc-autocomplete-panel{border-top-left-radius:0;border-top-right-radius:0}.mat-mdc-autocomplete-panel-above div.mat-mdc-autocomplete-panel{border-bottom-left-radius:0;border-bottom-right-radius:0;transform-origin:center bottom}div.mat-mdc-autocomplete-panel.mat-mdc-autocomplete-visible{visibility:visible}div.mat-mdc-autocomplete-panel.mat-mdc-autocomplete-hidden{visibility:hidden;pointer-events:none}mat-autocomplete{display:none}\"],\n encapsulation: 2,\n data: {\n animation: [panelAnimation]\n },\n changeDetection: 0\n });\n }\n }\n return MatAutocomplete;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Directive applied to an element to make it usable\n * as a connection point for an autocomplete panel.\n */\nlet MatAutocompleteOrigin = /*#__PURE__*/(() => {\n class MatAutocompleteOrigin {\n constructor( /** Reference to the element on which the directive is applied. */\n elementRef) {\n this.elementRef = elementRef;\n }\n static {\n this.ɵfac = function MatAutocompleteOrigin_Factory(t) {\n return new (t || MatAutocompleteOrigin)(i0.ɵɵdirectiveInject(i0.ElementRef));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatAutocompleteOrigin,\n selectors: [[\"\", \"matAutocompleteOrigin\", \"\"]],\n exportAs: [\"matAutocompleteOrigin\"],\n standalone: true\n });\n }\n }\n return MatAutocompleteOrigin;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Provider that allows the autocomplete to register as a ControlValueAccessor.\n * @docs-private\n */\nconst MAT_AUTOCOMPLETE_VALUE_ACCESSOR = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: /*#__PURE__*/forwardRef(() => MatAutocompleteTrigger),\n multi: true\n};\n/**\n * Creates an error to be thrown when attempting to use an autocomplete trigger without a panel.\n * @docs-private\n */\nfunction getMatAutocompleteMissingPanelError() {\n return Error('Attempting to open an undefined instance of `mat-autocomplete`. ' + 'Make sure that the id passed to the `matAutocomplete` is correct and that ' + \"you're attempting to open it after the ngAfterContentInit hook.\");\n}\n/** Injection token that determines the scroll handling while the autocomplete panel is open. */\nconst MAT_AUTOCOMPLETE_SCROLL_STRATEGY = /*#__PURE__*/new InjectionToken('mat-autocomplete-scroll-strategy', {\n providedIn: 'root',\n factory: () => {\n const overlay = inject(Overlay);\n return () => overlay.scrollStrategies.reposition();\n }\n});\n/** @docs-private */\nfunction MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY(overlay) {\n return () => overlay.scrollStrategies.reposition();\n}\n/** @docs-private */\nconst MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER = {\n provide: MAT_AUTOCOMPLETE_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY\n};\n/** Base class with all of the `MatAutocompleteTrigger` functionality. */\nlet MatAutocompleteTrigger = /*#__PURE__*/(() => {\n class MatAutocompleteTrigger {\n constructor(_element, _overlay, _viewContainerRef, _zone, _changeDetectorRef, scrollStrategy, _dir, _formField, _document, _viewportRuler, _defaults) {\n this._element = _element;\n this._overlay = _overlay;\n this._viewContainerRef = _viewContainerRef;\n this._zone = _zone;\n this._changeDetectorRef = _changeDetectorRef;\n this._dir = _dir;\n this._formField = _formField;\n this._document = _document;\n this._viewportRuler = _viewportRuler;\n this._defaults = _defaults;\n this._componentDestroyed = false;\n /** Whether or not the label state is being overridden. */\n this._manuallyFloatingLabel = false;\n /** Subscription to viewport size changes. */\n this._viewportSubscription = Subscription.EMPTY;\n /** Implements BreakpointObserver to be used to detect handset landscape */\n this._breakpointObserver = inject(BreakpointObserver);\n this._handsetLandscapeSubscription = Subscription.EMPTY;\n /**\n * Whether the autocomplete can open the next time it is focused. Used to prevent a focused,\n * closed autocomplete from being reopened if the user switches to another browser tab and then\n * comes back.\n */\n this._canOpenOnNextFocus = true;\n /** Stream of keyboard events that can close the panel. */\n this._closeKeyEventStream = new Subject();\n /**\n * Event handler for when the window is blurred. Needs to be an\n * arrow function in order to preserve the context.\n */\n this._windowBlurHandler = () => {\n // If the user blurred the window while the autocomplete is focused, it means that it'll be\n // refocused when they come back. In this case we want to skip the first focus event, if the\n // pane was closed, in order to avoid reopening it unintentionally.\n this._canOpenOnNextFocus = this._document.activeElement !== this._element.nativeElement || this.panelOpen;\n };\n /** `View -> model callback called when value changes` */\n this._onChange = () => {};\n /** `View -> model callback called when autocomplete has been touched` */\n this._onTouched = () => {};\n /**\n * Position of the autocomplete panel relative to the trigger element. A position of `auto`\n * will render the panel underneath the trigger if there is enough space for it to fit in\n * the viewport, otherwise the panel will be shown above it. If the position is set to\n * `above` or `below`, the panel will always be shown above or below the trigger. no matter\n * whether it fits completely in the viewport.\n */\n this.position = 'auto';\n /**\n * `autocomplete` attribute to be set on the input element.\n * @docs-private\n */\n this.autocompleteAttribute = 'off';\n this._initialized = new Subject();\n this._injector = inject(Injector);\n /** Class to apply to the panel when it's above the input. */\n this._aboveClass = 'mat-mdc-autocomplete-panel-above';\n this._overlayAttached = false;\n /** Stream of changes to the selection state of the autocomplete options. */\n this.optionSelections = defer(() => {\n const options = this.autocomplete ? this.autocomplete.options : null;\n if (options) {\n return options.changes.pipe(startWith(options), switchMap(() => merge(...options.map(option => option.onSelectionChange))));\n }\n // If there are any subscribers before `ngAfterViewInit`, the `autocomplete` will be undefined.\n // Return a stream that we'll replace with the real one once everything is in place.\n return this._initialized.pipe(switchMap(() => this.optionSelections));\n });\n /** Handles keyboard events coming from the overlay panel. */\n this._handlePanelKeydown = event => {\n // Close when pressing ESCAPE or ALT + UP_ARROW, based on the a11y guidelines.\n // See: https://www.w3.org/TR/wai-aria-practices-1.1/#textbox-keyboard-interaction\n if (event.keyCode === ESCAPE && !hasModifierKey(event) || event.keyCode === UP_ARROW && hasModifierKey(event, 'altKey')) {\n // If the user had typed something in before we autoselected an option, and they decided\n // to cancel the selection, restore the input value to the one they had typed in.\n if (this._pendingAutoselectedOption) {\n this._updateNativeInputValue(this._valueBeforeAutoSelection ?? '');\n this._pendingAutoselectedOption = null;\n }\n this._closeKeyEventStream.next();\n this._resetActiveItem();\n // We need to stop propagation, otherwise the event will eventually\n // reach the input itself and cause the overlay to be reopened.\n event.stopPropagation();\n event.preventDefault();\n }\n };\n /**\n * Track which modal we have modified the `aria-owns` attribute of. When the combobox trigger is\n * inside an aria-modal, we apply aria-owns to the parent modal with the `id` of the options\n * panel. Track the modal we have changed so we can undo the changes on destroy.\n */\n this._trackedModal = null;\n this._scrollStrategy = scrollStrategy;\n }\n ngAfterViewInit() {\n this._initialized.next();\n this._initialized.complete();\n const window = this._getWindow();\n if (typeof window !== 'undefined') {\n this._zone.runOutsideAngular(() => window.addEventListener('blur', this._windowBlurHandler));\n }\n }\n ngOnChanges(changes) {\n if (changes['position'] && this._positionStrategy) {\n this._setStrategyPositions(this._positionStrategy);\n if (this.panelOpen) {\n this._overlayRef.updatePosition();\n }\n }\n }\n ngOnDestroy() {\n const window = this._getWindow();\n if (typeof window !== 'undefined') {\n window.removeEventListener('blur', this._windowBlurHandler);\n }\n this._handsetLandscapeSubscription.unsubscribe();\n this._viewportSubscription.unsubscribe();\n this._componentDestroyed = true;\n this._destroyPanel();\n this._closeKeyEventStream.complete();\n this._clearFromModal();\n }\n /** Whether or not the autocomplete panel is open. */\n get panelOpen() {\n return this._overlayAttached && this.autocomplete.showPanel;\n }\n /** Opens the autocomplete suggestion panel. */\n openPanel() {\n this._openPanelInternal();\n }\n /** Closes the autocomplete suggestion panel. */\n closePanel() {\n this._resetLabel();\n if (!this._overlayAttached) {\n return;\n }\n if (this.panelOpen) {\n // Only emit if the panel was visible.\n // `afterNextRender` always runs outside of the Angular zone, so all the subscriptions from\n // `_subscribeToClosingActions()` are also outside of the Angular zone.\n // We should manually run in Angular zone to update UI after panel closing.\n this._zone.run(() => {\n this.autocomplete.closed.emit();\n });\n }\n // Only reset if this trigger is the latest one that opened the\n // autocomplete since another may have taken it over.\n if (this.autocomplete._latestOpeningTrigger === this) {\n this.autocomplete._isOpen = false;\n this.autocomplete._latestOpeningTrigger = null;\n }\n this._overlayAttached = false;\n this._pendingAutoselectedOption = null;\n if (this._overlayRef && this._overlayRef.hasAttached()) {\n this._overlayRef.detach();\n this._closingActionsSubscription.unsubscribe();\n }\n this._updatePanelState();\n // Note that in some cases this can end up being called after the component is destroyed.\n // Add a check to ensure that we don't try to run change detection on a destroyed view.\n if (!this._componentDestroyed) {\n // We need to trigger change detection manually, because\n // `fromEvent` doesn't seem to do it at the proper time.\n // This ensures that the label is reset when the\n // user clicks outside.\n this._changeDetectorRef.detectChanges();\n }\n // Remove aria-owns attribute when the autocomplete is no longer visible.\n if (this._trackedModal) {\n removeAriaReferencedId(this._trackedModal, 'aria-owns', this.autocomplete.id);\n }\n }\n /**\n * Updates the position of the autocomplete suggestion panel to ensure that it fits all options\n * within the viewport.\n */\n updatePosition() {\n if (this._overlayAttached) {\n this._overlayRef.updatePosition();\n }\n }\n /**\n * A stream of actions that should close the autocomplete panel, including\n * when an option is selected, on blur, and when TAB is pressed.\n */\n get panelClosingActions() {\n return merge(this.optionSelections, this.autocomplete._keyManager.tabOut.pipe(filter(() => this._overlayAttached)), this._closeKeyEventStream, this._getOutsideClickStream(), this._overlayRef ? this._overlayRef.detachments().pipe(filter(() => this._overlayAttached)) : of()).pipe(\n // Normalize the output so we return a consistent type.\n map(event => event instanceof MatOptionSelectionChange ? event : null));\n }\n /** The currently active option, coerced to MatOption type. */\n get activeOption() {\n if (this.autocomplete && this.autocomplete._keyManager) {\n return this.autocomplete._keyManager.activeItem;\n }\n return null;\n }\n /** Stream of clicks outside of the autocomplete panel. */\n _getOutsideClickStream() {\n return merge(fromEvent(this._document, 'click'), fromEvent(this._document, 'auxclick'), fromEvent(this._document, 'touchend')).pipe(filter(event => {\n // If we're in the Shadow DOM, the event target will be the shadow root, so we have to\n // fall back to check the first element in the path of the click event.\n const clickTarget = _getEventTarget(event);\n const formField = this._formField ? this._formField.getConnectedOverlayOrigin().nativeElement : null;\n const customOrigin = this.connectedTo ? this.connectedTo.elementRef.nativeElement : null;\n return this._overlayAttached && clickTarget !== this._element.nativeElement &&\n // Normally focus moves inside `mousedown` so this condition will almost always be\n // true. Its main purpose is to handle the case where the input is focused from an\n // outside click which propagates up to the `body` listener within the same sequence\n // and causes the panel to close immediately (see #3106).\n this._document.activeElement !== this._element.nativeElement && (!formField || !formField.contains(clickTarget)) && (!customOrigin || !customOrigin.contains(clickTarget)) && !!this._overlayRef && !this._overlayRef.overlayElement.contains(clickTarget);\n }));\n }\n // Implemented as part of ControlValueAccessor.\n writeValue(value) {\n Promise.resolve(null).then(() => this._assignOptionValue(value));\n }\n // Implemented as part of ControlValueAccessor.\n registerOnChange(fn) {\n this._onChange = fn;\n }\n // Implemented as part of ControlValueAccessor.\n registerOnTouched(fn) {\n this._onTouched = fn;\n }\n // Implemented as part of ControlValueAccessor.\n setDisabledState(isDisabled) {\n this._element.nativeElement.disabled = isDisabled;\n }\n _handleKeydown(event) {\n const keyCode = event.keyCode;\n const hasModifier = hasModifierKey(event);\n // Prevent the default action on all escape key presses. This is here primarily to bring IE\n // in line with other browsers. By default, pressing escape on IE will cause it to revert\n // the input value to the one that it had on focus, however it won't dispatch any events\n // which means that the model value will be out of sync with the view.\n if (keyCode === ESCAPE && !hasModifier) {\n event.preventDefault();\n }\n this._valueOnLastKeydown = this._element.nativeElement.value;\n if (this.activeOption && keyCode === ENTER && this.panelOpen && !hasModifier) {\n this.activeOption._selectViaInteraction();\n this._resetActiveItem();\n event.preventDefault();\n } else if (this.autocomplete) {\n const prevActiveItem = this.autocomplete._keyManager.activeItem;\n const isArrowKey = keyCode === UP_ARROW || keyCode === DOWN_ARROW;\n if (keyCode === TAB || isArrowKey && !hasModifier && this.panelOpen) {\n this.autocomplete._keyManager.onKeydown(event);\n } else if (isArrowKey && this._canOpen()) {\n this._openPanelInternal(this._valueOnLastKeydown);\n }\n if (isArrowKey || this.autocomplete._keyManager.activeItem !== prevActiveItem) {\n this._scrollToOption(this.autocomplete._keyManager.activeItemIndex || 0);\n if (this.autocomplete.autoSelectActiveOption && this.activeOption) {\n if (!this._pendingAutoselectedOption) {\n this._valueBeforeAutoSelection = this._valueOnLastKeydown;\n }\n this._pendingAutoselectedOption = this.activeOption;\n this._assignOptionValue(this.activeOption.value);\n }\n }\n }\n }\n _handleInput(event) {\n let target = event.target;\n let value = target.value;\n // Based on `NumberValueAccessor` from forms.\n if (target.type === 'number') {\n value = value == '' ? null : parseFloat(value);\n }\n // If the input has a placeholder, IE will fire the `input` event on page load,\n // focus and blur, in addition to when the user actually changed the value. To\n // filter out all of the extra events, we save the value on focus and between\n // `input` events, and we check whether it changed.\n // See: https://connect.microsoft.com/IE/feedback/details/885747/\n if (this._previousValue !== value) {\n this._previousValue = value;\n this._pendingAutoselectedOption = null;\n // If selection is required we don't write to the CVA while the user is typing.\n // At the end of the selection either the user will have picked something\n // or we'll reset the value back to null.\n if (!this.autocomplete || !this.autocomplete.requireSelection) {\n this._onChange(value);\n }\n if (!value) {\n this._clearPreviousSelectedOption(null, false);\n } else if (this.panelOpen && !this.autocomplete.requireSelection) {\n // Note that we don't reset this when `requireSelection` is enabled,\n // because the option will be reset when the panel is closed.\n const selectedOption = this.autocomplete.options?.find(option => option.selected);\n if (selectedOption) {\n const display = this._getDisplayValue(selectedOption.value);\n if (value !== display) {\n selectedOption.deselect(false);\n }\n }\n }\n if (this._canOpen() && this._document.activeElement === event.target) {\n // When the `input` event fires, the input's value will have already changed. This means\n // that if we take the `this._element.nativeElement.value` directly, it'll be one keystroke\n // behind. This can be a problem when the user selects a value, changes a character while\n // the input still has focus and then clicks away (see #28432). To work around it, we\n // capture the value in `keydown` so we can use it here.\n const valueOnAttach = this._valueOnLastKeydown ?? this._element.nativeElement.value;\n this._valueOnLastKeydown = null;\n this._openPanelInternal(valueOnAttach);\n }\n }\n }\n _handleFocus() {\n if (!this._canOpenOnNextFocus) {\n this._canOpenOnNextFocus = true;\n } else if (this._canOpen()) {\n this._previousValue = this._element.nativeElement.value;\n this._attachOverlay(this._previousValue);\n this._floatLabel(true);\n }\n }\n _handleClick() {\n if (this._canOpen() && !this.panelOpen) {\n this._openPanelInternal();\n }\n }\n /**\n * In \"auto\" mode, the label will animate down as soon as focus is lost.\n * This causes the value to jump when selecting an option with the mouse.\n * This method manually floats the label until the panel can be closed.\n * @param shouldAnimate Whether the label should be animated when it is floated.\n */\n _floatLabel(shouldAnimate = false) {\n if (this._formField && this._formField.floatLabel === 'auto') {\n if (shouldAnimate) {\n this._formField._animateAndLockLabel();\n } else {\n this._formField.floatLabel = 'always';\n }\n this._manuallyFloatingLabel = true;\n }\n }\n /** If the label has been manually elevated, return it to its normal state. */\n _resetLabel() {\n if (this._manuallyFloatingLabel) {\n if (this._formField) {\n this._formField.floatLabel = 'auto';\n }\n this._manuallyFloatingLabel = false;\n }\n }\n /**\n * This method listens to a stream of panel closing actions and resets the\n * stream every time the option list changes.\n */\n _subscribeToClosingActions() {\n const initialRender = new Observable(subscriber => {\n afterNextRender(() => {\n subscriber.next();\n }, {\n injector: this._injector\n });\n });\n const optionChanges = this.autocomplete.options.changes.pipe(tap(() => this._positionStrategy.reapplyLastPosition()),\n // Defer emitting to the stream until the next tick, because changing\n // bindings in here will cause \"changed after checked\" errors.\n delay(0));\n // When the options are initially rendered, and when the option list changes...\n return merge(initialRender, optionChanges).pipe(\n // create a new stream of panelClosingActions, replacing any previous streams\n // that were created, and flatten it so our stream only emits closing events...\n switchMap(() => this._zone.run(() => {\n // `afterNextRender` always runs outside of the Angular zone, thus we have to re-enter\n // the Angular zone. This will lead to change detection being called outside of the Angular\n // zone and the `autocomplete.opened` will also emit outside of the Angular.\n const wasOpen = this.panelOpen;\n this._resetActiveItem();\n this._updatePanelState();\n this._changeDetectorRef.detectChanges();\n if (this.panelOpen) {\n this._overlayRef.updatePosition();\n }\n if (wasOpen !== this.panelOpen) {\n // If the `panelOpen` state changed, we need to make sure to emit the `opened` or\n // `closed` event, because we may not have emitted it. This can happen\n // - if the users opens the panel and there are no options, but the\n // options come in slightly later or as a result of the value changing,\n // - if the panel is closed after the user entered a string that did not match any\n // of the available options,\n // - if a valid string is entered after an invalid one.\n if (this.panelOpen) {\n this._emitOpened();\n } else {\n this.autocomplete.closed.emit();\n }\n }\n return this.panelClosingActions;\n })),\n // when the first closing event occurs...\n take(1))\n // set the value, close the panel, and complete.\n .subscribe(event => this._setValueAndClose(event));\n }\n /**\n * Emits the opened event once it's known that the panel will be shown and stores\n * the state of the trigger right before the opening sequence was finished.\n */\n _emitOpened() {\n this.autocomplete.opened.emit();\n }\n /** Destroys the autocomplete suggestion panel. */\n _destroyPanel() {\n if (this._overlayRef) {\n this.closePanel();\n this._overlayRef.dispose();\n this._overlayRef = null;\n }\n }\n /** Given a value, returns the string that should be shown within the input. */\n _getDisplayValue(value) {\n const autocomplete = this.autocomplete;\n return autocomplete && autocomplete.displayWith ? autocomplete.displayWith(value) : value;\n }\n _assignOptionValue(value) {\n const toDisplay = this._getDisplayValue(value);\n if (value == null) {\n this._clearPreviousSelectedOption(null, false);\n }\n // Simply falling back to an empty string if the display value is falsy does not work properly.\n // The display value can also be the number zero and shouldn't fall back to an empty string.\n this._updateNativeInputValue(toDisplay != null ? toDisplay : '');\n }\n _updateNativeInputValue(value) {\n // If it's used within a `MatFormField`, we should set it through the property so it can go\n // through change detection.\n if (this._formField) {\n this._formField._control.value = value;\n } else {\n this._element.nativeElement.value = value;\n }\n this._previousValue = value;\n }\n /**\n * This method closes the panel, and if a value is specified, also sets the associated\n * control to that value. It will also mark the control as dirty if this interaction\n * stemmed from the user.\n */\n _setValueAndClose(event) {\n const panel = this.autocomplete;\n const toSelect = event ? event.source : this._pendingAutoselectedOption;\n if (toSelect) {\n this._clearPreviousSelectedOption(toSelect);\n this._assignOptionValue(toSelect.value);\n // TODO(crisbeto): this should wait until the animation is done, otherwise the value\n // gets reset while the panel is still animating which looks glitchy. It'll likely break\n // some tests to change it at this point.\n this._onChange(toSelect.value);\n panel._emitSelectEvent(toSelect);\n this._element.nativeElement.focus();\n } else if (panel.requireSelection && this._element.nativeElement.value !== this._valueOnAttach) {\n this._clearPreviousSelectedOption(null);\n this._assignOptionValue(null);\n // Wait for the animation to finish before clearing the form control value, otherwise\n // the options might change while the animation is running which looks glitchy.\n if (panel._animationDone) {\n panel._animationDone.pipe(take(1)).subscribe(() => this._onChange(null));\n } else {\n this._onChange(null);\n }\n }\n this.closePanel();\n }\n /**\n * Clear any previous selected option and emit a selection change event for this option\n */\n _clearPreviousSelectedOption(skip, emitEvent) {\n // Null checks are necessary here, because the autocomplete\n // or its options may not have been assigned yet.\n this.autocomplete?.options?.forEach(option => {\n if (option !== skip && option.selected) {\n option.deselect(emitEvent);\n }\n });\n }\n _openPanelInternal(valueOnAttach = this._element.nativeElement.value) {\n this._attachOverlay(valueOnAttach);\n this._floatLabel();\n // Add aria-owns attribute when the autocomplete becomes visible.\n if (this._trackedModal) {\n const panelId = this.autocomplete.id;\n addAriaReferencedId(this._trackedModal, 'aria-owns', panelId);\n }\n }\n _attachOverlay(valueOnAttach) {\n if (!this.autocomplete && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getMatAutocompleteMissingPanelError();\n }\n let overlayRef = this._overlayRef;\n if (!overlayRef) {\n this._portal = new TemplatePortal(this.autocomplete.template, this._viewContainerRef, {\n id: this._formField?.getLabelId()\n });\n overlayRef = this._overlay.create(this._getOverlayConfig());\n this._overlayRef = overlayRef;\n this._viewportSubscription = this._viewportRuler.change().subscribe(() => {\n if (this.panelOpen && overlayRef) {\n overlayRef.updateSize({\n width: this._getPanelWidth()\n });\n }\n });\n // Subscribe to the breakpoint events stream to detect when screen is in\n // handsetLandscape.\n this._handsetLandscapeSubscription = this._breakpointObserver.observe(Breakpoints.HandsetLandscape).subscribe(result => {\n const isHandsetLandscape = result.matches;\n // Check if result.matches Breakpoints.HandsetLandscape. Apply HandsetLandscape\n // settings to prevent overlay cutoff in that breakpoint. Fixes b/284148377\n if (isHandsetLandscape) {\n this._positionStrategy.withFlexibleDimensions(true).withGrowAfterOpen(true).withViewportMargin(8);\n } else {\n this._positionStrategy.withFlexibleDimensions(false).withGrowAfterOpen(false).withViewportMargin(0);\n }\n });\n } else {\n // Update the trigger, panel width and direction, in case anything has changed.\n this._positionStrategy.setOrigin(this._getConnectedElement());\n overlayRef.updateSize({\n width: this._getPanelWidth()\n });\n }\n if (overlayRef && !overlayRef.hasAttached()) {\n overlayRef.attach(this._portal);\n this._valueOnAttach = valueOnAttach;\n this._valueOnLastKeydown = null;\n this._closingActionsSubscription = this._subscribeToClosingActions();\n }\n const wasOpen = this.panelOpen;\n this.autocomplete._isOpen = this._overlayAttached = true;\n this.autocomplete._latestOpeningTrigger = this;\n this.autocomplete._setColor(this._formField?.color);\n this._updatePanelState();\n this._applyModalPanelOwnership();\n // We need to do an extra `panelOpen` check in here, because the\n // autocomplete won't be shown if there are no options.\n if (this.panelOpen && wasOpen !== this.panelOpen) {\n this._emitOpened();\n }\n }\n /** Updates the panel's visibility state and any trigger state tied to id. */\n _updatePanelState() {\n this.autocomplete._setVisibility();\n // Note that here we subscribe and unsubscribe based on the panel's visiblity state,\n // because the act of subscribing will prevent events from reaching other overlays and\n // we don't want to block the events if there are no options.\n if (this.panelOpen) {\n const overlayRef = this._overlayRef;\n if (!this._keydownSubscription) {\n // Use the `keydownEvents` in order to take advantage of\n // the overlay event targeting provided by the CDK overlay.\n this._keydownSubscription = overlayRef.keydownEvents().subscribe(this._handlePanelKeydown);\n }\n if (!this._outsideClickSubscription) {\n // Subscribe to the pointer events stream so that it doesn't get picked up by other overlays.\n // TODO(crisbeto): we should switch `_getOutsideClickStream` eventually to use this stream,\n // but the behvior isn't exactly the same and it ends up breaking some internal tests.\n this._outsideClickSubscription = overlayRef.outsidePointerEvents().subscribe();\n }\n } else {\n this._keydownSubscription?.unsubscribe();\n this._outsideClickSubscription?.unsubscribe();\n this._keydownSubscription = this._outsideClickSubscription = null;\n }\n }\n _getOverlayConfig() {\n return new OverlayConfig({\n positionStrategy: this._getOverlayPosition(),\n scrollStrategy: this._scrollStrategy(),\n width: this._getPanelWidth(),\n direction: this._dir ?? undefined,\n panelClass: this._defaults?.overlayPanelClass\n });\n }\n _getOverlayPosition() {\n // Set default Overlay Position\n const strategy = this._overlay.position().flexibleConnectedTo(this._getConnectedElement()).withFlexibleDimensions(false).withPush(false);\n this._setStrategyPositions(strategy);\n this._positionStrategy = strategy;\n return strategy;\n }\n /** Sets the positions on a position strategy based on the directive's input state. */\n _setStrategyPositions(positionStrategy) {\n // Note that we provide horizontal fallback positions, even though by default the dropdown\n // width matches the input, because consumers can override the width. See #18854.\n const belowPositions = [{\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top'\n }, {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top'\n }];\n // The overlay edge connected to the trigger should have squared corners, while\n // the opposite end has rounded corners. We apply a CSS class to swap the\n // border-radius based on the overlay position.\n const panelClass = this._aboveClass;\n const abovePositions = [{\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n panelClass\n }, {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n panelClass\n }];\n let positions;\n if (this.position === 'above') {\n positions = abovePositions;\n } else if (this.position === 'below') {\n positions = belowPositions;\n } else {\n positions = [...belowPositions, ...abovePositions];\n }\n positionStrategy.withPositions(positions);\n }\n _getConnectedElement() {\n if (this.connectedTo) {\n return this.connectedTo.elementRef;\n }\n return this._formField ? this._formField.getConnectedOverlayOrigin() : this._element;\n }\n _getPanelWidth() {\n return this.autocomplete.panelWidth || this._getHostWidth();\n }\n /** Returns the width of the input element, so the panel width can match it. */\n _getHostWidth() {\n return this._getConnectedElement().nativeElement.getBoundingClientRect().width;\n }\n /**\n * Reset the active item to -1. This is so that pressing arrow keys will activate the correct\n * option.\n *\n * If the consumer opted-in to automatically activatating the first option, activate the first\n * *enabled* option.\n */\n _resetActiveItem() {\n const autocomplete = this.autocomplete;\n if (autocomplete.autoActiveFirstOption) {\n // Find the index of the first *enabled* option. Avoid calling `_keyManager.setActiveItem`\n // because it activates the first option that passes the skip predicate, rather than the\n // first *enabled* option.\n let firstEnabledOptionIndex = -1;\n for (let index = 0; index < autocomplete.options.length; index++) {\n const option = autocomplete.options.get(index);\n if (!option.disabled) {\n firstEnabledOptionIndex = index;\n break;\n }\n }\n autocomplete._keyManager.setActiveItem(firstEnabledOptionIndex);\n } else {\n autocomplete._keyManager.setActiveItem(-1);\n }\n }\n /** Determines whether the panel can be opened. */\n _canOpen() {\n const element = this._element.nativeElement;\n return !element.readOnly && !element.disabled && !this.autocompleteDisabled;\n }\n /** Use defaultView of injected document if available or fallback to global window reference */\n _getWindow() {\n return this._document?.defaultView || window;\n }\n /** Scrolls to a particular option in the list. */\n _scrollToOption(index) {\n // Given that we are not actually focusing active options, we must manually adjust scroll\n // to reveal options below the fold. First, we find the offset of the option from the top\n // of the panel. If that offset is below the fold, the new scrollTop will be the offset -\n // the panel height + the option height, so the active option will be just visible at the\n // bottom of the panel. If that offset is above the top of the visible panel, the new scrollTop\n // will become the offset. If that offset is visible within the panel already, the scrollTop is\n // not adjusted.\n const autocomplete = this.autocomplete;\n const labelCount = _countGroupLabelsBeforeOption(index, autocomplete.options, autocomplete.optionGroups);\n if (index === 0 && labelCount === 1) {\n // If we've got one group label before the option and we're at the top option,\n // scroll the list to the top. This is better UX than scrolling the list to the\n // top of the option, because it allows the user to read the top group's label.\n autocomplete._setScrollTop(0);\n } else if (autocomplete.panel) {\n const option = autocomplete.options.toArray()[index];\n if (option) {\n const element = option._getHostElement();\n const newScrollPosition = _getOptionScrollPosition(element.offsetTop, element.offsetHeight, autocomplete._getScrollTop(), autocomplete.panel.nativeElement.offsetHeight);\n autocomplete._setScrollTop(newScrollPosition);\n }\n }\n }\n /**\n * If the autocomplete trigger is inside of an `aria-modal` element, connect\n * that modal to the options panel with `aria-owns`.\n *\n * For some browser + screen reader combinations, when navigation is inside\n * of an `aria-modal` element, the screen reader treats everything outside\n * of that modal as hidden or invisible.\n *\n * This causes a problem when the combobox trigger is _inside_ of a modal, because the\n * options panel is rendered _outside_ of that modal, preventing screen reader navigation\n * from reaching the panel.\n *\n * We can work around this issue by applying `aria-owns` to the modal with the `id` of\n * the options panel. This effectively communicates to assistive technology that the\n * options panel is part of the same interaction as the modal.\n *\n * At time of this writing, this issue is present in VoiceOver.\n * See https://github.com/angular/components/issues/20694\n */\n _applyModalPanelOwnership() {\n // TODO(http://github.com/angular/components/issues/26853): consider de-duplicating this with\n // the `LiveAnnouncer` and any other usages.\n //\n // Note that the selector here is limited to CDK overlays at the moment in order to reduce the\n // section of the DOM we need to look through. This should cover all the cases we support, but\n // the selector can be expanded if it turns out to be too narrow.\n const modal = this._element.nativeElement.closest('body > .cdk-overlay-container [aria-modal=\"true\"]');\n if (!modal) {\n // Most commonly, the autocomplete trigger is not inside a modal.\n return;\n }\n const panelId = this.autocomplete.id;\n if (this._trackedModal) {\n removeAriaReferencedId(this._trackedModal, 'aria-owns', panelId);\n }\n addAriaReferencedId(modal, 'aria-owns', panelId);\n this._trackedModal = modal;\n }\n /** Clears the references to the listbox overlay element from the modal it was added to. */\n _clearFromModal() {\n if (this._trackedModal) {\n const panelId = this.autocomplete.id;\n removeAriaReferencedId(this._trackedModal, 'aria-owns', panelId);\n this._trackedModal = null;\n }\n }\n static {\n this.ɵfac = function MatAutocompleteTrigger_Factory(t) {\n return new (t || MatAutocompleteTrigger)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i1$1.Overlay), i0.ɵɵdirectiveInject(i0.ViewContainerRef), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(MAT_AUTOCOMPLETE_SCROLL_STRATEGY), i0.ɵɵdirectiveInject(i2.Directionality, 8), i0.ɵɵdirectiveInject(MAT_FORM_FIELD, 9), i0.ɵɵdirectiveInject(DOCUMENT, 8), i0.ɵɵdirectiveInject(i3.ViewportRuler), i0.ɵɵdirectiveInject(MAT_AUTOCOMPLETE_DEFAULT_OPTIONS, 8));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatAutocompleteTrigger,\n selectors: [[\"input\", \"matAutocomplete\", \"\"], [\"textarea\", \"matAutocomplete\", \"\"]],\n hostAttrs: [1, \"mat-mdc-autocomplete-trigger\"],\n hostVars: 7,\n hostBindings: function MatAutocompleteTrigger_HostBindings(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵlistener(\"focusin\", function MatAutocompleteTrigger_focusin_HostBindingHandler() {\n return ctx._handleFocus();\n })(\"blur\", function MatAutocompleteTrigger_blur_HostBindingHandler() {\n return ctx._onTouched();\n })(\"input\", function MatAutocompleteTrigger_input_HostBindingHandler($event) {\n return ctx._handleInput($event);\n })(\"keydown\", function MatAutocompleteTrigger_keydown_HostBindingHandler($event) {\n return ctx._handleKeydown($event);\n })(\"click\", function MatAutocompleteTrigger_click_HostBindingHandler() {\n return ctx._handleClick();\n });\n }\n if (rf & 2) {\n i0.ɵɵattribute(\"autocomplete\", ctx.autocompleteAttribute)(\"role\", ctx.autocompleteDisabled ? null : \"combobox\")(\"aria-autocomplete\", ctx.autocompleteDisabled ? null : \"list\")(\"aria-activedescendant\", ctx.panelOpen && ctx.activeOption ? ctx.activeOption.id : null)(\"aria-expanded\", ctx.autocompleteDisabled ? null : ctx.panelOpen.toString())(\"aria-controls\", ctx.autocompleteDisabled || !ctx.panelOpen ? null : ctx.autocomplete == null ? null : ctx.autocomplete.id)(\"aria-haspopup\", ctx.autocompleteDisabled ? null : \"listbox\");\n }\n },\n inputs: {\n autocomplete: [0, \"matAutocomplete\", \"autocomplete\"],\n position: [0, \"matAutocompletePosition\", \"position\"],\n connectedTo: [0, \"matAutocompleteConnectedTo\", \"connectedTo\"],\n autocompleteAttribute: [0, \"autocomplete\", \"autocompleteAttribute\"],\n autocompleteDisabled: [2, \"matAutocompleteDisabled\", \"autocompleteDisabled\", booleanAttribute]\n },\n exportAs: [\"matAutocompleteTrigger\"],\n standalone: true,\n features: [i0.ɵɵProvidersFeature([MAT_AUTOCOMPLETE_VALUE_ACCESSOR]), i0.ɵɵInputTransformsFeature, i0.ɵɵNgOnChangesFeature]\n });\n }\n }\n return MatAutocompleteTrigger;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet MatAutocompleteModule = /*#__PURE__*/(() => {\n class MatAutocompleteModule {\n static {\n this.ɵfac = function MatAutocompleteModule_Factory(t) {\n return new (t || MatAutocompleteModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: MatAutocompleteModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n providers: [MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER],\n imports: [OverlayModule, MatOptionModule, MatCommonModule, CommonModule, CdkScrollableModule, MatOptionModule, MatCommonModule]\n });\n }\n }\n return MatAutocompleteModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MAT_AUTOCOMPLETE_DEFAULT_OPTIONS, MAT_AUTOCOMPLETE_DEFAULT_OPTIONS_FACTORY, MAT_AUTOCOMPLETE_SCROLL_STRATEGY, MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY, MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER, MAT_AUTOCOMPLETE_VALUE_ACCESSOR, MatAutocomplete, MatAutocompleteModule, MatAutocompleteOrigin, MatAutocompleteSelectedEvent, MatAutocompleteTrigger, getMatAutocompleteMissingPanelError };\n","import * as i1 from '@angular/cdk/platform';\nimport { normalizePassiveListenerOptions } from '@angular/cdk/platform';\nimport * as i0 from '@angular/core';\nimport { Injectable, EventEmitter, Directive, Output, booleanAttribute, Optional, Inject, Input, NgModule } from '@angular/core';\nimport { coerceElement, coerceNumberProperty } from '@angular/cdk/coercion';\nimport { EMPTY, Subject, fromEvent } from 'rxjs';\nimport { auditTime, takeUntil } from 'rxjs/operators';\nimport { DOCUMENT } from '@angular/common';\n\n/** Options to pass to the animationstart listener. */\nconst listenerOptions = /*#__PURE__*/normalizePassiveListenerOptions({\n passive: true\n});\n/**\n * An injectable service that can be used to monitor the autofill state of an input.\n * Based on the following blog post:\n * https://medium.com/@brunn/detecting-autofilled-fields-in-javascript-aed598d25da7\n */\nlet AutofillMonitor = /*#__PURE__*/(() => {\n class AutofillMonitor {\n constructor(_platform, _ngZone) {\n this._platform = _platform;\n this._ngZone = _ngZone;\n this._monitoredElements = new Map();\n }\n monitor(elementOrRef) {\n if (!this._platform.isBrowser) {\n return EMPTY;\n }\n const element = coerceElement(elementOrRef);\n const info = this._monitoredElements.get(element);\n if (info) {\n return info.subject;\n }\n const result = new Subject();\n const cssClass = 'cdk-text-field-autofilled';\n const listener = event => {\n // Animation events fire on initial element render, we check for the presence of the autofill\n // CSS class to make sure this is a real change in state, not just the initial render before\n // we fire off events.\n if (event.animationName === 'cdk-text-field-autofill-start' && !element.classList.contains(cssClass)) {\n element.classList.add(cssClass);\n this._ngZone.run(() => result.next({\n target: event.target,\n isAutofilled: true\n }));\n } else if (event.animationName === 'cdk-text-field-autofill-end' && element.classList.contains(cssClass)) {\n element.classList.remove(cssClass);\n this._ngZone.run(() => result.next({\n target: event.target,\n isAutofilled: false\n }));\n }\n };\n this._ngZone.runOutsideAngular(() => {\n element.addEventListener('animationstart', listener, listenerOptions);\n element.classList.add('cdk-text-field-autofill-monitored');\n });\n this._monitoredElements.set(element, {\n subject: result,\n unlisten: () => {\n element.removeEventListener('animationstart', listener, listenerOptions);\n }\n });\n return result;\n }\n stopMonitoring(elementOrRef) {\n const element = coerceElement(elementOrRef);\n const info = this._monitoredElements.get(element);\n if (info) {\n info.unlisten();\n info.subject.complete();\n element.classList.remove('cdk-text-field-autofill-monitored');\n element.classList.remove('cdk-text-field-autofilled');\n this._monitoredElements.delete(element);\n }\n }\n ngOnDestroy() {\n this._monitoredElements.forEach((_info, element) => this.stopMonitoring(element));\n }\n static {\n this.ɵfac = function AutofillMonitor_Factory(t) {\n return new (t || AutofillMonitor)(i0.ɵɵinject(i1.Platform), i0.ɵɵinject(i0.NgZone));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: AutofillMonitor,\n factory: AutofillMonitor.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return AutofillMonitor;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** A directive that can be used to monitor the autofill state of an input. */\nlet CdkAutofill = /*#__PURE__*/(() => {\n class CdkAutofill {\n constructor(_elementRef, _autofillMonitor) {\n this._elementRef = _elementRef;\n this._autofillMonitor = _autofillMonitor;\n /** Emits when the autofill state of the element changes. */\n this.cdkAutofill = new EventEmitter();\n }\n ngOnInit() {\n this._autofillMonitor.monitor(this._elementRef).subscribe(event => this.cdkAutofill.emit(event));\n }\n ngOnDestroy() {\n this._autofillMonitor.stopMonitoring(this._elementRef);\n }\n static {\n this.ɵfac = function CdkAutofill_Factory(t) {\n return new (t || CdkAutofill)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(AutofillMonitor));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkAutofill,\n selectors: [[\"\", \"cdkAutofill\", \"\"]],\n outputs: {\n cdkAutofill: \"cdkAutofill\"\n },\n standalone: true\n });\n }\n }\n return CdkAutofill;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Directive to automatically resize a textarea to fit its content. */\nlet CdkTextareaAutosize = /*#__PURE__*/(() => {\n class CdkTextareaAutosize {\n /** Minimum amount of rows in the textarea. */\n get minRows() {\n return this._minRows;\n }\n set minRows(value) {\n this._minRows = coerceNumberProperty(value);\n this._setMinHeight();\n }\n /** Maximum amount of rows in the textarea. */\n get maxRows() {\n return this._maxRows;\n }\n set maxRows(value) {\n this._maxRows = coerceNumberProperty(value);\n this._setMaxHeight();\n }\n /** Whether autosizing is enabled or not */\n get enabled() {\n return this._enabled;\n }\n set enabled(value) {\n // Only act if the actual value changed. This specifically helps to not run\n // resizeToFitContent too early (i.e. before ngAfterViewInit)\n if (this._enabled !== value) {\n (this._enabled = value) ? this.resizeToFitContent(true) : this.reset();\n }\n }\n get placeholder() {\n return this._textareaElement.placeholder;\n }\n set placeholder(value) {\n this._cachedPlaceholderHeight = undefined;\n if (value) {\n this._textareaElement.setAttribute('placeholder', value);\n } else {\n this._textareaElement.removeAttribute('placeholder');\n }\n this._cacheTextareaPlaceholderHeight();\n }\n constructor(_elementRef, _platform, _ngZone, /** @breaking-change 11.0.0 make document required */\n document) {\n this._elementRef = _elementRef;\n this._platform = _platform;\n this._ngZone = _ngZone;\n this._destroyed = new Subject();\n this._enabled = true;\n /**\n * Value of minRows as of last resize. If the minRows has decreased, the\n * height of the textarea needs to be recomputed to reflect the new minimum. The maxHeight\n * does not have the same problem because it does not affect the textarea's scrollHeight.\n */\n this._previousMinRows = -1;\n this._isViewInited = false;\n /** Handles `focus` and `blur` events. */\n this._handleFocusEvent = event => {\n this._hasFocus = event.type === 'focus';\n };\n this._document = document;\n this._textareaElement = this._elementRef.nativeElement;\n }\n /** Sets the minimum height of the textarea as determined by minRows. */\n _setMinHeight() {\n const minHeight = this.minRows && this._cachedLineHeight ? `${this.minRows * this._cachedLineHeight}px` : null;\n if (minHeight) {\n this._textareaElement.style.minHeight = minHeight;\n }\n }\n /** Sets the maximum height of the textarea as determined by maxRows. */\n _setMaxHeight() {\n const maxHeight = this.maxRows && this._cachedLineHeight ? `${this.maxRows * this._cachedLineHeight}px` : null;\n if (maxHeight) {\n this._textareaElement.style.maxHeight = maxHeight;\n }\n }\n ngAfterViewInit() {\n if (this._platform.isBrowser) {\n // Remember the height which we started with in case autosizing is disabled\n this._initialHeight = this._textareaElement.style.height;\n this.resizeToFitContent();\n this._ngZone.runOutsideAngular(() => {\n const window = this._getWindow();\n fromEvent(window, 'resize').pipe(auditTime(16), takeUntil(this._destroyed)).subscribe(() => this.resizeToFitContent(true));\n this._textareaElement.addEventListener('focus', this._handleFocusEvent);\n this._textareaElement.addEventListener('blur', this._handleFocusEvent);\n });\n this._isViewInited = true;\n this.resizeToFitContent(true);\n }\n }\n ngOnDestroy() {\n this._textareaElement.removeEventListener('focus', this._handleFocusEvent);\n this._textareaElement.removeEventListener('blur', this._handleFocusEvent);\n this._destroyed.next();\n this._destroyed.complete();\n }\n /**\n * Cache the height of a single-row textarea if it has not already been cached.\n *\n * We need to know how large a single \"row\" of a textarea is in order to apply minRows and\n * maxRows. For the initial version, we will assume that the height of a single line in the\n * textarea does not ever change.\n */\n _cacheTextareaLineHeight() {\n if (this._cachedLineHeight) {\n return;\n }\n // Use a clone element because we have to override some styles.\n let textareaClone = this._textareaElement.cloneNode(false);\n textareaClone.rows = 1;\n // Use `position: absolute` so that this doesn't cause a browser layout and use\n // `visibility: hidden` so that nothing is rendered. Clear any other styles that\n // would affect the height.\n textareaClone.style.position = 'absolute';\n textareaClone.style.visibility = 'hidden';\n textareaClone.style.border = 'none';\n textareaClone.style.padding = '0';\n textareaClone.style.height = '';\n textareaClone.style.minHeight = '';\n textareaClone.style.maxHeight = '';\n // In Firefox it happens that textarea elements are always bigger than the specified amount\n // of rows. This is because Firefox tries to add extra space for the horizontal scrollbar.\n // As a workaround that removes the extra space for the scrollbar, we can just set overflow\n // to hidden. This ensures that there is no invalid calculation of the line height.\n // See Firefox bug report: https://bugzilla.mozilla.org/show_bug.cgi?id=33654\n textareaClone.style.overflow = 'hidden';\n this._textareaElement.parentNode.appendChild(textareaClone);\n this._cachedLineHeight = textareaClone.clientHeight;\n textareaClone.remove();\n // Min and max heights have to be re-calculated if the cached line height changes\n this._setMinHeight();\n this._setMaxHeight();\n }\n _measureScrollHeight() {\n const element = this._textareaElement;\n const previousMargin = element.style.marginBottom || '';\n const isFirefox = this._platform.FIREFOX;\n const needsMarginFiller = isFirefox && this._hasFocus;\n const measuringClass = isFirefox ? 'cdk-textarea-autosize-measuring-firefox' : 'cdk-textarea-autosize-measuring';\n // In some cases the page might move around while we're measuring the `textarea` on Firefox. We\n // work around it by assigning a temporary margin with the same height as the `textarea` so that\n // it occupies the same amount of space. See #23233.\n if (needsMarginFiller) {\n element.style.marginBottom = `${element.clientHeight}px`;\n }\n // Reset the textarea height to auto in order to shrink back to its default size.\n // Also temporarily force overflow:hidden, so scroll bars do not interfere with calculations.\n element.classList.add(measuringClass);\n // The measuring class includes a 2px padding to workaround an issue with Chrome,\n // so we account for that extra space here by subtracting 4 (2px top + 2px bottom).\n const scrollHeight = element.scrollHeight - 4;\n element.classList.remove(measuringClass);\n if (needsMarginFiller) {\n element.style.marginBottom = previousMargin;\n }\n return scrollHeight;\n }\n _cacheTextareaPlaceholderHeight() {\n if (!this._isViewInited || this._cachedPlaceholderHeight != undefined) {\n return;\n }\n if (!this.placeholder) {\n this._cachedPlaceholderHeight = 0;\n return;\n }\n const value = this._textareaElement.value;\n this._textareaElement.value = this._textareaElement.placeholder;\n this._cachedPlaceholderHeight = this._measureScrollHeight();\n this._textareaElement.value = value;\n }\n ngDoCheck() {\n if (this._platform.isBrowser) {\n this.resizeToFitContent();\n }\n }\n /**\n * Resize the textarea to fit its content.\n * @param force Whether to force a height recalculation. By default the height will be\n * recalculated only if the value changed since the last call.\n */\n resizeToFitContent(force = false) {\n // If autosizing is disabled, just skip everything else\n if (!this._enabled) {\n return;\n }\n this._cacheTextareaLineHeight();\n this._cacheTextareaPlaceholderHeight();\n // If we haven't determined the line-height yet, we know we're still hidden and there's no point\n // in checking the height of the textarea.\n if (!this._cachedLineHeight) {\n return;\n }\n const textarea = this._elementRef.nativeElement;\n const value = textarea.value;\n // Only resize if the value or minRows have changed since these calculations can be expensive.\n if (!force && this._minRows === this._previousMinRows && value === this._previousValue) {\n return;\n }\n const scrollHeight = this._measureScrollHeight();\n const height = Math.max(scrollHeight, this._cachedPlaceholderHeight || 0);\n // Use the scrollHeight to know how large the textarea *would* be if fit its entire value.\n textarea.style.height = `${height}px`;\n this._ngZone.runOutsideAngular(() => {\n if (typeof requestAnimationFrame !== 'undefined') {\n requestAnimationFrame(() => this._scrollToCaretPosition(textarea));\n } else {\n setTimeout(() => this._scrollToCaretPosition(textarea));\n }\n });\n this._previousValue = value;\n this._previousMinRows = this._minRows;\n }\n /**\n * Resets the textarea to its original size\n */\n reset() {\n // Do not try to change the textarea, if the initialHeight has not been determined yet\n // This might potentially remove styles when reset() is called before ngAfterViewInit\n if (this._initialHeight !== undefined) {\n this._textareaElement.style.height = this._initialHeight;\n }\n }\n _noopInputHandler() {\n // no-op handler that ensures we're running change detection on input events.\n }\n /** Access injected document if available or fallback to global document reference */\n _getDocument() {\n return this._document || document;\n }\n /** Use defaultView of injected document if available or fallback to global window reference */\n _getWindow() {\n const doc = this._getDocument();\n return doc.defaultView || window;\n }\n /**\n * Scrolls a textarea to the caret position. On Firefox resizing the textarea will\n * prevent it from scrolling to the caret position. We need to re-set the selection\n * in order for it to scroll to the proper position.\n */\n _scrollToCaretPosition(textarea) {\n const {\n selectionStart,\n selectionEnd\n } = textarea;\n // IE will throw an \"Unspecified error\" if we try to set the selection range after the\n // element has been removed from the DOM. Assert that the directive hasn't been destroyed\n // between the time we requested the animation frame and when it was executed.\n // Also note that we have to assert that the textarea is focused before we set the\n // selection range. Setting the selection range on a non-focused textarea will cause\n // it to receive focus on IE and Edge.\n if (!this._destroyed.isStopped && this._hasFocus) {\n textarea.setSelectionRange(selectionStart, selectionEnd);\n }\n }\n static {\n this.ɵfac = function CdkTextareaAutosize_Factory(t) {\n return new (t || CdkTextareaAutosize)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i1.Platform), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(DOCUMENT, 8));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkTextareaAutosize,\n selectors: [[\"textarea\", \"cdkTextareaAutosize\", \"\"]],\n hostAttrs: [\"rows\", \"1\", 1, \"cdk-textarea-autosize\"],\n hostBindings: function CdkTextareaAutosize_HostBindings(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵlistener(\"input\", function CdkTextareaAutosize_input_HostBindingHandler() {\n return ctx._noopInputHandler();\n });\n }\n },\n inputs: {\n minRows: [0, \"cdkAutosizeMinRows\", \"minRows\"],\n maxRows: [0, \"cdkAutosizeMaxRows\", \"maxRows\"],\n enabled: [2, \"cdkTextareaAutosize\", \"enabled\", booleanAttribute],\n placeholder: \"placeholder\"\n },\n exportAs: [\"cdkTextareaAutosize\"],\n standalone: true,\n features: [i0.ɵɵInputTransformsFeature]\n });\n }\n }\n return CdkTextareaAutosize;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet TextFieldModule = /*#__PURE__*/(() => {\n class TextFieldModule {\n static {\n this.ɵfac = function TextFieldModule_Factory(t) {\n return new (t || TextFieldModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: TextFieldModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({});\n }\n }\n return TextFieldModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { AutofillMonitor, CdkAutofill, CdkTextareaAutosize, TextFieldModule };\n","import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport * as i1 from '@angular/cdk/platform';\nimport { getSupportedInputTypes } from '@angular/cdk/platform';\nimport * as i4 from '@angular/cdk/text-field';\nimport { TextFieldModule } from '@angular/cdk/text-field';\nimport * as i0 from '@angular/core';\nimport { InjectionToken, Directive, Optional, Self, Inject, Input, NgModule } from '@angular/core';\nimport * as i2 from '@angular/forms';\nimport { Validators } from '@angular/forms';\nimport * as i3 from '@angular/material/core';\nimport { _ErrorStateTracker, MatCommonModule } from '@angular/material/core';\nimport * as i5 from '@angular/material/form-field';\nimport { MAT_FORM_FIELD, MatFormFieldControl, MatFormFieldModule } from '@angular/material/form-field';\nexport { MatError, MatFormField, MatHint, MatLabel, MatPrefix, MatSuffix } from '@angular/material/form-field';\nimport { Subject } from 'rxjs';\n\n/** @docs-private */\nfunction getMatInputUnsupportedTypeError(type) {\n return Error(`Input type \"${type}\" isn't supported by matInput.`);\n}\n\n/**\n * This token is used to inject the object whose value should be set into `MatInput`. If none is\n * provided, the native `HTMLInputElement` is used. Directives like `MatDatepickerInput` can provide\n * themselves for this token, in order to make `MatInput` delegate the getting and setting of the\n * value to them.\n */\nconst MAT_INPUT_VALUE_ACCESSOR = /*#__PURE__*/new InjectionToken('MAT_INPUT_VALUE_ACCESSOR');\n\n// Invalid input type. Using one of these will throw an MatInputUnsupportedTypeError.\nconst MAT_INPUT_INVALID_TYPES = ['button', 'checkbox', 'file', 'hidden', 'image', 'radio', 'range', 'reset', 'submit'];\nlet nextUniqueId = 0;\nlet MatInput = /*#__PURE__*/(() => {\n class MatInput {\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get disabled() {\n return this._disabled;\n }\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n // Browsers may not fire the blur event if the input is disabled too quickly.\n // Reset from here to ensure that the element doesn't become stuck.\n if (this.focused) {\n this.focused = false;\n this.stateChanges.next();\n }\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get id() {\n return this._id;\n }\n set id(value) {\n this._id = value || this._uid;\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get required() {\n return this._required ?? this.ngControl?.control?.hasValidator(Validators.required) ?? false;\n }\n set required(value) {\n this._required = coerceBooleanProperty(value);\n }\n /** Input type of the element. */\n get type() {\n return this._type;\n }\n set type(value) {\n this._type = value || 'text';\n this._validateType();\n // When using Angular inputs, developers are no longer able to set the properties on the native\n // input element. To ensure that bindings for `type` work, we need to sync the setter\n // with the native property. Textarea elements don't support the type property or attribute.\n if (!this._isTextarea && getSupportedInputTypes().has(this._type)) {\n this._elementRef.nativeElement.type = this._type;\n }\n }\n /** An object used to control when error messages are shown. */\n get errorStateMatcher() {\n return this._errorStateTracker.matcher;\n }\n set errorStateMatcher(value) {\n this._errorStateTracker.matcher = value;\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get value() {\n return this._inputValueAccessor.value;\n }\n set value(value) {\n if (value !== this.value) {\n this._inputValueAccessor.value = value;\n this.stateChanges.next();\n }\n }\n /** Whether the element is readonly. */\n get readonly() {\n return this._readonly;\n }\n set readonly(value) {\n this._readonly = coerceBooleanProperty(value);\n }\n /** Whether the input is in an error state. */\n get errorState() {\n return this._errorStateTracker.errorState;\n }\n set errorState(value) {\n this._errorStateTracker.errorState = value;\n }\n constructor(_elementRef, _platform, ngControl, parentForm, parentFormGroup, defaultErrorStateMatcher, inputValueAccessor, _autofillMonitor, ngZone,\n // TODO: Remove this once the legacy appearance has been removed. We only need\n // to inject the form field for determining whether the placeholder has been promoted.\n _formField) {\n this._elementRef = _elementRef;\n this._platform = _platform;\n this.ngControl = ngControl;\n this._autofillMonitor = _autofillMonitor;\n this._formField = _formField;\n this._uid = `mat-input-${nextUniqueId++}`;\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n this.focused = false;\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n this.stateChanges = new Subject();\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n this.controlType = 'mat-input';\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n this.autofilled = false;\n this._disabled = false;\n this._type = 'text';\n this._readonly = false;\n this._neverEmptyInputTypes = ['date', 'datetime', 'datetime-local', 'month', 'time', 'week'].filter(t => getSupportedInputTypes().has(t));\n this._iOSKeyupListener = event => {\n const el = event.target;\n // Note: We specifically check for 0, rather than `!el.selectionStart`, because the two\n // indicate different things. If the value is 0, it means that the caret is at the start\n // of the input, whereas a value of `null` means that the input doesn't support\n // manipulating the selection range. Inputs that don't support setting the selection range\n // will throw an error so we want to avoid calling `setSelectionRange` on them. See:\n // https://html.spec.whatwg.org/multipage/input.html#do-not-apply\n if (!el.value && el.selectionStart === 0 && el.selectionEnd === 0) {\n // Note: Just setting `0, 0` doesn't fix the issue. Setting\n // `1, 1` fixes it for the first time that you type text and\n // then hold delete. Toggling to `1, 1` and then back to\n // `0, 0` seems to completely fix it.\n el.setSelectionRange(1, 1);\n el.setSelectionRange(0, 0);\n }\n };\n const element = this._elementRef.nativeElement;\n const nodeName = element.nodeName.toLowerCase();\n // If no input value accessor was explicitly specified, use the element as the input value\n // accessor.\n this._inputValueAccessor = inputValueAccessor || element;\n this._previousNativeValue = this.value;\n // Force setter to be called in case id was not specified.\n this.id = this.id;\n // On some versions of iOS the caret gets stuck in the wrong place when holding down the delete\n // key. In order to get around this we need to \"jiggle\" the caret loose. Since this bug only\n // exists on iOS, we only bother to install the listener on iOS.\n if (_platform.IOS) {\n ngZone.runOutsideAngular(() => {\n _elementRef.nativeElement.addEventListener('keyup', this._iOSKeyupListener);\n });\n }\n this._errorStateTracker = new _ErrorStateTracker(defaultErrorStateMatcher, ngControl, parentFormGroup, parentForm, this.stateChanges);\n this._isServer = !this._platform.isBrowser;\n this._isNativeSelect = nodeName === 'select';\n this._isTextarea = nodeName === 'textarea';\n this._isInFormField = !!_formField;\n if (this._isNativeSelect) {\n this.controlType = element.multiple ? 'mat-native-select-multiple' : 'mat-native-select';\n }\n }\n ngAfterViewInit() {\n if (this._platform.isBrowser) {\n this._autofillMonitor.monitor(this._elementRef.nativeElement).subscribe(event => {\n this.autofilled = event.isAutofilled;\n this.stateChanges.next();\n });\n }\n }\n ngOnChanges() {\n this.stateChanges.next();\n }\n ngOnDestroy() {\n this.stateChanges.complete();\n if (this._platform.isBrowser) {\n this._autofillMonitor.stopMonitoring(this._elementRef.nativeElement);\n }\n if (this._platform.IOS) {\n this._elementRef.nativeElement.removeEventListener('keyup', this._iOSKeyupListener);\n }\n }\n ngDoCheck() {\n if (this.ngControl) {\n // We need to re-evaluate this on every change detection cycle, because there are some\n // error triggers that we can't subscribe to (e.g. parent form submissions). This means\n // that whatever logic is in here has to be super lean or we risk destroying the performance.\n this.updateErrorState();\n // Since the input isn't a `ControlValueAccessor`, we don't have a good way of knowing when\n // the disabled state has changed. We can't use the `ngControl.statusChanges`, because it\n // won't fire if the input is disabled with `emitEvents = false`, despite the input becoming\n // disabled.\n if (this.ngControl.disabled !== null && this.ngControl.disabled !== this.disabled) {\n this.disabled = this.ngControl.disabled;\n this.stateChanges.next();\n }\n }\n // We need to dirty-check the native element's value, because there are some cases where\n // we won't be notified when it changes (e.g. the consumer isn't using forms or they're\n // updating the value using `emitEvent: false`).\n this._dirtyCheckNativeValue();\n // We need to dirty-check and set the placeholder attribute ourselves, because whether it's\n // present or not depends on a query which is prone to \"changed after checked\" errors.\n this._dirtyCheckPlaceholder();\n }\n /** Focuses the input. */\n focus(options) {\n this._elementRef.nativeElement.focus(options);\n }\n /** Refreshes the error state of the input. */\n updateErrorState() {\n this._errorStateTracker.updateErrorState();\n }\n /** Callback for the cases where the focused state of the input changes. */\n _focusChanged(isFocused) {\n if (isFocused !== this.focused) {\n this.focused = isFocused;\n this.stateChanges.next();\n }\n }\n _onInput() {\n // This is a noop function and is used to let Angular know whenever the value changes.\n // Angular will run a new change detection each time the `input` event has been dispatched.\n // It's necessary that Angular recognizes the value change, because when floatingLabel\n // is set to false and Angular forms aren't used, the placeholder won't recognize the\n // value changes and will not disappear.\n // Listening to the input event wouldn't be necessary when the input is using the\n // FormsModule or ReactiveFormsModule, because Angular forms also listens to input events.\n }\n /** Does some manual dirty checking on the native input `value` property. */\n _dirtyCheckNativeValue() {\n const newValue = this._elementRef.nativeElement.value;\n if (this._previousNativeValue !== newValue) {\n this._previousNativeValue = newValue;\n this.stateChanges.next();\n }\n }\n /** Does some manual dirty checking on the native input `placeholder` attribute. */\n _dirtyCheckPlaceholder() {\n const placeholder = this._getPlaceholder();\n if (placeholder !== this._previousPlaceholder) {\n const element = this._elementRef.nativeElement;\n this._previousPlaceholder = placeholder;\n placeholder ? element.setAttribute('placeholder', placeholder) : element.removeAttribute('placeholder');\n }\n }\n /** Gets the current placeholder of the form field. */\n _getPlaceholder() {\n return this.placeholder || null;\n }\n /** Make sure the input is a supported type. */\n _validateType() {\n if (MAT_INPUT_INVALID_TYPES.indexOf(this._type) > -1 && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getMatInputUnsupportedTypeError(this._type);\n }\n }\n /** Checks whether the input type is one of the types that are never empty. */\n _isNeverEmpty() {\n return this._neverEmptyInputTypes.indexOf(this._type) > -1;\n }\n /** Checks whether the input is invalid based on the native validation. */\n _isBadInput() {\n // The `validity` property won't be present on platform-server.\n let validity = this._elementRef.nativeElement.validity;\n return validity && validity.badInput;\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get empty() {\n return !this._isNeverEmpty() && !this._elementRef.nativeElement.value && !this._isBadInput() && !this.autofilled;\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get shouldLabelFloat() {\n if (this._isNativeSelect) {\n // For a single-selection ``, the label *always* floats to avoid\n // overlapping the label with the options.\n const selectElement = this._elementRef.nativeElement;\n const firstOption = selectElement.options[0];\n // On most browsers the `selectedIndex` will always be 0, however on IE and Edge it'll be\n // -1 if the `value` is set to something, that isn't in the list of options, at a later point.\n return this.focused || selectElement.multiple || !this.empty || !!(selectElement.selectedIndex > -1 && firstOption && firstOption.label);\n } else {\n return this.focused || !this.empty;\n }\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n setDescribedByIds(ids) {\n if (ids.length) {\n this._elementRef.nativeElement.setAttribute('aria-describedby', ids.join(' '));\n } else {\n this._elementRef.nativeElement.removeAttribute('aria-describedby');\n }\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n onContainerClick() {\n // Do not re-focus the input element if the element is already focused. Otherwise it can happen\n // that someone clicks on a time input and the cursor resets to the \"hours\" field while the\n // \"minutes\" field was actually clicked. See: https://github.com/angular/components/issues/12849\n if (!this.focused) {\n this.focus();\n }\n }\n /** Whether the form control is a native select that is displayed inline. */\n _isInlineSelect() {\n const element = this._elementRef.nativeElement;\n return this._isNativeSelect && (element.multiple || element.size > 1);\n }\n static {\n this.ɵfac = function MatInput_Factory(t) {\n return new (t || MatInput)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i1.Platform), i0.ɵɵdirectiveInject(i2.NgControl, 10), i0.ɵɵdirectiveInject(i2.NgForm, 8), i0.ɵɵdirectiveInject(i2.FormGroupDirective, 8), i0.ɵɵdirectiveInject(i3.ErrorStateMatcher), i0.ɵɵdirectiveInject(MAT_INPUT_VALUE_ACCESSOR, 10), i0.ɵɵdirectiveInject(i4.AutofillMonitor), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(MAT_FORM_FIELD, 8));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatInput,\n selectors: [[\"input\", \"matInput\", \"\"], [\"textarea\", \"matInput\", \"\"], [\"select\", \"matNativeControl\", \"\"], [\"input\", \"matNativeControl\", \"\"], [\"textarea\", \"matNativeControl\", \"\"]],\n hostAttrs: [1, \"mat-mdc-input-element\"],\n hostVars: 18,\n hostBindings: function MatInput_HostBindings(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵlistener(\"focus\", function MatInput_focus_HostBindingHandler() {\n return ctx._focusChanged(true);\n })(\"blur\", function MatInput_blur_HostBindingHandler() {\n return ctx._focusChanged(false);\n })(\"input\", function MatInput_input_HostBindingHandler() {\n return ctx._onInput();\n });\n }\n if (rf & 2) {\n i0.ɵɵhostProperty(\"id\", ctx.id)(\"disabled\", ctx.disabled)(\"required\", ctx.required);\n i0.ɵɵattribute(\"name\", ctx.name || null)(\"readonly\", ctx.readonly && !ctx._isNativeSelect || null)(\"aria-invalid\", ctx.empty && ctx.required ? null : ctx.errorState)(\"aria-required\", ctx.required)(\"id\", ctx.id);\n i0.ɵɵclassProp(\"mat-input-server\", ctx._isServer)(\"mat-mdc-form-field-textarea-control\", ctx._isInFormField && ctx._isTextarea)(\"mat-mdc-form-field-input-control\", ctx._isInFormField)(\"mdc-text-field__input\", ctx._isInFormField)(\"mat-mdc-native-select-inline\", ctx._isInlineSelect());\n }\n },\n inputs: {\n disabled: \"disabled\",\n id: \"id\",\n placeholder: \"placeholder\",\n name: \"name\",\n required: \"required\",\n type: \"type\",\n errorStateMatcher: \"errorStateMatcher\",\n userAriaDescribedBy: [0, \"aria-describedby\", \"userAriaDescribedBy\"],\n value: \"value\",\n readonly: \"readonly\"\n },\n exportAs: [\"matInput\"],\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: MatFormFieldControl,\n useExisting: MatInput\n }]), i0.ɵɵNgOnChangesFeature]\n });\n }\n }\n return MatInput;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet MatInputModule = /*#__PURE__*/(() => {\n class MatInputModule {\n static {\n this.ɵfac = function MatInputModule_Factory(t) {\n return new (t || MatInputModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: MatInputModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n imports: [MatCommonModule, MatFormFieldModule, MatFormFieldModule, TextFieldModule, MatCommonModule]\n });\n }\n }\n return MatInputModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MAT_INPUT_VALUE_ACCESSOR, MatInput, MatInputModule, getMatInputUnsupportedTypeError };\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from \"@angular/core\";\r\nimport { MatAutocompleteSelectedEvent } from \"@angular/material/autocomplete\";\r\nimport { EthBaseControlInputComponent } from \"@e-tenant-hub/shared/ui/inputs/base-control-input\";\r\nimport { Observable } from \"rxjs\";\r\n\r\n@Component({\r\n\tselector: \"cp-common-auto-complete-input\",\r\n\ttemplateUrl: \"./common-auto-complete-input.component.html\",\r\n\tstyleUrl: \"./common-auto-complete-input.component.scss\",\r\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CommonAutoCompleteInputComponent extends EthBaseControlInputComponent {\r\n\t@Input() type: \"email\" | \"text\" | \"password\" | \"number\" | \"search\" = \"text\";\r\n\t@Input() specialType?: \"amount\" | \"phoneNumber\" | \"ca\";\r\n\t@Input() iconColor?: \"text-primary\" | \"text-neutral-400\" = \"text-neutral-400\";\r\n\t@Input() cursor: \"auto\" | \"pointer\" = \"auto\";\r\n\t@Input() filteredOptions!: Observable | undefined;\r\n\t@Input() displayFormatOption!: (item: T) => string;\r\n\t@Input() displayFn!: (item: T) => string;\r\n\r\n\t@Output() readonly optionSelected = new EventEmitter();\r\n\r\n\t@Input() get prefixIcon(): string | undefined {\r\n\t\tif (this.type === \"search\") {\r\n\t\t\tthis.prefixIcon = \"search\";\r\n\t\t\tthis.iconColor = \"text-neutral-400\";\r\n\t\t}\r\n\t\treturn this._prefixIcon;\r\n\t}\r\n\tset prefixIcon(value: string) {\r\n\t\tthis._prefixIcon = value;\r\n\t}\r\n\r\n\t@Input() get suffixIcon(): string | undefined {\r\n\t\tif (this.specialType === \"amount\") {\r\n\t\t\tthis.suffixIcon = \"euro\";\r\n\t\t\tthis.iconColor = \"text-primary\";\r\n\t\t}\r\n\t\treturn this._suffixIcon;\r\n\t}\r\n\tset suffixIcon(value: string) {\r\n\t\tthis._suffixIcon = value;\r\n\t}\r\n\r\n\tget errorCount(): number {\r\n\t\treturn this.ngControl.errors ? Object.keys(this.ngControl.errors).length : 0;\r\n\t}\r\n\r\n\tprivate _prefixIcon?: string;\r\n\tprivate _suffixIcon?: string;\r\n\r\n\tisPasswordVisible = false;\r\n\thasFocus = false;\r\n\r\n\tonFocus() {\r\n\t\tthis.hasFocus = true;\r\n\t}\r\n\r\n\tonBlur() {\r\n\t\tthis.hasFocus = false;\r\n\t}\r\n\r\n\temitOptionSelected($event: MatAutocompleteSelectedEvent) {\r\n\t\tthis.optionSelected.emit($event);\r\n\t}\r\n}\r\n","
\r\n\t@if (label) {\r\n\t\t\r\n\t\t\t{{ label }}\r\n\t\t\r\n\t}\r\n\t\r\n\t\t@if (prefixIcon) {\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\t\t@for (option of filteredOptions | async; track option) {\r\n\t\t\t\t{{ displayFormatOption(option) }}\r\n\t\t\t}\r\n\t\t\r\n\t\t@if (suffixIcon) {\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\t\t\r\n\t\t\t@if (ngControl.hasError(\"required\")) {\r\n\t\t\t\t@if (specialType === \"ca\") {\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tVeuillez entrer 6 caractères minimum.
\r\n\t\t\t\t\t\tCompléter avec autant de caractère \"0\" devant votre numéro de CA pour atteindre un nombre de 6.\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\tExemple : si votre numéro de CA est 24, alors entrez 000024.\r\n\t\t\t\t} @else {\r\n\t\t\t\t\tLe champ \"{{ name ?? label }}\" est obligatoire.\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t
\r\n\t\r\n
\r\n","import * as i0 from '@angular/core';\nimport { inject, ElementRef, NgZone, Directive, Input, Pipe } from '@angular/core';\nimport { DefaultValueAccessor } from '@angular/forms';\nimport { MASKITO_DEFAULT_ELEMENT_PREDICATE, maskitoTransform, Maskito, MASKITO_DEFAULT_OPTIONS } from '@maskito/core';\nlet MaskitoDirective = /*#__PURE__*/(() => {\n class MaskitoDirective {\n constructor() {\n this.elementRef = inject(ElementRef).nativeElement;\n this.ngZone = inject(NgZone);\n this.maskedElement = null;\n this.options = null;\n this.elementPredicate = MASKITO_DEFAULT_ELEMENT_PREDICATE;\n const accessor = inject(DefaultValueAccessor, {\n self: true,\n optional: true\n });\n if (accessor) {\n const original = accessor.writeValue.bind(accessor);\n accessor.writeValue = value => {\n original(this.options ? maskitoTransform(String(value ?? ''), this.options) : value);\n };\n }\n }\n async ngOnChanges() {\n const {\n elementPredicate,\n options\n } = this;\n this.maskedElement?.destroy();\n if (!options) {\n return;\n }\n const predicateResult = await elementPredicate(this.elementRef);\n if (this.elementPredicate !== elementPredicate) {\n // Ignore the result of the predicate if the\n // maskito element has changed before the predicate was resolved.\n return;\n }\n this.ngZone.runOutsideAngular(() => {\n this.maskedElement = new Maskito(predicateResult, options);\n });\n }\n ngOnDestroy() {\n this.maskedElement?.destroy();\n }\n static {\n this.ɵfac = function MaskitoDirective_Factory(t) {\n return new (t || MaskitoDirective)();\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MaskitoDirective,\n selectors: [[\"\", \"maskito\", \"\"]],\n inputs: {\n options: [0, \"maskito\", \"options\"],\n elementPredicate: [0, \"maskitoElement\", \"elementPredicate\"]\n },\n standalone: true,\n features: [i0.ɵɵNgOnChangesFeature]\n });\n }\n }\n return MaskitoDirective;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet MaskitoPipe = /*#__PURE__*/(() => {\n class MaskitoPipe {\n transform(value, maskitoOptions) {\n return maskitoTransform(String(value ?? ''), maskitoOptions ?? MASKITO_DEFAULT_OPTIONS);\n }\n static {\n this.ɵfac = function MaskitoPipe_Factory(t) {\n return new (t || MaskitoPipe)();\n };\n }\n static {\n this.ɵpipe = /* @__PURE__ */i0.ɵɵdefinePipe({\n name: \"maskito\",\n type: MaskitoPipe,\n pure: true,\n standalone: true\n });\n }\n }\n return MaskitoPipe;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MaskitoDirective, MaskitoPipe };\n","import { CommonModule } from \"@angular/common\";\r\nimport { NgModule } from \"@angular/core\";\r\nimport { ReactiveFormsModule } from \"@angular/forms\";\r\nimport { MatAutocompleteModule } from \"@angular/material/autocomplete\";\r\nimport { MatInputModule } from \"@angular/material/input\";\r\nimport { EthIconComponent } from \"@e-tenant-hub/shared/ui/icon\";\r\nimport { MaskitoDirective } from \"@maskito/angular\";\r\nimport { CommonAutoCompleteInputComponent } from \"./common-auto-complete-input.component\";\r\n\r\n@NgModule({\r\n\timports: [\r\n\t\tCommonModule,\r\n\t\tReactiveFormsModule,\r\n\t\tMatAutocompleteModule,\r\n\t\tMatInputModule,\r\n\t\tEthIconComponent,\r\n\t\tMaskitoDirective,\r\n\t],\r\n\tdeclarations: [CommonAutoCompleteInputComponent],\r\n\texports: [CommonAutoCompleteInputComponent],\r\n})\r\nexport class CommonAutoCompleteInputModule {}\r\n"],"mappings":"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","names":["ɵɵelementStart","ɵɵtext","ɵɵelementEnd","ɵɵadvance","ɵɵtextInterpolate","ɵɵpipeBind1","ctx_r0","label","ɵɵelement","ɵɵproperty","icon","isIconFilled","RoundedButtonComponent","constructor","type","isFullWidth","disabled","isReversed","readOnly","clicked","EventEmitter","selectors","inputs","outputs","decls","vars","consts","template","rf","ctx","ɵɵlistener","emit","ɵɵtemplate","RoundedButtonComponent_Conditional_1_Template","RoundedButtonComponent_Conditional_2_Template","ɵɵpureFunction6","_c0","ɵɵconditional","_RoundedButtonComponent","RoundedButtonModule","CommonModule","MatIconModule","MatRippleModule","EthIconComponent","_RoundedButtonModule","SystemPayParameterKeys","_SystemPayParameterKeys","actionMode","amount","contextMode","currency","customerEmail","customerId","pageAction","paymentConfig","returnMode","returnUrl","signature","siteId","transactionStatus","transmissionDate","transmissionId","urlCheck","version","allRequest","OnlinePaymentTransactionStatus","_OnlinePaymentTransactionStatus","error","expiration","failure","none","refusal","success","SystemPayTransmissionResponseStatus","_SystemPayTransmissionResponseStatus","abandoned","authorised","authorisedToValidate","cancelled","captured","captureFailed","expired","initial","notCreated","refused","suspended","underVerification","waitingAuthorisation","waitingAuthorisationToValidate","record","RentalContactPersonRoles","_RentalContactPersonRoles","buildingManager","areaManager","socialAndRentalManager","mediationAndResidentialPeaceOfficer","territoryAssistant","territoryManager","specialPremisesManager","record","RentalAccommodationTypes","_RentalAccommodationTypes","buildingJanitor","housingBRS","garage","residence","office","land","bikeGarage","technicalReserve","professionalPremises","residentCollectivePremises","garageOrParkBRS","park","gargabeRoom","maintenanceRoom","motoRoom","studentResidence","miscellaneousRentals","laundry","cellar","business","studentAccommodation","cellarBRS","housing","nonPropertyPremises","motoBoxing","isPrimaryRecord","RentalHabitationTypes","_RentalHabitationTypes","type1","type1bis","type2","type3","type4","type5","type6","type7","studio","room","restructuredType3","restructuredType4","restructuredType1","restructuredType2","restructuredType5","restructuredType6","slotsLocation","type3bis","type4bis","parking","RentalExpertiseAreaCodes","_RentalExpertiseAreaCodes","elevator","playgrounds","tv","individualBoiler","individualBoiler2","gasWaterHeater","cumulus","collectiveHeating","collectiveHeating2","collectiveHeating3","waterMeter","insectControl","multiMaintenance","automatedGarageDoor","vmc","RentalWaterTypes","_RentalWaterTypes","hotWater","coldWater","RentalLotTypes","_RentalLotTypes","accommodation","SolicitationStatus","_SolicitationStatus","canceled","closed","inProgress","registered","requested","unknown","closedCategoryItems","inProgressCategoryItems","record","SolicitationCategories","_SolicitationCategories","customerRelationshipCenter","disorders","rentalManagement","technical","all","shortRecord","SolicitationSubCategories","_SolicitationSubCategories","bulkyItemsClearing","cleaningServices","documentsRequest","electricity","familySituationChange","floors","garageRequest","glazing","heatingAndVentilation","homeAdaptationRequest","intercom","joinery","lift","locksmith","masonry","others","outdoorAreas","paymentTermsAndConditions","pests","plumbing","rentAndCosts","residentialAutomaticDoor","safetyEquipment","securityDepositRefund","seepageAndTightness","slsOpsSurvey","television","workAuthorizationRequest","allDisorders","allRentalManagement","allTechnical","SolicitationScopes","_SolicitationScopes","private","public","partRecord","SolicitationCommentTypes","_SolicitationCommentTypes","closureRequest","informationRequest","reminder","tagRecord","iconRecord","formRecord","FilterSolicitationPipe","constructor","tmpValues","transform","values","filters","filter","f","selected","value","forEach","category","Array","isArray","minDateFilter","maxDateFilter","v","creationDate","PreciseDate","toString","isPublicFilter","isPublic","status","title","toLowerCase","includes","String","pure","_FilterSolicitationPipe","RentalsHttpClient","constructor","appConfig","inject","APP_CONFIG","httpClient","HttpClient","get","endPoint","options","apiRoot","post","params","put","delete","downloadFile","responseType","downloadLocalFile","uploadFile","body","callback","url","reportProgress","observe","pipe","tap","event","type","HttpEventType","UploadProgress","fileProgress","percentage","total","Math","round","loaded","undefined","totalFileSize","uploadedFileSize","factory","ɵfac","_RentalsHttpClient","RentalDisplayPipe","transform","rentalIdentifier","rentalKey","pure","standalone","_RentalDisplayPipe","RentalsModule","provide","RentalsHttpClient","deps","HttpClient","imports","CommonModule","ConfigModule","UtilsModule","_RentalsModule","BalancesService","constructor","httpClient","inject","RentalsHttpClient","lastPaymentsSubject$","BehaviorSubject","onLastPaymentsChange$","asObservable","getOnlinePaymentInfoByRental","rentalId","get","getLastPaymentsByRental","getLastPaymentNoticeByRental","getPaymentNoticeHistoryByRental","getAccountStatementByRental","getDirectDebitByRental","thirdPartyId","retrieveOnlinePaymentParameters","request","post","reloadLastPayments","next","factory","ɵfac","providedIn","_BalancesService","CommunicationService","constructor","_insuranceUploadedSubject$","BehaviorSubject","_rentalSelectionChangedSubject$","onInsuranceUploaded$","asObservable","onRentalSelectionChanged$","changeRentalUnitSelection","next","insuranceUploaded","factory","ɵfac","providedIn","_CommunicationService","FilesService","constructor","httpClient","inject","RentalsHttpClient","getOnlinePaymentNotice","rentalId","fileName","downloadFile","getSEPAForm","downloadLocalFile","getBedbugsGuideUrl","get","getMaintenanceGuideUrl","getRentalCostsGuideUrl","getRentalRepairGuideUrl","factory","ɵfac","providedIn","_FilesService","FormsService","constructor","httpClient","inject","RentalsHttpClient","getLastActive","thirdPartyId","get","registerQuestionAnswers","request","post","factory","ɵfac","providedIn","_FormsService","InsurancesService","constructor","httpClient","inject","RentalsHttpClient","_uploadInsuranceFileSource","Subject","onUploadInsuranceFile$","asObservable","getInsuranceStatusByRental","rentalId","get","updateInsuranceDocument","thirdPartyId","request","formData","FormData","append","file","name","beginDate","toISOString","endDate","i","lotIdentifiers","length","uploadFile","fileProgress","next","factory","ɵfac","providedIn","_InsurancesService","RentalsService","constructor","httpClient","inject","RentalsHttpClient","getRentalById","rentalId","get","getRentalsByIds","rentalIds","post","getRentalsByUsername","userName","getRentalContactPersons","isLegalPerson","getRentalAgency","getAccommodationsByRental","getContractingCompaniesByRental","getConsumptionsByRental","factory","ɵfac","providedIn","_RentalsService","SolicitationsFilterService","constructor","_filterChangedSubject","BehaviorSubject","onFilterChanged$","asObservable","reset","select","filter","currentFilterIndex","currentFilters","findIndex","cf","id","f","category","forEach","index","splice","push","selected","handleNoFilter","notify","remove","removedFilterId","getFilters","next","length","factory","ɵfac","providedIn","_SolicitationsFilterService","FamilySituationTypes","_FamilySituationTypes","record","InsuranceStatusType","_InsuranceStatusType","expired","upToDate","processing","nearlyExpired","record","iconRecord","JobContractTypes","_JobContractTypes","record","PreferenceType","NotificationType","_NotificationType","email","post","tenantSpace","sms","SolicitationsService","constructor","httpClient","inject","RentalsHttpClient","solicitationUpdateSubject$","BehaviorSubject","onSolicitationUpdate$","asObservable","nbReadSolicitationsSubject$","onNbReadSolicitationsChange$","isNewSolicitationRequestDisabledSubject$","isNewSolicitationRequestDisabled$","getNbNewSolicitationsByRental","rentalId","get","pipe","map","r","nbNewSolicitations","getAllSolicitationsByRental","tap","response","next","isNewSolicitationRequestDisabled","createSolicitation","request","post","addSolicitationStep","solicitationId","markSolicitationAsRead","put","reloadSolicitations","reloadNbReadSolicitations","determineSolicitationStatusColor","status","SolicitationStatus","canceled","Colors","Error","closed","Success","requested","unknown","Neutral400","Primary","factory","ɵfac","providedIn","_SolicitationsService","ThirdPartiesService","constructor","httpClient","inject","RentalsHttpClient","getContactDetail","rentalId","thirdPartyId","get","getPreferences","getSurveySettings","getThirdPartiesByRental","tenantNumber","getThirdPartiesByFamilyName","familyName","updateContactDetail","request","post","updatePreferences","factory","ɵfac","providedIn","_ThirdPartiesService","PaymentNoticeType","CookieService","_CookieService","document","platformId","isPlatformBrowser","name","escapedName","encodedURIComponent","result","cookies","currentCookie","cookieName","cookieValue","value","expiresOrOptions","path","domain","secure","sameSite","partitioned","optionsBody","cookieString","options","dateExpires","expiresDate","t","ɵɵinject","DOCUMENT","PLATFORM_ID","ɵɵdefineInjectable","CookiesService","constructor","httpClient","inject","RentalsHttpClient","cookieService","CookieService","disableGa","environment","googleAnalyticsCode","saveCookieAcceptance","request","post","refuseCookieGa","expirationDate","deleteAll","set","acceptCookieGa","check","delete","factory","ɵfac","providedIn","_CookiesService","UsersService","constructor","httpClient","inject","RentalsHttpClient","updateEmail","username","request","post","updatePassword","factory","ɵfac","providedIn","_UsersService","QuestionType","SolicitationFilter","constructor","init","id","Math","random","toString","slice","Object","assign","Portal","host","ComponentPortal","component","viewContainerRef","injector","componentFactoryResolver","projectableNodes","TemplatePortal","templateRef","context","DomPortal","element","ElementRef","BasePortalOutlet","portal","fn","DomPortalOutlet","BasePortalOutlet","outletElement","_componentFactoryResolver","_appRef","_defaultInjector","_document","portal","element","anchorNode","componentFactory","componentRef","Injector","viewContainer","viewRef","rootNode","index","CdkPortal","_CdkPortal","TemplatePortal","templateRef","viewContainerRef","t","ɵɵdirectiveInject","TemplateRef","ViewContainerRef","ɵɵdefineDirective","ɵɵInheritDefinitionFeature","CdkPortalOutlet","_CdkPortalOutlet","BasePortalOutlet","_componentFactoryResolver","_viewContainerRef","_document","EventEmitter","portal","element","anchorNode","viewContainerRef","componentFactory","ref","viewRef","nativeElement","t","ɵɵdirectiveInject","ComponentFactoryResolver$1","ViewContainerRef","DOCUMENT","ɵɵdefineDirective","ɵɵInheritDefinitionFeature","PortalModule","_PortalModule","t","ɵɵdefineNgModule","ɵɵdefineInjector","DataSource","isDataSource","value","ConnectableObservable","_ViewRepeaterOperation","_VIEW_REPEATER_STRATEGY","InjectionToken","_DisposeViewRepeaterStrategy","changes","viewContainerRef","itemContextFactory","itemValueResolver","itemViewChanged","record","adjustedPreviousIndex","currentIndex","view","operation","insertContext","SelectionModel","_multiple","initiallySelectedValues","_emitChanges","compareWith","Subject","value","values","changed","oldValues","newSelectedSet","flushEvent","predicate","inputValue","selection","selectedValue","UniqueSelectionDispatcher","_UniqueSelectionDispatcher","id","name","listener","registered","t","ɵɵdefineInjectable","DEFAULT_SCROLL_TIME","ScrollDispatcher","_ScrollDispatcher","_ngZone","_platform","document","Subject","scrollable","scrollableReference","auditTimeInMs","Observable","observer","subscription","auditTime","of","_","container","elementOrElementRef","ancestors","filter","target","scrollingContainers","_subscription","element","coerceElement","scrollableElement","window","fromEvent","t","ɵɵinject","NgZone","Platform","DOCUMENT","ɵɵdefineInjectable","CdkScrollable","_CdkScrollable","elementRef","scrollDispatcher","ngZone","dir","takeUntil","options","el","isRtl","getRtlScrollAxisType","RtlScrollAxisType","supportsScrollBehavior","from","LEFT","RIGHT","ɵɵdirectiveInject","ElementRef","Directionality","ɵɵdefineDirective","DEFAULT_RESIZE_TIME","ViewportRuler","_ViewportRuler","event","output","scrollPosition","width","height","documentElement","documentRect","top","left","throttleTime","CdkScrollableModule","_CdkScrollableModule","t","ɵɵdefineNgModule","ɵɵdefineInjector","ScrollingModule","_ScrollingModule","BidiModule","SingleBoxSharedResizeObserver","_box","Subject","entries","target","Observable","observer","subscription","filter","entry","shareReplay","takeUntil","SharedResizeObserver","_SharedResizeObserver","inject","NgZone","options","box","t","ɵɵdefineInjectable","AnimationMetadataType","AUTO_STYLE","trigger","name","definitions","animate","timings","styles","group","steps","options","sequence","style","tokens","state","keyframes","transition","stateChangeExpr","animateChild","options","AnimationMetadataType","query","selector","animation","options","AnimationMetadataType","NoopAnimationPlayer","duration","delay","fn","position","phaseName","methods","AnimationGroupPlayer","_players","doneCount","destroyCount","startCount","total","player","time","p","timeAtPosition","longestPlayer","longestSoFar","ɵPRE_STYLE","_c0","MatTab_ng_template_0_Template","rf","ctx","ɵɵprojection","_c1","_c2","_c3","_c4","_c5","_c6","a0","_c7","a1","MatTabBody_ng_template_2_Template","_c8","_c9","MatTabGroup_For_3_Conditional_6_ng_template_0_Template","MatTabGroup_For_3_Conditional_6_Template","ɵɵtemplate","tab_r4","ɵɵnextContext","ɵɵproperty","MatTabGroup_For_3_Conditional_7_Template","ɵɵtext","ɵɵtextInterpolate","MatTabGroup_For_3_Template","_r2","ɵɵgetCurrentView","ɵɵelementStart","ɵɵlistener","ctx_r2","ɵɵrestoreView","ɵ$index_3_r5","ctx_r5","tabHeader_r7","ɵɵreference","ɵɵresetView","$event","ɵɵelement","ɵɵelementEnd","tabNode_r8","ɵɵclassMap","ɵɵclassProp","ɵɵattribute","ɵɵadvance","ɵɵconditional","MatTabGroup_Conditional_4_Template","MatTabGroup_For_8_Template","_r9","tab_r10","ɵ$index_23_r11","MAT_TAB_CONTENT","InjectionToken","MatTabContent","_MatTabContent","template","t","ɵɵdirectiveInject","TemplateRef","ɵɵdefineDirective","ɵɵProvidersFeature","MAT_TAB_LABEL","MAT_TAB","MatTabLabel","_MatTabLabel","CdkPortal","templateRef","viewContainerRef","_closestTab","ViewContainerRef","ɵɵInheritDefinitionFeature","MAT_TAB_GROUP","MatTab","_MatTab","value","_viewContainerRef","_closestTabGroup","Subject","changes","TemplatePortal","ɵɵdefineComponent","rf","ctx","dirIndex","ɵɵcontentQuery","_t","ɵɵqueryRefresh","ɵɵloadQuery","ɵɵviewQuery","booleanAttribute","ɵɵInputTransformsFeature","ɵɵNgOnChangesFeature","ɵɵStandaloneFeature","_c0","ɵɵprojectionDef","ɵɵtemplate","MatTab_ng_template_0_Template","ACTIVE_CLASS","NO_TRANSITION_CLASS","MatInkBar","_items","item","element","correspondingItem","currentItem","domRect","InkBarItem","_InkBarItem","inject","ElementRef","newValue","previousIndicatorClientRect","currentClientRect","widthDelta","xPosition","documentNode","inkBarElement","inkBarContentElement","parentElement","MatTabLabelWrapper","_MatTabLabelWrapper","InkBarItem","elementRef","t","ɵɵdirectiveInject","ElementRef","ɵɵdefineDirective","rf","ctx","ɵɵattribute","ɵɵclassProp","booleanAttribute","ɵɵInputTransformsFeature","ɵɵInheritDefinitionFeature","passiveEventListenerOptions","normalizePassiveListenerOptions","HEADER_SCROLL_DELAY","HEADER_SCROLL_INTERVAL","MatPaginatedTabHeader","_MatPaginatedTabHeader","v","value","_elementRef","_changeDetectorRef","_viewportRuler","_dir","_ngZone","_platform","_animationMode","Subject","EventEmitter","inject","SharedResizeObserver","Injector","fromEvent","takeUntil","dirChange","of","resize","debounceTime","viewportResize","realign","FocusKeyManager","afterNextRender","merge","newFocusIndex","EMPTY","startWith","switchMap","tabItems","Observable","observer","resizeObserver","entries","item","skip","filter","e","event","hasModifierKey","textContent","index","tabIndex","containerEl","scrollDistance","translateX","direction","viewLength","scrollAmount","labelIndex","selectedLabel","offsetLeft","offsetWidth","labelBeforePos","labelAfterPos","beforeVisiblePos","afterVisiblePos","scrollWidth","containerWidth","isEnabled","lengthOfTabList","selectedItem","selectedLabelWrapper","mouseEvent","timer","maxScrollDistance","distance","position","ChangeDetectorRef","ViewportRuler","Directionality","NgZone","Platform","ANIMATION_MODULE_TYPE","numberAttribute","MatTabHeader","_MatTabHeader","changeDetectorRef","viewportRuler","dir","ngZone","platform","animationMode","MatInkBar","ɵɵdefineComponent","dirIndex","ɵɵcontentQuery","_t","ɵɵqueryRefresh","ɵɵloadQuery","ɵɵviewQuery","_c1","_c2","_c3","_c4","_c5","ɵɵStandaloneFeature","_c0","_r1","ɵɵgetCurrentView","ɵɵprojectionDef","ɵɵelementStart","ɵɵlistener","ɵɵrestoreView","ɵɵresetView","$event","ɵɵelement","ɵɵelementEnd","ɵɵprojection","ɵɵproperty","ɵɵadvance","MatRipple","CdkObserveContent","MAT_TABS_CONFIG","InjectionToken","matTabsAnimations","trigger","state","style","transition","animate","MatTabBodyPortal","_MatTabBodyPortal","CdkPortalOutlet","componentFactoryResolver","viewContainerRef","_host","_document","Subscription","isCentering","ComponentFactoryResolver$1","ViewContainerRef","forwardRef","MatTabBody","DOCUMENT","_MatTabBody","distinctUntilChanged","x","y","origin","ɵɵtemplate","MatTabBody_ng_template_2_Template","ɵɵpureFunction2","_c7","ɵɵpureFunction1","_c6","CdkScrollable","nextId","ENABLE_BACKGROUND_INPUT","MatTabGroup","_MatTabGroup","stringValue","classList","defaultConfig","QueryList","indexToSelect","isFirstRun","wrapper","tab","tabs","selectedTab","i","header","MatTabChangeEvent","tabHeight","tabHeader","targetIndex","focusOrigin","MatTab","_c8","_c9","ɵɵclassMap","ɵɵstyleProp","ɵɵProvidersFeature","MAT_TAB_GROUP","ɵɵrepeaterCreate","MatTabGroup_For_3_Template","ɵɵrepeaterTrackByIdentity","MatTabGroup_Conditional_4_Template","MatTabGroup_For_8_Template","ɵɵrepeater","ɵɵconditional","CdkMonitorFocus","MatTabsModule","_MatTabsModule","t","ɵɵdefineNgModule","ɵɵdefineInjector","MatCommonModule","_c0","_c1","_c2","_c3","_c4","_c5","_c6","_c7","MatFormField_ng_template_0_Conditional_0_Conditional_2_Template","rf","ctx","ɵɵelement","MatFormField_ng_template_0_Conditional_0_Template","ɵɵelementStart","ɵɵprojection","ɵɵtemplate","ɵɵelementEnd","ctx_r1","ɵɵnextContext","ɵɵproperty","ɵɵattribute","ɵɵadvance","ɵɵconditional","MatFormField_ng_template_0_Template","MatFormField_Conditional_4_Template","MatFormField_Conditional_6_Conditional_1_ng_template_0_Template","MatFormField_Conditional_6_Conditional_1_Template","labelTemplate_r3","ɵɵreference","MatFormField_Conditional_6_Template","MatFormField_Conditional_7_Template","MatFormField_Conditional_8_Template","MatFormField_Conditional_10_ng_template_0_Template","MatFormField_Conditional_10_Template","MatFormField_Conditional_12_Template","MatFormField_Conditional_13_Template","MatFormField_Conditional_14_Template","MatFormField_Case_16_Template","MatFormField_Case_17_Conditional_1_Template","ɵɵtext","ɵɵtextInterpolate","MatFormField_Case_17_Template","MatLabel","_MatLabel","t","ɵɵdefineDirective","nextUniqueId$2","MAT_ERROR","InjectionToken","MatError","_MatError","ariaLive","elementRef","ɵɵinjectAttribute","ɵɵdirectiveInject","ElementRef","ɵɵhostProperty","ɵɵProvidersFeature","nextUniqueId$1","MatHint","_MatHint","ɵɵclassProp","MAT_PREFIX","MatPrefix","_MatPrefix","value","MAT_SUFFIX","MatSuffix","_MatSuffix","FLOATING_LABEL_PARENT","MatFormFieldFloatingLabel","_MatFormFieldFloatingLabel","_elementRef","inject","SharedResizeObserver","NgZone","Subscription","estimateScrollWidth","element","htmlEl","clone","scrollWidth","ACTIVATE_CLASS","DEACTIVATING_CLASS","MatFormFieldLineRipple","_MatFormFieldLineRipple","ngZone","event","classList","isDeactivating","MatFormFieldNotchedOutline","_MatFormFieldNotchedOutline","_ngZone","label","labelWidth","ɵɵdefineComponent","ɵɵviewQuery","_t","ɵɵqueryRefresh","ɵɵloadQuery","ɵɵStandaloneFeature","ɵɵprojectionDef","matFormFieldAnimations","trigger","state","style","transition","animate","MatFormFieldControl","_MatFormFieldControl","MAT_FORM_FIELD","InjectionToken","MAT_FORM_FIELD_DEFAULT_OPTIONS","nextUniqueId","DEFAULT_APPEARANCE","DEFAULT_FLOAT_LABEL","DEFAULT_SUBSCRIPT_SIZING","FLOATING_LABEL_DEFAULT_DOCKED_TRANSFORM","MatFormField","_MatFormField","value","coerceBooleanProperty","oldValue","newAppearance","_elementRef","_changeDetectorRef","_unusedNgZone","_dir","_platform","_defaults","_animationMode","_unusedDocument","contentChild","MatLabel","Subject","inject","Injector","computed","control","takeUntil","p","s","merge","afterRender","prop","ids","startHint","hint","endHint","error","floatingLabel","iconPrefixContainer","textPrefixContainer","iconPrefixContainerWidth","textPrefixContainerWidth","negate","prefixWidth","labelHorizontalOffset","element","rootNode","t","ɵɵdirectiveInject","ElementRef","ChangeDetectorRef","NgZone","Directionality","Platform","ANIMATION_MODULE_TYPE","DOCUMENT","ɵɵdefineComponent","rf","ctx","dirIndex","ɵɵcontentQuerySignal","ɵɵcontentQuery","MatFormFieldControl","MAT_PREFIX","MAT_SUFFIX","MAT_ERROR","MatHint","ɵɵqueryAdvance","_t","ɵɵqueryRefresh","ɵɵloadQuery","ɵɵviewQuery","_c3","_c4","_c5","MatFormFieldFloatingLabel","MatFormFieldNotchedOutline","MatFormFieldLineRipple","ɵɵclassProp","ɵɵProvidersFeature","FLOATING_LABEL_PARENT","ɵɵStandaloneFeature","_c7","_r1","ɵɵgetCurrentView","ɵɵprojectionDef","_c6","ɵɵtemplate","MatFormField_ng_template_0_Template","ɵɵtemplateRefExtractor","ɵɵelementStart","ɵɵlistener","$event","ɵɵrestoreView","ɵɵresetView","MatFormField_Conditional_4_Template","MatFormField_Conditional_6_Template","MatFormField_Conditional_7_Template","MatFormField_Conditional_8_Template","MatFormField_Conditional_10_Template","ɵɵprojection","ɵɵelementEnd","MatFormField_Conditional_12_Template","MatFormField_Conditional_13_Template","MatFormField_Conditional_14_Template","MatFormField_Case_16_Template","MatFormField_Case_17_Template","tmp_16_0","ɵɵadvance","ɵɵconditional","NgTemplateOutlet","matFormFieldAnimations","MatFormFieldModule","_MatFormFieldModule","ɵɵdefineNgModule","ɵɵdefineInjector","MatCommonModule","CommonModule","ObserversModule","NoopValueAccessorDirective","writeValue","obj","registerOnChange","fn","registerOnTouched","standalone","features","ɵɵProvidersFeature","provide","NG_VALUE_ACCESSOR","multi","useExisting","_NoopValueAccessorDirective","EthBaseControlInputComponent","constructor","fill","ngControl","injectNgControl","placeholderOrLabel","placeholder","label","inject","NgControl","self","optional","Error","FormControlDirective","FormControlName","selectors","inputs","name","standalone","features","ɵɵProvidersFeature","provide","MAT_FORM_FIELD_DEFAULT_OPTIONS","useValue","subscriptSizing","ɵɵHostDirectivesFeature","NoopValueAccessorDirective","ɵɵStandaloneFeature","decls","vars","template","rf","ctx","dependencies","MatFormFieldModule","encapsulation","changeDetection","_EthBaseControlInputComponent","scrollBehaviorSupported","supportsScrollBehavior","BlockScrollStrategy","_viewportRuler","document","root","coerceCssPixelValue","html","body","htmlStyle","bodyStyle","previousHtmlScrollBehavior","previousBodyScrollBehavior","viewport","CloseScrollStrategy","_scrollDispatcher","_ngZone","_viewportRuler","_config","overlayRef","stream","filter","scrollable","scrollPosition","NoopScrollStrategy","isElementScrolledOutsideView","element","scrollContainers","containerBounds","outsideAbove","outsideBelow","outsideLeft","outsideRight","isElementClippedByScrolling","scrollContainerRect","clippedAbove","clippedBelow","clippedLeft","clippedRight","RepositionScrollStrategy","throttle","overlayRect","width","height","ScrollStrategyOptions","_ScrollStrategyOptions","document","config","BlockScrollStrategy","t","ɵɵinject","ScrollDispatcher","ViewportRuler","NgZone","DOCUMENT","ɵɵdefineInjectable","OverlayConfig","configKeys","key","ConnectedOverlayPositionChange","connectionPair","scrollableViewProperties","BaseOverlayDispatcher","_BaseOverlayDispatcher","document","overlayRef","index","t","ɵɵinject","DOCUMENT","ɵɵdefineInjectable","OverlayKeyboardDispatcher","_OverlayKeyboardDispatcher","_ngZone","event","overlays","i","keydownEvents","NgZone","OverlayOutsideClickDispatcher","_OverlayOutsideClickDispatcher","_platform","_getEventTarget","target","origin","containsPierceShadowDom","outsidePointerEvents","body","Platform","parent","child","supportsShadowRoot","current","OverlayContainer","_OverlayContainer","containerClass","_isTestEnvironment","oppositePlatformContainers","container","OverlayRef","_portalOutlet","_host","_pane","_config","_keyboardDispatcher","_document","_location","_outsideClickDispatcher","_animationsDisabled","_injector","Subject","Subscription","untracked","afterRender","portal","attachResult","afterNextRender","detachmentResult","isAttached","strategy","sizeConfig","__spreadValues","dir","__spreadProps","classes","direction","style","coerceCssPixelValue","enablePointer","showingClass","backdropToDetach","element","cssClasses","isAdd","coerceArray","c","subscription","takeUntil","merge","scrollStrategy","backdrop","boundingBoxClass","cssUnitPattern","FlexibleConnectedPositionStrategy","connectedTo","_viewportRuler","_overlayContainer","originRect","overlayRect","viewportRect","containerRect","flexibleFits","fallback","pos","originPoint","overlayPoint","overlayFit","bestFit","bestScore","fit","score","extendStyles","lastPosition","scrollables","positions","margin","flexibleDimensions","growAfterOpen","canPush","isLocked","offset","selector","x","startX","endX","y","overlayStartX","overlayStartY","point","rawOverlayRect","viewport","position","overlay","getRoundedBoundingClientRect","offsetX","offsetY","leftOverflow","rightOverflow","topOverflow","bottomOverflow","visibleWidth","visibleHeight","visibleArea","availableHeight","availableWidth","minHeight","getPixelValue","minWidth","verticalFit","horizontalFit","start","scrollPosition","overflowRight","overflowBottom","overflowTop","overflowLeft","pushX","pushY","scrollVisibility","compareScrollVisibility","changeEvent","ConnectedOverlayPositionChange","elements","xOrigin","yOrigin","isRtl","height","top","bottom","smallestDistanceToViewportEdge","previousHeight","isBoundedByRightViewportEdge","isBoundedByLeftViewportEdge","width","left","right","previousWidth","boundingBoxRect","styles","maxHeight","maxWidth","hasExactPosition","hasFlexibleDimensions","config","transformString","documentHeight","horizontalStyleProperty","documentWidth","originBounds","overlayBounds","scrollContainerBounds","scrollable","isElementClippedByScrolling","isElementScrolledOutsideView","length","overflows","currentValue","currentOverflow","axis","cssClass","ElementRef","destination","source","key","input","value","units","clientRect","a","b","wrapperClass","GlobalPositionStrategy","overlayRef","config","value","offset","styles","parentStyles","width","height","maxWidth","maxHeight","shouldBeFlushHorizontally","shouldBeFlushVertically","xPosition","xOffset","isRtl","marginLeft","marginRight","justifyContent","parent","OverlayPositionBuilder","_OverlayPositionBuilder","_viewportRuler","_document","_platform","_overlayContainer","origin","FlexibleConnectedPositionStrategy","t","ɵɵinject","ViewportRuler","DOCUMENT","Platform","OverlayContainer","ɵɵdefineInjectable","nextUniqueId","Overlay","_Overlay","scrollStrategies","_componentFactoryResolver","_positionBuilder","_keyboardDispatcher","_injector","_ngZone","_directionality","_location","_outsideClickDispatcher","_animationsModuleType","host","pane","portalOutlet","overlayConfig","OverlayConfig","OverlayRef","EnvironmentInjector","ApplicationRef","DomPortalOutlet","ScrollStrategyOptions","ComponentFactoryResolver$1","OverlayKeyboardDispatcher","Injector","NgZone","Directionality","Location","OverlayOutsideClickDispatcher","ANIMATION_MODULE_TYPE","defaultPositionList","CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY","InjectionToken","overlay","inject","CdkOverlayOrigin","_CdkOverlayOrigin","elementRef","ɵɵdirectiveInject","ElementRef","ɵɵdefineDirective","CdkConnectedOverlay","_CdkConnectedOverlay","offsetX","offsetY","_overlay","templateRef","viewContainerRef","scrollStrategyFactory","_dir","Subscription","EventEmitter","TemplatePortal","changes","event","hasModifierKey","target","_getEventTarget","positionStrategy","positions","currentPosition","strategy","takeWhile","position","TemplateRef","ViewContainerRef","booleanAttribute","ɵɵInputTransformsFeature","ɵɵNgOnChangesFeature","CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER_FACTORY","CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER","OverlayModule","_OverlayModule","ɵɵdefineNgModule","ɵɵdefineInjector","BidiModule","PortalModule","ScrollingModule","_c0","_c1","MatAutocomplete_ng_template_0_Template","rf","ctx","_r1","ɵɵgetCurrentView","ɵɵelementStart","ɵɵlistener","$event","ɵɵrestoreView","ctx_r1","ɵɵnextContext","ɵɵresetView","ɵɵprojection","ɵɵelementEnd","formFieldId_r3","ɵɵclassMap","ɵɵclassProp","ɵɵproperty","ɵɵattribute","panelAnimation","trigger","state","style","transition","group","animate","_uniqueAutocompleteIdCounter","MatAutocompleteSelectedEvent","source","option","MAT_AUTOCOMPLETE_DEFAULT_OPTIONS","InjectionToken","MAT_AUTOCOMPLETE_DEFAULT_OPTIONS_FACTORY","MatAutocomplete","_MatAutocomplete","value","_changeDetectorRef","_elementRef","_defaults","platform","Subscription","EventEmitter","ActiveDescendantKeyManager","index","scrollTop","event","labelId","labelExpression","t","ɵɵdirectiveInject","ChangeDetectorRef","ElementRef","Platform","ɵɵdefineComponent","dirIndex","ɵɵcontentQuery","MatOption","MAT_OPTGROUP","_t","ɵɵqueryRefresh","ɵɵloadQuery","ɵɵviewQuery","TemplateRef","booleanAttribute","ɵɵProvidersFeature","MAT_OPTION_PARENT_COMPONENT","ɵɵInputTransformsFeature","ɵɵStandaloneFeature","ɵɵprojectionDef","ɵɵtemplate","MAT_AUTOCOMPLETE_VALUE_ACCESSOR","NG_VALUE_ACCESSOR","forwardRef","MatAutocompleteTrigger","MAT_AUTOCOMPLETE_SCROLL_STRATEGY","InjectionToken","overlay","inject","Overlay","MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY","MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER","MatAutocompleteTrigger","_MatAutocompleteTrigger","_element","_overlay","_viewContainerRef","_zone","_changeDetectorRef","scrollStrategy","_dir","_formField","_document","_viewportRuler","_defaults","Subscription","BreakpointObserver","Subject","Injector","defer","options","startWith","switchMap","merge","option","event","hasModifierKey","window","changes","removeAriaReferencedId","filter","of","map","MatOptionSelectionChange","fromEvent","clickTarget","_getEventTarget","formField","customOrigin","value","fn","isDisabled","keyCode","hasModifier","prevActiveItem","isArrowKey","target","selectedOption","display","valueOnAttach","shouldAnimate","initialRender","Observable","subscriber","afterNextRender","optionChanges","tap","delay","wasOpen","take","autocomplete","toDisplay","panel","toSelect","skip","emitEvent","panelId","addAriaReferencedId","overlayRef","TemplatePortal","Breakpoints","result","OverlayConfig","strategy","positionStrategy","belowPositions","panelClass","abovePositions","positions","firstEnabledOptionIndex","index","element","labelCount","_countGroupLabelsBeforeOption","newScrollPosition","_getOptionScrollPosition","modal","t","ɵɵdirectiveInject","ElementRef","ViewContainerRef","NgZone","ChangeDetectorRef","Directionality","MAT_FORM_FIELD","DOCUMENT","ViewportRuler","MAT_AUTOCOMPLETE_DEFAULT_OPTIONS","ɵɵdefineDirective","rf","ctx","ɵɵlistener","$event","ɵɵattribute","booleanAttribute","ɵɵProvidersFeature","MAT_AUTOCOMPLETE_VALUE_ACCESSOR","ɵɵInputTransformsFeature","ɵɵNgOnChangesFeature","MatAutocompleteModule","_MatAutocompleteModule","ɵɵdefineNgModule","ɵɵdefineInjector","OverlayModule","MatOptionModule","MatCommonModule","CommonModule","CdkScrollableModule","listenerOptions","normalizePassiveListenerOptions","AutofillMonitor","_AutofillMonitor","_platform","_ngZone","elementOrRef","EMPTY","element","coerceElement","info","result","Subject","cssClass","listener","event","_info","t","ɵɵinject","Platform","NgZone","ɵɵdefineInjectable","CdkTextareaAutosize","_CdkTextareaAutosize","value","coerceNumberProperty","_elementRef","_platform","_ngZone","document","Subject","event","minHeight","maxHeight","window","fromEvent","auditTime","takeUntil","textareaClone","element","previousMargin","isFirefox","needsMarginFiller","measuringClass","scrollHeight","force","textarea","height","selectionStart","selectionEnd","t","ɵɵdirectiveInject","ElementRef","Platform","NgZone","DOCUMENT","ɵɵdefineDirective","rf","ctx","ɵɵlistener","booleanAttribute","ɵɵInputTransformsFeature","TextFieldModule","_TextFieldModule","ɵɵdefineNgModule","ɵɵdefineInjector","MAT_INPUT_VALUE_ACCESSOR","InjectionToken","MAT_INPUT_INVALID_TYPES","nextUniqueId","MatInput","_MatInput","value","coerceBooleanProperty","Validators","getSupportedInputTypes","_elementRef","_platform","ngControl","parentForm","parentFormGroup","defaultErrorStateMatcher","inputValueAccessor","_autofillMonitor","ngZone","_formField","Subject","t","event","el","element","nodeName","_ErrorStateTracker","options","isFocused","newValue","placeholder","validity","selectElement","firstOption","ids","ɵɵdirectiveInject","ElementRef","Platform","NgControl","NgForm","FormGroupDirective","ErrorStateMatcher","AutofillMonitor","NgZone","MAT_FORM_FIELD","ɵɵdefineDirective","rf","ctx","ɵɵlistener","ɵɵhostProperty","ɵɵattribute","ɵɵclassProp","ɵɵProvidersFeature","MatFormFieldControl","ɵɵNgOnChangesFeature","MatInputModule","_MatInputModule","ɵɵdefineNgModule","ɵɵdefineInjector","MatCommonModule","MatFormFieldModule","TextFieldModule","ɵɵelementStart","ɵɵtext","ɵɵelementEnd","ɵɵclassProp","ctx_r1","ngControl","invalid","touched","hasFocus","ɵɵadvance","ɵɵtextInterpolate1","label","ɵɵelement","ɵɵclassMap","iconColor","ɵɵproperty","prefixIcon","option_r3","ɵɵtextInterpolate","displayFormatOption","suffixIcon","tmp_3_0","name","undefined","ɵɵtemplate","CommonAutoCompleteInputComponent_Conditional_12_Conditional_0_Template","CommonAutoCompleteInputComponent_Conditional_12_Conditional_1_Template","ɵɵconditional","specialType","CommonAutoCompleteInputComponent","EthBaseControlInputComponent","constructor","type","cursor","optionSelected","EventEmitter","isPasswordVisible","_prefixIcon","value","_suffixIcon","errorCount","errors","Object","keys","length","onFocus","onBlur","emitOptionSelected","$event","emit","t","selectors","inputs","filteredOptions","displayFn","outputs","features","ɵɵInheritDefinitionFeature","decls","vars","consts","template","rf","ctx","CommonAutoCompleteInputComponent_Conditional_1_Template","CommonAutoCompleteInputComponent_Conditional_3_Template","ɵɵlistener","i0","ɵɵrestoreView","_r1","ɵɵresetView","ɵɵrepeaterCreate","CommonAutoCompleteInputComponent_For_8_Template","ɵɵrepeaterTrackByIdentity","CommonAutoCompleteInputComponent_Conditional_10_Template","CommonAutoCompleteInputComponent_Conditional_12_Template","fill","control","placeholderOrLabel","auto_r4","ɵɵrepeater","ɵɵpipeBind1","hasError","_CommonAutoCompleteInputComponent","MaskitoDirective","_MaskitoDirective","inject","ElementRef","NgZone","MASKITO_DEFAULT_ELEMENT_PREDICATE","accessor","DefaultValueAccessor","original","value","maskitoTransform","__async","elementPredicate","options","predicateResult","Maskito","t","ɵɵdefineDirective","ɵɵNgOnChangesFeature","CommonAutoCompleteInputModule","CommonModule","ReactiveFormsModule","MatAutocompleteModule","MatInputModule","EthIconComponent","_CommonAutoCompleteInputModule"],"x_google_ignoreList":[24,29,30,31,32,33,34,35,38,39,40,41,44]}