{"version":3,"file":"src_app_modules_main-application_application-menu_application-menu_module_ts.5a51c6ecda0efde3.js","mappings":"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","names":["MatPaginatorIntl","constructor","this","changes","Subject","itemsPerPageLabel","nextPageLabel","previousPageLabel","firstPageLabel","lastPageLabel","getRangeLabel","page","pageSize","length","startIndex","Math","max","min","ɵfac","ɵprov","i0","factory","MAT_PAGINATOR_INTL_PROVIDER","provide","deps","Optional","SkipSelf","useFactory","MAT_PAGINATOR_INTL_PROVIDER_FACTORY","parentIntl","MatPaginatorModule","ɵmod","ɵinj","imports","CommonModule","MatButtonModule","MatSelectModule","MatTooltipModule","MatCommonModule","MatSidenavModule","CdkScrollableModule","CdkStepperModule","BidiModule","MatStepperIntl","optionalLabel","completedLabel","editableLabel","MAT_STEPPER_INTL_PROVIDER","MAT_STEPPER_INTL_PROVIDER_FACTORY","MatStepperModule","ErrorStateMatcher","PortalModule","MatIconModule","MatRippleModule","MatToolbarModule","IdleTimeModule","NotificationRingItemModule","IconComponent","PipesModule","PillListModule","MatProgressSpinnerModule","NotificationRingModule","MatMenuModule","MatCheckboxModule","ReactiveFormsModule","SidePanelService","BehaviorSubject","isSidePanelExpanded","isSidePanelExpanded$","isSidePanelExpandedSubject","asObservable","toggleSidePanel","next","GENERAL","UKNOWN","BROWSERS","CHROME","FIREFOX","SAFARI","OPERA","IE","MS_EDGE","MS_EDGE_CHROMIUM","FB_MESSANGER","SAMSUNG","UCBROWSER","UNKNOWN","MOBILES_RE","HTC","NEXUS_PHONE","DELL","MOTOROLA","RegExp","LG","SONY","ASUS","NOKIA_LUMIA","MICROMAX","PALM","VERTU","PANTECH","FLY","WIKO","I_MOBILE","SIMVALLEY","WOLFGANG","ALCATEL","NINTENDO","AMOI","INQ","VITA","BLACKBERRY","FIREFOX_OS","IPHONE","iPod","ANDROID","WINDOWS_PHONE","GENERIC_PHONE","TABLETS_RE","iPad","NexusTablet","GoogleTablet","SamsungTablet","Kindle","SurfaceTablet","HPTablet","AsusTablet","BlackBerryTablet","HTCtablet","MotorolaTablet","NookTablet","AcerTablet","ToshibaTablet","LGTablet","FujitsuTablet","PrestigioTablet","LenovoTablet","DellTablet","YarvikTablet","MedionTablet","ArnovaTablet","IntensoTablet","IRUTablet","MegafonTablet","EbodaTablet","AllViewTablet","ArchosTablet","AinolTablet","NokiaLumiaTablet","SonyTablet","PhilipsTablet","CubeTablet","CobyTablet","MIDTablet","MSITablet","SMiTTablet","RockChipTablet","FlyTablet","bqTablet","HuaweiTablet","NecTablet","PantechTablet","BronchoTablet","VersusTablet","ZyncTablet","PositivoTablet","NabiTablet","KoboTablet","DanewTablet","TexetTablet","PlaystationTablet","TrekstorTablet","PyleAudioTablet","AdvanTablet","DanyTechTablet","GalapadTablet","MicromaxTablet","KarbonnTablet","AllFineTablet","PROSCANTablet","YONESTablet","ChangJiaTablet","GUTablet","PointOfViewTablet","OvermaxTablet","HCLTablet","DPSTablet","VistureTablet","CrestaTablet","MediatekTablet","ConcordeTablet","GoCleverTablet","ModecomTablet","VoninoTablet","ECSTablet","StorexTablet","VodafoneTablet","EssentielBTablet","RossMoorTablet","iMobileTablet","TolinoTablet","AudioSonicTablet","AMPETablet","SkkTablet","TecnoTablet","JXDTablet","iJoyTablet","FX2Tablet","XoroTablet","ViewsonicTablet","VerizonTablet","OdysTablet","CaptivaTablet","IconbitTablet","TeclastTablet","OndaTablet","JaytechTablet","BlaupunktTablet","DigmaTablet","EvolioTablet","LavaTablet","AocTablet","MpmanTablet","CelkonTablet","WolderTablet","MediacomTablet","MiTablet","NibiruTablet","NexoTablet","LeaderTablet","UbislateTablet","PocketBookTablet","KocasoTablet","HisenseTablet","Hudl","TelstraTablet","Honeywell","GenericTablet","DEVICES","CHROME_BOOK","PS4","MAC","CHROMECAST","APPLE_TV","GOOGLE_TV","Tesla","HONEYWELL","MI_SE_9","DESKTOP_DEVICES","OS","WINDOWS","IOS","LINUX","UNIX","CHROME_OS","OS_VERSIONS","WINDOWS_3_11","WINDOWS_95","WINDOWS_ME","WINDOWS_98","WINDOWS_CE","WINDOWS_2000","WINDOWS_XP","WINDOWS_SERVER_2003","WINDOWS_VISTA","WINDOWS_7","WINDOWS_8_1","WINDOWS_8","WINDOWS_10","WINDOWS_PHONE_7_5","WINDOWS_PHONE_8_1","WINDOWS_PHONE_10","WINDOWS_NT_4_0","MACOSX_11_0","MACOSX_16","MACOSX_15","MACOSX_14","MACOSX_13","MACOSX_12","MACOSX_11","MACOSX_10","MACOSX_9","MACOSX_8","MACOSX_7","MACOSX_6","MACOSX_5","MACOSX_4","MACOSX_3","MACOSX_2","MACOSX","iOS","ANDROID_9","toLowerCase","OS_RE","and","or","not","DEVICES_RE","OS_VERSIONS_RE_MAP","BROWSER_VERSIONS_RE_MAP","OS_VERSIONS_RE","Object","keys","reduce","obj","key","BROWSER_VERSIONS_RE","Constants","freeze","__proto__","BROWSERS_RE","ReTree","test","str","regex","Array","isArray","every","item","some","exec","res","DeviceType","Mobile","Tablet","Desktop","Unknown","OrientationType","Portrait","Landscape","DeviceDetectorService","platformId","ua","userAgent","os","browser","device","os_version","browser_version","reTree","deviceType","orientation","isPlatformBrowser","window","navigator","setDeviceInfo","mappings","const","prop","forEach","mapping","platform","maxTouchPoints","map","previousValue","currentValue","matchMedia","matches","isTablet","isMobile","isDesktop","getDeviceInfo","find","mobile","indexOf","PLATFORM_ID","SidePanelSectionItemComponent","ComponentAbstract","cdr","router","dialog","modalsService","appVersionService","helpRouterService","store","snackbarService","super","EventEmitter","select","selectUserPermissionLevel","pipe","untilDestroyed","filter","permissionLevel","ngOnInit","isActive","location","pathname","startsWith","sectionItem","urlPath","activeSection","version$","distinctUntilChanged","tap","appVersion","currentVersion","version_number","needUpgrade","subscribe","events","event","NavigationEnd","url","detectChanges","ngOnDestroy","open","menuSectionItem","permissionLevelWarning","permissionLevels","firstValueFrom","_this","permissionLevels$","checkPermissionLevel","warning","modalDialogComponent","NewTurnoverModalComponent","openNewTurnoverModal","queryParams","getGlobalPreservedParams","newTab","serializeUrl","createUrlTree","href","toString","navigate","then","menuActions","menuActionsEvent","emit","toggleSection","$event","stopPropagation","isExpanded","selectors","__decorate","UntilDestroy","SidePanelSectionComponent","AppRoutes","checkActiveSection","currentSectionBSubject","currentSection","section","label","path","RoutePath","homePaths","separator","ctx","side_panel_section_component_decorate","SidePanelComponent","DashboardsAbstract","PermissionLevelType","currentVersionTimestamp","version_timestamp","URL","searchParams","append","selectUserData","userData","combineLatest","selectSelectedDashboardMode","dashboardMode","permissionList","email","menuConfig","getMenuConfig","menuAction","action","mainPageActionEvent","includes","checkRolesSection","availableDashboardPermissionsCount","homeDashboardPermissions","permission","checkHomeSection","checksMainSection","turnoversSection","boardsSection","calendarSection","inspectionsSection","maintenanceSection","reportsSection","managementSection","sections","homeSection","push","rolesSection","newSection","checksSubsection","isHasRightToSection","checkPermissions","isUserEmailDomainAllowed","emailDomains","hideWithoutSubsection","side_panel_component_decorate","EntityType","EntityTypeListConst","value","NotificationRingItemComponent","enumerationValuePipe","icon","getNotificationIcon","title","getNotificationTitle","content","getNotificationContent","footer","getNotificationFooter","selectEvent","delete","deleteInProgress","deleteEvent","notification","category","NotificationCategory","EIcon","relatedObjectTypeId","transform","additionalData","workflowStepEnumType","WorkflowStepListConst","ticketName","WorkflowStepEnumType","entityList","unitName","unitNames","join","propertyName","userType","UserType","companyName","NotificationRingComponent","UntypedFormControl","getLastMessages","deleteInProgress$","selectDeleteNotificationInProgress","selectLastNotificationList","lastNotificationList","allNotificationList","filterList","unreadOnly","valueChanges","selectNotification","webNotification","wasRead","dispatch","markAsRead","baseNotificationBody","notificationIds","notificationId","openSource","markAllAsRead","deleteNotification","displayedNotificationList","setUnreadCount","unreadCount","getLastNotificationList","openTicketPreviewModal","ticketId","relatedObjectId","propertyId","turnoverIds","RouteData","bidId","notification_ring_component_decorate","PropertySelectorComponent","activatedRoute","DashboardViewType","snapshot","urlPortfolioId","parseInt","urlPropertyId","maxNameLength$","maxNameLength","maxWidth","targetWidth","selectorsWidthCss","selectSelectedPortfolioId","portfolioId","groupingByItems","selectJoinProperties","joined","grouping","setValue","selectPortfolios","portfolios","userPortfolios","id","name","x","e","portfolio","emitEvent","first","selectProperties","properties","userProperties","sort","options","index","sortBy","toUpperCase","startWith","route","firstChild","mergeMap","data","newDashboardViewType","isNil","dashboardViewType","portfolioItem","updateRouterParam","clearTurnoverKanbanPortfolio","selectedPortfolioId","propertyItem","p","property","selectedPropertyId","state","joinProperties","params","relativeTo","queryParamsHandling","replaceUrl","fragment","property_selector_component_decorate","BreadcrumbItemComponent","reloadRoute","navigateByUrl","skipLocationChange","TopPanelComponent","routeBreadcrumbList","getBreadcrumbList","root","setCustomBreadcrumbs","breadcrumbList","mergeBreadcrumbList","switchMap","getDashboardViewTypes","selectCustomBreadcrumbs","additionalBreadcrumbList","selectIsAuthenticated","isAuthenticated","loadAllUserProperties","loadAllUserPortfolios","home","MainPageActions","breadcrumbs","routeConfig","lastRoutePart","split","pop","replace","selectDashboardViewType","dashboardViewTypes","enumerationValue","dashboardViewTypeEnum","selectedDashboardViewType","top_panel_component_decorate","ApplicationMenuComponent","oidcSecurityService","sidePanelService","deviceService","screenWiperService","screenClasses$","wipeDuration","globalWiperVisible$","environment","showBanner","watchForSidePanel","currentVersionTimeStamp","isLoading$","selectLoadEnumerationsLoading","dashboardViewType$","mainPageActions","logoff","returnUrl","application_menu_component_decorate","routes","component","canActivate","ResidentGuard","children","redirectTo","pathMatch","AutoLoginPartialRoutesGuard","AuthGuard","HomeRedirectGuard","loadChildren","__webpack_require__","m","HomeDashboardModule","Promise","DashboardRolesModule","TurnoversModule","InspectionsModule","MaintenanceModule","CalendarModule","BoardsModule","loadComponent","TokenExchangeComponent","DashboardReportsModule","PermissionLevelGuardFactory","TicketsModule","ManagementRoute","canDeactivate","ViewCloseGuard","ManagementModule","UnitDetailsComponent","NoPermissionComponent","ApplicationMenuRoutingModule","RouterModule","ApplicationMenuModule","YesEmptyPipe","ValueIfPositivePipe","ValueIfNonZeroPipe","AbstractSecurityStorage","useClass","OidcStorageService","NotificationsModule","ModalsModule","FormsModule","MatAutocompleteModule","MatBadgeModule","MatCardModule","MatDatepickerModule","MatDialogModule","MatDividerModule","MatExpansionModule","MatFormFieldModule","MatGridListModule","MatInputModule","MatListModule","MatNativeDateModule","MatRadioModule","MatSnackBarModule","MatSortModule","MatTabsModule","MatTableModule","MatChipsModule","DirectivesModule","NewTurnoverModalModule","PortfolioStoreModule","AnimationModule","AvatarModule","SearchInputModule","RadioButtonDropdownModule","CustomColorPickerComponent","CustomControlAbstract","ngControl","formDirective","labelCss","_labelCss","labelOutsideDefaultCss","valueCss","_valueCss","_labelElement","initControlBase","control","onChanged","writeValue","BoardsCreateComponent","dialogRef","formBuilder","boardService","boardActionSubject","ButtonType","group","selectedPortfolioIds","boardType","Validators","progressType","datasource","outputAction","outputBehaviour","boardCellColor","ProgressTypeList","BoardSourceTypeList","BoardTypeList","BoardOutputTypeList","BoardOutputBehaviourList","editMode","form","patchValue","controls","last","remove","boardTypeList","flat","selected","BoardType","BoardProgressType","BoardSourceType","BoardOutputType","BoardOutputBehaviour","undefined","isSettingsOpened","setValidators","updateValueAndValidity","clearValidators","toggleAdvancedSettings","ok","disallowSourceTypeOutputTypeMap","valid","close","board","Board","assign","add","RestBoardModel","markAllAsTouched","error","MAT_DIALOG_DATA","boards_create_component_decorate","BoardColumnType","ScheduleCellStatus","BoardView","allPortfolios","boardColumnsConfig","JSON","stringify","columns","type","config","isBoardResponse","entity","parse","isBoardColumn","c","uuidv4","propertyColumnIndex","findIndex","unitColumnIndex","splice","editable","visible","frozen","initDefaultColumns","Number","extend","addColumn","workflowStep","poisition","column","ColumnSorting","sorting","primaryValue","cellValueHelper","columnId","fieldFunction","getComparedValueFunction","sortFunction","e1","e2","value1","value2","getComparableValue","phasePriority","isColumnSummable","isCostColumn","getNextStepType","turnover","turnoverData","dateMoveIn","getCurrentStep","sourceType","DashboardUserHeaderComponent","PriorityType","showBack","previousRoute","selectDashboardFilterState","assignee","setDashboardFilter","selectActiveUsers","users","myTasksLoading$","selectMyTasksLoading","myTasksTurnovers$","selectMyTasksTurnoversCount","myTasksTickets$","selectMyTasksTicketsCount","staleTurnovers$","selectStaleTurnoversCount","lateTurnovers$","selectLateTurnoversCount","goBack","evt","preventDefault","createFeatureSelector","fromDashboardFilter","InspectionsBaseComponent","inspectionService","modalService","InspectionStatus","inspection","sortHeaderId","entityDetails","unit","toLocaleLowerCase","isTurboMode","inspectionTemplate","inspectionType","areasLabel","assigneeUser","displayName","createdAt","completedAt","dueDate","share","status","openSendDialog","download","attachments","attachment","openConfirmationModal","confirmColor","confirmLabel","afterClosed","result","DialogResult","catchError","_","caught","features","InspectionStepModel","stepNumber","questionsElms","elements","elm","noteElms","fileElms","stateElms","questions","qElm","isRequired","notesCount","fileUploadCount","propertyStateCount","imagesCount","mainImage","note","files","propertyState","isCustomStep","flagsCount","InspectionAreaModel","answer","parseJSON","answerJSON","steps","pages","idx","stepsCount","completedStepsCount","step","isCompleted","InspectionItemStatus","isSkipped","inspectionTemplateAreaTitle","sharedInspectionLibrarySpaceTitle","InspectionModel","HumanizePipe","InspectionType","inspectionContents","areas","allSteps","flatMap","area","Boolean","areasCount","completedOrSkippedAreasCount","acc","curStep","summary","completedRooms","totalRooms","selectTemplateState","fromTemplate","selectTemplates","createSelector","templateState","listItems","selectTemplatesLoading","listItemsLoading","selectTemplateUpdate","entityUpdateOngoing","selectTemplateDeleteOngoing","deleteEntityOngoing","selectTemplateAreaUpdateOngoing","selectTemplateAreaUpdateStatus","templateAreaUpdateStatus","templateAreaUpdateOngoing","selectTemplateAreaDeleteOngoing","templateAreaRemoveOngoing","selectUnitTypes","unitTypes","UnitDetailsComponentForm","UnitDetailsAbstract","getPropertyAddress","physicalAddress","street1","street2","city","zip","getPropertyManager","propertyManager","firstName","lastName","inputs","UnitDetailsPicturesSectionComponentForm","UnitDetailsPicturesSectionComponent","UnitAttachmentType","imageVideoFileExtensions","initForm","getUnitAttachments","unitId","selectUnitAttachments","unitAttachments","prepareUnitAttachments","fileUploaded","unitAttachmentType","upload","setAttachment","showUnitPictures","openGalleryModal","attachmentType","attachmentsBSubject","unitPhotosBSubject","readOnly","showUnitFloorPlans","unitFloorPlanBSubject","setUnitAttachment","attachmentToEntity","externalUrl","applianceId","fileUploadId","originalFileName","description","PHOTO","FLOOR_PLAN","unitPhotos","unitFloorPlan","targetAttachmentType","displayedUnitPhotos","slice","displayedUnitFloorPlan","UnitDetailsPropertySectionComponent","descriptionGroup","get","DESCRIPTION","finish","FINISH","selectUnit","propertyAddress","addresses","propertyManagerEmail","selectFinishTypesEnumeration","finishEnumeration","finishList","getEnumerationRadioListFunction","unit_details_property_section_component_decorate","UnitDetailsDescriptionSectionComponent","rent","RENT","marketRent","MARKETRENT","advertisedRent","ADVERTISEDRENT","oldRent","OLDRENT","renewalStrategyLoading$","selectRenewalStrategyForUnitLoading","selectRenewalStrategyForUnit","restUnitTypeRentTargetModel","unit_details_description_section_component_decorate","UnitDetailsInspectionsComponent","inspectionsSource","loadAllUserTemplates","templates","templateList","initDataSource","getBeUnitId","inspections","MatTableDataSource","t","inspectionTemplateId","sortingDataAccessor","tableSortPredicate","bind","deleteInspection","inspectionModel","success","MatSort","unit_details_inspections_component_decorate","unitNonPmsService","unitService","turnoverService","MoveOutTypeListConst","selectPreviousRoute","prevRoute","sourceView","paramMap","turnoverId","bulkBidId","selectUnitLoading","isUnitDoNotAutoCreateTurnsLoading$","selectUnitDoNotAutoCreateTurnsLoading","nameControl","debounceTime","update","loadUnit","getRenewalStrategyForUnit","selectLoadEnumerations","enumerationConfig","applianceTypeList","applianceTypes","colorTypeList","applianceColors","selectTurnoverDeleteStatus","turnoverDeleteStatus","UpdateStatus","doNotAutoCreateTurns","updateBreadcrumb","initTurnover","clearUnit","getTurnover","moveOutType","changeDoNotAutoCreateTurns","updateUnitDoNotAutoCreateTurns","take","deleteTurnover","goToHome","DigitsValidator","invalid","deleteUnit","finalize","unit_details_component_decorate","allFileExtensions","MoveOutType","PROPUP_EMAIL_DOMAINS","MANAGEMENT_EMAIL_DOMAINS","concat","forExternalOnly","passQueryParams","allowedDomains","domain","userService","getCashedUserData","navigationExtras","permissionToCheck","AnyPermissionLevelGuardFactory","permissionsToCheck","inject","Router","UserService","user","noPermissionUrlTree","parseUrl","routeState","selectCoreModule","coreState","routeStateFeatureKey","JwtHelperService","HelpRouterService","getStorageItem","storageValue","localStorage","getItem","err","console","setStorageItem","setItem","json","positiveOnly","digitsPositive","digits","AvatarComponent","avatarService","userInfo","avatarTheme","getUserConfig","userId","SYSTEM_USER_ID","setFullName","fullName","AvatarService","setThemeConfigList","avatarThemeItem","configList","themeNumber","isNaN","themeAmount","getAvatarTheme","updateAvatarTheme","themePrefix","LocalStorageDataEnum","getRandomValue","minValue","maxValue","ceil","floor","random","DashboardContainerComponent","isLoading","loading","isEmptyDashboard","emptyDashboard","onBodyScroll","onScroll","position","target","scrollTop","EmptyDashboardComponent","userData$","EmptyDataComponent","PictureComponent","fileMimeType","FileMimeType","comment","picture","selectPicture","selectPictureEvent","deleteItem","deletePictureEvent","toggleEditMode","showCommentActionButtons","currentComment","save","updatePictureEvent","cancel","PillListComponent","valueAccessor","availableOptions","availableOptionsValue","tooltip","registerOnChange","fn","registerOnTouched","onTouched","setDisabledState","isDisabled","disable","enable","selectOption","option","selectable","MatChipList","bound01","n","isOnePointZero","parseFloat","isPercent","isPercentage","String","abs","clamp01","val","boundAlpha","a","convertToPercentage","pad2","rgbToHsl","r","g","b","h","s","l","d","hue2rgb","q","rgbToHsv","v","rgbToHex","allow3Char","hex","round","charAt","convertDecimalToHex","convertHexToDecimal","parseIntFromHex","names","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","goldenrod","gold","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavenderblush","lavender","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","CSS_UNIT","PERMISSIVE_MATCH3","PERMISSIVE_MATCH4","matchers","rgb","rgba","hsl","hsla","hsv","hsva","hex3","hex6","hex4","hex8","isValidCSSUnit","color","TinyColor","opts","_a","numberInputToObject","originalInput","inputToRGB","format","stringInputToObject","trim","named","match","rgbToRgb","substr","hsvToRgb","i","f","mod","hslToRgb","prototype","hasOwnProperty","call","roundA","gradientType","isValid","isDark","getBrightness","isLight","toRgb","getLuminance","RsRGB","GsRGB","BsRGB","pow","getAlpha","setAlpha","alpha","isMonochrome","toHsl","toHsv","toHsvString","toHslString","toHex","toHexString","toHex8","allow4Char","rgbaToHex","toHex8String","toHexShortString","allowShortChar","toRgbString","toPercentageRgb","fmt","toPercentageRgbString","rnd","toName","_i","entries","_b","formatSet","formattedString","toNumber","clone","lighten","amount","brighten","darken","tint","mix","shade","desaturate","saturate","greyscale","spin","hue","rgb1","rgb2","analogous","results","slices","part","ret","complement","monochromatic","modification","splitcomplement","onBackground","background","fg","bg","triad","polyad","tetrad","increment","equals","MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER","InjectionToken","Overlay","MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY","overlay","scrollStrategies","reposition","OverlayModule","MatOptionModule","MatCard","_animationMode","ANIMATION_MODULE_TYPE","ɵcmp","_c0","MAT_CHIP_REMOVE","MAT_CHIP_AVATAR","MAT_CHIP_TRAILING_ICON","MatChipBase","_elementRef","_MatChipMixinBase","mixinTabIndex","mixinColor","mixinDisableRipple","MatChip","elementRef","_ngZone","globalRippleOptions","_changeDetectorRef","_document","animationMode","tabIndex","_hasFocus","chipListSelectable","_chipListMultiple","_chipListDisabled","role","_selected","_selectable","_disabled","_removable","_onFocus","_onBlur","selectionChange","destroyed","removed","_addHostClassName","_chipRippleTarget","createElement","classList","nativeElement","appendChild","_chipRipple","RippleRenderer","setupTriggerEvents","rippleConfig","_animationsDisabled","rippleDisabled","disabled","disableRipple","coercedValue","coerceBooleanProperty","_dispatchSelectionChange","_value","textContent","removable","ariaSelected","basicChipAttrName","element","hasAttribute","tagName","chip","_removeTriggerEvents","markForCheck","deselect","selectViaInteraction","toggleSelected","isUserInput","focus","_handleClick","_handleKeydown","keyCode","DELETE","BACKSPACE","SPACE","_blur","onStable","run","source","i1","MAT_RIPPLE_GLOBAL_OPTIONS","DOCUMENT","ɵdir","dirIndex","_t","MAT_CHIPS_DEFAULT_OPTIONS","_MatChipListBase","mixinErrorState","_defaultErrorStateMatcher","_parentForm","_parentFormGroup","stateChanges","nextUniqueId$1","MatChipListChange","_dir","controlType","_lastDestroyedChipIndex","_destroyed","_uid","_tabIndex","_userTabIndex","_onTouched","_onChange","_multiple","_compareWith","o1","o2","ariaOrientation","change","valueChange","multiple","_selectionModel","_this$_selectionModel2","_explicitRole","empty","_syncChipsState","compareWith","_initializeSelection","_chipInput","required","_required","_this$ngControl","_this$ngControl$contr","hasValidator","placeholder","_placeholder","focused","_hasFocusedChip","chips","shouldLabelFloat","chipSelectionChanges","merge","chipFocusChanges","chipBlurChanges","chipRemoveChanges","ngAfterContentInit","_keyManager","FocusKeyManager","withWrap","withVerticalOrientation","withHomeAndEnd","withHorizontalOrientation","takeUntil","dir","tabOut","_allowFocusEscape","resolve","_resetChips","_updateTabIndex","_updateFocusForDestroyedChips","SelectionModel","ngDoCheck","updateErrorState","complete","_dropSubscriptions","registerInput","inputElement","setAttribute","setDescribedByIds","ids","removeAttribute","_setSelectionByValue","onContainerClick","_originatesFromChip","setFirstItemActive","_focusInput","_keydown","contains","onKeydown","newChipIndex","setActiveItem","_isValidIndex","_clearSelection","_selectValue","_sortValues","correspondingChip","skip","clear","_propagateChanges","fallbackValue","valueToEmit","setTimeout","_markAsTouched","_listenToChipsFocus","_listenToChipsSelection","_listenToChipsRemoved","_chipFocusSubscription","unsubscribe","_chipBlurSubscription","_chipSelectionSubscription","_chipRemoveSubscription","isSelected","chipIndex","toArray","updateActiveItem","currentElement","parentElement","i1$1","i2","i3","MatFormFieldControl","useExisting","ngContentSelectors","useValue","separatorKeyCodes","ENTER","TileCoordinator","columnIndex","rowIndex","rowCount","rowspan","lastRowMax","tracker","numColumns","tiles","fill","positions","tile","_trackTile","gapStartIndex","_findMatchingGap","colspan","_markTilePosition","TilePosition","tileCols","gapEndIndex","_nextRow","_findGapEndIndex","start","row","col","MAT_GRID_LIST","MatGridTile","_element","_gridList","_rowspan","_colspan","coerceNumberProperty","_setStyle","style","cssCalcAllowedValue","TileStyler","_rows","init","gutterSize","cols","direction","_gutterSize","normalizeUnits","_cols","_direction","getBaseTileSize","sizePercent","gutterFraction","getTilePosition","baseSize","offset","calc","getTileSize","span","setStyle","colIndex","percentWidthPerTile","gutterWidthFractionPerTile","setColStyles","setRowStyles","percentWidth","gutterWidth","baseTileWidth","getGutterSpan","getTileSpan","tileHeight","getComputedHeight","FixedTileStyler","fixedRowHeight","reset","list","_setListStyle","_tiles","RatioTileStyler","_parseRatio","baseTileHeight","rowHeightRatio","ratioParts","FitTileStyler","exp","MatGridList","_gutter","rowHeight","_rowHeight","newValue","_setTileStyler","_checkCols","_checkRowHeight","ngAfterContentChecked","_layoutTiles","_tileStyler","_tileCoordinator","pos","MatLineModule","MAT_SELECT_SCROLL_STRATEGY_PROVIDER","MAT_SELECT_SCROLL_STRATEGY_PROVIDER_FACTORY","tab_r4","_r13","_r0","ctx_r12","ctx_r14","_r18","ctx_r17","ctx_r19","_MAT_INK_BAR_POSITIONER","providedIn","_MAT_INK_BAR_POSITIONER_FACTORY","left","offsetLeft","width","offsetWidth","MatInkBar","_inkBarPositioner","alignToElement","show","inkBar","visibility","hide","MAT_TAB_CONTENT","MAT_TAB_LABEL","MAT_TAB","_MatTabBase","mixinDisabled","MAT_TAB_GROUP","MatTab","_viewContainerRef","_closestTabGroup","textLabel","_contentPortal","_stateChanges","origin","templateLabel","_templateLabel","_setTemplateLabelInput","ngOnChanges","TemplatePortal","_explicitContent","_implicitContent","_closestTab","TemplateRef","matTabsAnimations","translateTab","trigger","minHeight","transition","animate","MatTabBodyPortal","CdkPortalOutlet","componentFactoryResolver","viewContainerRef","_host","_centeringSub","Subscription","_leavingSub","_beforeCentering","_isCenterPosition","_position","isCentering","hasAttached","attach","_content","_afterLeavingCenter","preserveContent","detach","forwardRef","MatTabBody","_MatTabBodyBase","changeDetectorRef","_dirChangeSubscription","_translateTabComplete","_onCentering","_onCentered","animationDuration","_computePositionAnimationState","y","fromState","toState","_positionIndex","_computePositionFromOrigin","_onTranslateTabStarted","clientHeight","_getLayoutDirection","decls","styles","MAT_TABS_CONFIG","_MatTabLabelWrapperBase","MatTabLabelWrapper","getOffsetLeft","getOffsetWidth","passiveEventListenerOptions","normalizePassiveListenerOptions","passive","MatPaginatedTabHeader","_viewportRuler","_platform","_scrollDistance","_selectedIndexChanged","_showPaginationControls","_disableScrollAfter","_disableScrollBefore","_stopScrolling","_disablePagination","_selectedIndex","selectFocusedIndex","indexFocused","runOutsideAngular","fromEvent","_stopInterval","disablePagination","selectedIndex","ngAfterViewInit","_previousPaginator","_handlePaginatorPress","_nextPaginator","dirChange","of","resize","realign","updatePagination","_alignInkBarToSelectedTab","_items","_itemsResized","_getMaxScrollDistance","newFocusIndex","_setTabFocus","ResizeObserver","EMPTY","tabItems","Observable","observer","resizeObserver","observe","disconnect","contentRect","height","_tabLabelCount","_scrollToLabel","_checkScrollingControls","_scrollDistanceChanged","_updateTabScrollPosition","hasModifierKey","focusIndex","_itemSelected","_onContentChanges","_currentTextContent","_checkPaginationEnabled","activeItemIndex","tab","containerEl","_tabListContainer","scrollLeft","scrollWidth","scrollDistance","translateX","_tabList","TRIDENT","EDGE","_scrollTo","_scrollHeader","_handlePaginatorClick","labelIndex","selectedLabel","viewLength","labelBeforePos","labelAfterPos","_tabListInner","beforeVisiblePos","afterVisiblePos","isEnabled","selectedItem","selectedLabelWrapper","_inkBar","mouseEvent","button","timer","maxScrollDistance","distance","_MatTabHeaderBase","viewportRuler","ngZone","_disableRipple","MatTabHeader","_c3","_c4","_c5","_c6","_c7","i4","i5","nextId","MatTabChangeEvent","_MatTabGroupMixinBase","_MatTabGroupBase","defaultConfig","_tabs","QueryList","_indexToSelect","_lastFocusedTabIndex","_tabBodyWrapperHeight","_tabsSubscription","_tabLabelSubscription","_dynamicHeight","headerPosition","_preserveContent","selectedIndexChange","focusChange","animationDone","selectedTabChange","_groupId","dynamicHeight","contentTabIndex","_animationDuration","_contentTabIndex","backgroundColor","_backgroundColor","indexToSelect","_clampTabIndex","isFirstRun","_createChangeEvent","wrapper","_tabBodyWrapper","_subscribeToAllTabChanges","_subscribeToTabLabels","tabs","selectedTab","_allTabs","notifyOnChanges","destroy","realignInkBar","_tabHeader","focusTab","header","_focusChanged","_getTabLabelId","_getTabContentId","_setTabBodyWrapperHeight","tabHeight","offsetHeight","_removeTabBodyWrapperHeight","tabHeader","_getTabIndex","_tabFocusChanged","focusOrigin","MatTabGroup","_c8","_c9","i1$2","i7","ObserversModule","A11yModule","_r7","ctx_r6","_r10","ctx_r9","_r12","ctx_r11","ctx_r13","_r17","ctx_r16","_r19","ctx_r18","ctx_r20","ctx_r21","_r2","ctx_r1","ChromeFieldsComponent","onChange","view","input","fontSize","borderRadius","border","boxShadow","display","marginTop","toggleViews","handleChange","isValidHex","disableAlpha","ChromeComponent","ColorWrap","circle","pointer","afterValidChange","activeBackground","handleValueChange","NG_VALUE_ACCESSOR","multi","ColorChromeModule","AlphaModule","CheckboardModule","EditableInputModule","HueModule","SaturationModule","checkboardCache","CheckboardComponent","size","getCheckerboard","c1","c2","checkboard","render","document","canvas","getContext","fillStyle","fillRect","translate","toDataURL","gridStyles","CoordinatesDirective","el","coordinatesChange","mousechange","mouseListening","mousemove","isTouch","mouseup","mousedown","sub","containerWidth","clientWidth","containerHeight","getBoundingClientRect","pageXOffset","top","pageYOffset","clientX","clientY","CoordinatesModule","AlphaComponent","pointerLeft","pointerTop","gradient","simpleCheckForValidColor","checked","passed","keysToCheck","letter","oldHue","ColorMode","HEX","HSL","HSV","RGB","mode","colorChange","onChangeComplete","onSwatchHover","_onChangeCompleteSubscription","_onSwatchHoverSubscription","msg","isDevMode","Error","warn","setState","currentColor","handleSwatchHover","nextUniqueId","EditableInputComponent","uniqueId","wrapStyle","wrap","inputStyle","labelStyle","dragLabel","cursor","handleFocus","handleFocusOut","blurValue","handleKeydown","stringValue","num","arrowOffset","handleKeyup","ev","handleDrag","handleMousedown","movementX","dragMax","HueComponent","hidePointer","SaturationComponent","bright","SwatchModule","ShadeModule"],"sourceRoot":"webpack:///","sources":["./node_modules/@angular/material/fesm2020/paginator.mjs","./node_modules/@angular/material/fesm2020/sidenav.mjs","./node_modules/@angular/cdk/fesm2020/stepper.mjs","./node_modules/@angular/material/fesm2020/stepper.mjs","./node_modules/@angular/material/fesm2020/toolbar.mjs","./src/app/modules/ui-components/components/idle-time/idle-time.module.ts","./src/app/modules/ui-components/components/notification-ring/components/notification-ring-item/notification-ring-item.module.ts","./src/app/modules/ui-components/components/notification-ring/notification-ring.module.ts","./src/app/services/side-panel.service.ts","./node_modules/ngx-device-detector/fesm2020/ngx-device-detector.mjs","./src/app/modules/main-application/application-menu/side-panel-section-item/side-panel-section-item.component.html","./src/app/modules/main-application/application-menu/side-panel-section-item/side-panel-section-item.component.ts","./src/app/modules/main-application/application-menu/side-panel-section/side-panel-section.component.html","./src/app/modules/main-application/application-menu/side-panel-section/side-panel-section.component.ts","./src/app/modules/main-application/application-menu/side-panel/side-panel.component.html","./src/app/modules/main-application/application-menu/side-panel/side-panel.component.ts","./src/app/modules/shared/enums/entity-type.ts","./src/app/modules/shared/constants/entity-type-list.const.ts","./src/app/modules/ui-components/components/notification-ring/components/notification-ring-item/notification-ring-item.component.html","./src/app/modules/ui-components/components/notification-ring/components/notification-ring-item/notification-ring-item.component.ts","./src/app/modules/ui-components/components/notification-ring/notification-ring.component.html","./src/app/modules/ui-components/components/notification-ring/notification-ring.component.ts","./src/app/modules/main-application/application-menu/property-selector/property-selector.component.ts","./src/app/modules/main-application/application-menu/property-selector/property-selector.component.html","./src/app/modules/main-application/application-menu/breadcrumb-item/breadcrumb-item.component.ts","./src/app/modules/main-application/application-menu/breadcrumb-item/breadcrumb-item.component.html","./src/app/modules/main-application/application-menu/top-panel/top-panel.component.html","./src/app/modules/main-application/application-menu/top-panel/top-panel.component.ts","./src/app/modules/main-application/application-menu/application-menu.component.html","./src/app/modules/main-application/application-menu/application-menu.component.ts","./src/app/modules/main-application/application-menu/application-menu.routing.module.ts","./src/app/modules/main-application/application-menu/application-menu.module.ts","./src/app/modules/ui-components/components/custom-color-picker/custom-color-picker.component.html","./src/app/modules/ui-components/components/custom-color-picker/custom-color-picker.component.ts","./src/app/modules/main-application/boards/boards-create/boards-create.component.html","./src/app/modules/main-application/boards/boards-create/boards-create.component.ts","./src/app/modules/main-application/boards/interfaces/board.enums.ts","./src/app/modules/main-application/boards/interfaces/board.ts","./src/app/modules/main-application/dashboard-roles/components/dashboard-user-header/dashboard-user-header.component.html","./src/app/modules/main-application/dashboard-roles/components/dashboard-user-header/dashboard-user-header.component.ts","./src/app/modules/main-application/dashboard-roles/store/selectors/dashboard-filter.selectors.ts","./src/app/modules/main-application/inspections/components/inspections-base.component.ts","./src/app/modules/main-application/inspections/models/inspection-step.model.ts","./src/app/modules/main-application/inspections/models/inspection-area.model.ts","./src/app/modules/main-application/inspections/models/inspection.model.ts","./src/app/modules/main-application/inspections/models/rest-inspections-model.interface.ts","./src/app/modules/main-application/inspections/pages/template/store/template.selectors.ts","./src/app/modules/main-application/management/components/portfolio/components/unit-details/config/enums/unit-details-component-form.ts","./src/app/modules/main-application/management/components/portfolio/components/unit-details/abstract/unit-details.abstract.ts","./src/app/modules/main-application/management/components/portfolio/components/unit-details/components/unit-details-pictures-section/unit-details-pictures-section.component.html","./src/app/modules/main-application/management/components/portfolio/components/unit-details/components/unit-details-pictures-section/unit-details-pictures-section.component.ts","./src/app/modules/main-application/management/components/portfolio/components/unit-details/components/unit-details-property-section/unit-details-property-section.component.html","./src/app/modules/main-application/management/components/portfolio/components/unit-details/components/unit-details-property-section/unit-details-property-section.component.ts","./src/app/modules/main-application/management/components/portfolio/components/unit-details/components/unit-details-description-section/unit-details-description-section.component.html","./src/app/modules/main-application/management/components/portfolio/components/unit-details/components/unit-details-description-section/unit-details-description-section.component.ts","./src/app/modules/main-application/management/components/portfolio/components/unit-details/components/unit-details-inspections/unit-details-inspections.component.html","./src/app/modules/main-application/management/components/portfolio/components/unit-details/components/unit-details-inspections/unit-details-inspections.component.ts","./src/app/modules/main-application/management/components/portfolio/components/unit-details/unit-details.component.html","./src/app/modules/main-application/management/components/portfolio/components/unit-details/unit-details.component.ts","./src/app/modules/shared/constants/file-extensions.const.ts","./src/app/modules/shared/constants/move-out-type-list.const.ts","./src/app/modules/shared/constants/side-panel-config.const.ts","./src/app/modules/shared/enums/move-out-type.enum.ts","./src/app/modules/shared/functions/check-user-email-domain.ts","./src/app/modules/shared/guards/home-redirect.guard.ts","./src/app/modules/shared/guards/permission-level.guard.ts","./src/app/modules/shared/selectors/route-state.selector.ts","./src/app/modules/shared/services/help-router.service.ts","./src/app/modules/shared/utils/extensions.ts","./src/app/modules/shared/validators/digits.validator.ts","./src/app/modules/ui-components/components/avatar/avatar.component.html","./src/app/modules/ui-components/components/avatar/avatar.component.ts","./src/app/modules/ui-components/components/avatar/avatar.module.ts","./src/app/modules/ui-components/components/avatar/services/avatar.service.ts","./src/app/modules/shared/functions/get-random-value.function.ts","./src/app/modules/ui-components/components/dashboard-container/dashboard-container.component.html","./src/app/modules/ui-components/components/dashboard-container/dashboard-container.component.ts","./src/app/modules/ui-components/components/empty-dashboard/empty-dashboard.component.ts","./src/app/modules/ui-components/components/empty-dashboard/empty-dashboard.component.html","./src/app/modules/ui-components/components/empty-data/empty-data.component.ts","./src/app/modules/ui-components/components/empty-data/empty-data.component.html","./src/app/modules/ui-components/components/picture/picture.component.html","./src/app/modules/ui-components/components/picture/picture.component.ts","./src/app/modules/ui-components/components/pill-list/pill-list.component.html","./src/app/modules/ui-components/components/pill-list/pill-list.component.ts","./src/app/modules/ui-components/components/pill-list/pill-list.module.ts","./src/app/modules/ui-components/components/search-input/search-input.module.ts","./node_modules/@ctrl/tinycolor/dist/module/util.js","./node_modules/@ctrl/tinycolor/dist/module/conversion.js","./node_modules/@ctrl/tinycolor/dist/module/css-color-names.js","./node_modules/@ctrl/tinycolor/dist/module/format-input.js","./node_modules/@ctrl/tinycolor/dist/module/index.js","./node_modules/@angular/material/fesm2020/autocomplete.mjs","./node_modules/@angular/material/fesm2020/card.mjs","./node_modules/@angular/material/fesm2020/chips.mjs","./node_modules/@angular/material/fesm2020/grid-list.mjs","./node_modules/@angular/material/fesm2020/select.mjs","./node_modules/@angular/material/fesm2020/tabs.mjs","./node_modules/ngx-color/fesm2020/ngx-color-chrome.mjs","./node_modules/ngx-color/fesm2020/ngx-color.mjs"],"sourcesContent":["import * as i2 from '@angular/common';\nimport { CommonModule } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { Injectable, Optional, SkipSelf, InjectionToken, EventEmitter, Directive, Input, Output, Component, ChangeDetectionStrategy, ViewEncapsulation, Inject, NgModule } from '@angular/core';\nimport * as i6 from '@angular/material/core';\nimport { mixinDisabled, mixinInitialized, MatCommonModule } from '@angular/material/core';\nimport * as i3 from '@angular/material/button';\nimport { MatButtonModule } from '@angular/material/button';\nimport * as i5 from '@angular/material/select';\nimport { MatSelectModule } from '@angular/material/select';\nimport * as i7 from '@angular/material/tooltip';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { coerceNumberProperty, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { Subject } from 'rxjs';\nimport * as i4 from '@angular/material/form-field';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * To modify the labels and text displayed, create a new instance of MatPaginatorIntl and\n * include it in a custom provider\n */\nclass MatPaginatorIntl {\n constructor() {\n /**\n * Stream to emit from when labels are changed. Use this to notify components when the labels have\n * changed after initialization.\n */\n this.changes = new Subject();\n /** A label for the page size selector. */\n this.itemsPerPageLabel = 'Items per page:';\n /** A label for the button that increments the current page. */\n this.nextPageLabel = 'Next page';\n /** A label for the button that decrements the current page. */\n this.previousPageLabel = 'Previous page';\n /** A label for the button that moves to the first page. */\n this.firstPageLabel = 'First page';\n /** A label for the button that moves to the last page. */\n this.lastPageLabel = 'Last page';\n /** A label for the range of items within the current page and the length of the whole list. */\n this.getRangeLabel = (page, pageSize, length) => {\n if (length == 0 || pageSize == 0) {\n return `0 of ${length}`;\n }\n length = Math.max(length, 0);\n const startIndex = page * pageSize;\n // If the start index exceeds the list length, do not try and fix the end index to the end.\n const endIndex = startIndex < length ? Math.min(startIndex + pageSize, length) : startIndex + pageSize;\n return `${startIndex + 1} – ${endIndex} of ${length}`;\n };\n }\n}\nMatPaginatorIntl.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatPaginatorIntl, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\nMatPaginatorIntl.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatPaginatorIntl, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatPaginatorIntl, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }] });\n/** @docs-private */\nfunction MAT_PAGINATOR_INTL_PROVIDER_FACTORY(parentIntl) {\n return parentIntl || new MatPaginatorIntl();\n}\n/** @docs-private */\nconst MAT_PAGINATOR_INTL_PROVIDER = {\n // If there is already an MatPaginatorIntl available, use that. Otherwise, provide a new one.\n provide: MatPaginatorIntl,\n deps: [[new Optional(), new SkipSelf(), MatPaginatorIntl]],\n useFactory: MAT_PAGINATOR_INTL_PROVIDER_FACTORY,\n};\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** The default page size if there is no page size and there are no provided page size options. */\nconst DEFAULT_PAGE_SIZE = 50;\n/**\n * Change event object that is emitted when the user selects a\n * different page size or navigates to another page.\n */\nclass PageEvent {\n}\n/** Injection token that can be used to provide the default options for the paginator module. */\nconst MAT_PAGINATOR_DEFAULT_OPTIONS = new InjectionToken('MAT_PAGINATOR_DEFAULT_OPTIONS');\n// Boilerplate for applying mixins to _MatPaginatorBase.\n/** @docs-private */\nconst _MatPaginatorMixinBase = mixinDisabled(mixinInitialized(class {\n}));\n/**\n * Base class with all of the `MatPaginator` functionality.\n * @docs-private\n */\nclass _MatPaginatorBase extends _MatPaginatorMixinBase {\n constructor(_intl, _changeDetectorRef, defaults) {\n super();\n this._intl = _intl;\n this._changeDetectorRef = _changeDetectorRef;\n this._pageIndex = 0;\n this._length = 0;\n this._pageSizeOptions = [];\n this._hidePageSize = false;\n this._showFirstLastButtons = false;\n /** Used to configure the underlying `MatSelect` inside the paginator. */\n this.selectConfig = {};\n /** Event emitted when the paginator changes the page size or page index. */\n this.page = new EventEmitter();\n this._intlChanges = _intl.changes.subscribe(() => this._changeDetectorRef.markForCheck());\n if (defaults) {\n const { pageSize, pageSizeOptions, hidePageSize, showFirstLastButtons } = defaults;\n if (pageSize != null) {\n this._pageSize = pageSize;\n }\n if (pageSizeOptions != null) {\n this._pageSizeOptions = pageSizeOptions;\n }\n if (hidePageSize != null) {\n this._hidePageSize = hidePageSize;\n }\n if (showFirstLastButtons != null) {\n this._showFirstLastButtons = showFirstLastButtons;\n }\n }\n }\n /** The zero-based page index of the displayed list of items. Defaulted to 0. */\n get pageIndex() {\n return this._pageIndex;\n }\n set pageIndex(value) {\n this._pageIndex = Math.max(coerceNumberProperty(value), 0);\n this._changeDetectorRef.markForCheck();\n }\n /** The length of the total number of items that are being paginated. Defaulted to 0. */\n get length() {\n return this._length;\n }\n set length(value) {\n this._length = coerceNumberProperty(value);\n this._changeDetectorRef.markForCheck();\n }\n /** Number of items to display on a page. By default set to 50. */\n get pageSize() {\n return this._pageSize;\n }\n set pageSize(value) {\n this._pageSize = Math.max(coerceNumberProperty(value), 0);\n this._updateDisplayedPageSizeOptions();\n }\n /** The set of provided page size options to display to the user. */\n get pageSizeOptions() {\n return this._pageSizeOptions;\n }\n set pageSizeOptions(value) {\n this._pageSizeOptions = (value || []).map(p => coerceNumberProperty(p));\n this._updateDisplayedPageSizeOptions();\n }\n /** Whether to hide the page size selection UI from the user. */\n get hidePageSize() {\n return this._hidePageSize;\n }\n set hidePageSize(value) {\n this._hidePageSize = coerceBooleanProperty(value);\n }\n /** Whether to show the first/last buttons UI to the user. */\n get showFirstLastButtons() {\n return this._showFirstLastButtons;\n }\n set showFirstLastButtons(value) {\n this._showFirstLastButtons = coerceBooleanProperty(value);\n }\n ngOnInit() {\n this._initialized = true;\n this._updateDisplayedPageSizeOptions();\n this._markInitialized();\n }\n ngOnDestroy() {\n this._intlChanges.unsubscribe();\n }\n /** Advances to the next page if it exists. */\n nextPage() {\n if (!this.hasNextPage()) {\n return;\n }\n const previousPageIndex = this.pageIndex;\n this.pageIndex = this.pageIndex + 1;\n this._emitPageEvent(previousPageIndex);\n }\n /** Move back to the previous page if it exists. */\n previousPage() {\n if (!this.hasPreviousPage()) {\n return;\n }\n const previousPageIndex = this.pageIndex;\n this.pageIndex = this.pageIndex - 1;\n this._emitPageEvent(previousPageIndex);\n }\n /** Move to the first page if not already there. */\n firstPage() {\n // hasPreviousPage being false implies at the start\n if (!this.hasPreviousPage()) {\n return;\n }\n const previousPageIndex = this.pageIndex;\n this.pageIndex = 0;\n this._emitPageEvent(previousPageIndex);\n }\n /** Move to the last page if not already there. */\n lastPage() {\n // hasNextPage being false implies at the end\n if (!this.hasNextPage()) {\n return;\n }\n const previousPageIndex = this.pageIndex;\n this.pageIndex = this.getNumberOfPages() - 1;\n this._emitPageEvent(previousPageIndex);\n }\n /** Whether there is a previous page. */\n hasPreviousPage() {\n return this.pageIndex >= 1 && this.pageSize != 0;\n }\n /** Whether there is a next page. */\n hasNextPage() {\n const maxPageIndex = this.getNumberOfPages() - 1;\n return this.pageIndex < maxPageIndex && this.pageSize != 0;\n }\n /** Calculate the number of pages */\n getNumberOfPages() {\n if (!this.pageSize) {\n return 0;\n }\n return Math.ceil(this.length / this.pageSize);\n }\n /**\n * Changes the page size so that the first item displayed on the page will still be\n * displayed using the new page size.\n *\n * For example, if the page size is 10 and on the second page (items indexed 10-19) then\n * switching so that the page size is 5 will set the third page as the current page so\n * that the 10th item will still be displayed.\n */\n _changePageSize(pageSize) {\n // Current page needs to be updated to reflect the new page size. Navigate to the page\n // containing the previous page's first item.\n const startIndex = this.pageIndex * this.pageSize;\n const previousPageIndex = this.pageIndex;\n this.pageIndex = Math.floor(startIndex / pageSize) || 0;\n this.pageSize = pageSize;\n this._emitPageEvent(previousPageIndex);\n }\n /** Checks whether the buttons for going forwards should be disabled. */\n _nextButtonsDisabled() {\n return this.disabled || !this.hasNextPage();\n }\n /** Checks whether the buttons for going backwards should be disabled. */\n _previousButtonsDisabled() {\n return this.disabled || !this.hasPreviousPage();\n }\n /**\n * Updates the list of page size options to display to the user. Includes making sure that\n * the page size is an option and that the list is sorted.\n */\n _updateDisplayedPageSizeOptions() {\n if (!this._initialized) {\n return;\n }\n // If no page size is provided, use the first page size option or the default page size.\n if (!this.pageSize) {\n this._pageSize =\n this.pageSizeOptions.length != 0 ? this.pageSizeOptions[0] : DEFAULT_PAGE_SIZE;\n }\n this._displayedPageSizeOptions = this.pageSizeOptions.slice();\n if (this._displayedPageSizeOptions.indexOf(this.pageSize) === -1) {\n this._displayedPageSizeOptions.push(this.pageSize);\n }\n // Sort the numbers using a number-specific sort function.\n this._displayedPageSizeOptions.sort((a, b) => a - b);\n this._changeDetectorRef.markForCheck();\n }\n /** Emits an event notifying that a change of the paginator's properties has been triggered. */\n _emitPageEvent(previousPageIndex) {\n this.page.emit({\n previousPageIndex,\n pageIndex: this.pageIndex,\n pageSize: this.pageSize,\n length: this.length,\n });\n }\n}\n_MatPaginatorBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: _MatPaginatorBase, deps: \"invalid\", target: i0.ɵɵFactoryTarget.Directive });\n_MatPaginatorBase.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: _MatPaginatorBase, inputs: { color: \"color\", pageIndex: \"pageIndex\", length: \"length\", pageSize: \"pageSize\", pageSizeOptions: \"pageSizeOptions\", hidePageSize: \"hidePageSize\", showFirstLastButtons: \"showFirstLastButtons\", selectConfig: \"selectConfig\" }, outputs: { page: \"page\" }, usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: _MatPaginatorBase, decorators: [{\n type: Directive\n }], ctorParameters: function () { return [{ type: MatPaginatorIntl }, { type: i0.ChangeDetectorRef }, { type: undefined }]; }, propDecorators: { color: [{\n type: Input\n }], pageIndex: [{\n type: Input\n }], length: [{\n type: Input\n }], pageSize: [{\n type: Input\n }], pageSizeOptions: [{\n type: Input\n }], hidePageSize: [{\n type: Input\n }], showFirstLastButtons: [{\n type: Input\n }], selectConfig: [{\n type: Input\n }], page: [{\n type: Output\n }] } });\n/**\n * Component to provide navigation between paged information. Displays the size of the current\n * page, user-selectable options to change that size, what items are being shown, and\n * navigational button to go to the previous or next page.\n */\nclass MatPaginator extends _MatPaginatorBase {\n constructor(intl, changeDetectorRef, defaults) {\n super(intl, changeDetectorRef, defaults);\n if (defaults && defaults.formFieldAppearance != null) {\n this._formFieldAppearance = defaults.formFieldAppearance;\n }\n }\n}\nMatPaginator.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatPaginator, deps: [{ token: MatPaginatorIntl }, { token: i0.ChangeDetectorRef }, { token: MAT_PAGINATOR_DEFAULT_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Component });\nMatPaginator.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatPaginator, selector: \"mat-paginator\", inputs: { disabled: \"disabled\" }, host: { attributes: { \"role\": \"group\" }, classAttribute: \"mat-paginator\" }, exportAs: [\"matPaginator\"], usesInheritance: true, ngImport: i0, template: \"
\\n
\\n
\\n
\\n {{_intl.itemsPerPageLabel}}\\n
\\n\\n 1\\\"\\n [appearance]=\\\"_formFieldAppearance!\\\"\\n [color]=\\\"color\\\"\\n class=\\\"mat-paginator-page-size-select\\\">\\n \\n \\n {{pageSizeOption}}\\n \\n \\n \\n\\n {{pageSize}}
\\n
\\n\\n
\\n
\\n {{_intl.getRangeLabel(pageIndex, pageSize, length)}}\\n
\\n\\n \\n \\n \\n \\n
\\n
\\n\\n\", styles: [\".mat-paginator{display:block}.mat-paginator-outer-container{display:flex}.mat-paginator-container{display:flex;align-items:center;justify-content:flex-end;padding:0 8px;flex-wrap:wrap-reverse;width:100%}.mat-paginator-page-size{display:flex;align-items:baseline;margin-right:8px}[dir=rtl] .mat-paginator-page-size{margin-right:0;margin-left:8px}.mat-paginator-page-size-label{margin:0 4px}.mat-paginator-page-size-select{margin:6px 4px 0 4px;width:56px}.mat-paginator-page-size-select.mat-form-field-appearance-outline{width:64px}.mat-paginator-page-size-select.mat-form-field-appearance-fill{width:64px}.mat-paginator-range-label{margin:0 32px 0 24px}.mat-paginator-range-actions{display:flex;align-items:center}.mat-paginator-icon{display:inline-block;width:28px;fill:currentColor}[dir=rtl] .mat-paginator-icon{transform:rotate(180deg)}.cdk-high-contrast-active .mat-paginator-icon{fill:CanvasText}\"], dependencies: [{ kind: \"directive\", type: i2.NgForOf, selector: \"[ngFor][ngForOf]\", inputs: [\"ngForOf\", \"ngForTrackBy\", \"ngForTemplate\"] }, { kind: \"directive\", type: i2.NgIf, selector: \"[ngIf]\", inputs: [\"ngIf\", \"ngIfThen\", \"ngIfElse\"] }, { kind: \"component\", type: i3.MatButton, selector: \"button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]\", inputs: [\"disabled\", \"disableRipple\", \"color\"], exportAs: [\"matButton\"] }, { kind: \"component\", type: i4.MatFormField, selector: \"mat-form-field\", inputs: [\"color\", \"appearance\", \"hideRequiredMarker\", \"hintLabel\", \"floatLabel\"], exportAs: [\"matFormField\"] }, { kind: \"component\", type: i5.MatSelect, selector: \"mat-select\", inputs: [\"disabled\", \"disableRipple\", \"tabIndex\"], exportAs: [\"matSelect\"] }, { kind: \"component\", type: i6.MatOption, selector: \"mat-option\", exportAs: [\"matOption\"] }, { kind: \"directive\", type: i7.MatTooltip, selector: \"[matTooltip]\", exportAs: [\"matTooltip\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatPaginator, decorators: [{\n type: Component,\n args: [{ selector: 'mat-paginator', exportAs: 'matPaginator', inputs: ['disabled'], host: {\n 'class': 'mat-paginator',\n 'role': 'group',\n }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: \"
\\n
\\n
\\n
\\n {{_intl.itemsPerPageLabel}}\\n
\\n\\n 1\\\"\\n [appearance]=\\\"_formFieldAppearance!\\\"\\n [color]=\\\"color\\\"\\n class=\\\"mat-paginator-page-size-select\\\">\\n \\n \\n {{pageSizeOption}}\\n \\n \\n \\n\\n {{pageSize}}
\\n
\\n\\n
\\n
\\n {{_intl.getRangeLabel(pageIndex, pageSize, length)}}\\n
\\n\\n \\n \\n \\n \\n
\\n
\\n\\n\", styles: [\".mat-paginator{display:block}.mat-paginator-outer-container{display:flex}.mat-paginator-container{display:flex;align-items:center;justify-content:flex-end;padding:0 8px;flex-wrap:wrap-reverse;width:100%}.mat-paginator-page-size{display:flex;align-items:baseline;margin-right:8px}[dir=rtl] .mat-paginator-page-size{margin-right:0;margin-left:8px}.mat-paginator-page-size-label{margin:0 4px}.mat-paginator-page-size-select{margin:6px 4px 0 4px;width:56px}.mat-paginator-page-size-select.mat-form-field-appearance-outline{width:64px}.mat-paginator-page-size-select.mat-form-field-appearance-fill{width:64px}.mat-paginator-range-label{margin:0 32px 0 24px}.mat-paginator-range-actions{display:flex;align-items:center}.mat-paginator-icon{display:inline-block;width:28px;fill:currentColor}[dir=rtl] .mat-paginator-icon{transform:rotate(180deg)}.cdk-high-contrast-active .mat-paginator-icon{fill:CanvasText}\"] }]\n }], ctorParameters: function () { return [{ type: MatPaginatorIntl }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_PAGINATOR_DEFAULT_OPTIONS]\n }] }]; } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatPaginatorModule {\n}\nMatPaginatorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatPaginatorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nMatPaginatorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.2.0\", ngImport: i0, type: MatPaginatorModule, declarations: [MatPaginator], imports: [CommonModule, MatButtonModule, MatSelectModule, MatTooltipModule, MatCommonModule], exports: [MatPaginator] });\nMatPaginatorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatPaginatorModule, providers: [MAT_PAGINATOR_INTL_PROVIDER], imports: [CommonModule, MatButtonModule, MatSelectModule, MatTooltipModule, MatCommonModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatPaginatorModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [CommonModule, MatButtonModule, MatSelectModule, MatTooltipModule, MatCommonModule],\n exports: [MatPaginator],\n declarations: [MatPaginator],\n providers: [MAT_PAGINATOR_INTL_PROVIDER],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MAT_PAGINATOR_DEFAULT_OPTIONS, MAT_PAGINATOR_INTL_PROVIDER, MAT_PAGINATOR_INTL_PROVIDER_FACTORY, MatPaginator, MatPaginatorIntl, MatPaginatorModule, PageEvent, _MatPaginatorBase };\n","import * as i1 from '@angular/cdk/scrolling';\nimport { CdkScrollable, CdkScrollableModule } from '@angular/cdk/scrolling';\nimport * as i5 from '@angular/common';\nimport { DOCUMENT, CommonModule } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { InjectionToken, forwardRef, Component, ChangeDetectionStrategy, ViewEncapsulation, Inject, EventEmitter, Optional, Input, Output, ViewChild, QueryList, ContentChildren, ContentChild, NgModule } from '@angular/core';\nimport { MatCommonModule } from '@angular/material/core';\nimport * as i2 from '@angular/cdk/a11y';\nimport * as i4 from '@angular/cdk/bidi';\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes';\nimport * as i3 from '@angular/cdk/platform';\nimport { Subject, fromEvent, merge } from 'rxjs';\nimport { filter, map, mapTo, takeUntil, distinctUntilChanged, take, startWith, debounceTime } from 'rxjs/operators';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Animations used by the Material drawers.\n * @docs-private\n */\nconst matDrawerAnimations = {\n /** Animation that slides a drawer in and out. */\n transformDrawer: trigger('transform', [\n // We remove the `transform` here completely, rather than setting it to zero, because:\n // 1. Having a transform can cause elements with ripples or an animated\n // transform to shift around in Chrome with an RTL layout (see #10023).\n // 2. 3d transforms causes text to appear blurry on IE and Edge.\n state('open, open-instant', style({\n 'transform': 'none',\n 'visibility': 'visible',\n })),\n state('void', style({\n // Avoids the shadow showing up when closed in SSR.\n 'box-shadow': 'none',\n 'visibility': 'hidden',\n })),\n transition('void => open-instant', animate('0ms')),\n transition('void <=> open, open-instant => void', animate('400ms cubic-bezier(0.25, 0.8, 0.25, 1)')),\n ]),\n};\n\n/**\n * Throws an exception when two MatDrawer are matching the same position.\n * @docs-private\n */\nfunction throwMatDuplicatedDrawerError(position) {\n throw Error(`A drawer was already declared for 'position=\"${position}\"'`);\n}\n/** Configures whether drawers should use auto sizing by default. */\nconst MAT_DRAWER_DEFAULT_AUTOSIZE = new InjectionToken('MAT_DRAWER_DEFAULT_AUTOSIZE', {\n providedIn: 'root',\n factory: MAT_DRAWER_DEFAULT_AUTOSIZE_FACTORY,\n});\n/**\n * Used to provide a drawer container to a drawer while avoiding circular references.\n * @docs-private\n */\nconst MAT_DRAWER_CONTAINER = new InjectionToken('MAT_DRAWER_CONTAINER');\n/** @docs-private */\nfunction MAT_DRAWER_DEFAULT_AUTOSIZE_FACTORY() {\n return false;\n}\nclass MatDrawerContent extends CdkScrollable {\n constructor(_changeDetectorRef, _container, elementRef, scrollDispatcher, ngZone) {\n super(elementRef, scrollDispatcher, ngZone);\n this._changeDetectorRef = _changeDetectorRef;\n this._container = _container;\n }\n ngAfterContentInit() {\n this._container._contentMarginChanges.subscribe(() => {\n this._changeDetectorRef.markForCheck();\n });\n }\n}\nMatDrawerContent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatDrawerContent, deps: [{ token: i0.ChangeDetectorRef }, { token: forwardRef(() => MatDrawerContainer) }, { token: i0.ElementRef }, { token: i1.ScrollDispatcher }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });\nMatDrawerContent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatDrawerContent, selector: \"mat-drawer-content\", host: { properties: { \"style.margin-left.px\": \"_container._contentMargins.left\", \"style.margin-right.px\": \"_container._contentMargins.right\" }, classAttribute: \"mat-drawer-content\" }, providers: [\n {\n provide: CdkScrollable,\n useExisting: MatDrawerContent,\n },\n ], usesInheritance: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatDrawerContent, decorators: [{\n type: Component,\n args: [{\n selector: 'mat-drawer-content',\n template: '',\n host: {\n 'class': 'mat-drawer-content',\n '[style.margin-left.px]': '_container._contentMargins.left',\n '[style.margin-right.px]': '_container._contentMargins.right',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n {\n provide: CdkScrollable,\n useExisting: MatDrawerContent,\n },\n ],\n }]\n }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: MatDrawerContainer, decorators: [{\n type: Inject,\n args: [forwardRef(() => MatDrawerContainer)]\n }] }, { type: i0.ElementRef }, { type: i1.ScrollDispatcher }, { type: i0.NgZone }]; } });\n/**\n * This component corresponds to a drawer that can be opened on the drawer container.\n */\nclass MatDrawer {\n constructor(_elementRef, _focusTrapFactory, _focusMonitor, _platform, _ngZone, _interactivityChecker, _doc, _container) {\n this._elementRef = _elementRef;\n this._focusTrapFactory = _focusTrapFactory;\n this._focusMonitor = _focusMonitor;\n this._platform = _platform;\n this._ngZone = _ngZone;\n this._interactivityChecker = _interactivityChecker;\n this._doc = _doc;\n this._container = _container;\n this._elementFocusedBeforeDrawerWasOpened = null;\n /** Whether the drawer is initialized. Used for disabling the initial animation. */\n this._enableAnimations = false;\n this._position = 'start';\n this._mode = 'over';\n this._disableClose = false;\n this._opened = false;\n /** Emits whenever the drawer has started animating. */\n this._animationStarted = new Subject();\n /** Emits whenever the drawer is done animating. */\n this._animationEnd = new Subject();\n /** Current state of the sidenav animation. */\n this._animationState = 'void';\n /** Event emitted when the drawer open state is changed. */\n this.openedChange = \n // Note this has to be async in order to avoid some issues with two-bindings (see #8872).\n new EventEmitter(/* isAsync */ true);\n /** Event emitted when the drawer has been opened. */\n this._openedStream = this.openedChange.pipe(filter(o => o), map(() => { }));\n /** Event emitted when the drawer has started opening. */\n this.openedStart = this._animationStarted.pipe(filter(e => e.fromState !== e.toState && e.toState.indexOf('open') === 0), mapTo(undefined));\n /** Event emitted when the drawer has been closed. */\n this._closedStream = this.openedChange.pipe(filter(o => !o), map(() => { }));\n /** Event emitted when the drawer has started closing. */\n this.closedStart = this._animationStarted.pipe(filter(e => e.fromState !== e.toState && e.toState === 'void'), mapTo(undefined));\n /** Emits when the component is destroyed. */\n this._destroyed = new Subject();\n /** Event emitted when the drawer's position changes. */\n // tslint:disable-next-line:no-output-on-prefix\n this.onPositionChanged = new EventEmitter();\n /**\n * An observable that emits when the drawer mode changes. This is used by the drawer container to\n * to know when to when the mode changes so it can adapt the margins on the content.\n */\n this._modeChanged = new Subject();\n this.openedChange.subscribe((opened) => {\n if (opened) {\n if (this._doc) {\n this._elementFocusedBeforeDrawerWasOpened = this._doc.activeElement;\n }\n this._takeFocus();\n }\n else if (this._isFocusWithinDrawer()) {\n this._restoreFocus(this._openedVia || 'program');\n }\n });\n /**\n * Listen to `keydown` events outside the zone so that change detection is not run every\n * time a key is pressed. Instead we re-enter the zone only if the `ESC` key is pressed\n * and we don't have close disabled.\n */\n this._ngZone.runOutsideAngular(() => {\n fromEvent(this._elementRef.nativeElement, 'keydown')\n .pipe(filter(event => {\n return event.keyCode === ESCAPE && !this.disableClose && !hasModifierKey(event);\n }), takeUntil(this._destroyed))\n .subscribe(event => this._ngZone.run(() => {\n this.close();\n event.stopPropagation();\n event.preventDefault();\n }));\n });\n // We need a Subject with distinctUntilChanged, because the `done` event\n // fires twice on some browsers. See https://github.com/angular/angular/issues/24084\n this._animationEnd\n .pipe(distinctUntilChanged((x, y) => {\n return x.fromState === y.fromState && x.toState === y.toState;\n }))\n .subscribe((event) => {\n const { fromState, toState } = event;\n if ((toState.indexOf('open') === 0 && fromState === 'void') ||\n (toState === 'void' && fromState.indexOf('open') === 0)) {\n this.openedChange.emit(this._opened);\n }\n });\n }\n /** The side that the drawer is attached to. */\n get position() {\n return this._position;\n }\n set position(value) {\n // Make sure we have a valid value.\n value = value === 'end' ? 'end' : 'start';\n if (value !== this._position) {\n // Static inputs in Ivy are set before the element is in the DOM.\n if (this._isAttached) {\n this._updatePositionInParent(value);\n }\n this._position = value;\n this.onPositionChanged.emit();\n }\n }\n /** Mode of the drawer; one of 'over', 'push' or 'side'. */\n get mode() {\n return this._mode;\n }\n set mode(value) {\n this._mode = value;\n this._updateFocusTrapState();\n this._modeChanged.next();\n }\n /** Whether the drawer can be closed with the escape key or by clicking on the backdrop. */\n get disableClose() {\n return this._disableClose;\n }\n set disableClose(value) {\n this._disableClose = coerceBooleanProperty(value);\n }\n /**\n * Whether the drawer should focus the first focusable element automatically when opened.\n * Defaults to false in when `mode` is set to `side`, otherwise defaults to `true`. If explicitly\n * enabled, focus will be moved into the sidenav in `side` mode as well.\n * @breaking-change 14.0.0 Remove boolean option from autoFocus. Use string or AutoFocusTarget\n * instead.\n */\n get autoFocus() {\n const value = this._autoFocus;\n // Note that usually we don't allow autoFocus to be set to `first-tabbable` in `side` mode,\n // because we don't know how the sidenav is being used, but in some cases it still makes\n // sense to do it. The consumer can explicitly set `autoFocus`.\n if (value == null) {\n if (this.mode === 'side') {\n return 'dialog';\n }\n else {\n return 'first-tabbable';\n }\n }\n return value;\n }\n set autoFocus(value) {\n if (value === 'true' || value === 'false' || value == null) {\n value = coerceBooleanProperty(value);\n }\n this._autoFocus = value;\n }\n /**\n * Whether the drawer is opened. We overload this because we trigger an event when it\n * starts or end.\n */\n get opened() {\n return this._opened;\n }\n set opened(value) {\n this.toggle(coerceBooleanProperty(value));\n }\n /**\n * Focuses the provided element. If the element is not focusable, it will add a tabIndex\n * attribute to forcefully focus it. The attribute is removed after focus is moved.\n * @param element The element to focus.\n */\n _forceFocus(element, options) {\n if (!this._interactivityChecker.isFocusable(element)) {\n element.tabIndex = -1;\n // The tabindex attribute should be removed to avoid navigating to that element again\n this._ngZone.runOutsideAngular(() => {\n const callback = () => {\n element.removeEventListener('blur', callback);\n element.removeEventListener('mousedown', callback);\n element.removeAttribute('tabindex');\n };\n element.addEventListener('blur', callback);\n element.addEventListener('mousedown', callback);\n });\n }\n element.focus(options);\n }\n /**\n * Focuses the first element that matches the given selector within the focus trap.\n * @param selector The CSS selector for the element to set focus to.\n */\n _focusByCssSelector(selector, options) {\n let elementToFocus = this._elementRef.nativeElement.querySelector(selector);\n if (elementToFocus) {\n this._forceFocus(elementToFocus, options);\n }\n }\n /**\n * Moves focus into the drawer. Note that this works even if\n * the focus trap is disabled in `side` mode.\n */\n _takeFocus() {\n if (!this._focusTrap) {\n return;\n }\n const element = this._elementRef.nativeElement;\n // When autoFocus is not on the sidenav, if the element cannot be focused or does\n // not exist, focus the sidenav itself so the keyboard navigation still works.\n // We need to check that `focus` is a function due to Universal.\n switch (this.autoFocus) {\n case false:\n case 'dialog':\n return;\n case true:\n case 'first-tabbable':\n this._focusTrap.focusInitialElementWhenReady().then(hasMovedFocus => {\n if (!hasMovedFocus && typeof this._elementRef.nativeElement.focus === 'function') {\n element.focus();\n }\n });\n break;\n case 'first-heading':\n this._focusByCssSelector('h1, h2, h3, h4, h5, h6, [role=\"heading\"]');\n break;\n default:\n this._focusByCssSelector(this.autoFocus);\n break;\n }\n }\n /**\n * Restores focus to the element that was originally focused when the drawer opened.\n * If no element was focused at that time, the focus will be restored to the drawer.\n */\n _restoreFocus(focusOrigin) {\n if (this.autoFocus === 'dialog') {\n return;\n }\n if (this._elementFocusedBeforeDrawerWasOpened) {\n this._focusMonitor.focusVia(this._elementFocusedBeforeDrawerWasOpened, focusOrigin);\n }\n else {\n this._elementRef.nativeElement.blur();\n }\n this._elementFocusedBeforeDrawerWasOpened = null;\n }\n /** Whether focus is currently within the drawer. */\n _isFocusWithinDrawer() {\n const activeEl = this._doc.activeElement;\n return !!activeEl && this._elementRef.nativeElement.contains(activeEl);\n }\n ngAfterViewInit() {\n this._isAttached = true;\n this._focusTrap = this._focusTrapFactory.create(this._elementRef.nativeElement);\n this._updateFocusTrapState();\n // Only update the DOM position when the sidenav is positioned at\n // the end since we project the sidenav before the content by default.\n if (this._position === 'end') {\n this._updatePositionInParent('end');\n }\n }\n ngAfterContentChecked() {\n // Enable the animations after the lifecycle hooks have run, in order to avoid animating\n // drawers that are open by default. When we're on the server, we shouldn't enable the\n // animations, because we don't want the drawer to animate the first time the user sees\n // the page.\n if (this._platform.isBrowser) {\n this._enableAnimations = true;\n }\n }\n ngOnDestroy() {\n if (this._focusTrap) {\n this._focusTrap.destroy();\n }\n this._anchor?.remove();\n this._anchor = null;\n this._animationStarted.complete();\n this._animationEnd.complete();\n this._modeChanged.complete();\n this._destroyed.next();\n this._destroyed.complete();\n }\n /**\n * Open the drawer.\n * @param openedVia Whether the drawer was opened by a key press, mouse click or programmatically.\n * Used for focus management after the sidenav is closed.\n */\n open(openedVia) {\n return this.toggle(true, openedVia);\n }\n /** Close the drawer. */\n close() {\n return this.toggle(false);\n }\n /** Closes the drawer with context that the backdrop was clicked. */\n _closeViaBackdropClick() {\n // If the drawer is closed upon a backdrop click, we always want to restore focus. We\n // don't need to check whether focus is currently in the drawer, as clicking on the\n // backdrop causes blurs the active element.\n return this._setOpen(/* isOpen */ false, /* restoreFocus */ true, 'mouse');\n }\n /**\n * Toggle this drawer.\n * @param isOpen Whether the drawer should be open.\n * @param openedVia Whether the drawer was opened by a key press, mouse click or programmatically.\n * Used for focus management after the sidenav is closed.\n */\n toggle(isOpen = !this.opened, openedVia) {\n // If the focus is currently inside the drawer content and we are closing the drawer,\n // restore the focus to the initially focused element (when the drawer opened).\n if (isOpen && openedVia) {\n this._openedVia = openedVia;\n }\n const result = this._setOpen(isOpen, \n /* restoreFocus */ !isOpen && this._isFocusWithinDrawer(), this._openedVia || 'program');\n if (!isOpen) {\n this._openedVia = null;\n }\n return result;\n }\n /**\n * Toggles the opened state of the drawer.\n * @param isOpen Whether the drawer should open or close.\n * @param restoreFocus Whether focus should be restored on close.\n * @param focusOrigin Origin to use when restoring focus.\n */\n _setOpen(isOpen, restoreFocus, focusOrigin) {\n this._opened = isOpen;\n if (isOpen) {\n this._animationState = this._enableAnimations ? 'open' : 'open-instant';\n }\n else {\n this._animationState = 'void';\n if (restoreFocus) {\n this._restoreFocus(focusOrigin);\n }\n }\n this._updateFocusTrapState();\n return new Promise(resolve => {\n this.openedChange.pipe(take(1)).subscribe(open => resolve(open ? 'open' : 'close'));\n });\n }\n _getWidth() {\n return this._elementRef.nativeElement ? this._elementRef.nativeElement.offsetWidth || 0 : 0;\n }\n /** Updates the enabled state of the focus trap. */\n _updateFocusTrapState() {\n if (this._focusTrap) {\n // The focus trap is only enabled when the drawer is open in any mode other than side.\n this._focusTrap.enabled = this.opened && this.mode !== 'side';\n }\n }\n /**\n * Updates the position of the drawer in the DOM. We need to move the element around ourselves\n * when it's in the `end` position so that it comes after the content and the visual order\n * matches the tab order. We also need to be able to move it back to `start` if the sidenav\n * started off as `end` and was changed to `start`.\n */\n _updatePositionInParent(newPosition) {\n const element = this._elementRef.nativeElement;\n const parent = element.parentNode;\n if (newPosition === 'end') {\n if (!this._anchor) {\n this._anchor = this._doc.createComment('mat-drawer-anchor');\n parent.insertBefore(this._anchor, element);\n }\n parent.appendChild(element);\n }\n else if (this._anchor) {\n this._anchor.parentNode.insertBefore(element, this._anchor);\n }\n }\n}\nMatDrawer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatDrawer, deps: [{ token: i0.ElementRef }, { token: i2.FocusTrapFactory }, { token: i2.FocusMonitor }, { token: i3.Platform }, { token: i0.NgZone }, { token: i2.InteractivityChecker }, { token: DOCUMENT, optional: true }, { token: MAT_DRAWER_CONTAINER, optional: true }], target: i0.ɵɵFactoryTarget.Component });\nMatDrawer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatDrawer, selector: \"mat-drawer\", inputs: { position: \"position\", mode: \"mode\", disableClose: \"disableClose\", autoFocus: \"autoFocus\", opened: \"opened\" }, outputs: { openedChange: \"openedChange\", _openedStream: \"opened\", openedStart: \"openedStart\", _closedStream: \"closed\", closedStart: \"closedStart\", onPositionChanged: \"positionChanged\" }, host: { attributes: { \"tabIndex\": \"-1\" }, listeners: { \"@transform.start\": \"_animationStarted.next($event)\", \"@transform.done\": \"_animationEnd.next($event)\" }, properties: { \"attr.align\": \"null\", \"class.mat-drawer-end\": \"position === \\\"end\\\"\", \"class.mat-drawer-over\": \"mode === \\\"over\\\"\", \"class.mat-drawer-push\": \"mode === \\\"push\\\"\", \"class.mat-drawer-side\": \"mode === \\\"side\\\"\", \"class.mat-drawer-opened\": \"opened\", \"@transform\": \"_animationState\" }, classAttribute: \"mat-drawer\" }, viewQueries: [{ propertyName: \"_content\", first: true, predicate: [\"content\"], descendants: true }], exportAs: [\"matDrawer\"], ngImport: i0, template: \"
\\r\\n \\r\\n
\\r\\n\", dependencies: [{ kind: \"directive\", type: i1.CdkScrollable, selector: \"[cdk-scrollable], [cdkScrollable]\" }], animations: [matDrawerAnimations.transformDrawer], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatDrawer, decorators: [{\n type: Component,\n args: [{ selector: 'mat-drawer', exportAs: 'matDrawer', animations: [matDrawerAnimations.transformDrawer], host: {\n 'class': 'mat-drawer',\n // must prevent the browser from aligning text based on value\n '[attr.align]': 'null',\n '[class.mat-drawer-end]': 'position === \"end\"',\n '[class.mat-drawer-over]': 'mode === \"over\"',\n '[class.mat-drawer-push]': 'mode === \"push\"',\n '[class.mat-drawer-side]': 'mode === \"side\"',\n '[class.mat-drawer-opened]': 'opened',\n 'tabIndex': '-1',\n '[@transform]': '_animationState',\n '(@transform.start)': '_animationStarted.next($event)',\n '(@transform.done)': '_animationEnd.next($event)',\n }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: \"
\\r\\n \\r\\n
\\r\\n\" }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i2.FocusTrapFactory }, { type: i2.FocusMonitor }, { type: i3.Platform }, { type: i0.NgZone }, { type: i2.InteractivityChecker }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: MatDrawerContainer, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_DRAWER_CONTAINER]\n }] }]; }, propDecorators: { position: [{\n type: Input\n }], mode: [{\n type: Input\n }], disableClose: [{\n type: Input\n }], autoFocus: [{\n type: Input\n }], opened: [{\n type: Input\n }], openedChange: [{\n type: Output\n }], _openedStream: [{\n type: Output,\n args: ['opened']\n }], openedStart: [{\n type: Output\n }], _closedStream: [{\n type: Output,\n args: ['closed']\n }], closedStart: [{\n type: Output\n }], onPositionChanged: [{\n type: Output,\n args: ['positionChanged']\n }], _content: [{\n type: ViewChild,\n args: ['content']\n }] } });\n/**\n * `` component.\n *\n * This is the parent component to one or two ``s that validates the state internally\n * and coordinates the backdrop and content styling.\n */\nclass MatDrawerContainer {\n constructor(_dir, _element, _ngZone, _changeDetectorRef, viewportRuler, defaultAutosize = false, _animationMode) {\n this._dir = _dir;\n this._element = _element;\n this._ngZone = _ngZone;\n this._changeDetectorRef = _changeDetectorRef;\n this._animationMode = _animationMode;\n /** Drawers that belong to this container. */\n this._drawers = new QueryList();\n /** Event emitted when the drawer backdrop is clicked. */\n this.backdropClick = new EventEmitter();\n /** Emits when the component is destroyed. */\n this._destroyed = new Subject();\n /** Emits on every ngDoCheck. Used for debouncing reflows. */\n this._doCheckSubject = new Subject();\n /**\n * Margins to be applied to the content. These are used to push / shrink the drawer content when a\n * drawer is open. We use margin rather than transform even for push mode because transform breaks\n * fixed position elements inside of the transformed element.\n */\n this._contentMargins = { left: null, right: null };\n this._contentMarginChanges = new Subject();\n // If a `Dir` directive exists up the tree, listen direction changes\n // and update the left/right properties to point to the proper start/end.\n if (_dir) {\n _dir.change.pipe(takeUntil(this._destroyed)).subscribe(() => {\n this._validateDrawers();\n this.updateContentMargins();\n });\n }\n // Since the minimum width of the sidenav depends on the viewport width,\n // we need to recompute the margins if the viewport changes.\n viewportRuler\n .change()\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => this.updateContentMargins());\n this._autosize = defaultAutosize;\n }\n /** The drawer child with the `start` position. */\n get start() {\n return this._start;\n }\n /** The drawer child with the `end` position. */\n get end() {\n return this._end;\n }\n /**\n * Whether to automatically resize the container whenever\n * the size of any of its drawers changes.\n *\n * **Use at your own risk!** Enabling this option can cause layout thrashing by measuring\n * the drawers on every change detection cycle. Can be configured globally via the\n * `MAT_DRAWER_DEFAULT_AUTOSIZE` token.\n */\n get autosize() {\n return this._autosize;\n }\n set autosize(value) {\n this._autosize = coerceBooleanProperty(value);\n }\n /**\n * Whether the drawer container should have a backdrop while one of the sidenavs is open.\n * If explicitly set to `true`, the backdrop will be enabled for drawers in the `side`\n * mode as well.\n */\n get hasBackdrop() {\n if (this._backdropOverride == null) {\n return !this._start || this._start.mode !== 'side' || !this._end || this._end.mode !== 'side';\n }\n return this._backdropOverride;\n }\n set hasBackdrop(value) {\n this._backdropOverride = value == null ? null : coerceBooleanProperty(value);\n }\n /** Reference to the CdkScrollable instance that wraps the scrollable content. */\n get scrollable() {\n return this._userContent || this._content;\n }\n ngAfterContentInit() {\n this._allDrawers.changes\n .pipe(startWith(this._allDrawers), takeUntil(this._destroyed))\n .subscribe((drawer) => {\n this._drawers.reset(drawer.filter(item => !item._container || item._container === this));\n this._drawers.notifyOnChanges();\n });\n this._drawers.changes.pipe(startWith(null)).subscribe(() => {\n this._validateDrawers();\n this._drawers.forEach((drawer) => {\n this._watchDrawerToggle(drawer);\n this._watchDrawerPosition(drawer);\n this._watchDrawerMode(drawer);\n });\n if (!this._drawers.length ||\n this._isDrawerOpen(this._start) ||\n this._isDrawerOpen(this._end)) {\n this.updateContentMargins();\n }\n this._changeDetectorRef.markForCheck();\n });\n // Avoid hitting the NgZone through the debounce timeout.\n this._ngZone.runOutsideAngular(() => {\n this._doCheckSubject\n .pipe(debounceTime(10), // Arbitrary debounce time, less than a frame at 60fps\n takeUntil(this._destroyed))\n .subscribe(() => this.updateContentMargins());\n });\n }\n ngOnDestroy() {\n this._contentMarginChanges.complete();\n this._doCheckSubject.complete();\n this._drawers.destroy();\n this._destroyed.next();\n this._destroyed.complete();\n }\n /** Calls `open` of both start and end drawers */\n open() {\n this._drawers.forEach(drawer => drawer.open());\n }\n /** Calls `close` of both start and end drawers */\n close() {\n this._drawers.forEach(drawer => drawer.close());\n }\n /**\n * Recalculates and updates the inline styles for the content. Note that this should be used\n * sparingly, because it causes a reflow.\n */\n updateContentMargins() {\n // 1. For drawers in `over` mode, they don't affect the content.\n // 2. For drawers in `side` mode they should shrink the content. We do this by adding to the\n // left margin (for left drawer) or right margin (for right the drawer).\n // 3. For drawers in `push` mode the should shift the content without resizing it. We do this by\n // adding to the left or right margin and simultaneously subtracting the same amount of\n // margin from the other side.\n let left = 0;\n let right = 0;\n if (this._left && this._left.opened) {\n if (this._left.mode == 'side') {\n left += this._left._getWidth();\n }\n else if (this._left.mode == 'push') {\n const width = this._left._getWidth();\n left += width;\n right -= width;\n }\n }\n if (this._right && this._right.opened) {\n if (this._right.mode == 'side') {\n right += this._right._getWidth();\n }\n else if (this._right.mode == 'push') {\n const width = this._right._getWidth();\n right += width;\n left -= width;\n }\n }\n // If either `right` or `left` is zero, don't set a style to the element. This\n // allows users to specify a custom size via CSS class in SSR scenarios where the\n // measured widths will always be zero. Note that we reset to `null` here, rather\n // than below, in order to ensure that the types in the `if` below are consistent.\n left = left || null;\n right = right || null;\n if (left !== this._contentMargins.left || right !== this._contentMargins.right) {\n this._contentMargins = { left, right };\n // Pull back into the NgZone since in some cases we could be outside. We need to be careful\n // to do it only when something changed, otherwise we can end up hitting the zone too often.\n this._ngZone.run(() => this._contentMarginChanges.next(this._contentMargins));\n }\n }\n ngDoCheck() {\n // If users opted into autosizing, do a check every change detection cycle.\n if (this._autosize && this._isPushed()) {\n // Run outside the NgZone, otherwise the debouncer will throw us into an infinite loop.\n this._ngZone.runOutsideAngular(() => this._doCheckSubject.next());\n }\n }\n /**\n * Subscribes to drawer events in order to set a class on the main container element when the\n * drawer is open and the backdrop is visible. This ensures any overflow on the container element\n * is properly hidden.\n */\n _watchDrawerToggle(drawer) {\n drawer._animationStarted\n .pipe(filter((event) => event.fromState !== event.toState), takeUntil(this._drawers.changes))\n .subscribe((event) => {\n // Set the transition class on the container so that the animations occur. This should not\n // be set initially because animations should only be triggered via a change in state.\n if (event.toState !== 'open-instant' && this._animationMode !== 'NoopAnimations') {\n this._element.nativeElement.classList.add('mat-drawer-transition');\n }\n this.updateContentMargins();\n this._changeDetectorRef.markForCheck();\n });\n if (drawer.mode !== 'side') {\n drawer.openedChange\n .pipe(takeUntil(this._drawers.changes))\n .subscribe(() => this._setContainerClass(drawer.opened));\n }\n }\n /**\n * Subscribes to drawer onPositionChanged event in order to\n * re-validate drawers when the position changes.\n */\n _watchDrawerPosition(drawer) {\n if (!drawer) {\n return;\n }\n // NOTE: We need to wait for the microtask queue to be empty before validating,\n // since both drawers may be swapping positions at the same time.\n drawer.onPositionChanged.pipe(takeUntil(this._drawers.changes)).subscribe(() => {\n this._ngZone.onMicrotaskEmpty.pipe(take(1)).subscribe(() => {\n this._validateDrawers();\n });\n });\n }\n /** Subscribes to changes in drawer mode so we can run change detection. */\n _watchDrawerMode(drawer) {\n if (drawer) {\n drawer._modeChanged\n .pipe(takeUntil(merge(this._drawers.changes, this._destroyed)))\n .subscribe(() => {\n this.updateContentMargins();\n this._changeDetectorRef.markForCheck();\n });\n }\n }\n /** Toggles the 'mat-drawer-opened' class on the main 'mat-drawer-container' element. */\n _setContainerClass(isAdd) {\n const classList = this._element.nativeElement.classList;\n const className = 'mat-drawer-container-has-open';\n if (isAdd) {\n classList.add(className);\n }\n else {\n classList.remove(className);\n }\n }\n /** Validate the state of the drawer children components. */\n _validateDrawers() {\n this._start = this._end = null;\n // Ensure that we have at most one start and one end drawer.\n this._drawers.forEach(drawer => {\n if (drawer.position == 'end') {\n if (this._end != null && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throwMatDuplicatedDrawerError('end');\n }\n this._end = drawer;\n }\n else {\n if (this._start != null && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throwMatDuplicatedDrawerError('start');\n }\n this._start = drawer;\n }\n });\n this._right = this._left = null;\n // Detect if we're LTR or RTL.\n if (this._dir && this._dir.value === 'rtl') {\n this._left = this._end;\n this._right = this._start;\n }\n else {\n this._left = this._start;\n this._right = this._end;\n }\n }\n /** Whether the container is being pushed to the side by one of the drawers. */\n _isPushed() {\n return ((this._isDrawerOpen(this._start) && this._start.mode != 'over') ||\n (this._isDrawerOpen(this._end) && this._end.mode != 'over'));\n }\n _onBackdropClicked() {\n this.backdropClick.emit();\n this._closeModalDrawersViaBackdrop();\n }\n _closeModalDrawersViaBackdrop() {\n // Close all open drawers where closing is not disabled and the mode is not `side`.\n [this._start, this._end]\n .filter(drawer => drawer && !drawer.disableClose && this._canHaveBackdrop(drawer))\n .forEach(drawer => drawer._closeViaBackdropClick());\n }\n _isShowingBackdrop() {\n return ((this._isDrawerOpen(this._start) && this._canHaveBackdrop(this._start)) ||\n (this._isDrawerOpen(this._end) && this._canHaveBackdrop(this._end)));\n }\n _canHaveBackdrop(drawer) {\n return drawer.mode !== 'side' || !!this._backdropOverride;\n }\n _isDrawerOpen(drawer) {\n return drawer != null && drawer.opened;\n }\n}\nMatDrawerContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatDrawerContainer, deps: [{ token: i4.Directionality, optional: true }, { token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i1.ViewportRuler }, { token: MAT_DRAWER_DEFAULT_AUTOSIZE }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Component });\nMatDrawerContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatDrawerContainer, selector: \"mat-drawer-container\", inputs: { autosize: \"autosize\", hasBackdrop: \"hasBackdrop\" }, outputs: { backdropClick: \"backdropClick\" }, host: { properties: { \"class.mat-drawer-container-explicit-backdrop\": \"_backdropOverride\" }, classAttribute: \"mat-drawer-container\" }, providers: [\n {\n provide: MAT_DRAWER_CONTAINER,\n useExisting: MatDrawerContainer,\n },\n ], queries: [{ propertyName: \"_content\", first: true, predicate: MatDrawerContent, descendants: true }, { propertyName: \"_allDrawers\", predicate: MatDrawer, descendants: true }], viewQueries: [{ propertyName: \"_userContent\", first: true, predicate: MatDrawerContent, descendants: true }], exportAs: [\"matDrawerContainer\"], ngImport: i0, template: \"
\\n\\n\\n\\n\\n\\n\\n \\n\\n\", styles: [\".mat-drawer-container{position:relative;z-index:1;box-sizing:border-box;-webkit-overflow-scrolling:touch;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}.cdk-high-contrast-active .mat-drawer-backdrop{opacity:.5}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}.cdk-high-contrast-active .mat-drawer,.cdk-high-contrast-active [dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}.cdk-high-contrast-active [dir=rtl] .mat-drawer,.cdk-high-contrast-active .mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer{transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer[style*=\\\"visibility: hidden\\\"]{display:none}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto;-webkit-overflow-scrolling:touch}.mat-sidenav-fixed{position:fixed}\"], dependencies: [{ kind: \"directive\", type: i5.NgIf, selector: \"[ngIf]\", inputs: [\"ngIf\", \"ngIfThen\", \"ngIfElse\"] }, { kind: \"component\", type: MatDrawerContent, selector: \"mat-drawer-content\" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatDrawerContainer, decorators: [{\n type: Component,\n args: [{ selector: 'mat-drawer-container', exportAs: 'matDrawerContainer', host: {\n 'class': 'mat-drawer-container',\n '[class.mat-drawer-container-explicit-backdrop]': '_backdropOverride',\n }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [\n {\n provide: MAT_DRAWER_CONTAINER,\n useExisting: MatDrawerContainer,\n },\n ], template: \"
\\n\\n\\n\\n\\n\\n\\n \\n\\n\", styles: [\".mat-drawer-container{position:relative;z-index:1;box-sizing:border-box;-webkit-overflow-scrolling:touch;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}.cdk-high-contrast-active .mat-drawer-backdrop{opacity:.5}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}.cdk-high-contrast-active .mat-drawer,.cdk-high-contrast-active [dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}.cdk-high-contrast-active [dir=rtl] .mat-drawer,.cdk-high-contrast-active .mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer{transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer[style*=\\\"visibility: hidden\\\"]{display:none}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto;-webkit-overflow-scrolling:touch}.mat-sidenav-fixed{position:fixed}\"] }]\n }], ctorParameters: function () { return [{ type: i4.Directionality, decorators: [{\n type: Optional\n }] }, { type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i1.ViewportRuler }, { type: undefined, decorators: [{\n type: Inject,\n args: [MAT_DRAWER_DEFAULT_AUTOSIZE]\n }] }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }]; }, propDecorators: { _allDrawers: [{\n type: ContentChildren,\n args: [MatDrawer, {\n // We need to use `descendants: true`, because Ivy will no longer match\n // indirect descendants if it's left as false.\n descendants: true,\n }]\n }], _content: [{\n type: ContentChild,\n args: [MatDrawerContent]\n }], _userContent: [{\n type: ViewChild,\n args: [MatDrawerContent]\n }], autosize: [{\n type: Input\n }], hasBackdrop: [{\n type: Input\n }], backdropClick: [{\n type: Output\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatSidenavContent extends MatDrawerContent {\n constructor(changeDetectorRef, container, elementRef, scrollDispatcher, ngZone) {\n super(changeDetectorRef, container, elementRef, scrollDispatcher, ngZone);\n }\n}\nMatSidenavContent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatSidenavContent, deps: [{ token: i0.ChangeDetectorRef }, { token: forwardRef(() => MatSidenavContainer) }, { token: i0.ElementRef }, { token: i1.ScrollDispatcher }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });\nMatSidenavContent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatSidenavContent, selector: \"mat-sidenav-content\", host: { properties: { \"style.margin-left.px\": \"_container._contentMargins.left\", \"style.margin-right.px\": \"_container._contentMargins.right\" }, classAttribute: \"mat-drawer-content mat-sidenav-content\" }, providers: [\n {\n provide: CdkScrollable,\n useExisting: MatSidenavContent,\n },\n ], usesInheritance: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatSidenavContent, decorators: [{\n type: Component,\n args: [{\n selector: 'mat-sidenav-content',\n template: '',\n host: {\n 'class': 'mat-drawer-content mat-sidenav-content',\n '[style.margin-left.px]': '_container._contentMargins.left',\n '[style.margin-right.px]': '_container._contentMargins.right',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n {\n provide: CdkScrollable,\n useExisting: MatSidenavContent,\n },\n ],\n }]\n }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: MatSidenavContainer, decorators: [{\n type: Inject,\n args: [forwardRef(() => MatSidenavContainer)]\n }] }, { type: i0.ElementRef }, { type: i1.ScrollDispatcher }, { type: i0.NgZone }]; } });\nclass MatSidenav extends MatDrawer {\n constructor() {\n super(...arguments);\n this._fixedInViewport = false;\n this._fixedTopGap = 0;\n this._fixedBottomGap = 0;\n }\n /** Whether the sidenav is fixed in the viewport. */\n get fixedInViewport() {\n return this._fixedInViewport;\n }\n set fixedInViewport(value) {\n this._fixedInViewport = coerceBooleanProperty(value);\n }\n /**\n * The gap between the top of the sidenav and the top of the viewport when the sidenav is in fixed\n * mode.\n */\n get fixedTopGap() {\n return this._fixedTopGap;\n }\n set fixedTopGap(value) {\n this._fixedTopGap = coerceNumberProperty(value);\n }\n /**\n * The gap between the bottom of the sidenav and the bottom of the viewport when the sidenav is in\n * fixed mode.\n */\n get fixedBottomGap() {\n return this._fixedBottomGap;\n }\n set fixedBottomGap(value) {\n this._fixedBottomGap = coerceNumberProperty(value);\n }\n}\nMatSidenav.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatSidenav, deps: null, target: i0.ɵɵFactoryTarget.Component });\nMatSidenav.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatSidenav, selector: \"mat-sidenav\", inputs: { fixedInViewport: \"fixedInViewport\", fixedTopGap: \"fixedTopGap\", fixedBottomGap: \"fixedBottomGap\" }, host: { attributes: { \"tabIndex\": \"-1\" }, properties: { \"attr.align\": \"null\", \"class.mat-drawer-end\": \"position === \\\"end\\\"\", \"class.mat-drawer-over\": \"mode === \\\"over\\\"\", \"class.mat-drawer-push\": \"mode === \\\"push\\\"\", \"class.mat-drawer-side\": \"mode === \\\"side\\\"\", \"class.mat-drawer-opened\": \"opened\", \"class.mat-sidenav-fixed\": \"fixedInViewport\", \"style.top.px\": \"fixedInViewport ? fixedTopGap : null\", \"style.bottom.px\": \"fixedInViewport ? fixedBottomGap : null\" }, classAttribute: \"mat-drawer mat-sidenav\" }, exportAs: [\"matSidenav\"], usesInheritance: true, ngImport: i0, template: \"
\\r\\n \\r\\n
\\r\\n\", dependencies: [{ kind: \"directive\", type: i1.CdkScrollable, selector: \"[cdk-scrollable], [cdkScrollable]\" }], animations: [matDrawerAnimations.transformDrawer], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatSidenav, decorators: [{\n type: Component,\n args: [{ selector: 'mat-sidenav', exportAs: 'matSidenav', animations: [matDrawerAnimations.transformDrawer], host: {\n 'class': 'mat-drawer mat-sidenav',\n 'tabIndex': '-1',\n // must prevent the browser from aligning text based on value\n '[attr.align]': 'null',\n '[class.mat-drawer-end]': 'position === \"end\"',\n '[class.mat-drawer-over]': 'mode === \"over\"',\n '[class.mat-drawer-push]': 'mode === \"push\"',\n '[class.mat-drawer-side]': 'mode === \"side\"',\n '[class.mat-drawer-opened]': 'opened',\n '[class.mat-sidenav-fixed]': 'fixedInViewport',\n '[style.top.px]': 'fixedInViewport ? fixedTopGap : null',\n '[style.bottom.px]': 'fixedInViewport ? fixedBottomGap : null',\n }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: \"
\\r\\n \\r\\n
\\r\\n\" }]\n }], propDecorators: { fixedInViewport: [{\n type: Input\n }], fixedTopGap: [{\n type: Input\n }], fixedBottomGap: [{\n type: Input\n }] } });\nclass MatSidenavContainer extends MatDrawerContainer {\n}\nMatSidenavContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatSidenavContainer, deps: null, target: i0.ɵɵFactoryTarget.Component });\nMatSidenavContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatSidenavContainer, selector: \"mat-sidenav-container\", host: { properties: { \"class.mat-drawer-container-explicit-backdrop\": \"_backdropOverride\" }, classAttribute: \"mat-drawer-container mat-sidenav-container\" }, providers: [\n {\n provide: MAT_DRAWER_CONTAINER,\n useExisting: MatSidenavContainer,\n },\n ], queries: [{ propertyName: \"_content\", first: true, predicate: MatSidenavContent, descendants: true }, { propertyName: \"_allDrawers\", predicate: MatSidenav, descendants: true }], exportAs: [\"matSidenavContainer\"], usesInheritance: true, ngImport: i0, template: \"
\\n\\n\\n\\n\\n\\n\\n \\n\\n\", styles: [\".mat-drawer-container{position:relative;z-index:1;box-sizing:border-box;-webkit-overflow-scrolling:touch;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}.cdk-high-contrast-active .mat-drawer-backdrop{opacity:.5}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}.cdk-high-contrast-active .mat-drawer,.cdk-high-contrast-active [dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}.cdk-high-contrast-active [dir=rtl] .mat-drawer,.cdk-high-contrast-active .mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer{transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer[style*=\\\"visibility: hidden\\\"]{display:none}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto;-webkit-overflow-scrolling:touch}.mat-sidenav-fixed{position:fixed}\"], dependencies: [{ kind: \"directive\", type: i5.NgIf, selector: \"[ngIf]\", inputs: [\"ngIf\", \"ngIfThen\", \"ngIfElse\"] }, { kind: \"component\", type: MatSidenavContent, selector: \"mat-sidenav-content\" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatSidenavContainer, decorators: [{\n type: Component,\n args: [{ selector: 'mat-sidenav-container', exportAs: 'matSidenavContainer', host: {\n 'class': 'mat-drawer-container mat-sidenav-container',\n '[class.mat-drawer-container-explicit-backdrop]': '_backdropOverride',\n }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [\n {\n provide: MAT_DRAWER_CONTAINER,\n useExisting: MatSidenavContainer,\n },\n ], template: \"
\\n\\n\\n\\n\\n\\n\\n \\n\\n\", styles: [\".mat-drawer-container{position:relative;z-index:1;box-sizing:border-box;-webkit-overflow-scrolling:touch;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}.cdk-high-contrast-active .mat-drawer-backdrop{opacity:.5}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}.cdk-high-contrast-active .mat-drawer,.cdk-high-contrast-active [dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}.cdk-high-contrast-active [dir=rtl] .mat-drawer,.cdk-high-contrast-active .mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer{transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer[style*=\\\"visibility: hidden\\\"]{display:none}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto;-webkit-overflow-scrolling:touch}.mat-sidenav-fixed{position:fixed}\"] }]\n }], propDecorators: { _allDrawers: [{\n type: ContentChildren,\n args: [MatSidenav, {\n // We need to use `descendants: true`, because Ivy will no longer match\n // indirect descendants if it's left as false.\n descendants: true,\n }]\n }], _content: [{\n type: ContentChild,\n args: [MatSidenavContent]\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatSidenavModule {\n}\nMatSidenavModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatSidenavModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nMatSidenavModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.2.0\", ngImport: i0, type: MatSidenavModule, declarations: [MatDrawer,\n MatDrawerContainer,\n MatDrawerContent,\n MatSidenav,\n MatSidenavContainer,\n MatSidenavContent], imports: [CommonModule, MatCommonModule, CdkScrollableModule], exports: [CdkScrollableModule,\n MatCommonModule,\n MatDrawer,\n MatDrawerContainer,\n MatDrawerContent,\n MatSidenav,\n MatSidenavContainer,\n MatSidenavContent] });\nMatSidenavModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatSidenavModule, imports: [CommonModule, MatCommonModule, CdkScrollableModule, CdkScrollableModule,\n MatCommonModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatSidenavModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [CommonModule, MatCommonModule, CdkScrollableModule],\n exports: [\n CdkScrollableModule,\n MatCommonModule,\n MatDrawer,\n MatDrawerContainer,\n MatDrawerContent,\n MatSidenav,\n MatSidenavContainer,\n MatSidenavContent,\n ],\n declarations: [\n MatDrawer,\n MatDrawerContainer,\n MatDrawerContent,\n MatSidenav,\n MatSidenavContainer,\n MatSidenavContent,\n ],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MAT_DRAWER_DEFAULT_AUTOSIZE, MAT_DRAWER_DEFAULT_AUTOSIZE_FACTORY, MatDrawer, MatDrawerContainer, MatDrawerContent, MatSidenav, MatSidenavContainer, MatSidenavContent, MatSidenavModule, matDrawerAnimations, throwMatDuplicatedDrawerError };\n","import { FocusKeyManager } from '@angular/cdk/a11y';\nimport * as i1 from '@angular/cdk/bidi';\nimport { BidiModule } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport { hasModifierKey, SPACE, ENTER } from '@angular/cdk/keycodes';\nimport * as i0 from '@angular/core';\nimport { Directive, InjectionToken, EventEmitter, forwardRef, TemplateRef, Component, ViewEncapsulation, ChangeDetectionStrategy, Inject, Optional, ContentChild, ViewChild, Input, Output, QueryList, ContentChildren, NgModule } from '@angular/core';\nimport { _getFocusedElementPierceShadowDom } from '@angular/cdk/platform';\nimport { Subject, of } from 'rxjs';\nimport { startWith, takeUntil } from 'rxjs/operators';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass CdkStepHeader {\n constructor(_elementRef) {\n this._elementRef = _elementRef;\n }\n /** Focuses the step header. */\n focus() {\n this._elementRef.nativeElement.focus();\n }\n}\nCdkStepHeader.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: CdkStepHeader, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });\nCdkStepHeader.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: CdkStepHeader, selector: \"[cdkStepHeader]\", host: { attributes: { \"role\": \"tab\" } }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: CdkStepHeader, decorators: [{\n type: Directive,\n args: [{\n selector: '[cdkStepHeader]',\n host: {\n 'role': 'tab',\n },\n }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }]; } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass CdkStepLabel {\n constructor(/** @docs-private */ template) {\n this.template = template;\n }\n}\nCdkStepLabel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: CdkStepLabel, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });\nCdkStepLabel.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: CdkStepLabel, selector: \"[cdkStepLabel]\", ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: CdkStepLabel, decorators: [{\n type: Directive,\n args: [{\n selector: '[cdkStepLabel]',\n }]\n }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Used to generate unique ID for each stepper component. */\nlet nextId = 0;\n/** Change event emitted on selection changes. */\nclass StepperSelectionEvent {\n}\n/** Enum to represent the different states of the steps. */\nconst STEP_STATE = {\n NUMBER: 'number',\n EDIT: 'edit',\n DONE: 'done',\n ERROR: 'error',\n};\n/** InjectionToken that can be used to specify the global stepper options. */\nconst STEPPER_GLOBAL_OPTIONS = new InjectionToken('STEPPER_GLOBAL_OPTIONS');\nclass CdkStep {\n constructor(_stepper, stepperOptions) {\n this._stepper = _stepper;\n /** Whether user has attempted to move away from the step. */\n this.interacted = false;\n /** Emits when the user has attempted to move away from the step. */\n this.interactedStream = new EventEmitter();\n this._editable = true;\n this._optional = false;\n this._completedOverride = null;\n this._customError = null;\n this._stepperOptions = stepperOptions ? stepperOptions : {};\n this._displayDefaultIndicatorType = this._stepperOptions.displayDefaultIndicatorType !== false;\n }\n /** Whether the user can return to this step once it has been marked as completed. */\n get editable() {\n return this._editable;\n }\n set editable(value) {\n this._editable = coerceBooleanProperty(value);\n }\n /** Whether the completion of step is optional. */\n get optional() {\n return this._optional;\n }\n set optional(value) {\n this._optional = coerceBooleanProperty(value);\n }\n /** Whether step is marked as completed. */\n get completed() {\n return this._completedOverride == null ? this._getDefaultCompleted() : this._completedOverride;\n }\n set completed(value) {\n this._completedOverride = coerceBooleanProperty(value);\n }\n _getDefaultCompleted() {\n return this.stepControl ? this.stepControl.valid && this.interacted : this.interacted;\n }\n /** Whether step has an error. */\n get hasError() {\n return this._customError == null ? this._getDefaultError() : this._customError;\n }\n set hasError(value) {\n this._customError = coerceBooleanProperty(value);\n }\n _getDefaultError() {\n return this.stepControl && this.stepControl.invalid && this.interacted;\n }\n /** Selects this step component. */\n select() {\n this._stepper.selected = this;\n }\n /** Resets the step to its initial state. Note that this includes resetting form data. */\n reset() {\n this.interacted = false;\n if (this._completedOverride != null) {\n this._completedOverride = false;\n }\n if (this._customError != null) {\n this._customError = false;\n }\n if (this.stepControl) {\n this.stepControl.reset();\n }\n }\n ngOnChanges() {\n // Since basically all inputs of the MatStep get proxied through the view down to the\n // underlying MatStepHeader, we have to make sure that change detection runs correctly.\n this._stepper._stateChanged();\n }\n _markAsInteracted() {\n if (!this.interacted) {\n this.interacted = true;\n this.interactedStream.emit(this);\n }\n }\n /** Determines whether the error state can be shown. */\n _showError() {\n // We want to show the error state either if the user opted into/out of it using the\n // global options, or if they've explicitly set it through the `hasError` input.\n return this._stepperOptions.showError ?? this._customError != null;\n }\n}\nCdkStep.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: CdkStep, deps: [{ token: forwardRef(() => CdkStepper) }, { token: STEPPER_GLOBAL_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Component });\nCdkStep.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: CdkStep, selector: \"cdk-step\", inputs: { stepControl: \"stepControl\", label: \"label\", errorMessage: \"errorMessage\", ariaLabel: [\"aria-label\", \"ariaLabel\"], ariaLabelledby: [\"aria-labelledby\", \"ariaLabelledby\"], state: \"state\", editable: \"editable\", optional: \"optional\", completed: \"completed\", hasError: \"hasError\" }, outputs: { interactedStream: \"interacted\" }, queries: [{ propertyName: \"stepLabel\", first: true, predicate: CdkStepLabel, descendants: true }], viewQueries: [{ propertyName: \"content\", first: true, predicate: TemplateRef, descendants: true, static: true }], exportAs: [\"cdkStep\"], usesOnChanges: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: CdkStep, decorators: [{\n type: Component,\n args: [{\n selector: 'cdk-step',\n exportAs: 'cdkStep',\n template: '',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n }]\n }], ctorParameters: function () { return [{ type: CdkStepper, decorators: [{\n type: Inject,\n args: [forwardRef(() => CdkStepper)]\n }] }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [STEPPER_GLOBAL_OPTIONS]\n }] }]; }, propDecorators: { stepLabel: [{\n type: ContentChild,\n args: [CdkStepLabel]\n }], content: [{\n type: ViewChild,\n args: [TemplateRef, { static: true }]\n }], stepControl: [{\n type: Input\n }], interactedStream: [{\n type: Output,\n args: ['interacted']\n }], label: [{\n type: Input\n }], errorMessage: [{\n type: Input\n }], ariaLabel: [{\n type: Input,\n args: ['aria-label']\n }], ariaLabelledby: [{\n type: Input,\n args: ['aria-labelledby']\n }], state: [{\n type: Input\n }], editable: [{\n type: Input\n }], optional: [{\n type: Input\n }], completed: [{\n type: Input\n }], hasError: [{\n type: Input\n }] } });\nclass CdkStepper {\n constructor(_dir, _changeDetectorRef, _elementRef) {\n this._dir = _dir;\n this._changeDetectorRef = _changeDetectorRef;\n this._elementRef = _elementRef;\n /** Emits when the component is destroyed. */\n this._destroyed = new Subject();\n /** Steps that belong to the current stepper, excluding ones from nested steppers. */\n this.steps = new QueryList();\n /** List of step headers sorted based on their DOM order. */\n this._sortedHeaders = new QueryList();\n this._linear = false;\n this._selectedIndex = 0;\n /** Event emitted when the selected step has changed. */\n this.selectionChange = new EventEmitter();\n this._orientation = 'horizontal';\n this._groupId = nextId++;\n }\n /** Whether the validity of previous steps should be checked or not. */\n get linear() {\n return this._linear;\n }\n set linear(value) {\n this._linear = coerceBooleanProperty(value);\n }\n /** The index of the selected step. */\n get selectedIndex() {\n return this._selectedIndex;\n }\n set selectedIndex(index) {\n const newIndex = coerceNumberProperty(index);\n if (this.steps && this._steps) {\n // Ensure that the index can't be out of bounds.\n if (!this._isValidIndex(newIndex) && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('cdkStepper: Cannot assign out-of-bounds value to `selectedIndex`.');\n }\n this.selected?._markAsInteracted();\n if (this._selectedIndex !== newIndex &&\n !this._anyControlsInvalidOrPending(newIndex) &&\n (newIndex >= this._selectedIndex || this.steps.toArray()[newIndex].editable)) {\n this._updateSelectedItemIndex(newIndex);\n }\n }\n else {\n this._selectedIndex = newIndex;\n }\n }\n /** The step that is selected. */\n get selected() {\n return this.steps ? this.steps.toArray()[this.selectedIndex] : undefined;\n }\n set selected(step) {\n this.selectedIndex = step && this.steps ? this.steps.toArray().indexOf(step) : -1;\n }\n /** Orientation of the stepper. */\n get orientation() {\n return this._orientation;\n }\n set orientation(value) {\n // This is a protected method so that `MatStepper` can hook into it.\n this._orientation = value;\n if (this._keyManager) {\n this._keyManager.withVerticalOrientation(value === 'vertical');\n }\n }\n ngAfterContentInit() {\n this._steps.changes\n .pipe(startWith(this._steps), takeUntil(this._destroyed))\n .subscribe((steps) => {\n this.steps.reset(steps.filter(step => step._stepper === this));\n this.steps.notifyOnChanges();\n });\n }\n ngAfterViewInit() {\n // If the step headers are defined outside of the `ngFor` that renders the steps, like in the\n // Material stepper, they won't appear in the `QueryList` in the same order as they're\n // rendered in the DOM which will lead to incorrect keyboard navigation. We need to sort\n // them manually to ensure that they're correct. Alternatively, we can change the Material\n // template to inline the headers in the `ngFor`, but that'll result in a lot of\n // code duplication. See #23539.\n this._stepHeader.changes\n .pipe(startWith(this._stepHeader), takeUntil(this._destroyed))\n .subscribe((headers) => {\n this._sortedHeaders.reset(headers.toArray().sort((a, b) => {\n const documentPosition = a._elementRef.nativeElement.compareDocumentPosition(b._elementRef.nativeElement);\n // `compareDocumentPosition` returns a bitmask so we have to use a bitwise operator.\n // https://developer.mozilla.org/en-US/docs/Web/API/Node/compareDocumentPosition\n // tslint:disable-next-line:no-bitwise\n return documentPosition & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;\n }));\n this._sortedHeaders.notifyOnChanges();\n });\n // Note that while the step headers are content children by default, any components that\n // extend this one might have them as view children. We initialize the keyboard handling in\n // AfterViewInit so we're guaranteed for both view and content children to be defined.\n this._keyManager = new FocusKeyManager(this._sortedHeaders)\n .withWrap()\n .withHomeAndEnd()\n .withVerticalOrientation(this._orientation === 'vertical');\n (this._dir ? this._dir.change : of())\n .pipe(startWith(this._layoutDirection()), takeUntil(this._destroyed))\n .subscribe(direction => this._keyManager.withHorizontalOrientation(direction));\n this._keyManager.updateActiveItem(this._selectedIndex);\n // No need to `takeUntil` here, because we're the ones destroying `steps`.\n this.steps.changes.subscribe(() => {\n if (!this.selected) {\n this._selectedIndex = Math.max(this._selectedIndex - 1, 0);\n }\n });\n // The logic which asserts that the selected index is within bounds doesn't run before the\n // steps are initialized, because we don't how many steps there are yet so we may have an\n // invalid index on init. If that's the case, auto-correct to the default so we don't throw.\n if (!this._isValidIndex(this._selectedIndex)) {\n this._selectedIndex = 0;\n }\n }\n ngOnDestroy() {\n this.steps.destroy();\n this._sortedHeaders.destroy();\n this._destroyed.next();\n this._destroyed.complete();\n }\n /** Selects and focuses the next step in list. */\n next() {\n this.selectedIndex = Math.min(this._selectedIndex + 1, this.steps.length - 1);\n }\n /** Selects and focuses the previous step in list. */\n previous() {\n this.selectedIndex = Math.max(this._selectedIndex - 1, 0);\n }\n /** Resets the stepper to its initial state. Note that this includes clearing form data. */\n reset() {\n this._updateSelectedItemIndex(0);\n this.steps.forEach(step => step.reset());\n this._stateChanged();\n }\n /** Returns a unique id for each step label element. */\n _getStepLabelId(i) {\n return `cdk-step-label-${this._groupId}-${i}`;\n }\n /** Returns unique id for each step content element. */\n _getStepContentId(i) {\n return `cdk-step-content-${this._groupId}-${i}`;\n }\n /** Marks the component to be change detected. */\n _stateChanged() {\n this._changeDetectorRef.markForCheck();\n }\n /** Returns position state of the step with the given index. */\n _getAnimationDirection(index) {\n const position = index - this._selectedIndex;\n if (position < 0) {\n return this._layoutDirection() === 'rtl' ? 'next' : 'previous';\n }\n else if (position > 0) {\n return this._layoutDirection() === 'rtl' ? 'previous' : 'next';\n }\n return 'current';\n }\n /** Returns the type of icon to be displayed. */\n _getIndicatorType(index, state = STEP_STATE.NUMBER) {\n const step = this.steps.toArray()[index];\n const isCurrentStep = this._isCurrentStep(index);\n return step._displayDefaultIndicatorType\n ? this._getDefaultIndicatorLogic(step, isCurrentStep)\n : this._getGuidelineLogic(step, isCurrentStep, state);\n }\n _getDefaultIndicatorLogic(step, isCurrentStep) {\n if (step._showError() && step.hasError && !isCurrentStep) {\n return STEP_STATE.ERROR;\n }\n else if (!step.completed || isCurrentStep) {\n return STEP_STATE.NUMBER;\n }\n else {\n return step.editable ? STEP_STATE.EDIT : STEP_STATE.DONE;\n }\n }\n _getGuidelineLogic(step, isCurrentStep, state = STEP_STATE.NUMBER) {\n if (step._showError() && step.hasError && !isCurrentStep) {\n return STEP_STATE.ERROR;\n }\n else if (step.completed && !isCurrentStep) {\n return STEP_STATE.DONE;\n }\n else if (step.completed && isCurrentStep) {\n return state;\n }\n else if (step.editable && isCurrentStep) {\n return STEP_STATE.EDIT;\n }\n else {\n return state;\n }\n }\n _isCurrentStep(index) {\n return this._selectedIndex === index;\n }\n /** Returns the index of the currently-focused step header. */\n _getFocusIndex() {\n return this._keyManager ? this._keyManager.activeItemIndex : this._selectedIndex;\n }\n _updateSelectedItemIndex(newIndex) {\n const stepsArray = this.steps.toArray();\n this.selectionChange.emit({\n selectedIndex: newIndex,\n previouslySelectedIndex: this._selectedIndex,\n selectedStep: stepsArray[newIndex],\n previouslySelectedStep: stepsArray[this._selectedIndex],\n });\n // If focus is inside the stepper, move it to the next header, otherwise it may become\n // lost when the active step content is hidden. We can't be more granular with the check\n // (e.g. checking whether focus is inside the active step), because we don't have a\n // reference to the elements that are rendering out the content.\n this._containsFocus()\n ? this._keyManager.setActiveItem(newIndex)\n : this._keyManager.updateActiveItem(newIndex);\n this._selectedIndex = newIndex;\n this._stateChanged();\n }\n _onKeydown(event) {\n const hasModifier = hasModifierKey(event);\n const keyCode = event.keyCode;\n const manager = this._keyManager;\n if (manager.activeItemIndex != null &&\n !hasModifier &&\n (keyCode === SPACE || keyCode === ENTER)) {\n this.selectedIndex = manager.activeItemIndex;\n event.preventDefault();\n }\n else {\n manager.onKeydown(event);\n }\n }\n _anyControlsInvalidOrPending(index) {\n if (this._linear && index >= 0) {\n return this.steps\n .toArray()\n .slice(0, index)\n .some(step => {\n const control = step.stepControl;\n const isIncomplete = control\n ? control.invalid || control.pending || !step.interacted\n : !step.completed;\n return isIncomplete && !step.optional && !step._completedOverride;\n });\n }\n return false;\n }\n _layoutDirection() {\n return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';\n }\n /** Checks whether the stepper contains the focused element. */\n _containsFocus() {\n const stepperElement = this._elementRef.nativeElement;\n const focusedElement = _getFocusedElementPierceShadowDom();\n return stepperElement === focusedElement || stepperElement.contains(focusedElement);\n }\n /** Checks whether the passed-in index is a valid step index. */\n _isValidIndex(index) {\n return index > -1 && (!this.steps || index < this.steps.length);\n }\n}\nCdkStepper.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: CdkStepper, deps: [{ token: i1.Directionality, optional: true }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });\nCdkStepper.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: CdkStepper, selector: \"[cdkStepper]\", inputs: { linear: \"linear\", selectedIndex: \"selectedIndex\", selected: \"selected\", orientation: \"orientation\" }, outputs: { selectionChange: \"selectionChange\" }, queries: [{ propertyName: \"_steps\", predicate: CdkStep, descendants: true }, { propertyName: \"_stepHeader\", predicate: CdkStepHeader, descendants: true }], exportAs: [\"cdkStepper\"], ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: CdkStepper, decorators: [{\n type: Directive,\n args: [{\n selector: '[cdkStepper]',\n exportAs: 'cdkStepper',\n }]\n }], ctorParameters: function () { return [{ type: i1.Directionality, decorators: [{\n type: Optional\n }] }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { _steps: [{\n type: ContentChildren,\n args: [CdkStep, { descendants: true }]\n }], _stepHeader: [{\n type: ContentChildren,\n args: [CdkStepHeader, { descendants: true }]\n }], linear: [{\n type: Input\n }], selectedIndex: [{\n type: Input\n }], selected: [{\n type: Input\n }], selectionChange: [{\n type: Output\n }], orientation: [{\n type: Input\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Button that moves to the next step in a stepper workflow. */\nclass CdkStepperNext {\n constructor(_stepper) {\n this._stepper = _stepper;\n /** Type of the next button. Defaults to \"submit\" if not specified. */\n this.type = 'submit';\n }\n}\nCdkStepperNext.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: CdkStepperNext, deps: [{ token: CdkStepper }], target: i0.ɵɵFactoryTarget.Directive });\nCdkStepperNext.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: CdkStepperNext, selector: \"button[cdkStepperNext]\", inputs: { type: \"type\" }, host: { listeners: { \"click\": \"_stepper.next()\" }, properties: { \"type\": \"type\" } }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: CdkStepperNext, decorators: [{\n type: Directive,\n args: [{\n selector: 'button[cdkStepperNext]',\n host: {\n '[type]': 'type',\n '(click)': '_stepper.next()',\n },\n }]\n }], ctorParameters: function () { return [{ type: CdkStepper }]; }, propDecorators: { type: [{\n type: Input\n }] } });\n/** Button that moves to the previous step in a stepper workflow. */\nclass CdkStepperPrevious {\n constructor(_stepper) {\n this._stepper = _stepper;\n /** Type of the previous button. Defaults to \"button\" if not specified. */\n this.type = 'button';\n }\n}\nCdkStepperPrevious.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: CdkStepperPrevious, deps: [{ token: CdkStepper }], target: i0.ɵɵFactoryTarget.Directive });\nCdkStepperPrevious.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: CdkStepperPrevious, selector: \"button[cdkStepperPrevious]\", inputs: { type: \"type\" }, host: { listeners: { \"click\": \"_stepper.previous()\" }, properties: { \"type\": \"type\" } }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: CdkStepperPrevious, decorators: [{\n type: Directive,\n args: [{\n selector: 'button[cdkStepperPrevious]',\n host: {\n '[type]': 'type',\n '(click)': '_stepper.previous()',\n },\n }]\n }], ctorParameters: function () { return [{ type: CdkStepper }]; }, propDecorators: { type: [{\n type: Input\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass CdkStepperModule {\n}\nCdkStepperModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: CdkStepperModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nCdkStepperModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.2.0\", ngImport: i0, type: CdkStepperModule, declarations: [CdkStep,\n CdkStepper,\n CdkStepHeader,\n CdkStepLabel,\n CdkStepperNext,\n CdkStepperPrevious], imports: [BidiModule], exports: [CdkStep, CdkStepper, CdkStepHeader, CdkStepLabel, CdkStepperNext, CdkStepperPrevious] });\nCdkStepperModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: CdkStepperModule, imports: [BidiModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: CdkStepperModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [BidiModule],\n exports: [CdkStep, CdkStepper, CdkStepHeader, CdkStepLabel, CdkStepperNext, CdkStepperPrevious],\n declarations: [\n CdkStep,\n CdkStepper,\n CdkStepHeader,\n CdkStepLabel,\n CdkStepperNext,\n CdkStepperPrevious,\n ],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { CdkStep, CdkStepHeader, CdkStepLabel, CdkStepper, CdkStepperModule, CdkStepperNext, CdkStepperPrevious, STEPPER_GLOBAL_OPTIONS, STEP_STATE, StepperSelectionEvent };\n","import * as i2$1 from '@angular/cdk/portal';\nimport { TemplatePortal, PortalModule } from '@angular/cdk/portal';\nimport { CdkStepLabel, CdkStepHeader, CdkStep, STEPPER_GLOBAL_OPTIONS, CdkStepper, CdkStepperNext, CdkStepperPrevious, CdkStepperModule } from '@angular/cdk/stepper';\nimport * as i3 from '@angular/common';\nimport { CommonModule } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { Directive, Injectable, Optional, SkipSelf, Component, ViewEncapsulation, ChangeDetectionStrategy, Input, forwardRef, Inject, ContentChild, QueryList, EventEmitter, ViewChildren, ContentChildren, Output, NgModule } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport * as i1 from '@angular/material/core';\nimport { mixinColor, ErrorStateMatcher, MatCommonModule, MatRippleModule } from '@angular/material/core';\nimport * as i4 from '@angular/material/icon';\nimport { MatIconModule } from '@angular/material/icon';\nimport * as i2 from '@angular/cdk/a11y';\nimport { Subject, Subscription } from 'rxjs';\nimport * as i3$1 from '@angular/cdk/bidi';\nimport { switchMap, map, startWith, takeUntil, distinctUntilChanged } from 'rxjs/operators';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatStepLabel extends CdkStepLabel {\n}\nMatStepLabel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepLabel, deps: null, target: i0.ɵɵFactoryTarget.Directive });\nMatStepLabel.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatStepLabel, selector: \"[matStepLabel]\", usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepLabel, decorators: [{\n type: Directive,\n args: [{\n selector: '[matStepLabel]',\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Stepper data that is required for internationalization. */\nclass MatStepperIntl {\n constructor() {\n /**\n * Stream that emits whenever the labels here are changed. Use this to notify\n * components if the labels have changed after initialization.\n */\n this.changes = new Subject();\n /** Label that is rendered below optional steps. */\n this.optionalLabel = 'Optional';\n /** Label that is used to indicate step as completed to screen readers. */\n this.completedLabel = 'Completed';\n /** Label that is used to indicate step as editable to screen readers. */\n this.editableLabel = 'Editable';\n }\n}\nMatStepperIntl.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepperIntl, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\nMatStepperIntl.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepperIntl, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepperIntl, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }] });\n/** @docs-private */\nfunction MAT_STEPPER_INTL_PROVIDER_FACTORY(parentIntl) {\n return parentIntl || new MatStepperIntl();\n}\n/** @docs-private */\nconst MAT_STEPPER_INTL_PROVIDER = {\n provide: MatStepperIntl,\n deps: [[new Optional(), new SkipSelf(), MatStepperIntl]],\n useFactory: MAT_STEPPER_INTL_PROVIDER_FACTORY,\n};\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n// Boilerplate for applying mixins to MatStepHeader.\n/** @docs-private */\nconst _MatStepHeaderBase = mixinColor(class MatStepHeaderBase extends CdkStepHeader {\n constructor(elementRef) {\n super(elementRef);\n }\n}, 'primary');\nclass MatStepHeader extends _MatStepHeaderBase {\n constructor(_intl, _focusMonitor, _elementRef, changeDetectorRef) {\n super(_elementRef);\n this._intl = _intl;\n this._focusMonitor = _focusMonitor;\n this._intlSubscription = _intl.changes.subscribe(() => changeDetectorRef.markForCheck());\n }\n ngAfterViewInit() {\n this._focusMonitor.monitor(this._elementRef, true);\n }\n ngOnDestroy() {\n this._intlSubscription.unsubscribe();\n this._focusMonitor.stopMonitoring(this._elementRef);\n }\n /** Focuses the step header. */\n focus(origin, options) {\n if (origin) {\n this._focusMonitor.focusVia(this._elementRef, origin, options);\n }\n else {\n this._elementRef.nativeElement.focus(options);\n }\n }\n /** Returns string label of given step if it is a text label. */\n _stringLabel() {\n return this.label instanceof MatStepLabel ? null : this.label;\n }\n /** Returns MatStepLabel if the label of given step is a template label. */\n _templateLabel() {\n return this.label instanceof MatStepLabel ? this.label : null;\n }\n /** Returns the host HTML element. */\n _getHostElement() {\n return this._elementRef.nativeElement;\n }\n /** Template context variables that are exposed to the `matStepperIcon` instances. */\n _getIconContext() {\n return {\n index: this.index,\n active: this.active,\n optional: this.optional,\n };\n }\n _getDefaultTextForState(state) {\n if (state == 'number') {\n return `${this.index + 1}`;\n }\n if (state == 'edit') {\n return 'create';\n }\n if (state == 'error') {\n return 'warning';\n }\n return state;\n }\n}\nMatStepHeader.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepHeader, deps: [{ token: MatStepperIntl }, { token: i2.FocusMonitor }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });\nMatStepHeader.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatStepHeader, selector: \"mat-step-header\", inputs: { color: \"color\", state: \"state\", label: \"label\", errorMessage: \"errorMessage\", iconOverrides: \"iconOverrides\", index: \"index\", selected: \"selected\", active: \"active\", optional: \"optional\", disableRipple: \"disableRipple\" }, host: { attributes: { \"role\": \"tab\" }, classAttribute: \"mat-step-header\" }, usesInheritance: true, ngImport: i0, template: \"
\\n\\n
\\n
\\n \\n \\n {{_getDefaultTextForState(state)}}\\n {{_intl.completedLabel}}\\n {{_intl.editableLabel}}\\n {{_getDefaultTextForState(state)}}\\n \\n
\\n
\\n
\\n \\n
\\n \\n
\\n \\n
{{label}}
\\n\\n
{{_intl.optionalLabel}}
\\n
{{errorMessage}}
\\n
\\n\\n\", styles: [\".mat-step-header{overflow:hidden;outline:none;cursor:pointer;position:relative;box-sizing:content-box;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-step-header:focus .mat-focus-indicator::before{content:\\\"\\\"}.cdk-high-contrast-active .mat-step-header{outline:solid 1px}.cdk-high-contrast-active .mat-step-header[aria-selected=true] .mat-step-label{text-decoration:underline}.mat-step-optional,.mat-step-sub-label-error{font-size:12px}.mat-step-icon{border-radius:50%;height:24px;width:24px;flex-shrink:0;position:relative}.mat-step-icon-content{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);display:flex}.mat-step-icon .mat-icon{font-size:16px;height:16px;width:16px}.mat-step-icon-state-error .mat-icon{font-size:24px;height:24px;width:24px}.mat-step-label{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:50px;vertical-align:middle}.mat-step-text-label{text-overflow:ellipsis;overflow:hidden}.mat-step-header .mat-step-header-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}\"], dependencies: [{ kind: \"directive\", type: i3.NgIf, selector: \"[ngIf]\", inputs: [\"ngIf\", \"ngIfThen\", \"ngIfElse\"] }, { kind: \"directive\", type: i3.NgTemplateOutlet, selector: \"[ngTemplateOutlet]\", inputs: [\"ngTemplateOutletContext\", \"ngTemplateOutlet\", \"ngTemplateOutletInjector\"] }, { kind: \"directive\", type: i3.NgSwitch, selector: \"[ngSwitch]\", inputs: [\"ngSwitch\"] }, { kind: \"directive\", type: i3.NgSwitchCase, selector: \"[ngSwitchCase]\", inputs: [\"ngSwitchCase\"] }, { kind: \"directive\", type: i3.NgSwitchDefault, selector: \"[ngSwitchDefault]\" }, { kind: \"component\", type: i4.MatIcon, selector: \"mat-icon\", inputs: [\"color\", \"inline\", \"svgIcon\", \"fontSet\", \"fontIcon\"], exportAs: [\"matIcon\"] }, { kind: \"directive\", type: i1.MatRipple, selector: \"[mat-ripple], [matRipple]\", inputs: [\"matRippleColor\", \"matRippleUnbounded\", \"matRippleCentered\", \"matRippleRadius\", \"matRippleAnimation\", \"matRippleDisabled\", \"matRippleTrigger\"], exportAs: [\"matRipple\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepHeader, decorators: [{\n type: Component,\n args: [{ selector: 'mat-step-header', inputs: ['color'], host: {\n 'class': 'mat-step-header',\n 'role': 'tab',\n }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: \"
\\n\\n
\\n
\\n \\n \\n {{_getDefaultTextForState(state)}}\\n {{_intl.completedLabel}}\\n {{_intl.editableLabel}}\\n {{_getDefaultTextForState(state)}}\\n \\n
\\n
\\n
\\n \\n
\\n \\n
\\n \\n
{{label}}
\\n\\n
{{_intl.optionalLabel}}
\\n
{{errorMessage}}
\\n
\\n\\n\", styles: [\".mat-step-header{overflow:hidden;outline:none;cursor:pointer;position:relative;box-sizing:content-box;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-step-header:focus .mat-focus-indicator::before{content:\\\"\\\"}.cdk-high-contrast-active .mat-step-header{outline:solid 1px}.cdk-high-contrast-active .mat-step-header[aria-selected=true] .mat-step-label{text-decoration:underline}.mat-step-optional,.mat-step-sub-label-error{font-size:12px}.mat-step-icon{border-radius:50%;height:24px;width:24px;flex-shrink:0;position:relative}.mat-step-icon-content{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);display:flex}.mat-step-icon .mat-icon{font-size:16px;height:16px;width:16px}.mat-step-icon-state-error .mat-icon{font-size:24px;height:24px;width:24px}.mat-step-label{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:50px;vertical-align:middle}.mat-step-text-label{text-overflow:ellipsis;overflow:hidden}.mat-step-header .mat-step-header-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}\"] }]\n }], ctorParameters: function () { return [{ type: MatStepperIntl }, { type: i2.FocusMonitor }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { state: [{\n type: Input\n }], label: [{\n type: Input\n }], errorMessage: [{\n type: Input\n }], iconOverrides: [{\n type: Input\n }], index: [{\n type: Input\n }], selected: [{\n type: Input\n }], active: [{\n type: Input\n }], optional: [{\n type: Input\n }], disableRipple: [{\n type: Input\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nconst DEFAULT_HORIZONTAL_ANIMATION_DURATION = '500ms';\nconst DEFAULT_VERTICAL_ANIMATION_DURATION = '225ms';\n/**\n * Animations used by the Material steppers.\n * @docs-private\n */\nconst matStepperAnimations = {\n /** Animation that transitions the step along the X axis in a horizontal stepper. */\n horizontalStepTransition: trigger('horizontalStepTransition', [\n state('previous', style({ transform: 'translate3d(-100%, 0, 0)', visibility: 'hidden' })),\n // Transition to `inherit`, rather than `visible`,\n // because visibility on a child element the one from the parent,\n // making this element focusable inside of a `hidden` element.\n state('current', style({ transform: 'none', visibility: 'inherit' })),\n state('next', style({ transform: 'translate3d(100%, 0, 0)', visibility: 'hidden' })),\n transition('* => *', animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)'), {\n params: { 'animationDuration': DEFAULT_HORIZONTAL_ANIMATION_DURATION },\n }),\n ]),\n /** Animation that transitions the step along the Y axis in a vertical stepper. */\n verticalStepTransition: trigger('verticalStepTransition', [\n state('previous', style({ height: '0px', visibility: 'hidden' })),\n state('next', style({ height: '0px', visibility: 'hidden' })),\n // Transition to `inherit`, rather than `visible`,\n // because visibility on a child element the one from the parent,\n // making this element focusable inside of a `hidden` element.\n state('current', style({ height: '*', visibility: 'inherit' })),\n transition('* <=> current', animate('{{animationDuration}} cubic-bezier(0.4, 0.0, 0.2, 1)'), {\n params: { 'animationDuration': DEFAULT_VERTICAL_ANIMATION_DURATION },\n }),\n ]),\n};\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Template to be used to override the icons inside the step header.\n */\nclass MatStepperIcon {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nMatStepperIcon.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepperIcon, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });\nMatStepperIcon.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatStepperIcon, selector: \"ng-template[matStepperIcon]\", inputs: { name: [\"matStepperIcon\", \"name\"] }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepperIcon, decorators: [{\n type: Directive,\n args: [{\n selector: 'ng-template[matStepperIcon]',\n }]\n }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; }, propDecorators: { name: [{\n type: Input,\n args: ['matStepperIcon']\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Content for a `mat-step` that will be rendered lazily.\n */\nclass MatStepContent {\n constructor(_template) {\n this._template = _template;\n }\n}\nMatStepContent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepContent, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });\nMatStepContent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatStepContent, selector: \"ng-template[matStepContent]\", ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepContent, decorators: [{\n type: Directive,\n args: [{\n selector: 'ng-template[matStepContent]',\n }]\n }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatStep extends CdkStep {\n constructor(stepper, _errorStateMatcher, _viewContainerRef, stepperOptions) {\n super(stepper, stepperOptions);\n this._errorStateMatcher = _errorStateMatcher;\n this._viewContainerRef = _viewContainerRef;\n this._isSelected = Subscription.EMPTY;\n }\n ngAfterContentInit() {\n this._isSelected = this._stepper.steps.changes\n .pipe(switchMap(() => {\n return this._stepper.selectionChange.pipe(map(event => event.selectedStep === this), startWith(this._stepper.selected === this));\n }))\n .subscribe(isSelected => {\n if (isSelected && this._lazyContent && !this._portal) {\n this._portal = new TemplatePortal(this._lazyContent._template, this._viewContainerRef);\n }\n });\n }\n ngOnDestroy() {\n this._isSelected.unsubscribe();\n }\n /** Custom error state matcher that additionally checks for validity of interacted form. */\n isErrorState(control, form) {\n const originalErrorState = this._errorStateMatcher.isErrorState(control, form);\n // Custom error state checks for the validity of form that is not submitted or touched\n // since user can trigger a form change by calling for another step without directly\n // interacting with the current form.\n const customErrorState = !!(control && control.invalid && this.interacted);\n return originalErrorState || customErrorState;\n }\n}\nMatStep.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStep, deps: [{ token: forwardRef(() => MatStepper) }, { token: i1.ErrorStateMatcher, skipSelf: true }, { token: i0.ViewContainerRef }, { token: STEPPER_GLOBAL_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Component });\nMatStep.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatStep, selector: \"mat-step\", inputs: { color: \"color\" }, providers: [\n { provide: ErrorStateMatcher, useExisting: MatStep },\n { provide: CdkStep, useExisting: MatStep },\n ], queries: [{ propertyName: \"stepLabel\", first: true, predicate: MatStepLabel, descendants: true }, { propertyName: \"_lazyContent\", first: true, predicate: MatStepContent, descendants: true }], exportAs: [\"matStep\"], usesInheritance: true, ngImport: i0, template: \"\\n \\n \\n\\n\", dependencies: [{ kind: \"directive\", type: i2$1.CdkPortalOutlet, selector: \"[cdkPortalOutlet]\", inputs: [\"cdkPortalOutlet\"], outputs: [\"attached\"], exportAs: [\"cdkPortalOutlet\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStep, decorators: [{\n type: Component,\n args: [{ selector: 'mat-step', providers: [\n { provide: ErrorStateMatcher, useExisting: MatStep },\n { provide: CdkStep, useExisting: MatStep },\n ], encapsulation: ViewEncapsulation.None, exportAs: 'matStep', changeDetection: ChangeDetectionStrategy.OnPush, template: \"\\n \\n \\n\\n\" }]\n }], ctorParameters: function () { return [{ type: MatStepper, decorators: [{\n type: Inject,\n args: [forwardRef(() => MatStepper)]\n }] }, { type: i1.ErrorStateMatcher, decorators: [{\n type: SkipSelf\n }] }, { type: i0.ViewContainerRef }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [STEPPER_GLOBAL_OPTIONS]\n }] }]; }, propDecorators: { stepLabel: [{\n type: ContentChild,\n args: [MatStepLabel]\n }], color: [{\n type: Input\n }], _lazyContent: [{\n type: ContentChild,\n args: [MatStepContent, { static: false }]\n }] } });\nclass MatStepper extends CdkStepper {\n constructor(dir, changeDetectorRef, elementRef) {\n super(dir, changeDetectorRef, elementRef);\n /** Steps that belong to the current stepper, excluding ones from nested steppers. */\n this.steps = new QueryList();\n /** Event emitted when the current step is done transitioning in. */\n this.animationDone = new EventEmitter();\n /**\n * Whether the label should display in bottom or end position.\n * Only applies in the `horizontal` orientation.\n */\n this.labelPosition = 'end';\n /**\n * Position of the stepper's header.\n * Only applies in the `horizontal` orientation.\n */\n this.headerPosition = 'top';\n /** Consumer-specified template-refs to be used to override the header icons. */\n this._iconOverrides = {};\n /** Stream of animation `done` events when the body expands/collapses. */\n this._animationDone = new Subject();\n this._animationDuration = '';\n const nodeName = elementRef.nativeElement.nodeName.toLowerCase();\n this.orientation = nodeName === 'mat-vertical-stepper' ? 'vertical' : 'horizontal';\n }\n /** Duration for the animation. Will be normalized to milliseconds if no units are set. */\n get animationDuration() {\n return this._animationDuration;\n }\n set animationDuration(value) {\n this._animationDuration = /^\\d+$/.test(value) ? value + 'ms' : value;\n }\n ngAfterContentInit() {\n super.ngAfterContentInit();\n this._icons.forEach(({ name, templateRef }) => (this._iconOverrides[name] = templateRef));\n // Mark the component for change detection whenever the content children query changes\n this.steps.changes.pipe(takeUntil(this._destroyed)).subscribe(() => {\n this._stateChanged();\n });\n this._animationDone\n .pipe(\n // This needs a `distinctUntilChanged` in order to avoid emitting the same event twice due\n // to a bug in animations where the `.done` callback gets invoked twice on some browsers.\n // See https://github.com/angular/angular/issues/24084\n distinctUntilChanged((x, y) => x.fromState === y.fromState && x.toState === y.toState), takeUntil(this._destroyed))\n .subscribe(event => {\n if (event.toState === 'current') {\n this.animationDone.emit();\n }\n });\n }\n _stepIsNavigable(index, step) {\n return step.completed || this.selectedIndex === index || !this.linear;\n }\n _getAnimationDuration() {\n if (this.animationDuration) {\n return this.animationDuration;\n }\n return this.orientation === 'horizontal'\n ? DEFAULT_HORIZONTAL_ANIMATION_DURATION\n : DEFAULT_VERTICAL_ANIMATION_DURATION;\n }\n}\nMatStepper.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepper, deps: [{ token: i3$1.Directionality, optional: true }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });\nMatStepper.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatStepper, selector: \"mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]\", inputs: { selectedIndex: \"selectedIndex\", disableRipple: \"disableRipple\", color: \"color\", labelPosition: \"labelPosition\", headerPosition: \"headerPosition\", animationDuration: \"animationDuration\" }, outputs: { animationDone: \"animationDone\" }, host: { attributes: { \"role\": \"tablist\" }, properties: { \"class.mat-stepper-horizontal\": \"orientation === \\\"horizontal\\\"\", \"class.mat-stepper-vertical\": \"orientation === \\\"vertical\\\"\", \"class.mat-stepper-label-position-end\": \"orientation === \\\"horizontal\\\" && labelPosition == \\\"end\\\"\", \"class.mat-stepper-label-position-bottom\": \"orientation === \\\"horizontal\\\" && labelPosition == \\\"bottom\\\"\", \"class.mat-stepper-header-position-bottom\": \"headerPosition === \\\"bottom\\\"\", \"attr.aria-orientation\": \"orientation\" } }, providers: [{ provide: CdkStepper, useExisting: MatStepper }], queries: [{ propertyName: \"_steps\", predicate: MatStep, descendants: true }, { propertyName: \"_icons\", predicate: MatStepperIcon, descendants: true }], viewQueries: [{ propertyName: \"_stepHeader\", predicate: MatStepHeader, descendants: true }], exportAs: [\"matStepper\", \"matVerticalStepper\", \"matHorizontalStepper\"], usesInheritance: true, ngImport: i0, template: \"\\n \\n
\\n
\\n \\n \\n
\\n \\n
\\n\\n
\\n
\\n \\n
\\n
\\n
\\n\\n \\n \\n
\\n \\n
\\n
\\n
\\n \\n
\\n
\\n
\\n
\\n
\\n\\n
\\n\\n\\n\\n \\n\\n\", styles: [\".mat-stepper-vertical,.mat-stepper-horizontal{display:block}.mat-horizontal-stepper-header-container{white-space:nowrap;display:flex;align-items:center}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header-container{align-items:flex-start}.mat-stepper-header-position-bottom .mat-horizontal-stepper-header-container{order:1}.mat-stepper-horizontal-line{border-top-width:1px;border-top-style:solid;flex:auto;height:0;margin:0 -16px;min-width:32px}.mat-stepper-label-position-bottom .mat-stepper-horizontal-line{margin:0;min-width:0;position:relative}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header:not(:first-child)::before,[dir=rtl] .mat-stepper-label-position-bottom .mat-horizontal-stepper-header:not(:last-child)::before,.mat-stepper-label-position-bottom .mat-horizontal-stepper-header:not(:last-child)::after,[dir=rtl] .mat-stepper-label-position-bottom .mat-horizontal-stepper-header:not(:first-child)::after{border-top-width:1px;border-top-style:solid;content:\\\"\\\";display:inline-block;height:0;position:absolute;width:calc(50% - 20px)}.mat-horizontal-stepper-header{display:flex;height:72px;overflow:hidden;align-items:center;padding:0 24px}.mat-horizontal-stepper-header .mat-step-icon{margin-right:8px;flex:none}[dir=rtl] .mat-horizontal-stepper-header .mat-step-icon{margin-right:0;margin-left:8px}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header{box-sizing:border-box;flex-direction:column;height:auto}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header:not(:last-child)::after,[dir=rtl] .mat-stepper-label-position-bottom .mat-horizontal-stepper-header:not(:first-child)::after{right:0}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header:not(:first-child)::before,[dir=rtl] .mat-stepper-label-position-bottom .mat-horizontal-stepper-header:not(:last-child)::before{left:0}[dir=rtl] .mat-stepper-label-position-bottom .mat-horizontal-stepper-header:last-child::before,[dir=rtl] .mat-stepper-label-position-bottom .mat-horizontal-stepper-header:first-child::after{display:none}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header .mat-step-icon{margin-right:0;margin-left:0}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header .mat-step-label{padding:16px 0 0 0;text-align:center;width:100%}.mat-vertical-stepper-header{display:flex;align-items:center;height:24px}.mat-vertical-stepper-header .mat-step-icon{margin-right:12px}[dir=rtl] .mat-vertical-stepper-header .mat-step-icon{margin-right:0;margin-left:12px}.mat-horizontal-stepper-wrapper{display:flex;flex-direction:column}.mat-horizontal-stepper-content{outline:0}.mat-horizontal-stepper-content.mat-horizontal-stepper-content-inactive{height:0;overflow:hidden}.mat-horizontal-content-container{overflow:hidden;padding:0 24px 24px 24px}.cdk-high-contrast-active .mat-horizontal-content-container{outline:solid 1px}.mat-stepper-header-position-bottom .mat-horizontal-content-container{padding:24px 24px 0 24px}.mat-vertical-content-container{margin-left:36px;border:0;position:relative}.cdk-high-contrast-active .mat-vertical-content-container{outline:solid 1px}[dir=rtl] .mat-vertical-content-container{margin-left:0;margin-right:36px}.mat-stepper-vertical-line::before{content:\\\"\\\";position:absolute;left:0;border-left-width:1px;border-left-style:solid}[dir=rtl] .mat-stepper-vertical-line::before{left:auto;right:0}.mat-vertical-stepper-content{overflow:hidden;outline:0}.mat-vertical-content{padding:0 24px 24px 24px}.mat-step:last-child .mat-vertical-content-container{border:none}\"], dependencies: [{ kind: \"directive\", type: i3.NgForOf, selector: \"[ngFor][ngForOf]\", inputs: [\"ngForOf\", \"ngForTrackBy\", \"ngForTemplate\"] }, { kind: \"directive\", type: i3.NgIf, selector: \"[ngIf]\", inputs: [\"ngIf\", \"ngIfThen\", \"ngIfElse\"] }, { kind: \"directive\", type: i3.NgTemplateOutlet, selector: \"[ngTemplateOutlet]\", inputs: [\"ngTemplateOutletContext\", \"ngTemplateOutlet\", \"ngTemplateOutletInjector\"] }, { kind: \"directive\", type: i3.NgSwitch, selector: \"[ngSwitch]\", inputs: [\"ngSwitch\"] }, { kind: \"directive\", type: i3.NgSwitchCase, selector: \"[ngSwitchCase]\", inputs: [\"ngSwitchCase\"] }, { kind: \"component\", type: MatStepHeader, selector: \"mat-step-header\", inputs: [\"color\", \"state\", \"label\", \"errorMessage\", \"iconOverrides\", \"index\", \"selected\", \"active\", \"optional\", \"disableRipple\"] }], animations: [\n matStepperAnimations.horizontalStepTransition,\n matStepperAnimations.verticalStepTransition,\n ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepper, decorators: [{\n type: Component,\n args: [{ selector: 'mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]', exportAs: 'matStepper, matVerticalStepper, matHorizontalStepper', inputs: ['selectedIndex'], host: {\n '[class.mat-stepper-horizontal]': 'orientation === \"horizontal\"',\n '[class.mat-stepper-vertical]': 'orientation === \"vertical\"',\n '[class.mat-stepper-label-position-end]': 'orientation === \"horizontal\" && labelPosition == \"end\"',\n '[class.mat-stepper-label-position-bottom]': 'orientation === \"horizontal\" && labelPosition == \"bottom\"',\n '[class.mat-stepper-header-position-bottom]': 'headerPosition === \"bottom\"',\n '[attr.aria-orientation]': 'orientation',\n 'role': 'tablist',\n }, animations: [\n matStepperAnimations.horizontalStepTransition,\n matStepperAnimations.verticalStepTransition,\n ], providers: [{ provide: CdkStepper, useExisting: MatStepper }], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: \"\\n \\n
\\n
\\n \\n \\n
\\n \\n
\\n\\n
\\n
\\n \\n
\\n
\\n
\\n\\n \\n \\n
\\n \\n
\\n
\\n
\\n \\n
\\n
\\n
\\n
\\n
\\n\\n
\\n\\n\\n\\n \\n\\n\", styles: [\".mat-stepper-vertical,.mat-stepper-horizontal{display:block}.mat-horizontal-stepper-header-container{white-space:nowrap;display:flex;align-items:center}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header-container{align-items:flex-start}.mat-stepper-header-position-bottom .mat-horizontal-stepper-header-container{order:1}.mat-stepper-horizontal-line{border-top-width:1px;border-top-style:solid;flex:auto;height:0;margin:0 -16px;min-width:32px}.mat-stepper-label-position-bottom .mat-stepper-horizontal-line{margin:0;min-width:0;position:relative}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header:not(:first-child)::before,[dir=rtl] .mat-stepper-label-position-bottom .mat-horizontal-stepper-header:not(:last-child)::before,.mat-stepper-label-position-bottom .mat-horizontal-stepper-header:not(:last-child)::after,[dir=rtl] .mat-stepper-label-position-bottom .mat-horizontal-stepper-header:not(:first-child)::after{border-top-width:1px;border-top-style:solid;content:\\\"\\\";display:inline-block;height:0;position:absolute;width:calc(50% - 20px)}.mat-horizontal-stepper-header{display:flex;height:72px;overflow:hidden;align-items:center;padding:0 24px}.mat-horizontal-stepper-header .mat-step-icon{margin-right:8px;flex:none}[dir=rtl] .mat-horizontal-stepper-header .mat-step-icon{margin-right:0;margin-left:8px}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header{box-sizing:border-box;flex-direction:column;height:auto}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header:not(:last-child)::after,[dir=rtl] .mat-stepper-label-position-bottom .mat-horizontal-stepper-header:not(:first-child)::after{right:0}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header:not(:first-child)::before,[dir=rtl] .mat-stepper-label-position-bottom .mat-horizontal-stepper-header:not(:last-child)::before{left:0}[dir=rtl] .mat-stepper-label-position-bottom .mat-horizontal-stepper-header:last-child::before,[dir=rtl] .mat-stepper-label-position-bottom .mat-horizontal-stepper-header:first-child::after{display:none}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header .mat-step-icon{margin-right:0;margin-left:0}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header .mat-step-label{padding:16px 0 0 0;text-align:center;width:100%}.mat-vertical-stepper-header{display:flex;align-items:center;height:24px}.mat-vertical-stepper-header .mat-step-icon{margin-right:12px}[dir=rtl] .mat-vertical-stepper-header .mat-step-icon{margin-right:0;margin-left:12px}.mat-horizontal-stepper-wrapper{display:flex;flex-direction:column}.mat-horizontal-stepper-content{outline:0}.mat-horizontal-stepper-content.mat-horizontal-stepper-content-inactive{height:0;overflow:hidden}.mat-horizontal-content-container{overflow:hidden;padding:0 24px 24px 24px}.cdk-high-contrast-active .mat-horizontal-content-container{outline:solid 1px}.mat-stepper-header-position-bottom .mat-horizontal-content-container{padding:24px 24px 0 24px}.mat-vertical-content-container{margin-left:36px;border:0;position:relative}.cdk-high-contrast-active .mat-vertical-content-container{outline:solid 1px}[dir=rtl] .mat-vertical-content-container{margin-left:0;margin-right:36px}.mat-stepper-vertical-line::before{content:\\\"\\\";position:absolute;left:0;border-left-width:1px;border-left-style:solid}[dir=rtl] .mat-stepper-vertical-line::before{left:auto;right:0}.mat-vertical-stepper-content{overflow:hidden;outline:0}.mat-vertical-content{padding:0 24px 24px 24px}.mat-step:last-child .mat-vertical-content-container{border:none}\"] }]\n }], ctorParameters: function () { return [{ type: i3$1.Directionality, decorators: [{\n type: Optional\n }] }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { _stepHeader: [{\n type: ViewChildren,\n args: [MatStepHeader]\n }], _steps: [{\n type: ContentChildren,\n args: [MatStep, { descendants: true }]\n }], _icons: [{\n type: ContentChildren,\n args: [MatStepperIcon, { descendants: true }]\n }], animationDone: [{\n type: Output\n }], disableRipple: [{\n type: Input\n }], color: [{\n type: Input\n }], labelPosition: [{\n type: Input\n }], headerPosition: [{\n type: Input\n }], animationDuration: [{\n type: Input\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Button that moves to the next step in a stepper workflow. */\nclass MatStepperNext extends CdkStepperNext {\n}\nMatStepperNext.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepperNext, deps: null, target: i0.ɵɵFactoryTarget.Directive });\nMatStepperNext.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatStepperNext, selector: \"button[matStepperNext]\", inputs: { type: \"type\" }, host: { properties: { \"type\": \"type\" }, classAttribute: \"mat-stepper-next\" }, usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepperNext, decorators: [{\n type: Directive,\n args: [{\n selector: 'button[matStepperNext]',\n host: {\n 'class': 'mat-stepper-next',\n '[type]': 'type',\n },\n inputs: ['type'],\n }]\n }] });\n/** Button that moves to the previous step in a stepper workflow. */\nclass MatStepperPrevious extends CdkStepperPrevious {\n}\nMatStepperPrevious.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepperPrevious, deps: null, target: i0.ɵɵFactoryTarget.Directive });\nMatStepperPrevious.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatStepperPrevious, selector: \"button[matStepperPrevious]\", inputs: { type: \"type\" }, host: { properties: { \"type\": \"type\" }, classAttribute: \"mat-stepper-previous\" }, usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepperPrevious, decorators: [{\n type: Directive,\n args: [{\n selector: 'button[matStepperPrevious]',\n host: {\n 'class': 'mat-stepper-previous',\n '[type]': 'type',\n },\n inputs: ['type'],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatStepperModule {\n}\nMatStepperModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepperModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nMatStepperModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepperModule, declarations: [MatStep,\n MatStepLabel,\n MatStepper,\n MatStepperNext,\n MatStepperPrevious,\n MatStepHeader,\n MatStepperIcon,\n MatStepContent], imports: [MatCommonModule,\n CommonModule,\n PortalModule,\n MatButtonModule,\n CdkStepperModule,\n MatIconModule,\n MatRippleModule], exports: [MatCommonModule,\n MatStep,\n MatStepLabel,\n MatStepper,\n MatStepperNext,\n MatStepperPrevious,\n MatStepHeader,\n MatStepperIcon,\n MatStepContent] });\nMatStepperModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepperModule, providers: [MAT_STEPPER_INTL_PROVIDER, ErrorStateMatcher], imports: [MatCommonModule,\n CommonModule,\n PortalModule,\n MatButtonModule,\n CdkStepperModule,\n MatIconModule,\n MatRippleModule, MatCommonModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatStepperModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [\n MatCommonModule,\n CommonModule,\n PortalModule,\n MatButtonModule,\n CdkStepperModule,\n MatIconModule,\n MatRippleModule,\n ],\n exports: [\n MatCommonModule,\n MatStep,\n MatStepLabel,\n MatStepper,\n MatStepperNext,\n MatStepperPrevious,\n MatStepHeader,\n MatStepperIcon,\n MatStepContent,\n ],\n declarations: [\n MatStep,\n MatStepLabel,\n MatStepper,\n MatStepperNext,\n MatStepperPrevious,\n MatStepHeader,\n MatStepperIcon,\n MatStepContent,\n ],\n providers: [MAT_STEPPER_INTL_PROVIDER, ErrorStateMatcher],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MAT_STEPPER_INTL_PROVIDER, MAT_STEPPER_INTL_PROVIDER_FACTORY, MatStep, MatStepContent, MatStepHeader, MatStepLabel, MatStepper, MatStepperIcon, MatStepperIntl, MatStepperModule, MatStepperNext, MatStepperPrevious, matStepperAnimations };\n","import * as i0 from '@angular/core';\nimport { Directive, Component, ChangeDetectionStrategy, ViewEncapsulation, Inject, ContentChildren, NgModule } from '@angular/core';\nimport { mixinColor, MatCommonModule } from '@angular/material/core';\nimport * as i1 from '@angular/cdk/platform';\nimport { DOCUMENT } from '@angular/common';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n// Boilerplate for applying mixins to MatToolbar.\n/** @docs-private */\nconst _MatToolbarBase = mixinColor(class {\n constructor(_elementRef) {\n this._elementRef = _elementRef;\n }\n});\nclass MatToolbarRow {\n}\nMatToolbarRow.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatToolbarRow, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nMatToolbarRow.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatToolbarRow, selector: \"mat-toolbar-row\", host: { classAttribute: \"mat-toolbar-row\" }, exportAs: [\"matToolbarRow\"], ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatToolbarRow, decorators: [{\n type: Directive,\n args: [{\n selector: 'mat-toolbar-row',\n exportAs: 'matToolbarRow',\n host: { 'class': 'mat-toolbar-row' },\n }]\n }] });\nclass MatToolbar extends _MatToolbarBase {\n constructor(elementRef, _platform, document) {\n super(elementRef);\n this._platform = _platform;\n // TODO: make the document a required param when doing breaking changes.\n this._document = document;\n }\n ngAfterViewInit() {\n if (this._platform.isBrowser) {\n this._checkToolbarMixedModes();\n this._toolbarRows.changes.subscribe(() => this._checkToolbarMixedModes());\n }\n }\n /**\n * Throws an exception when developers are attempting to combine the different toolbar row modes.\n */\n _checkToolbarMixedModes() {\n if (this._toolbarRows.length && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n // Check if there are any other DOM nodes that can display content but aren't inside of\n // a element.\n const isCombinedUsage = Array.from(this._elementRef.nativeElement.childNodes)\n .filter(node => !(node.classList && node.classList.contains('mat-toolbar-row')))\n .filter(node => node.nodeType !== (this._document ? this._document.COMMENT_NODE : 8))\n .some(node => !!(node.textContent && node.textContent.trim()));\n if (isCombinedUsage) {\n throwToolbarMixedModesError();\n }\n }\n }\n}\nMatToolbar.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatToolbar, deps: [{ token: i0.ElementRef }, { token: i1.Platform }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component });\nMatToolbar.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatToolbar, selector: \"mat-toolbar\", inputs: { color: \"color\" }, host: { properties: { \"class.mat-toolbar-multiple-rows\": \"_toolbarRows.length > 0\", \"class.mat-toolbar-single-row\": \"_toolbarRows.length === 0\" }, classAttribute: \"mat-toolbar\" }, queries: [{ propertyName: \"_toolbarRows\", predicate: MatToolbarRow, descendants: true }], exportAs: [\"matToolbar\"], usesInheritance: true, ngImport: i0, template: \"\\n\\n\", styles: [\".cdk-high-contrast-active .mat-toolbar{outline:solid 1px}.mat-toolbar-row,.mat-toolbar-single-row{display:flex;box-sizing:border-box;padding:0 16px;width:100%;flex-direction:row;align-items:center;white-space:nowrap}.mat-toolbar-multiple-rows{display:flex;box-sizing:border-box;flex-direction:column;width:100%}\"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatToolbar, decorators: [{\n type: Component,\n args: [{ selector: 'mat-toolbar', exportAs: 'matToolbar', inputs: ['color'], host: {\n 'class': 'mat-toolbar',\n '[class.mat-toolbar-multiple-rows]': '_toolbarRows.length > 0',\n '[class.mat-toolbar-single-row]': '_toolbarRows.length === 0',\n }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: \"\\n\\n\", styles: [\".cdk-high-contrast-active .mat-toolbar{outline:solid 1px}.mat-toolbar-row,.mat-toolbar-single-row{display:flex;box-sizing:border-box;padding:0 16px;width:100%;flex-direction:row;align-items:center;white-space:nowrap}.mat-toolbar-multiple-rows{display:flex;box-sizing:border-box;flex-direction:column;width:100%}\"] }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.Platform }, { type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }]; }, propDecorators: { _toolbarRows: [{\n type: ContentChildren,\n args: [MatToolbarRow, { descendants: true }]\n }] } });\n/**\n * Throws an exception when attempting to combine the different toolbar row modes.\n * @docs-private\n */\nfunction throwToolbarMixedModesError() {\n throw Error('MatToolbar: Attempting to combine different toolbar modes. ' +\n 'Either specify multiple `` elements explicitly or just place content ' +\n 'inside of a `` for a single row.');\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatToolbarModule {\n}\nMatToolbarModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatToolbarModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nMatToolbarModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.2.0\", ngImport: i0, type: MatToolbarModule, declarations: [MatToolbar, MatToolbarRow], imports: [MatCommonModule], exports: [MatToolbar, MatToolbarRow, MatCommonModule] });\nMatToolbarModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatToolbarModule, imports: [MatCommonModule, MatCommonModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatToolbarModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [MatCommonModule],\n exports: [MatToolbar, MatToolbarRow, MatCommonModule],\n declarations: [MatToolbar, MatToolbarRow],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MatToolbar, MatToolbarModule, MatToolbarRow, throwToolbarMixedModesError };\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { IdleTimeComponent } from './idle-time.component';\n\n@NgModule({\n declarations: [IdleTimeComponent],\n exports: [IdleTimeComponent],\n imports: [CommonModule],\n})\nexport class IdleTimeModule {}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\n\nimport { PipesModule } from '@shared/pipes/pipes.module';\nimport { IconComponent } from '@ui-components/components/icon/icon.component';\nimport { PillListModule } from '@ui-components/components/pill-list/pill-list.module';\n\nimport { NotificationRingItemComponent } from './notification-ring-item.component';\n\n@NgModule({\n declarations: [NotificationRingItemComponent],\n imports: [\n CommonModule,\n IconComponent,\n PipesModule,\n PillListModule,\n MatButtonModule,\n MatIconModule,\n MatProgressSpinnerModule,\n ],\n exports: [NotificationRingItemComponent],\n})\nexport class NotificationRingItemModule {}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatMenuModule } from '@angular/material/menu';\n\nimport { PipesModule } from '@shared/pipes/pipes.module';\nimport { IconComponent } from '@ui-components/components/icon/icon.component';\nimport { NotificationRingItemModule } from '@ui-components/components/notification-ring/components/notification-ring-item/notification-ring-item.module';\n\nimport { NotificationRingComponent } from './notification-ring.component';\n\n@NgModule({\n declarations: [NotificationRingComponent],\n imports: [\n CommonModule,\n IconComponent,\n MatMenuModule,\n MatCheckboxModule,\n ReactiveFormsModule,\n NotificationRingItemModule,\n PipesModule,\n MatButtonModule,\n ],\n exports: [NotificationRingComponent],\n})\nexport class NotificationRingModule {}\n","import { BehaviorSubject, Observable } from 'rxjs';\n\nexport class SidePanelService {\n isSidePanelExpanded$: Observable;\n private isSidePanelExpanded = true;\n private isSidePanelExpandedSubject = new BehaviorSubject(this.isSidePanelExpanded);\n\n constructor() {\n this.isSidePanelExpanded$ = this.isSidePanelExpandedSubject.asObservable();\n }\n\n toggleSidePanel() {\n this.isSidePanelExpanded = !this.isSidePanelExpanded;\n this.isSidePanelExpandedSubject.next(this.isSidePanelExpanded);\n }\n}\n","import * as i0 from '@angular/core';\nimport { PLATFORM_ID, Injectable, Inject } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Created by ahsanayaz on 08/11/2016.\n */\nconst GENERAL = {\n UKNOWN: 'Unknown',\n};\nconst BROWSERS = {\n CHROME: 'Chrome',\n FIREFOX: 'Firefox',\n SAFARI: 'Safari',\n OPERA: 'Opera',\n IE: 'IE',\n MS_EDGE: 'MS-Edge',\n MS_EDGE_CHROMIUM: 'MS-Edge-Chromium',\n FB_MESSANGER: 'FB-Messanger',\n SAMSUNG: 'Samsung',\n UCBROWSER: 'UC-Browser',\n UNKNOWN: GENERAL.UKNOWN,\n};\nconst MOBILES_RE = {\n // tslint:disable-next-line:max-line-length\n HTC: /HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\\bEVO\\b|T-Mobile G1|Z520m|Android [0-9.]+; Pixel/,\n NEXUS_PHONE: /Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6/,\n DELL: /Dell[;]? (Streak|Aero|Venue|Venue Pro|Flash|Smoke|Mini 3iX)|XCD28|XCD35|\\b001DL\\b|\\b101DL\\b|\\bGS01\\b/,\n MOTOROLA: new RegExp(`Motorola|DROIDX|DROID BIONIC|\\\\bDroid\\\\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|\n A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|\n MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|\n ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|\n WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|\n XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|\n XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\\\\bMoto E\\\\b|XT1068|XT1092|XT1052`),\n SAMSUNG: new RegExp(`\\\\bSamsung\\\\b|SM-G950F|SM-G955F|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|\n GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|\n GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|\n GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|\n GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|\n GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|\n GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|\n GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|\n GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|\n GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|\n GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|\n GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|\n GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|\n GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|\n GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|\n GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|\n GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|\n GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|\n SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|\n SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|\n SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|\n SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|\n SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|\n SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|\n SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|\n SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|\n SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|\n SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|\n SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|\n SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|\n SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|\n SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|\n SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|\n SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|\n SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|\n SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|\n SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|\n SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|\n SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|\n SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|\n SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|\n SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|\n SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|\n SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|\n SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|\n SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|\n SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|\n SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|\n SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|\n GT-N7105|SCH-I535|SM-N900A|SM-N900T|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|\n GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|\n GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|\n SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|\n SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F|SM-G920F|SM-G920V|SM-G930F|\n SM-N910C|SM-A310F|GT-I9190|SM-J500FN|SM-G903F|SM-J330F`),\n LG: new RegExp(`\\\\bLG\\\\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|\n LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|\n C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|\n LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|\n VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|\n MS323|M257)`),\n SONY: /SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533/,\n ASUS: /Asus.*Galaxy|PadFone.*Mobile/,\n NOKIA_LUMIA: /Lumia [0-9]{3,4}/,\n MICROMAX: /Micromax.*\\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\\b/,\n PALM: /PalmSource|Palm/,\n VERTU: /Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature/,\n PANTECH: new RegExp(`PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|\n IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|\n IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|\n CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|\n P2000|P7040|P7000|C790`),\n FLY: /IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250/,\n WIKO: new RegExp(`KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|\n SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|\n CINK KING|CINK PEAX|CINK SLIM|SUBLIM`),\n I_MOBILE: /i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)/,\n SIMVALLEY: /\\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\\b/,\n WOLFGANG: /AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q/,\n ALCATEL: /Alcatel|Mobile; rv:49.0|Mobile; ALCATEL 4052R; rv:48.0/,\n NINTENDO: /Nintendo (3DS|Switch)/,\n AMOI: /Amoi/,\n INQ: /INQ/,\n VITA: /\\bVita\\b/,\n BLACKBERRY: /\\bBlackBerry\\b|\\bBB10\\b|rim[0-9]+/,\n FIREFOX_OS: /\\bFirefox-OS\\b/,\n IPHONE: /\\biPhone\\b/,\n iPod: /\\biPod\\b/,\n ANDROID: /\\bAndroid\\b/,\n WINDOWS_PHONE: /\\bWindows-Phone\\b/,\n GENERIC_PHONE: new RegExp(`Tapatalk|PDA;|SAGEM|\\\\bmmp\\\\b|pocket|\\\\bpsp\\\\b|symbian|Smartphone|smartfon|treo|up.browser|\n up.link|vodafone|\\\\bwap\\\\b|nokia|Nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser`),\n};\nconst TABLETS_RE = {\n iPad: /iPad|iPad.*Mobile/,\n NexusTablet: /Android.*Nexus[\\s]+(7|9|10)/,\n GoogleTablet: /Android.*Pixel C/,\n SamsungTablet: new RegExp(`SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|\n GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|\n SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|\n GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|\n SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|\n GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|\n SHV-E230S|SHW-M180K|SHW-M180L|SM-T865|SM-T290|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|\n SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|\n GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T385M|SM-P585M|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|\n SM-P601|SM-P605|SM-P615|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|\n GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|\n SM-T510|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|\n SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T500|SM-T330|\n SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|\n SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-T116BU|SM-P550|\n SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|\n SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|\n SM-T719|SM-T725|SM-T813|SM-T819|SM-T580|SM-T590|SM-T355Y?|SM-T280|SM-T817A|SM-T820|SM-W700|SM-P580|SM-T587|SM-P350|\n SM-P555M|SM-P355M|SM-T113NU|SM-T815Y|SM-T585|SM-T285|SM-T825|SM-W708|SM-T835|SM-P585Y|SM-X200`),\n Kindle: new RegExp(`Kindle|Silk.*Accelerated|Android.*\\\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|\n KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI|KFFOWI|KFGIWI|KFMEWI)\\\\b|Android.*Silk\\/[0-9.]+ like Chrome\\\n /[0-9.]+ (?!Mobile)`),\n SurfaceTablet: /Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)/,\n HPTablet: /HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10/,\n AsusTablet: new RegExp(`^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|\n TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|\n Slider SL101|\\\\bK00F\\\\b|\\\\bK00C\\\\b|\\\\bK00E\\\\b|\\\\bK00L\\\\b|TX201LA|ME176C|ME102A|\\\\bM80TA\\\\b|ME372CL|\n ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\\\\bME70C\\\\b|ME581C|\n ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z|\\\\bP027\\\\b|\\\\bP024\\\\b|\\\\bP00C\\\\b`),\n BlackBerryTablet: /PlayBook|RIM Tablet/,\n HTCtablet: /HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410/,\n MotorolaTablet: /xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617/,\n NookTablet: /Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2/,\n AcerTablet: new RegExp(`Android.*; \\\\b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|\n W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\\\\b|W3-810|\\\\bA3-A10\\\\b|\\\\bA3-A11\\\\b|\n \\\\bA3-A20\\\\b|\\\\bA3-A30`),\n ToshibaTablet: /Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO/,\n LGTablet: /\\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\\b/,\n FujitsuTablet: /Android.*\\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\\b/,\n PrestigioTablet: new RegExp(`PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|\n PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|\n PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|\n PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|\n PMT5887|PMT5001|PMT5002`),\n LenovoTablet: new RegExp(`Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-850M|YT3-X90L|YT3-X90F|\n YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|\n B8000|B8080)(-|)(FL|F|HV|H|)|TB-X606F|TB-X103F|TB-X304F|TB-X304L|TB-X704F|TB-8703F|Tab2A7-10F|TB2-X30L|TB-8504F`),\n DellTablet: /Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7/,\n YarvikTablet: new RegExp(`Android.*\\\\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|\n TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|\n TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|\n TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|\n TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\\\\b`),\n MedionTablet: /Android.*\\bOYO\\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB/,\n ArnovaTablet: /97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2/,\n IntensoTablet: /INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004/,\n IRUTablet: /M702pro/,\n MegafonTablet: /MegaFon V9|\\bZTE V9\\b|Android.*\\bMT7A\\b/,\n EbodaTablet: /E-Boda (Supreme|Impresspeed|Izzycomm|Essential)/,\n AllViewTablet: /Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)/,\n ArchosTablet: new RegExp(`\\\\b(101G9|80G9|A101IT)\\\\b|Qilive 97R|Archos5|\\\\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|c|)(G10|\n Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\\\\b`),\n AinolTablet: /NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark/,\n NokiaLumiaTablet: /Lumia 2520/,\n SonyTablet: new RegExp(`Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|\n SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|\n EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP641|SGP612|SOT31|SGP771|SGP611|\n SGP612|SGP712`),\n PhilipsTablet: /\\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\\b/,\n CubeTablet: /Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT/,\n CobyTablet: new RegExp(`MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|\n MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010`),\n MIDTablet: new RegExp(`M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|\n MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|\n MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10`),\n MSITablet: new RegExp(`MSI \\\\b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|\n Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\\\\b`),\n SMiTTablet: /Android.*(\\bMID\\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)/,\n RockChipTablet: /Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A/,\n FlyTablet: /IQ310|Fly Vision/,\n bqTablet: new RegExp(`Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|\n Livingstone|Cervantes|Avant|Aquaris ([E|M]10|M8))|Maxwell.*Lite|Maxwell.*Plus`),\n HuaweiTablet: new RegExp(`MediaPad|MediaPad 7 Youth|MediaPad T3 10|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|\n S7-201|S7-Slim|M2-A01L|BAH-L09|BAH-W09|AGS-W09`),\n NecTablet: /\\bN-06D|\\bN-08D/,\n PantechTablet: /Pantech.*P4100/,\n BronchoTablet: /Broncho.*(N701|N708|N802|a710)/,\n VersusTablet: /TOUCHPAD.*[78910]|\\bTOUCHTAB\\b/,\n ZyncTablet: /z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900/,\n PositivoTablet: /TB07STA|TB10STA|TB07FTA|TB10FTA/,\n NabiTablet: /Android.*\\bNabi/,\n KoboTablet: /Kobo Touch|\\bK080\\b|\\bVox\\b Build|\\bArc\\b Build/,\n DanewTablet: /DSlide.*\\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\\b/,\n TexetTablet: new RegExp(`NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|\n TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|\n TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|\n TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|\n TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|\n TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|\n TB-436|TB-416|TB-146SE|TB-126SE`),\n PlaystationTablet: /Playstation.*(Portable|Vita)/,\n TrekstorTablet: /ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab/,\n PyleAudioTablet: /\\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\\b/,\n AdvanTablet: new RegExp(`Android.* \\\\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|\n T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\\\b`),\n DanyTechTablet: `Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|\n Genius TAB GII|Genius TAB GIII|Genius Tab S1`,\n GalapadTablet: /Android.*\\bG1\\b(?!\\))/,\n MicromaxTablet: /Funbook|Micromax.*\\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\\b/,\n KarbonnTablet: /Android.*\\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\\b/,\n AllFineTablet: /Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide/,\n PROSCANTablet: new RegExp(`\\\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|\n PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|\n PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|\n PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\\\b`),\n YONESTablet: /BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026/,\n ChangJiaTablet: new RegExp(`TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|\n TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|\n TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|\n TPC10111|TPC10203|TPC10205|TPC10503`),\n GUTablet: /TX-A1301|TX-M9002|Q702|kf026/,\n PointOfViewTablet: new RegExp(`TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|\n TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|\n TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|\n TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10`),\n OvermaxTablet: new RegExp(`OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|\n MagicTab|Stream|TB-08|TB-09)|Qualcore 1027`),\n HCLTablet: /HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync/,\n DPSTablet: /DPS Dream 9|DPS Dual 7/,\n VistureTablet: /V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10/,\n CrestaTablet: /CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989/,\n MediatekTablet: /\\bMT8125|MT8389|MT8135|MT8377\\b/,\n ConcordeTablet: /Concorde([ ]+)?Tab|ConCorde ReadMan/,\n GoCleverTablet: new RegExp(`GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|\n TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|\n GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|\n TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|\n TAB R104|TAB R83.3|TAB A1042`),\n ModecomTablet: new RegExp(`FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|\n FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|\n FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003`),\n VoninoTablet: new RegExp(`\\\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|\n Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|\n Primus[ _]?QS|Android.*\\\\bQ8\\\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\\\b`),\n ECSTablet: /V07OT2|TM105A|S10OT1|TR10CS1/,\n StorexTablet: /eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab/,\n VodafoneTablet: /SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497/,\n EssentielBTablet: /Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2/,\n RossMoorTablet: /RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711/,\n iMobileTablet: /i-mobile i-note/,\n TolinoTablet: /tolino tab [0-9.]+|tolino shine/,\n AudioSonicTablet: /\\bC-22Q|T7-QC|T-17B|T-17P\\b/,\n AMPETablet: /Android.* A78 /,\n SkkTablet: /Android.* (SKYPAD|PHOENIX|CYCLOPS)/,\n TecnoTablet: /TECNO P9|TECNO DP8D/,\n JXDTablet: new RegExp(`Android.* \\\\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|\n S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|\n P1000|P300|S18|S6600|S9100)\\\\b`),\n iJoyTablet: new RegExp(`Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|\n Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|\n Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|\n Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|\n Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)`),\n FX2Tablet: /FX2 PAD7|FX2 PAD10/,\n XoroTablet: new RegExp(`KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|\n PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|\n PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|\n TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151`),\n ViewsonicTablet: /ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a/,\n VerizonTablet: /QTAQZ3|QTAIR7|QTAQTZ3|QTASUN1|QTASUN2|QTAXIA1/,\n OdysTablet: /LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\\bXELIO\\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10/,\n CaptivaTablet: /CAPTIVA PAD/,\n IconbitTablet: new RegExp(`NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|\n NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S`),\n TeclastTablet: new RegExp(`T98 4G|\\\\bP80\\\\b|\\\\bX90HD\\\\b|X98 Air|X98 Air 3G|\\\\bX89\\\\b|P80 3G|\\\\bX80h\\\\b|P98 Air|\n \\\\bX89HD\\\\b|P98 3G|\\\\bP90HD\\\\b|P89 3G|X98 3G|\\\\bP70h\\\\b|P79HD 3G|G18d 3G|\\\\bP79HD\\\\b|\\\\bP89s\\\\b|\\\\bA88\\\\b|\n \\\\bP10HD\\\\b|\\\\bP19HD\\\\b|G18 3G|\\\\bP78HD\\\\b|\\\\bA78\\\\b|\\\\bP75\\\\b|G17s 3G|G17h 3G|\\\\bP85t\\\\b|\\\\bP90\\\\b|\n \\\\bP11\\\\b|\\\\bP98t\\\\b|\\\\bP98HD\\\\b|\\\\bG18d\\\\b|\\\\bP85s\\\\b|\\\\bP11HD\\\\b|\\\\bP88s\\\\b|\\\\bA80HD\\\\b|\\\\bA80se\\\\b|\n \\\\bA10h\\\\b|\\\\bP89\\\\b|\\\\bP78s\\\\b|\\\\bG18\\\\b|\\\\bP85\\\\b|\\\\bA70h\\\\b|\\\\bA70\\\\b|\\\\bG17\\\\b|\\\\bP18\\\\b|\\\\bA80s\\\\b|\n \\\\bA11s\\\\b|\\\\bP88HD\\\\b|\\\\bA80h\\\\b|\\\\bP76s\\\\b|\\\\bP76h\\\\b|\\\\bP98\\\\b|\\\\bA10HD\\\\b|\\\\bP78\\\\b|\\\\bP88\\\\b|\\\\bA11\\\\b|\n \\\\bA10t\\\\b|\\\\bP76a\\\\b|\\\\bP76t\\\\b|\\\\bP76e\\\\b|\\\\bP85HD\\\\b|\\\\bP85a\\\\b|\\\\bP86\\\\b|\\\\bP75HD\\\\b|\\\\bP76v\\\\b|\\\\bA12\\\\b|\n \\\\bP75a\\\\b|\\\\bA15\\\\b|\\\\bP76Ti\\\\b|\\\\bP81HD\\\\b|\\\\bA10\\\\b|\\\\bT760VE\\\\b|\\\\bT720HD\\\\b|\\\\bP76\\\\b|\\\\bP73\\\\b|\\\\bP71\\\\b|\n \\\\bP72\\\\b|\\\\bT720SE\\\\b|\\\\bC520Ti\\\\b|\\\\bT760\\\\b|\\\\bT720VE\\\\b|T720-3GE|T720-WiFi`),\n OndaTablet: new RegExp(`\\\\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|\n V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|\n V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|\n Vi40)\\\\b[\\s]+|V10 \\\\b4G\\\\b`),\n JaytechTablet: /TPC-PA762/,\n BlaupunktTablet: /Endeavour 800NG|Endeavour 1010/,\n DigmaTablet: /\\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\\b/,\n EvolioTablet: /ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\\bEvotab\\b|\\bNeura\\b/,\n LavaTablet: /QPAD E704|\\bIvoryS\\b|E-TAB IVORY|\\bE-TAB\\b/,\n AocTablet: /MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712/,\n MpmanTablet: new RegExp(`MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\n \\\\bMPG7\\\\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|\n MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010`),\n CelkonTablet: /CT695|CT888|CT[\\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\\bCT-1\\b/,\n WolderTablet: new RegExp(`miTab \\\\b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|\n POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|\n FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\\\\b`),\n MediacomTablet: 'M-MPI10C3G|M-SP10EG|M-SP10EGP|M-SP10HXAH|M-SP7HXAH|M-SP10HXBH|M-SP8HXAH|M-SP8MXA',\n MiTablet: /\\bMI PAD\\b|\\bHM NOTE 1W\\b/,\n NibiruTablet: /Nibiru M1|Nibiru Jupiter One/,\n NexoTablet: /NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI/,\n LeaderTablet: new RegExp(`TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|\n TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100`),\n UbislateTablet: /UbiSlate[\\s]?7C/,\n PocketBookTablet: /Pocketbook/,\n KocasoTablet: /\\b(TB-1207)\\b/,\n HisenseTablet: /\\b(F5281|E2371)\\b/,\n Hudl: /Hudl HT7S3|Hudl 2/,\n TelstraTablet: /T-Hub2/,\n Honeywell: /RT10A/,\n GenericTablet: new RegExp(`Android.*\\\\b97D\\\\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\\\\bA7EB\\\\b|CatNova8|\n A1_07|CT704|CT1002|\\\\bM721\\\\b|rk30sdk|\\\\bEVOTAB\\\\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|\n Tablet-PC-4|Tagi Tab|\\\\bM6pro\\\\b|CT1020W|arc 10HD|\\\\bTP750\\\\b|\\\\bQTAQZ3\\\\b|WVT101|TM1088|KT107`),\n};\nconst DEVICES = {\n BLACKBERRY: 'Blackberry',\n FIREFOX_OS: 'Firefox-OS',\n CHROME_BOOK: 'Chrome-Book',\n WINDOWS_PHONE: 'Windows-Phone',\n VITA: 'Vita',\n PS4: 'PS4',\n MAC: 'Macintosh',\n CHROMECAST: 'Chromecast',\n APPLE_TV: 'Apple-TV',\n GOOGLE_TV: 'Google-TV',\n ANDROID: 'Android',\n Tesla: 'Tesla',\n iPad: 'iPad',\n IPHONE: 'iPhone',\n iPod: 'iPod',\n UNKNOWN: GENERAL.UKNOWN,\n HTC: 'HTC',\n NEXUS_PHONE: 'Nexus Phone',\n NexusTablet: 'Nexus Tablet',\n DELL: 'Dell',\n MOTOROLA: 'Motorola',\n SAMSUNG: 'Samsung',\n LG: 'LG',\n SONY: 'Sony',\n ASUS: 'Asus',\n NOKIA_LUMIA: 'Nokia Lumia',\n MICROMAX: 'Micromax',\n PALM: 'Palm',\n VERTU: 'Vertu',\n PANTECH: 'PANTECH',\n FLY: 'Fly',\n WIKO: `WIKO`,\n I_MOBILE: 'i-mobile',\n SIMVALLEY: 'Simvalley',\n WOLFGANG: 'Wolfgang',\n ALCATEL: 'Alcatel',\n HONEYWELL: 'Honeywell',\n NINTENDO: 'Nintendo',\n AMOI: 'Amoi',\n INQ: 'INQ',\n GENERIC_PHONE: 'Generic Phone',\n MI_SE_9: 'Mi SE 9',\n};\nconst DESKTOP_DEVICES = [\n DEVICES.PS4,\n DEVICES.CHROME_BOOK,\n DEVICES.MAC,\n DEVICES.DELL,\n DEVICES.ASUS,\n DEVICES.UNKNOWN,\n];\nconst OS = {\n WINDOWS: 'Windows',\n MAC: 'Mac',\n IOS: 'iOS',\n ANDROID: 'Android',\n LINUX: 'Linux',\n UNIX: 'Unix',\n FIREFOX_OS: 'Firefox-OS',\n CHROME_OS: 'Chrome-OS',\n WINDOWS_PHONE: 'Windows-Phone',\n UNKNOWN: GENERAL.UKNOWN,\n};\nconst OS_VERSIONS = {\n WINDOWS_3_11: 'windows-3-11',\n WINDOWS_95: 'windows-95',\n WINDOWS_ME: 'windows-me',\n WINDOWS_98: 'windows-98',\n WINDOWS_CE: 'windows-ce',\n WINDOWS_2000: 'windows-2000',\n WINDOWS_XP: 'windows-xp',\n WINDOWS_SERVER_2003: 'windows-server-2003',\n WINDOWS_VISTA: 'windows-vista',\n WINDOWS_7: 'windows-7',\n WINDOWS_8_1: 'windows-8-1',\n WINDOWS_8: 'windows-8',\n WINDOWS_10: 'windows-10',\n WINDOWS_PHONE_7_5: 'windows-phone-7-5',\n WINDOWS_PHONE_8_1: 'windows-phone-8-1',\n WINDOWS_PHONE_10: 'windows-phone-10',\n WINDOWS_NT_4_0: 'windows-nt-4-0',\n MACOSX_11_0: 'mac-os-x-11-0',\n MACOSX_16: 'mac-os-x-16',\n MACOSX_15: 'mac-os-x-15',\n MACOSX_14: 'mac-os-x-14',\n MACOSX_13: 'mac-os-x-13',\n MACOSX_12: 'mac-os-x-12',\n MACOSX_11: 'mac-os-x-11',\n MACOSX_10: 'mac-os-x-10',\n MACOSX_9: 'mac-os-x-9',\n MACOSX_8: 'mac-os-x-8',\n MACOSX_7: 'mac-os-x-7',\n MACOSX_6: 'mac-os-x-6',\n MACOSX_5: 'mac-os-x-5',\n MACOSX_4: 'mac-os-x-4',\n MACOSX_3: 'mac-os-x-3',\n MACOSX_2: 'mac-os-x-2',\n MACOSX: 'mac-os-x',\n iOS: 'iOS',\n ANDROID_9: 'android-9',\n UNKNOWN: GENERAL.UKNOWN.toLowerCase(),\n};\nconst OS_RE = {\n WINDOWS: {\n and: [{ or: [/\\bWindows|(Win\\d\\d)\\b/, /\\bWin 9x\\b/] }, { not: /\\bWindows Phone\\b/ }],\n },\n MAC: {\n and: [/\\bMac OS\\b/, { not: { or: [/\\biPhone\\b/, /\\biPad\\b/, /\\biPod\\b/, /\\bWindows Phone\\b/] } }],\n },\n IOS: {\n and: [{ or: [/\\biPad\\b/, /\\biPhone\\b/, /\\biPod\\b/] }, { not: /\\bWindows Phone\\b/ }],\n },\n ANDROID: { and: [/\\bAndroid\\b/, { not: /\\bWindows Phone\\b/ }] },\n LINUX: /\\bLinux\\b/,\n UNIX: /\\bUNIX\\b/,\n FIREFOX_OS: { and: [/\\bFirefox\\b/, /Mobile\\b/] },\n CHROME_OS: /\\bCrOS\\b/,\n WINDOWS_PHONE: { or: [/\\bIEMobile\\b/, /\\bWindows Phone\\b/] },\n PS4: /\\bMozilla\\/5.0 \\(PlayStation 4\\b/,\n VITA: /\\bMozilla\\/5.0 \\(Play(S|s)tation Vita\\b/,\n};\nconst BROWSERS_RE = {\n CHROME: {\n and: [\n { or: [/\\bChrome\\b/, /\\bCriOS\\b/, /\\bHeadlessChrome\\b/] },\n {\n not: {\n or: [/\\bOPR\\b/, /\\bEdg(e|A|iOS)\\b/, /\\bEdg\\/\\b/, /\\bSamsungBrowser\\b/, /\\bUCBrowser\\b/],\n },\n },\n ],\n },\n FIREFOX: { or: [/\\bFirefox\\b/, /\\bFxiOS\\b/] },\n SAFARI: {\n and: [\n /^((?!CriOS).)*\\Safari\\b.*$/,\n {\n not: {\n or: [/\\bOPR\\b/, /\\bEdg(e|A|iOS)\\b/, /\\bEdg\\/\\b/, /\\bWindows Phone\\b/, /\\bSamsungBrowser\\b/, /\\bUCBrowser\\b/],\n },\n },\n ],\n },\n OPERA: { or: [/Opera\\b/, /\\bOPR\\b/] },\n IE: {\n or: [/\\bMSIE\\b/, /\\bTrident\\b/, /^Mozilla\\/5\\.0 \\(Windows NT 10\\.0; Win64; x64\\)$/],\n },\n MS_EDGE: { or: [/\\bEdg(e|A|iOS)\\b/] },\n MS_EDGE_CHROMIUM: /\\bEdg\\/\\b/,\n PS4: /\\bMozilla\\/5.0 \\(PlayStation 4\\b/,\n VITA: /\\bMozilla\\/5.0 \\(Play(S|s)tation Vita\\b/,\n FB_MESSANGER: /\\bFBAN\\/MessengerForiOS\\b/,\n SAMSUNG: /\\bSamsungBrowser\\b/,\n UCBROWSER: /\\bUCBrowser\\b/,\n};\nconst DEVICES_RE = {\n ...MOBILES_RE,\n ...TABLETS_RE,\n ...OS_RE,\n FIREFOX_OS: { and: [/\\bFirefox\\b/, /\\bMobile\\b/] },\n CHROME_BOOK: /\\bCrOS\\b/,\n PS4: /\\bMozilla\\/5.0 \\(PlayStation 4\\b/,\n CHROMECAST: /\\bCrKey\\b/,\n APPLE_TV: /^iTunes-AppleTV\\/4.1$/,\n GOOGLE_TV: /\\bGoogleTV\\b/,\n Tesla: /Tesla\\/([0-9]{4}.[0-9]{1,2}.?[0-9]{0,2}.?[0-9]{0,2})-(.{7})/,\n MI_SE_9: /\\bXiaomi\\b/,\n MAC: {\n and: [/\\bMac OS\\b/, { not: { or: [/\\biPhone\\b/, /\\biPad\\b/, /\\biPod\\b/, /\\bWindows Phone\\b/] } }],\n },\n};\nconst OS_VERSIONS_RE_MAP = {\n WINDOWS_3_11: /Win16/,\n WINDOWS_95: /(Windows 95|Win95|Windows_95)/,\n WINDOWS_ME: /(Win 9x 4.90|Windows ME)/,\n WINDOWS_98: /(Windows 98|Win98)/,\n WINDOWS_CE: /Windows CE/,\n WINDOWS_2000: /(Windows NT 5.0|Windows 2000)/,\n WINDOWS_XP: /(Windows NT 5.1|Windows XP)/,\n WINDOWS_SERVER_2003: /Windows NT 5.2/,\n WINDOWS_VISTA: /Windows NT 6.0/,\n WINDOWS_7: /(Windows 7|Windows NT 6.1)/,\n WINDOWS_8_1: /(Windows 8.1|Windows NT 6.3)/,\n WINDOWS_8: /(Windows 8|Windows NT 6.2)/,\n WINDOWS_10: /(Windows NT 10.0)/,\n WINDOWS_PHONE_7_5: /(Windows Phone OS 7.5)/,\n WINDOWS_PHONE_8_1: /(Windows Phone 8.1)/,\n WINDOWS_PHONE_10: /(Windows Phone 10)/,\n WINDOWS_NT_4_0: {\n and: [/(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/, { not: /Windows NT 10.0/ }],\n },\n MACOSX: /(MAC OS X\\s*[^ 0-9])/,\n MACOSX_3: /(Darwin 10.3|Mac OS X 10.3)/,\n MACOSX_4: /(Darwin 10.4|Mac OS X 10.4)/,\n MACOSX_5: /(Mac OS X 10.5)/,\n MACOSX_6: /(Mac OS X 10.6)/,\n MACOSX_7: /(Mac OS X 10.7)/,\n MACOSX_8: /(Mac OS X 10.8)/,\n MACOSX_9: /(Mac OS X 10.9)/,\n MACOSX_10: /(Mac OS X 10.10)/,\n MACOSX_11: /(Mac OS X 10.11)/,\n MACOSX_12: /(Mac OS X 10.12)/,\n MACOSX_13: /(Mac OS X 10.13)/,\n MACOSX_14: /(Mac OS X 10.14)/,\n MACOSX_15: /(Mac OS X 10.15)/,\n MACOSX_16: /(Mac OS X 10.16)/,\n MACOSX_11_0: {\n or: [/11_0 like Mac OS X/, /Mac OS X 11/],\n },\n iOS: /(iPhone OS\\s*[0-9_]+)/,\n ANDROID_9: /(Android 9)/,\n};\nconst BROWSER_VERSIONS_RE_MAP = {\n CHROME: [/\\bChrome\\/([\\d\\.]+)\\b/, /\\bCriOS\\/([\\d\\.]+)\\b/, /\\bHeadlessChrome\\/([\\d\\.]+)\\b/],\n FIREFOX: [/\\bFirefox\\/([\\d\\.]+)\\b/, /\\bFxiOS\\/([\\d\\.]+)\\b/],\n SAFARI: [/\\bVersion\\/([\\d\\.]+)\\b/, /\\bSafari\\/([\\d\\.]+)\\b/],\n OPERA: [/\\bVersion\\/([\\d\\.]+)\\b/, /\\bOPR\\/([\\d\\.]+)\\b/],\n IE: [/\\bMSIE ([\\d\\.]+\\w?)\\b/, /\\brv:([\\d\\.]+\\w?)\\b/],\n MS_EDGE: /\\bEdg(?:e|A|iOS)\\/([\\d\\.]+)\\b/,\n MS_EDGE_CHROMIUM: /\\bEdg\\/([\\d\\.]+)\\b/,\n SAMSUNG: /\\bSamsungBrowser\\/([\\d\\.]+)\\b/,\n UCBROWSER: /\\bUCBrowser\\/([\\d\\.]+)\\b/,\n};\nconst OS_VERSIONS_RE = Object.keys(OS_VERSIONS_RE_MAP).reduce((obj, key) => {\n obj[key] = OS_VERSIONS_RE_MAP[key];\n return obj;\n}, {});\nconst BROWSER_VERSIONS_RE = Object.keys(BROWSER_VERSIONS_RE_MAP).reduce((obj, key) => {\n obj[BROWSERS[key]] = BROWSER_VERSIONS_RE_MAP[key];\n return obj;\n}, {});\n\nvar Constants = /*#__PURE__*/Object.freeze({\n __proto__: null,\n GENERAL: GENERAL,\n BROWSERS: BROWSERS,\n MOBILES_RE: MOBILES_RE,\n TABLETS_RE: TABLETS_RE,\n DEVICES: DEVICES,\n DESKTOP_DEVICES: DESKTOP_DEVICES,\n OS: OS,\n OS_VERSIONS: OS_VERSIONS,\n OS_RE: OS_RE,\n BROWSERS_RE: BROWSERS_RE,\n DEVICES_RE: DEVICES_RE,\n OS_VERSIONS_RE_MAP: OS_VERSIONS_RE_MAP,\n BROWSER_VERSIONS_RE_MAP: BROWSER_VERSIONS_RE_MAP,\n OS_VERSIONS_RE: OS_VERSIONS_RE,\n BROWSER_VERSIONS_RE: BROWSER_VERSIONS_RE\n});\n\n/**\n * Created by ahsanayaz on 08/11/2016.\n */\nclass ReTree {\n constructor() { }\n test(str, regex) {\n if (typeof regex === 'string') {\n regex = new RegExp(regex);\n }\n if (regex instanceof RegExp) {\n return regex.test(str);\n }\n else if (regex && Array.isArray(regex.and)) {\n return regex.and.every((item) => {\n return this.test(str, item);\n });\n }\n else if (regex && Array.isArray(regex.or)) {\n return regex.or.some((item) => {\n return this.test(str, item);\n });\n }\n else if (regex && regex.not) {\n return !this.test(str, regex.not);\n }\n else {\n return false;\n }\n }\n exec(str, regex) {\n if (typeof regex === 'string') {\n regex = new RegExp(regex);\n }\n if (regex instanceof RegExp) {\n return regex.exec(str);\n }\n else if (regex && Array.isArray(regex)) {\n return regex.reduce((res, item) => {\n return !!res ? res : this.exec(str, item);\n }, null);\n }\n else {\n return null;\n }\n }\n}\n\n// tslint:disable: variable-name\nvar DeviceType;\n(function (DeviceType) {\n DeviceType[\"Mobile\"] = \"mobile\";\n DeviceType[\"Tablet\"] = \"tablet\";\n DeviceType[\"Desktop\"] = \"desktop\";\n DeviceType[\"Unknown\"] = \"unknown\";\n})(DeviceType || (DeviceType = {}));\nvar OrientationType;\n(function (OrientationType) {\n OrientationType[\"Portrait\"] = \"portrait\";\n OrientationType[\"Landscape\"] = \"landscape\";\n})(OrientationType || (OrientationType = {}));\nconst iPad = 'iPad';\nclass DeviceDetectorService {\n constructor(platformId) {\n this.platformId = platformId;\n this.ua = '';\n this.userAgent = '';\n this.os = '';\n this.browser = '';\n this.device = '';\n this.os_version = '';\n this.browser_version = '';\n this.reTree = new ReTree();\n this.deviceType = '';\n this.orientation = '';\n if (isPlatformBrowser(this.platformId) && typeof window !== 'undefined') {\n this.userAgent = window.navigator.userAgent;\n }\n this.setDeviceInfo(this.userAgent);\n }\n /**\n * @author Ahsan Ayaz\n * @desc Sets the initial value of the device when the service is initiated.\n * This value is later accessible for usage\n */\n setDeviceInfo(ua = this.userAgent) {\n if (ua !== this.userAgent) {\n this.userAgent = ua;\n }\n const mappings = [\n { const: 'OS', prop: 'os' },\n { const: 'BROWSERS', prop: 'browser' },\n { const: 'DEVICES', prop: 'device' },\n { const: 'OS_VERSIONS', prop: 'os_version' },\n ];\n mappings.forEach(mapping => {\n this[mapping.prop] = Object.keys(Constants[mapping.const]).reduce((obj, item) => {\n if (Constants[mapping.const][item] === 'device') {\n // hack for iOS 13 Tablet\n if (isPlatformBrowser(this.platformId) &&\n (!!this.reTree.test(this.userAgent, TABLETS_RE[iPad]) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1))) {\n obj[Constants[mapping.const][item]] = iPad;\n return Object;\n }\n }\n obj[Constants[mapping.const][item]] = this.reTree.test(ua, Constants[`${mapping.const}_RE`][item]);\n return obj;\n }, {});\n });\n mappings.forEach(mapping => {\n this[mapping.prop] = Object.keys(Constants[mapping.const])\n .map(key => {\n return Constants[mapping.const][key];\n })\n .reduce((previousValue, currentValue) => {\n if (mapping.prop === 'device' && previousValue === Constants[mapping.const].ANDROID) {\n // if we have the actual device found, instead of 'Android', return the actual device\n return this[mapping.prop][currentValue] ? currentValue : previousValue;\n }\n else {\n return previousValue === Constants[mapping.const].UNKNOWN && this[mapping.prop][currentValue]\n ? currentValue\n : previousValue;\n }\n }, Constants[mapping.const].UNKNOWN);\n });\n this.browser_version = '0';\n if (this.browser !== BROWSERS.UNKNOWN) {\n const re = BROWSER_VERSIONS_RE[this.browser];\n const res = this.reTree.exec(ua, re);\n if (!!res) {\n this.browser_version = res[1];\n }\n }\n if (typeof window !== 'undefined' && window.matchMedia) {\n this.orientation = window.matchMedia('(orientation: landscape)').matches\n ? OrientationType.Landscape\n : OrientationType.Portrait;\n }\n else {\n this.orientation = GENERAL.UKNOWN;\n }\n this.deviceType = this.isTablet()\n ? DeviceType.Tablet\n : this.isMobile(this.userAgent)\n ? DeviceType.Mobile\n : this.isDesktop(this.userAgent)\n ? DeviceType.Desktop\n : DeviceType.Unknown;\n }\n /**\n * @author Ahsan Ayaz\n * @desc Returns the device information\n * @returns the device information object.\n */\n getDeviceInfo() {\n const deviceInfo = {\n userAgent: this.userAgent,\n os: this.os,\n browser: this.browser,\n device: this.device,\n os_version: this.os_version,\n browser_version: this.browser_version,\n deviceType: this.deviceType,\n orientation: this.orientation,\n };\n return deviceInfo;\n }\n /**\n * @author Ahsan Ayaz\n * @desc Compares the current device info with the mobile devices to check\n * if the current device is a mobile and also check current device is tablet so it will return false.\n * @returns whether the current device is a mobile\n */\n isMobile(userAgent = this.userAgent) {\n if (this.isTablet(userAgent)) {\n return false;\n }\n const match = Object.keys(MOBILES_RE).find(mobile => {\n return this.reTree.test(userAgent, MOBILES_RE[mobile]);\n });\n return !!match;\n }\n /**\n * @author Ahsan Ayaz\n * @desc Compares the current device info with the tablet devices to check\n * if the current device is a tablet.\n * @returns whether the current device is a tablet\n */\n isTablet(userAgent = this.userAgent) {\n if (isPlatformBrowser(this.platformId) &&\n (!!this.reTree.test(this.userAgent, TABLETS_RE[iPad]) ||\n (typeof navigator !== 'undefined' && navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1))) {\n return true;\n }\n const match = Object.keys(TABLETS_RE).find(mobile => {\n return !!this.reTree.test(userAgent, TABLETS_RE[mobile]);\n });\n return !!match;\n }\n /**\n * @author Ahsan Ayaz\n * @desc Compares the current device info with the desktop devices to check\n * if the current device is a desktop device.\n * @returns whether the current device is a desktop device\n */\n isDesktop(userAgent = this.userAgent) {\n if (this.device === DEVICES.UNKNOWN) {\n if (this.isMobile(userAgent) || this.isTablet(userAgent)) {\n return false;\n }\n }\n return DESKTOP_DEVICES.indexOf(this.device) > -1;\n }\n}\nDeviceDetectorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.0.4\", ngImport: i0, type: DeviceDetectorService, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable });\nDeviceDetectorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"14.0.4\", ngImport: i0, type: DeviceDetectorService, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.0.4\", ngImport: i0, type: DeviceDetectorService, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n }]\n }], ctorParameters: function () { return [{ type: undefined, decorators: [{\n type: Inject,\n args: [PLATFORM_ID]\n }] }]; } });\n\n/*\n * Public API Surface of ngx-device-detector\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { BROWSERS, BROWSERS_RE, BROWSER_VERSIONS_RE, BROWSER_VERSIONS_RE_MAP, DESKTOP_DEVICES, DEVICES, DEVICES_RE, DeviceDetectorService, DeviceType, GENERAL, MOBILES_RE, OS, OS_RE, OS_VERSIONS, OS_VERSIONS_RE, OS_VERSIONS_RE_MAP, OrientationType, ReTree, TABLETS_RE };\n","
\n \n
\n\n\n \n
\n {{ sectionItem.label }}\n
\n \n \n
\n \n
\n {{ item.label }}\n
\n
\n \n
\n\n\n
\n
\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { Store } from '@ngrx/store';\nimport { firstValueFrom } from 'rxjs';\nimport { distinctUntilChanged, filter, tap } from 'rxjs/operators';\n\nimport { ComponentAbstract } from '@app/components/abstract/component.abstract';\nimport { AppVersionService } from '@app/services/app-version.service';\nimport { MainPageActions } from '@shared/enums/main-page-actions';\nimport { PermissionLevelType } from '@shared/enums/permission-level.enum';\nimport { checkPermissionLevel } from '@shared/functions/check-permission-level.function';\nimport { MenuSectionItem } from '@shared/interfaces/menu-config.interface';\nimport { selectUserPermissionLevel } from '@shared/selectors/user.selectors';\nimport { HelpRouterService } from '@shared/services/help-router.service';\nimport { SnackbarService } from '@ui-components/components/customized-snackbar/snackbar.service';\nimport { ModalsService } from '@ui-components/modals/modals.service';\nimport { NewTurnoverModalComponent } from '@ui-components/modals/new-turnover-modal/new-turnover-modal.component';\n\n@UntilDestroy()\n@Component({\n selector: 'app-side-panel-section-item',\n templateUrl: './side-panel-section-item.component.html',\n styleUrls: ['./side-panel-section-item.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidePanelSectionItemComponent extends ComponentAbstract implements OnInit, OnDestroy {\n @Input() sectionItem: MenuSectionItem;\n @Output() menuActionsEvent: EventEmitter = new EventEmitter();\n\n currentVersion = '';\n needUpgrade = false;\n activeSection = null;\n\n permissionLevels$ = this.store.select(selectUserPermissionLevel).pipe(\n untilDestroyed(this),\n filter((permissionLevel: PermissionLevelType[]) => !!permissionLevel?.length)\n );\n\n constructor(\n protected cdr: ChangeDetectorRef,\n private router: Router,\n private dialog: MatDialog,\n private modalsService: ModalsService,\n private appVersionService: AppVersionService,\n private helpRouterService: HelpRouterService,\n private store: Store,\n private snackbarService: SnackbarService\n ) {\n super(cdr);\n }\n\n ngOnInit(): void {\n this.isActive = window.location.pathname.startsWith(this.sectionItem.urlPath);\n this.activeSection = this.sectionItem.sectionItem.find(item => window.location.pathname.startsWith(item.urlPath));\n this.appVersionService.version$\n .pipe(\n untilDestroyed(this),\n distinctUntilChanged(),\n tap(appVersion => {\n if (this.currentVersion && this.currentVersion !== appVersion.version_number) {\n this.needUpgrade = true;\n }\n this.currentVersion = appVersion.version_number;\n })\n )\n .subscribe();\n\n this.router.events\n .pipe(\n untilDestroyed(this),\n filter(event => event instanceof NavigationEnd),\n distinctUntilChanged(),\n tap((event: NavigationEnd) => {\n this.isActive = event.url.startsWith(this.sectionItem.urlPath);\n this.activeSection = this.sectionItem.sectionItem.find(item => event.url.startsWith(item.urlPath));\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n }\n\n ngOnDestroy(): void {}\n\n async open(menuSectionItem: MenuSectionItem) {\n if (menuSectionItem.permissionLevelWarning) {\n const permissionLevels = await firstValueFrom(this.permissionLevels$);\n if (!checkPermissionLevel(permissionLevels, menuSectionItem.permissionLevelWarning)) {\n this.snackbarService.warning(`Permission: ${menuSectionItem.permissionLevelWarning.toLowerCase()} required`);\n return;\n }\n }\n\n if (menuSectionItem.modalDialogComponent) {\n switch (menuSectionItem.modalDialogComponent) {\n case NewTurnoverModalComponent:\n this.modalsService.openNewTurnoverModal([], false);\n break;\n default:\n this.dialog.open(menuSectionItem.modalDialogComponent);\n }\n\n return;\n }\n\n if (menuSectionItem.urlPath) {\n const queryParams = this.helpRouterService.getGlobalPreservedParams();\n\n if (menuSectionItem.newTab) {\n const url = this.router.serializeUrl(this.router.createUrlTree([menuSectionItem.urlPath], { queryParams }));\n\n window.open(url, '_blank');\n return;\n }\n\n if (this.needUpgrade) {\n const url = this.router.createUrlTree([menuSectionItem.urlPath], { queryParams });\n window.location.href = url.toString();\n } else {\n this.router.navigate([menuSectionItem.urlPath], { queryParams }).then();\n }\n }\n\n if (menuSectionItem.menuActions) {\n this.menuActionsEvent.emit(menuSectionItem.menuActions);\n }\n }\n\n toggleSection($event: MouseEvent) {\n $event.stopPropagation();\n this.isExpanded = !this.isExpanded;\n this.cdr.detectChanges();\n }\n}\n","
\n
\n \n \n
\n
\n \n\n\n\n \n \n\n\n\n \n \n\n\n\n \n\n\n\n
{{ section?.label }}
\n
\n\n\n \n\n\n\n
\n \n
\n
\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { some } from 'lodash';\nimport { BehaviorSubject } from 'rxjs';\nimport { distinctUntilChanged, filter, tap } from 'rxjs/operators';\n\nimport { ComponentAbstract } from '@app/components/abstract/component.abstract';\nimport { AppRoutes } from '@shared/constants/app-routes.const';\nimport { MainPageActions } from '@shared/enums/main-page-actions';\nimport { RoutePath } from '@shared/enums/route-path.enum';\nimport { MenuSection } from '@shared/interfaces/menu-config.interface';\nimport { HelpRouterService } from '@shared/services/help-router.service';\n\n@UntilDestroy()\n@Component({\n selector: 'app-side-panel-section',\n templateUrl: './side-panel-section.component.html',\n styleUrls: ['./side-panel-section.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidePanelSectionComponent extends ComponentAbstract implements OnInit, OnDestroy {\n @Input() section: MenuSection;\n @Input() currentSectionBSubject: BehaviorSubject;\n @Output() menuActionsEvent: EventEmitter = new EventEmitter();\n\n homePaths = [\n AppRoutes.ROLES_ADMIN_HOME,\n AppRoutes.ROLES_ASSET_HOME,\n AppRoutes.ROLES_CONSTRUCTION_HOME,\n AppRoutes.ROLES_PROPERTY_HOME,\n AppRoutes.ROLES_VENDOR_HOME,\n ];\n\n constructor(protected cdr: ChangeDetectorRef, private router: Router, private helpRouterService: HelpRouterService) {\n super(cdr);\n }\n\n ngOnInit(): void {\n this.checkActiveSection(window.location.pathname);\n this.router.events\n .pipe(\n untilDestroyed(this),\n filter(event => event instanceof NavigationEnd),\n distinctUntilChanged(),\n tap((event: NavigationEnd) => {\n this.checkActiveSection(event.url);\n })\n )\n .subscribe();\n\n this.currentSectionBSubject\n ?.pipe(\n untilDestroyed(this),\n tap(currentSection => {\n this.isExpanded = currentSection === this.section.label;\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n }\n\n ngOnDestroy(): void {}\n\n open() {\n const queryParams = this.helpRouterService.getGlobalPreservedParams();\n if (this.section.urlPath) {\n this.router.navigate([this.section.urlPath], { queryParams }).then();\n }\n }\n\n toggleSection(event: MouseEvent) {\n event.stopPropagation();\n let currentSection = null;\n if (!this.isExpanded) {\n currentSection = this.section.label;\n }\n this.currentSectionBSubject?.next(currentSection);\n }\n\n private checkActiveSection(path: string) {\n if (this.section.urlPath === RoutePath.HOME) {\n this.isActive = some(this.homePaths, item => path.startsWith(`/${item}`));\n } else {\n this.isActive =\n path.startsWith(`${this.section.urlPath}`) ||\n some(\n this.section.sectionItem,\n sectionItem => !sectionItem.separator && path.startsWith(`${sectionItem.urlPath}`)\n );\n }\n\n this.cdr.detectChanges();\n }\n\n menuActions($event: MainPageActions) {\n this.menuActionsEvent.emit($event);\n }\n}\n","\n \n\n
\n \n
\n\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { Store } from '@ngrx/store';\nimport { BehaviorSubject, combineLatest } from 'rxjs';\nimport { distinctUntilChanged, filter, tap } from 'rxjs/operators';\n\nimport { AppVersionService } from '@app/services/app-version.service';\nimport { DashboardsAbstract } from '@dashboards/components/abstract/dashboards.abstract';\nimport { selectSelectedDashboardMode } from '@dashboards/store/selectors/dashboards.selectors';\nimport {\n boardsSection,\n calendarSection,\n homeSection,\n inspectionsSection,\n maintenanceSection,\n managementSection,\n reportsSection,\n rolesSection,\n turnoversSection,\n} from '@shared/constants/side-panel-config.const';\nimport { DashboardMode } from '@shared/enums/dashboard-mode';\nimport { MainPageActions } from '@shared/enums/main-page-actions';\nimport { PermissionLevelType } from '@shared/enums/permission-level.enum';\nimport { checkPermissionLevel } from '@shared/functions/check-permission-level.function';\nimport { isUserEmailDomainAllowed } from '@shared/functions/check-user-email-domain';\nimport { MenuSection, MenuSectionItem } from '@shared/interfaces/menu-config.interface';\nimport { UserData } from '@shared/interfaces/user-data';\nimport { selectUserData, selectUserPermissionLevel } from '@shared/selectors/user.selectors';\nimport { SnackbarService } from '@ui-components/components/customized-snackbar/snackbar.service';\n\n@UntilDestroy()\n@Component({\n selector: 'app-side-panel',\n templateUrl: './side-panel.component.html',\n styleUrls: ['./side-panel.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidePanelComponent extends DashboardsAbstract implements OnInit, OnDestroy {\n menuConfig: MenuSection[] = [];\n currentVersionTimestamp = 0;\n readonly homeDashboardPermissions = [\n PermissionLevelType.Administrator_Dashboard_Read,\n PermissionLevelType.AssetManager_PropertyDashboard_Read,\n PermissionLevelType.ConstructionManager_Dashboard_Read,\n PermissionLevelType.PropertyManager_Dashboard_Read,\n PermissionLevelType.Turnovers_Kanban_Read, // TODO - temporary permission for Vendor\n ];\n\n currentSectionBSubject: BehaviorSubject = new BehaviorSubject(null);\n\n @Input() isSidePanelExpanded = true;\n @Output() mainPageActionEvent: EventEmitter = new EventEmitter();\n\n constructor(\n protected cdr: ChangeDetectorRef,\n private store: Store<{}>,\n private appVersionService: AppVersionService,\n private snackbarService: SnackbarService\n ) {\n super(cdr);\n }\n\n ngOnInit(): void {\n this.appVersionService.version$\n .pipe(\n untilDestroyed(this),\n distinctUntilChanged(),\n tap(appVersion => {\n if (this.currentVersionTimestamp && this.currentVersionTimestamp !== appVersion.version_timestamp) {\n const url = new URL(window.location.href);\n url.searchParams.append('version', appVersion.version_number);\n this.snackbarService.warning(\n `🎉 New PropUp version. Plz reload your browser.`,\n 24 * 60 * 60 * 1000,\n false\n );\n }\n this.currentVersionTimestamp = appVersion.version_timestamp;\n })\n )\n .subscribe();\n\n this.store\n .select(selectUserData)\n .pipe(\n untilDestroyed(this),\n filter((userData: UserData) => !!userData),\n tap((userData: UserData) => {\n this.userData = userData;\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n\n combineLatest([\n this.store.select(selectSelectedDashboardMode).pipe(filter((dashboardMode: DashboardMode) => !!dashboardMode)),\n this.store\n .select(selectUserPermissionLevel)\n .pipe(filter((permissionList: PermissionLevelType[]) => !!permissionList)),\n this.store.select(selectUserData).pipe(filter((userData: UserData) => !!userData?.email)),\n ])\n .pipe(\n untilDestroyed(this),\n tap(async ([dashboardMode, permissionList, userData]) => {\n this.dashboardMode = dashboardMode;\n this.permissionList = permissionList;\n this.userData = userData;\n this.menuConfig = this.getMenuConfig();\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n }\n\n menuAction(action: MainPageActions) {\n this.mainPageActionEvent.emit(action);\n }\n\n private getMenuConfig(): MenuSection[] {\n const menuConfig: MenuSection[] = [];\n if (!this.dashboardMode) {\n return menuConfig;\n }\n\n if (this.permissionList.includes(PermissionLevelType.AllPermissions)) {\n this.checkRolesSection(menuConfig);\n } else {\n const availableDashboardPermissionsCount = this.homeDashboardPermissions.filter(permission =>\n this.permissionList.includes(permission)\n ).length;\n\n if (availableDashboardPermissionsCount === 1) {\n this.checkHomeSection(menuConfig);\n } else if (availableDashboardPermissionsCount > 1) {\n this.checkRolesSection(menuConfig);\n }\n }\n this.checksMainSection(menuConfig, turnoversSection);\n this.checksMainSection(menuConfig, boardsSection);\n this.checksMainSection(menuConfig, calendarSection);\n this.checksMainSection(menuConfig, inspectionsSection);\n this.checksMainSection(menuConfig, maintenanceSection);\n this.checksMainSection(menuConfig, reportsSection);\n // this.checksMainSection(menuConfig, ticketsSection);\n this.checksMainSection(menuConfig, managementSection);\n return menuConfig;\n }\n\n ngOnDestroy(): void {}\n\n private checkHomeSection(sections: MenuSection[]) {\n const section: MenuSection = { ...homeSection };\n sections.push(section);\n }\n\n private checkRolesSection(sections: MenuSection[]) {\n this.checksMainSection(sections, rolesSection);\n }\n\n private checksMainSection(sections: MenuSection[], newSection: MenuSection) {\n const section: MenuSection = { ...newSection };\n const sectionItem: MenuSectionItem[] = this.checksSubsection(section.sectionItem);\n\n const hasRights = this.isHasRightToSection(section, 'any');\n if (!hasRights) {\n return;\n }\n section.sectionItem = sectionItem;\n sections.push(section);\n }\n\n private checksSubsection(sectionItem: MenuSectionItem[]): MenuSectionItem[] {\n if (!sectionItem?.length) {\n return [];\n }\n return sectionItem\n .map((item: MenuSectionItem) => ({ ...item, sectionItem: this.checksSubsection(item.sectionItem) }))\n .filter((item: MenuSectionItem) => this.isHasRightToSection(item, 'all'));\n }\n\n private isHasRightToSection(item: MenuSectionItem, checkPermissions: 'all' | 'any') {\n return (\n checkPermissionLevel(this.permissionList, item.permissionLevel, checkPermissions) &&\n isUserEmailDomainAllowed(this.userData.email, item.emailDomains) &&\n (!item.hideWithoutSubsection || item.sectionItem.length)\n );\n }\n}\n","export enum EntityType {\n Turnover = 1,\n Bid,\n Ticket,\n WorkflowStep,\n Company,\n}\n","import { EntityType } from '@shared/enums/entity-type';\nimport { IRadioButtonOption } from '@shared/interfaces/radio-button-option.interface';\n\nexport const EntityTypeListConst: IRadioButtonOption[] = [\n {\n value: EntityType.Bid,\n label: 'Bid',\n },\n {\n value: EntityType.Ticket,\n label: 'Ticket',\n },\n {\n value: EntityType.Turnover,\n label: 'Turnover',\n },\n {\n value: EntityType.WorkflowStep,\n label: 'WorkflowStep',\n },\n {\n value: EntityType.Company,\n label: 'Vendor',\n },\n];\n","\n
\n
\n \n
\n
\n
\n {{ title }}\n
\n
\n {{ content }}\n
\n
\n {{ footer }}\n
\n
\n
\n \n \n
{{ notification.timestamp | timeFromDate }}
\n
\n
\n\n\n\n \n\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\n\nimport { ComponentAbstract } from '@app/components/abstract/component.abstract';\nimport { EntityTypeListConst } from '@shared/constants/entity-type-list.const';\nimport { WorkflowStepListConst } from '@shared/constants/workflow-step-list.const';\nimport { EntityType } from '@shared/enums/entity-type';\nimport { EIcon } from '@shared/enums/icon.enum';\nimport { NotificationCategory } from '@shared/enums/notification-category';\nimport { UserType } from '@shared/enums/user-type';\nimport { WorkflowStepEnumType } from '@shared/enums/workflow-step.enum';\nimport { WebNotification } from '@shared/interfaces/notification.interface';\nimport { IRadioButtonOption } from '@shared/interfaces/radio-button-option.interface';\nimport { EnumerationValuePipe } from '@shared/pipes/enumeration-value.pipe';\n\n@Component({\n selector: 'app-notification-ring-item',\n templateUrl: './notification-ring-item.component.html',\n styleUrls: ['./notification-ring-item.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NotificationRingItemComponent extends ComponentAbstract implements OnInit {\n entityList: IRadioButtonOption[] = EntityTypeListConst;\n\n title = '';\n content = '';\n footer = '';\n\n icon: EIcon;\n deleteInProgress = false;\n\n @Input() isOdd = false;\n @Input() notification: WebNotification;\n @Input() deleteDisabled: boolean;\n @Output() selectEvent: EventEmitter = new EventEmitter();\n @Output() deleteEvent: EventEmitter = new EventEmitter();\n\n constructor(protected cdr: ChangeDetectorRef, private enumerationValuePipe: EnumerationValuePipe) {\n super(cdr);\n }\n\n ngOnInit(): void {\n this.icon = this.getNotificationIcon();\n this.title = this.getNotificationTitle();\n this.content = this.getNotificationContent();\n this.footer = this.getNotificationFooter();\n }\n\n select() {\n this.selectEvent.emit();\n }\n\n delete($event: MouseEvent) {\n this.deleteInProgress = true;\n this.cdr.detectChanges();\n $event.stopPropagation();\n this.deleteEvent.emit();\n }\n\n private getNotificationIcon(): EIcon {\n switch (this.notification.category) {\n case NotificationCategory.TurnoverComment:\n return EIcon.COMMENT2;\n case NotificationCategory.Bid:\n return EIcon.DOLLAR;\n case NotificationCategory.BidAccepted:\n return EIcon.DOLLAR;\n case NotificationCategory.BidRejected:\n return EIcon.DOLLAR;\n case NotificationCategory.BidComment:\n return EIcon.COMMENT2;\n case NotificationCategory.Ticket:\n return EIcon.TICKET;\n case NotificationCategory.BidSentBack:\n return EIcon.DOLLAR;\n case NotificationCategory.Turnover:\n return EIcon.TIME_SCHEDULE;\n case NotificationCategory.TurnStepSchedule:\n return EIcon.TIME_SCHEDULE;\n }\n }\n\n private getNotificationTitle(): string {\n if (this.notification.category === NotificationCategory.TurnStepSchedule) {\n return this.notification.title;\n }\n switch (this.notification.relatedObjectTypeId) {\n case EntityType.WorkflowStep: {\n return `${\n this.enumerationValuePipe.transform(\n this.notification.additionalData?.workflowStepEnumType,\n WorkflowStepListConst\n ) || ''\n }`;\n }\n case EntityType.Ticket: {\n return this.notification.additionalData?.ticketName || 'Ticket';\n }\n case EntityType.Bid: {\n return `${this.enumerationValuePipe.transform(WorkflowStepEnumType.Bid, WorkflowStepListConst) || ''}`;\n }\n default: {\n return `${this.enumerationValuePipe.transform(this.notification.relatedObjectTypeId, this.entityList) || ''}`;\n }\n }\n }\n\n private getNotificationFooter() {\n const unitName = this.notification.additionalData?.unitName\n ? `- ${this.notification.additionalData?.unitName}`\n : '';\n const unitNames = this.notification.additionalData?.unitNames\n ? `- ${this.notification.additionalData?.unitNames.join(', ')}`\n : '';\n return `${this.notification.additionalData?.propertyName || ''} ${unitName || unitNames}`;\n }\n\n private getNotificationContent() {\n switch (this.notification.category) {\n case NotificationCategory.Turnover: {\n return 'A turnover has been assigned to you';\n }\n case NotificationCategory.TurnoverComment: {\n return 'New comment';\n }\n case NotificationCategory.Bid: {\n return 'A new bid is available';\n }\n case NotificationCategory.BidAccepted: {\n return 'Bid accepted';\n }\n case NotificationCategory.BidRejected: {\n return 'Bid rejected';\n }\n case NotificationCategory.BidComment: {\n return this.notification.additionalData?.userType === UserType.Contractor\n ? `A new comment from ${this.notification.additionalData?.companyName} was added.`\n : 'A new comment was added';\n }\n case NotificationCategory.Ticket: {\n return 'A ticket has been assigned to you.';\n }\n case NotificationCategory.BidSentBack: {\n return 'A new offer is available.';\n }\n default: {\n return this.notification?.content || '';\n }\n }\n }\n}\n","\n \n\n \n 9 ? trimCounter : defaultCounter\">\n \n\n\n\n
{{ unreadCount }}
\n
\n\n\n
9+
\n
\n\n\n \n
\n
Notifications
\n \n \n show unread only\n \n
\n\n
\n \n \n \n
\n \n \n
No new notifications.
\n
\n\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnDestroy,\n OnInit,\n ViewEncapsulation,\n} from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport { Params, Router } from '@angular/router';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { Store } from '@ngrx/store';\nimport { Observable } from 'rxjs';\nimport { filter, tap } from 'rxjs/operators';\n\nimport { ComponentAbstract } from '@app/components/abstract/component.abstract';\nimport {\n deleteNotification,\n getLastNotificationList,\n markAllAsRead,\n markAsRead,\n} from '@main-application/notifications/actions/notifications.actions';\nimport {\n selectDeleteNotificationInProgress,\n selectLastNotificationList,\n} from '@main-application/notifications/selectors/notifications.selectors';\nimport { AppRoutes } from '@shared/constants/app-routes.const';\nimport { EntityType } from '@shared/enums/entity-type';\nimport { NotificationCategory } from '@shared/enums/notification-category';\nimport { RouteData } from '@shared/enums/route-data';\nimport { RoutePath } from '@shared/enums/route-path.enum';\nimport { UserType } from '@shared/enums/user-type';\nimport { WebNotification } from '@shared/interfaces/notification.interface';\nimport { UserData } from '@shared/interfaces/user-data';\nimport { selectUserData } from '@shared/selectors/user.selectors';\nimport { ModalsService } from '@ui-components/modals/modals.service';\n\n@UntilDestroy()\n@Component({\n selector: 'app-notification-ring',\n templateUrl: './notification-ring.component.html',\n styleUrls: ['./notification-ring.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class NotificationRingComponent extends ComponentAbstract implements OnInit, OnDestroy {\n allNotificationList: WebNotification[] = [];\n displayedNotificationList: WebNotification[] = [];\n userData: UserData;\n deleteInProgress$: Observable;\n unreadOnly = new UntypedFormControl(false);\n\n unreadCount = 0;\n\n @Input() userId: number;\n\n constructor(\n protected cdr: ChangeDetectorRef,\n private store: Store<{}>,\n private router: Router,\n private modalsService: ModalsService\n ) {\n super(cdr);\n }\n\n ngOnInit(): void {\n this.getLastMessages();\n\n this.deleteInProgress$ = this.store.select(selectDeleteNotificationInProgress);\n\n this.store\n .select(selectUserData)\n .pipe(\n untilDestroyed(this),\n filter((userData: UserData) => !!userData),\n tap((userData: UserData) => {\n this.userData = userData;\n })\n )\n .subscribe();\n\n this.store\n .select(selectLastNotificationList)\n .pipe(\n untilDestroyed(this),\n filter((lastNotificationList: WebNotification[]) => !!lastNotificationList),\n tap((lastNotificationList: WebNotification[]) => {\n this.allNotificationList = lastNotificationList;\n this.filterList();\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n\n this.unreadOnly.valueChanges\n .pipe(\n untilDestroyed(this),\n tap(() => {\n this.filterList();\n })\n )\n .subscribe();\n }\n\n ngOnDestroy(): void {}\n\n selectNotification(webNotification: WebNotification) {\n if (!webNotification.wasRead) {\n this.store.dispatch(\n markAsRead({\n baseNotificationBody: {\n notificationIds: [webNotification.notificationId],\n },\n })\n );\n }\n\n this.openSource(webNotification);\n }\n\n markAllAsRead() {\n this.store.dispatch(markAllAsRead());\n }\n\n deleteNotification(webNotification: WebNotification) {\n this.store.dispatch(\n deleteNotification({\n baseNotificationBody: {\n notificationIds: [webNotification.notificationId],\n },\n })\n );\n }\n\n private filterList() {\n if (this.unreadOnly.value) {\n this.displayedNotificationList = this.allNotificationList.filter(item => !item.wasRead);\n } else {\n this.displayedNotificationList = [...this.allNotificationList];\n }\n this.setUnreadCount();\n this.cdr.detectChanges();\n }\n\n private setUnreadCount() {\n this.unreadCount = (this.allNotificationList || []).filter(item => !item.wasRead).length;\n }\n\n private getLastMessages() {\n this.store.dispatch(getLastNotificationList());\n }\n\n private openSource(webNotification: WebNotification) {\n switch (webNotification.relatedObjectTypeId) {\n case EntityType.Ticket:\n this.modalsService.openTicketPreviewModal({\n ticketId: webNotification.relatedObjectId,\n unitName: webNotification.additionalData?.unitName,\n propertyName: webNotification.additionalData?.propertyName,\n propertyId: webNotification.additionalData?.propertyId,\n });\n break;\n\n case EntityType.Turnover:\n case EntityType.WorkflowStep:\n if (webNotification.additionalData?.workflowStepEnumType) {\n const params =\n webNotification.category === NotificationCategory.TurnoverComment\n ? {\n queryParams: { [RouteData.COMMENT_ID]: webNotification.relatedObjectId },\n }\n : {};\n\n this.router.navigate([AppRoutes.TURNOVERS, webNotification.additionalData.turnoverIds?.[0]], params);\n }\n break;\n\n case EntityType.Bid:\n let queryParams: Params =\n this.userData.userType === UserType.Employee\n ? { [RouteData.SOURCE_VIEW]: RoutePath.BID }\n : { [RouteData.SOURCE_VIEW]: RoutePath.VENDOR_DASHBOARD };\n if (webNotification.category === NotificationCategory.BidComment) {\n queryParams = { ...queryParams, [RouteData.COMMENT_ID]: webNotification.relatedObjectId };\n }\n\n const bidId =\n webNotification.category === NotificationCategory.BidComment\n ? webNotification.additionalData.bidId\n : webNotification.relatedObjectId;\n\n const path: any[] =\n this.userData.userType === UserType.Employee\n ? [\n RoutePath.TURNOVERS,\n RoutePath.BID,\n webNotification.additionalData?.turnoverIds?.[0],\n RoutePath.BID_DETAIL,\n bidId,\n ]\n : [RoutePath.ROLES, RoutePath.VENDOR_DASHBOARD, RoutePath.BID_DETAIL, bidId];\n\n if (bidId) {\n this.router.navigate(path, {\n queryParams,\n });\n }\n break;\n }\n }\n}\n","import { ChangeDetectorRef, Component, OnInit } from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport { ActivatedRoute, NavigationEnd, Params, Router } from '@angular/router';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { Store } from '@ngrx/store';\nimport { first, isNil, max, sortBy } from 'lodash';\nimport { BehaviorSubject, combineLatest } from 'rxjs';\nimport { distinctUntilChanged, filter, map, mergeMap, startWith, tap } from 'rxjs/operators';\n\nimport {\n clearTurnoverKanbanPortfolio,\n joinProperties,\n selectedPortfolioId,\n selectedPropertyId,\n} from '@dashboards/store/actions/dashboard.actions';\nimport { selectJoinProperties, selectSelectedPortfolioId } from '@dashboards/store/selectors/dashboards.selectors';\nimport { selectPortfolios, selectProperties } from '@portfolio/store/portfolio.selectors';\nimport { DashboardViewType } from '@shared/enums/dashboard-view-type';\nimport { RouteData } from '@shared/enums/route-data';\nimport { IRadioButtonOption } from '@shared/interfaces/radio-button-option.interface';\nimport { RestPortfolioModel } from '@shared/interfaces/rest-portfolio-model.interface';\n\n@UntilDestroy()\n@Component({\n selector: 'app-property-selector',\n templateUrl: './property-selector.component.html',\n styleUrls: ['./property-selector.component.scss'],\n})\nexport class PropertySelectorComponent implements OnInit {\n userProperties: IRadioButtonOption[] = [];\n userPortfolios: IRadioButtonOption[] = [];\n groupingByItems: IRadioButtonOption[] = [];\n\n DashboardViewType = DashboardViewType;\n\n urlPortfolioId: number = null;\n urlPropertyId: number = null;\n\n selectorsWidthCss = '';\n maxNameLength = 0;\n maxNameLength$ = new BehaviorSubject(0);\n\n dashboardViewType = DashboardViewType.PORTFOLIO_WIDE_VIEW;\n\n properties: UntypedFormControl = new UntypedFormControl();\n portfolio: UntypedFormControl = new UntypedFormControl();\n grouping: UntypedFormControl = new UntypedFormControl(2);\n\n constructor(\n private activatedRoute: ActivatedRoute,\n private store: Store<{}>,\n private cdr: ChangeDetectorRef,\n private router: Router\n ) {}\n\n ngOnInit(): void {\n const { queryParams } = this.activatedRoute.snapshot;\n this.urlPortfolioId = parseInt(queryParams?.[RouteData.PORTFOLIO_ID], 10) || null;\n this.urlPropertyId = parseInt(queryParams?.[RouteData.PROPERTY_ID], 10) || null;\n this.maxNameLength$\n .pipe(\n untilDestroyed(this),\n distinctUntilChanged(),\n tap(value => {\n this.maxNameLength = Math.max(this.maxNameLength, value);\n const maxWidth = this.maxNameLength * 6.31 + 90;\n let targetWidth = 200;\n while (targetWidth < maxWidth) {\n targetWidth += 10;\n }\n this.selectorsWidthCss = `width-${targetWidth}`;\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n\n combineLatest([this.activatedRoute.queryParams, this.store.select(selectSelectedPortfolioId)])\n .pipe(\n untilDestroyed(this),\n distinctUntilChanged(),\n tap(([queryParams, portfolioId]) => {\n this.urlPortfolioId = parseInt(queryParams?.[RouteData.PORTFOLIO_ID], 10) || portfolioId;\n this.urlPropertyId = parseInt(queryParams?.[RouteData.PROPERTY_ID], 10) || null;\n\n this.groupingByItems = [\n { label: 'None', value: true },\n { label: 'By property', value: false },\n ];\n })\n )\n .subscribe();\n\n this.store\n .select(selectJoinProperties)\n .pipe(\n untilDestroyed(this),\n distinctUntilChanged(),\n tap(joined => {\n this.grouping.setValue(joined);\n })\n )\n .subscribe();\n\n this.store\n .select(selectPortfolios)\n .pipe(\n untilDestroyed(this),\n filter(portfolios => !!portfolios?.length),\n tap((portfolios: RestPortfolioModel[]) => {\n this.userPortfolios = portfolios.map>(item => {\n return {\n value: item.id,\n label: item.name,\n };\n });\n this.maxNameLength$.next(max(this.userPortfolios.map(x => x.label.length)));\n if (this.urlPortfolioId && this.userPortfolios.some(e => e.value == this.urlPortfolioId)) {\n this.portfolio.setValue(this.urlPortfolioId, { emitEvent: false });\n } else {\n this.portfolio.setValue(first(this.userPortfolios || [])?.value);\n }\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n\n combineLatest([this.store.select(selectSelectedPortfolioId), this.store.select(selectProperties)])\n .pipe(\n untilDestroyed(this),\n filter(([portfolioId, properties]) => !!portfolioId && !!properties?.length),\n tap(([portfolioId, properties]) => {\n this.maxNameLength = 0;\n this.userProperties = [\n {\n value: -1,\n label: 'All properties',\n sort: 0,\n },\n ];\n const options = properties\n .filter(x => x.portfolioId === portfolioId)\n .map>((item, index) => {\n return {\n value: item.id,\n label: item.name,\n sort: index + 1,\n };\n });\n this.userProperties.push(...sortBy(options, [item => item.label.toUpperCase()]));\n this.maxNameLength$.next(max(this.userProperties.map(x => x.label.length)));\n if (this.urlPropertyId && this.userProperties.some(e => e.value == this.urlPropertyId)) {\n this.properties.setValue(this.urlPropertyId, { emitEvent: false });\n } else {\n this.properties.setValue(this.userProperties[0]?.value);\n }\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n\n this.router.events\n .pipe(\n untilDestroyed(this),\n filter(event => event instanceof NavigationEnd),\n startWith(null),\n map(() => this.activatedRoute),\n map(route => {\n while (route.firstChild) {\n route = route.firstChild;\n }\n return route;\n }),\n mergeMap(route => route.data),\n tap(data => {\n const newDashboardViewType = (\n isNil(data?.[RouteData.DASHBOARD_VIEW_TYPE])\n ? DashboardViewType.NONE\n : data?.[RouteData.DASHBOARD_VIEW_TYPE]\n ) as DashboardViewType;\n if (this.dashboardViewType !== newDashboardViewType) {\n this.dashboardViewType = newDashboardViewType;\n this.cdr.detectChanges();\n }\n })\n )\n .subscribe();\n\n this.portfolio.valueChanges\n .pipe(\n untilDestroyed(this),\n distinctUntilChanged(),\n filter(portfolioItem => !isNil(portfolioItem)),\n tap((portfolioId: number) => {\n this.updateRouterParam({ [RouteData.PORTFOLIO_ID]: portfolioId, [RouteData.PROPERTY_ID]: null });\n // clear cached kanban\n this.store.dispatch(clearTurnoverKanbanPortfolio());\n this.store.dispatch(selectedPortfolioId({ portfolioId }));\n })\n )\n .subscribe();\n\n combineLatest([this.properties.valueChanges.pipe(distinctUntilChanged()), this.store.select(selectProperties)])\n .pipe(\n untilDestroyed(this),\n distinctUntilChanged(),\n filter(([propertyItem, properties]) => !isNil(propertyItem) && !!properties?.length),\n map(([propertyId, properties]) => {\n return properties?.find(p => p.id === propertyId);\n }),\n tap(property => {\n if (\n [DashboardViewType.PROPERTY_VIEW, DashboardViewType.PROPERTY_WITH_GROUPING_VIEW].includes(\n this.dashboardViewType\n )\n ) {\n this.updateRouterParam({\n [RouteData.PORTFOLIO_ID]: this.portfolio.value,\n [RouteData.PROPERTY_ID]: property?.id,\n });\n }\n this.store.dispatch(selectedPropertyId({ propertyId: property?.id }));\n })\n )\n .subscribe();\n\n this.grouping.valueChanges\n .pipe(\n untilDestroyed(this),\n distinctUntilChanged(),\n tap(state => {\n this.store.dispatch(joinProperties({ state }));\n })\n )\n .subscribe();\n }\n\n private updateRouterParam(params: Params) {\n const currentParams = this.activatedRoute.snapshot.queryParams;\n const currentFragment = this.activatedRoute.snapshot.fragment;\n this.router\n .navigate([], {\n relativeTo: this.activatedRoute,\n queryParams: { ...currentParams, ...params },\n queryParamsHandling: 'merge',\n replaceUrl: true,\n fragment: currentFragment,\n })\n .then();\n }\n}\n","
\n \n \n \n
\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { ComponentAbstract } from '@app/components/abstract/component.abstract';\nimport { BreadcrumbItem } from '@shared/interfaces/breadcrumb-item';\nimport { HelpRouterService } from '@shared/services/help-router.service';\n\n@Component({\n selector: 'app-breadcrumb-item',\n templateUrl: './breadcrumb-item.component.html',\n styleUrls: ['./breadcrumb-item.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BreadcrumbItemComponent extends ComponentAbstract implements OnInit {\n constructor(protected cdr: ChangeDetectorRef, private router: Router, private helpRouterService: HelpRouterService) {\n super(cdr);\n }\n\n @Input() item: BreadcrumbItem;\n\n ngOnInit(): void {}\n\n open() {\n const queryParams = this.helpRouterService.getGlobalPreservedParams();\n if (this.item?.url) {\n this.reloadRoute().then(() => this.router.navigate([this.item.url], { queryParams }));\n }\n }\n\n private reloadRoute(): Promise {\n return this.router.navigateByUrl('/', { skipLocationChange: true });\n }\n}\n","\n \n
{{ item?.label }}
\n\n","
\n
\n \n \n \n
\n \n \n \n
\n \n
\n \n \n \n \n \n \n
\n
\n
\n
\n\n\n\n \n\n\n\n \n\n\n\n
\n \n \n
\n
\n\n\n \n\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { ActivatedRoute, NavigationEnd, Params, Router } from '@angular/router';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { Store } from '@ngrx/store';\nimport { isNil } from 'lodash';\nimport { Observable } from 'rxjs';\nimport { filter, map, mergeMap, startWith, switchMap, tap } from 'rxjs/operators';\n\nimport { DashboardsAbstract } from '@dashboards/components/abstract/dashboards.abstract';\nimport { selectedDashboardViewType, setCustomBreadcrumbs } from '@dashboards/store/actions/dashboard.actions';\nimport { selectCustomBreadcrumbs } from '@dashboards/store/selectors/dashboards.selectors';\nimport { loadAllUserPortfolios } from '@portfolio/store/portfolio.actions';\nimport { loadAllUserProperties } from '@shared/actions/user.actions';\nimport { DashboardViewType } from '@shared/enums/dashboard-view-type';\nimport { EIcon } from '@shared/enums/icon.enum';\nimport { MainPageActions } from '@shared/enums/main-page-actions';\nimport { RouteData } from '@shared/enums/route-data';\nimport { BreadcrumbItem } from '@shared/interfaces/breadcrumb-item';\nimport { EnumerationItem } from '@shared/interfaces/enumeration-item';\nimport { UserData } from '@shared/interfaces/user-data';\nimport { selectDashboardViewType } from '@shared/selectors/enumeration.selectors';\nimport { selectIsAuthenticated, selectUserData } from '@shared/selectors/user.selectors';\n\n@UntilDestroy()\n@Component({\n selector: 'app-top-panel',\n templateUrl: './top-panel.component.html',\n styleUrls: ['./top-panel.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TopPanelComponent extends DashboardsAbstract implements OnInit, OnDestroy {\n breadcrumbList: BreadcrumbItem[] = [];\n routeBreadcrumbList: BreadcrumbItem[] = [];\n additionalBreadcrumbList: BreadcrumbItem[] = [];\n userData: UserData;\n\n @Input() isSidePanelExpanded: boolean;\n @Output() mainPageActionEvent: EventEmitter = new EventEmitter();\n\n constructor(\n protected cdr: ChangeDetectorRef,\n private router: Router,\n private activatedRoute: ActivatedRoute,\n private store: Store<{}>\n ) {\n super(cdr);\n }\n\n ngOnInit(): void {\n this.router.events\n .pipe(\n untilDestroyed(this),\n filter(event => event instanceof NavigationEnd),\n startWith(null),\n tap((event: NavigationEnd) => {\n this.routeBreadcrumbList = this.getBreadcrumbList(this.activatedRoute.root);\n this.store.dispatch(setCustomBreadcrumbs({ breadcrumbList: [] }));\n this.mergeBreadcrumbList();\n }),\n map(() => this.activatedRoute),\n map(route => {\n while (route.firstChild) {\n route = route.firstChild;\n }\n return route;\n }),\n mergeMap(route => {\n return route.data;\n }),\n tap(data => {\n const newDashboardViewType = (\n isNil(data?.[RouteData.DASHBOARD_VIEW_TYPE])\n ? DashboardViewType.NONE\n : data?.[RouteData.DASHBOARD_VIEW_TYPE]\n ) as DashboardViewType;\n\n if (this.dashboardViewType !== newDashboardViewType) {\n this.dashboardViewType = newDashboardViewType;\n this.cdr.detectChanges();\n }\n }),\n switchMap(() => this.getDashboardViewTypes())\n )\n .subscribe();\n\n this.store\n .select(selectCustomBreadcrumbs)\n .pipe(\n untilDestroyed(this),\n tap((breadcrumbList: BreadcrumbItem[]) => {\n this.additionalBreadcrumbList = breadcrumbList;\n this.mergeBreadcrumbList();\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n\n this.store\n .select(selectUserData)\n .pipe(\n untilDestroyed(this),\n filter((userData: UserData) => !!userData),\n tap((userData: UserData) => {\n this.userData = userData;\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n\n this.store\n .select(selectIsAuthenticated)\n .pipe(\n untilDestroyed(this),\n tap((isAuthenticated: boolean) => {\n this.isAuthenticated = isAuthenticated;\n this.cdr.detectChanges();\n }),\n filter(isAuthenticated => isAuthenticated)\n )\n .subscribe(() => {\n this.store.dispatch(loadAllUserProperties());\n this.store.dispatch(loadAllUserPortfolios());\n });\n }\n\n ngOnDestroy(): void {}\n\n menuAction(action: MainPageActions) {\n this.mainPageActionEvent.emit(action);\n }\n\n home() {\n this.menuAction(MainPageActions.HOME_PAGE);\n }\n\n private getBreadcrumbList(\n activatedRoute: ActivatedRoute,\n url = '',\n breadcrumbs: BreadcrumbItem[] = []\n ): BreadcrumbItem[] {\n if (!activatedRoute) {\n return [];\n }\n\n const icon = (activatedRoute.routeConfig?.data?.[RouteData.BREADCRUMB_ICON] as EIcon) || null;\n const label = activatedRoute.routeConfig?.data?.[RouteData.BREADCRUMB] || null;\n let path = activatedRoute.routeConfig?.path || null;\n if (path) {\n const lastRoutePart = path.split('/').pop();\n const isDynamicRoute = lastRoutePart.startsWith(':');\n if (isDynamicRoute && !!activatedRoute.snapshot) {\n path = path.replace(lastRoutePart, activatedRoute.snapshot.params[lastRoutePart.split(':')[1]]);\n }\n url = `${url}/${path}`;\n }\n\n if (label) {\n breadcrumbs.push({ label, url, icon });\n }\n\n if (activatedRoute.firstChild) {\n this.getBreadcrumbList(activatedRoute.firstChild, url, breadcrumbs);\n }\n return breadcrumbs;\n }\n\n private getDashboardViewTypes(): Observable {\n return this.store.select(selectDashboardViewType).pipe(\n untilDestroyed(this),\n filter(dashboardViewType => !!dashboardViewType),\n map(dashboardViewTypes => dashboardViewTypes.find(e => e.enumerationValue == this.dashboardViewType)),\n tap((dashboardViewTypeEnum: EnumerationItem) => {\n this.store.dispatch(selectedDashboardViewType({ dashboardViewType: dashboardViewTypeEnum }));\n this.cdr.detectChanges();\n })\n );\n }\n\n private mergeBreadcrumbList() {\n this.breadcrumbList = [...this.routeBreadcrumbList, ...this.additionalBreadcrumbList];\n this.cdr.detectChanges();\n }\n\n private updateRouterParam(params: Params) {\n const currentParams = this.activatedRoute.snapshot.queryParams;\n const currentFragment = this.activatedRoute.snapshot.fragment;\n this.router\n .navigate([], {\n relativeTo: this.activatedRoute,\n queryParams: { ...currentParams, ...params },\n queryParamsHandling: 'merge',\n replaceUrl: true,\n fragment: currentFragment,\n })\n .then();\n }\n}\n","
Safari unsupported. Use Chrome
\n
\n
\n
\n
\n \n
\n \n
\n \n
\n \n \n
\n \n
\n\n\n\n\n\n
\n \n
\n
\n","import { ChangeDetectorRef, Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { Store } from '@ngrx/store';\nimport { OidcSecurityService } from 'angular-auth-oidc-client';\nimport { DeviceDetectorService } from 'ngx-device-detector';\nimport { Observable } from 'rxjs';\nimport { distinctUntilChanged, filter, first, tap } from 'rxjs/operators';\n\nimport { ComponentAbstract } from '@app/components/abstract/component.abstract';\nimport { AppVersionService } from '@app/services/app-version.service';\nimport { AppRoutes } from '@shared/constants/app-routes.const';\nimport { MainPageActions } from '@shared/enums/main-page-actions';\nimport { selectDashboardViewType, selectLoadEnumerationsLoading } from '@shared/selectors/enumeration.selectors';\nimport { SnackbarService } from '@ui-components/components/customized-snackbar/snackbar.service';\nimport { environment } from 'src/environments/environment';\n\nimport { ScreenWiperService } from '../../../services/screen-wiper.service';\nimport { SidePanelService } from '../../../services/side-panel.service';\n\n@UntilDestroy()\n@Component({\n selector: 'app-application-menu',\n templateUrl: './application-menu.component.html',\n styleUrls: ['./application-menu.component.scss'],\n providers: [SidePanelService],\n})\nexport class ApplicationMenuComponent extends ComponentAbstract implements OnInit {\n screenWipeStatus$ = this.screenWiperService.screenClasses$;\n wipeDuration = this.screenWiperService.wipeDuration;\n wiperVisible$ = this.screenWiperService.globalWiperVisible$;\n environment = environment;\n isAuthenticated = false;\n currentVersion = '';\n currentVersionTimeStamp = 0;\n\n showBuildTime = environment.showBuildTime;\n isExternal = false;\n displayNavigation = true; //Can be used for full screen mode in future\n\n isSidePanelExpanded$: Observable;\n showBanner = false;\n\n constructor(\n protected cdr: ChangeDetectorRef,\n private router: Router,\n private oidcSecurityService: OidcSecurityService,\n private store: Store<{}>,\n private sidePanelService: SidePanelService,\n private snackbarService: SnackbarService,\n private appVersionService: AppVersionService,\n private deviceService: DeviceDetectorService,\n private screenWiperService: ScreenWiperService\n ) {\n super(cdr);\n }\n\n ngOnInit() {\n this.showBanner = this.deviceService.browser === 'Safari';\n\n this.snackbarService.watchForSidePanel(this.sidePanelService).pipe(untilDestroyed(this)).subscribe();\n\n this.isSidePanelExpanded$ = this.sidePanelService.isSidePanelExpanded$;\n\n this.appVersionService.version$\n .pipe(\n untilDestroyed(this),\n distinctUntilChanged(),\n filter(appVersion => appVersion.version_timestamp > 0),\n first(),\n tap(appVersion => {\n this.currentVersionTimeStamp = appVersion.version_timestamp;\n this.currentVersion = appVersion.version_number;\n })\n )\n .subscribe();\n\n this.isLoading$ = this.store.select(selectLoadEnumerationsLoading);\n this.dashboardViewType$ = this.store.select(selectDashboardViewType);\n }\n\n toggleSidePanel() {\n this.sidePanelService.toggleSidePanel();\n }\n\n mainPageActions(action: MainPageActions) {\n switch (action) {\n case MainPageActions.ACCOUNT:\n {\n // todo - redirect to account settings\n }\n break;\n case MainPageActions.PASSWORD:\n {\n // todo - redirect to password settings\n }\n break;\n case MainPageActions.NOTIFICATIONS:\n {\n // todo - redirect to notifications settings\n }\n break;\n case MainPageActions.LOGOUT:\n {\n this.oidcSecurityService.logoff();\n this.isAuthenticated = false;\n }\n break;\n case MainPageActions.LOGIN:\n {\n this.router\n .navigate([AppRoutes.LOGIN], {\n queryParams: {\n returnUrl: window.location.href,\n },\n })\n .then();\n }\n break;\n case MainPageActions.HOME_PAGE:\n {\n this.router.navigate([AppRoutes.HOME]).then();\n }\n break;\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { AutoLoginPartialRoutesGuard } from 'angular-auth-oidc-client';\n\nimport { UnitDetailsComponent } from '@portfolio/components/unit-details/unit-details.component';\nimport { AppRoutes } from '@shared/constants/app-routes.const';\nimport { DashboardViewType } from '@shared/enums/dashboard-view-type';\nimport { EIcon } from '@shared/enums/icon.enum';\nimport { ManagementRoute } from '@shared/enums/management-route.enum';\nimport { PermissionLevelType } from '@shared/enums/permission-level.enum';\nimport { RouteData } from '@shared/enums/route-data';\nimport { RoutePath } from '@shared/enums/route-path.enum';\nimport { AuthGuard } from '@shared/guards/auth.guard';\nimport { HomeRedirectGuard } from '@shared/guards/home-redirect.guard';\nimport { PermissionLevelGuardFactory } from '@shared/guards/permission-level.guard';\nimport { ResidentGuard } from '@shared/guards/resident.guard';\nimport { ViewCloseGuard } from '@shared/guards/view-close.guard';\n\nimport { ApplicationMenuComponent } from './application-menu.component';\n\nconst routes: Routes = [\n {\n path: '',\n component: ApplicationMenuComponent,\n canActivate: [ResidentGuard],\n children: [\n {\n path: '',\n redirectTo: AppRoutes.HOME,\n pathMatch: 'full',\n },\n {\n path: RoutePath.HOME,\n canActivate: [AutoLoginPartialRoutesGuard, AuthGuard, HomeRedirectGuard],\n loadChildren: () =>\n import('@main-application/home-dashboard/home-dashboard.module').then(m => m.HomeDashboardModule),\n },\n {\n path: RoutePath.ROLES,\n canActivate: [AutoLoginPartialRoutesGuard, AuthGuard],\n data: { [RouteData.BREADCRUMB]: 'Home', [RouteData.BREADCRUMB_ICON]: EIcon.HOME },\n loadChildren: () =>\n import('@main-application/dashboard-roles/dashboard-roles.module').then(m => m.DashboardRolesModule),\n },\n {\n path: RoutePath.TURNOVERS,\n canActivate: [AutoLoginPartialRoutesGuard, AuthGuard],\n loadChildren: () => import('@main-application/turnovers/turnovers.module').then(m => m.TurnoversModule),\n },\n {\n path: RoutePath.INSPECTIONS,\n canActivate: [AutoLoginPartialRoutesGuard, AuthGuard],\n loadChildren: () => import('@main-application/inspections/inspections.module').then(m => m.InspectionsModule),\n },\n {\n path: RoutePath.Maintenance,\n canActivate: [AutoLoginPartialRoutesGuard, AuthGuard],\n loadChildren: () => import('@main-application/maintenance/maintenance.module').then(m => m.MaintenanceModule),\n },\n {\n path: RoutePath.CALENDAR,\n canActivate: [AutoLoginPartialRoutesGuard, AuthGuard],\n loadChildren: () => import('@main-application/calendar/calendar.module').then(m => m.CalendarModule),\n },\n {\n path: RoutePath.BOARDS,\n canActivate: [AutoLoginPartialRoutesGuard, AuthGuard],\n data: { [RouteData.BREADCRUMB]: 'Boards' },\n loadChildren: () => import('@main-application/boards/boards.module').then(m => m.BoardsModule),\n },\n {\n path: `${RoutePath.BUILDIUM}/tokenExchange`,\n canActivate: [AuthGuard],\n loadComponent: () =>\n import('@main-application/buildium/token-exchange/token-exchange.component').then(\n m => m.TokenExchangeComponent\n ),\n },\n {\n path: RoutePath.REPORTS,\n canActivate: [AutoLoginPartialRoutesGuard, AuthGuard],\n data: {\n [RouteData.BREADCRUMB]: 'Reports',\n [RouteData.BREADCRUMB_ICON]: EIcon.CHART_LINE,\n },\n loadChildren: () =>\n import('@main-application/dashboard-reports/dashboard-reports.module').then(m => m.DashboardReportsModule),\n },\n {\n path: RoutePath.TICKETS,\n canActivate: [\n AutoLoginPartialRoutesGuard,\n AuthGuard,\n PermissionLevelGuardFactory(PermissionLevelType.Tickets_Read),\n ],\n loadChildren: () => import('@main-application/tickets/tickets.module').then(m => m.TicketsModule),\n },\n {\n path: ManagementRoute.SETTINGS,\n canActivate: [AutoLoginPartialRoutesGuard, AuthGuard],\n canDeactivate: [ViewCloseGuard],\n data: {\n [RouteData.BREADCRUMB]: 'Settings',\n [RouteData.BREADCRUMB_ICON]: EIcon.SHIELD_USER,\n },\n loadChildren: () => import('@main-application/management/management.module').then(m => m.ManagementModule),\n },\n {\n path: `${RoutePath.UNIT_DETAILS}/:unitId`,\n component: UnitDetailsComponent,\n canActivate: [AutoLoginPartialRoutesGuard, AuthGuard],\n canDeactivate: [ViewCloseGuard],\n data: {\n [RouteData.BREADCRUMB]: 'Unit details',\n [RouteData.DASHBOARD_VIEW_TYPE]: DashboardViewType.NONE,\n },\n },\n {\n path: RoutePath.NO_PERMISSION,\n canActivate: [AutoLoginPartialRoutesGuard],\n data: {\n [RouteData.BREADCRUMB]: 'No permission',\n [RouteData.DASHBOARD_VIEW_TYPE]: DashboardViewType.NONE,\n },\n loadComponent: () =>\n import('@main-application/no-permission/no-permission.component').then(m => m.NoPermissionComponent),\n },\n ],\n },\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule],\n})\nexport class ApplicationMenuRoutingModule {}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatNativeDateModule } from '@angular/material/core';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatGridListModule } from '@angular/material/grid-list';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatListModule } from '@angular/material/list';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatSortModule } from '@angular/material/sort';\nimport { MatStepperModule } from '@angular/material/stepper';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { AbstractSecurityStorage } from 'angular-auth-oidc-client';\n\nimport { IdleTimeModule } from '@app/modules/ui-components/components/idle-time/idle-time.module';\nimport { NewTurnoverModalModule } from '@app/modules/ui-components/modals/new-turnover-modal/new-turnover-modal.module';\nimport { OidcStorageService } from '@app/services/oidc-storage.service';\nimport { NotificationsModule } from '@main-application/notifications/notifications.module';\nimport { PortfolioStoreModule } from '@portfolio/store/portfolio-store.module';\nimport { DirectivesModule } from '@shared/directives/directives.module';\nimport { PipesModule } from '@shared/pipes/pipes.module';\nimport { ValueIfNonZeroPipe } from '@shared/pipes/valueIfNonZero.pipe';\nimport { ValueIfPositivePipe } from '@shared/pipes/valueIfPositive.pipe';\nimport { YesEmptyPipe } from '@shared/pipes/yesEmpty.pipe';\nimport { AnimationModule } from '@ui-components/components/animation/animation.module';\nimport { AvatarModule } from '@ui-components/components/avatar/avatar.module';\nimport { IconComponent } from '@ui-components/components/icon/icon.component';\nimport { NotificationRingModule } from '@ui-components/components/notification-ring/notification-ring.module';\nimport { RadioButtonDropdownModule } from '@ui-components/components/radio-button-dropdown/radio-button-dropdown.module';\nimport { SearchInputModule } from '@ui-components/components/search-input/search-input.module';\nimport { ModalsModule } from '@ui-components/modals/modals.module';\n\nimport { ApplicationMenuComponent } from './application-menu.component';\nimport { ApplicationMenuRoutingModule } from './application-menu.routing.module';\nimport { BreadcrumbItemComponent } from './breadcrumb-item/breadcrumb-item.component';\nimport { PropertySelectorComponent } from './property-selector/property-selector.component';\nimport { SidePanelComponent } from './side-panel/side-panel.component';\nimport { SidePanelSectionComponent } from './side-panel-section/side-panel-section.component';\nimport { SidePanelSectionItemComponent } from './side-panel-section-item/side-panel-section-item.component';\nimport { TopPanelComponent } from './top-panel/top-panel.component';\n\n@NgModule({\n declarations: [\n ApplicationMenuComponent,\n SidePanelComponent,\n SidePanelSectionComponent,\n SidePanelSectionItemComponent,\n TopPanelComponent,\n PropertySelectorComponent,\n BreadcrumbItemComponent,\n ],\n imports: [\n CommonModule,\n NotificationsModule,\n\n ModalsModule,\n FormsModule,\n ReactiveFormsModule,\n\n MatAutocompleteModule,\n MatBadgeModule,\n MatButtonModule,\n MatCardModule,\n MatCheckboxModule,\n MatDatepickerModule,\n MatDialogModule,\n MatDividerModule,\n MatExpansionModule,\n MatFormFieldModule,\n MatGridListModule,\n MatIconModule,\n MatInputModule,\n MatListModule,\n MatMenuModule,\n MatNativeDateModule,\n MatPaginatorModule,\n MatRadioModule,\n MatSelectModule,\n MatSidenavModule,\n MatSnackBarModule,\n MatSortModule,\n MatStepperModule,\n MatTabsModule,\n MatTableModule,\n MatToolbarModule,\n MatTooltipModule,\n MatChipsModule,\n MatProgressSpinnerModule,\n\n ApplicationMenuRoutingModule,\n PipesModule,\n IdleTimeModule,\n DirectivesModule,\n NewTurnoverModalModule,\n ModalsModule,\n PortfolioStoreModule,\n AnimationModule,\n IconComponent,\n AvatarModule, //ToDo: make it stand alone component & move out from master-module\n SearchInputModule, //ToDo: make it stand alone component & move out from master-module\n RadioButtonDropdownModule, //ToDo: (maybe?) make it stand alone component & move out from master-module\n NotificationRingModule, //ToDo: make it stand alone component & move out from master-module\n ],\n providers: [\n YesEmptyPipe,\n ValueIfPositivePipe,\n ValueIfNonZeroPipe,\n { provide: AbstractSecurityStorage, useClass: OidcStorageService },\n ],\n})\nexport class ApplicationMenuModule {}\n","
\n \n \n
{{ control.value }}
\n
\n \n
\n
\n\n \n\n\n\n
\n \n \n
\n
\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n Self,\n ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, FormGroupDirective, NgControl } from '@angular/forms';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { distinctUntilChanged, tap } from 'rxjs/operators';\n\nimport { CustomControlAbstract } from '@app/components/abstract/custom-control.abstract';\nimport { EIcon } from '@shared/enums/icon.enum';\n\n@UntilDestroy()\n@Component({\n selector: 'app-custom-color-picker',\n templateUrl: './custom-color-picker.component.html',\n styleUrls: ['./custom-color-picker.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CustomColorPickerComponent\n extends CustomControlAbstract\n implements OnInit, OnDestroy, ControlValueAccessor\n{\n readonly labelOutsideDefaultCss = 'nowrap body-small-bold';\n\n @Input() selectCss = 'body-small text-color dark';\n @Input() set labelCss(value: string) {\n this._labelCss = value;\n }\n get labelCss(): string {\n if (this._labelCss) return this._labelCss;\n\n return this.labelOutsideDefaultCss;\n }\n\n private _valueCss: string;\n @Input() set valueCss(value) {\n this._valueCss = value;\n }\n get valueCss() {\n if (this._valueCss) {\n return this._valueCss;\n }\n return 'ellipsis text-color dark body-small';\n }\n @Input() containerCss = 'display-flex align-items-center';\n @Input() label = '';\n @Input() icon: EIcon;\n @Input() iconCss = 'dropdown-icon';\n @Input() iconTooltip = '';\n @Input() attrPlaceholder = '';\n @Input() attrDisable = false;\n @Input() markAsInvalid = false;\n @Input() errorSection = true;\n\n _labelCss = '';\n _labelElement: ElementRef;\n\n @ViewChild('labelElement', { static: false }) set content(value: ElementRef) {\n if (!value) return;\n\n this._labelElement = value;\n this.cdr.detectChanges();\n }\n\n constructor(\n @Self() @Optional() protected ngControl: NgControl,\n protected cdr: ChangeDetectorRef,\n @Optional() formDirective: FormGroupDirective\n ) {\n super(ngControl, cdr, formDirective);\n }\n\n ngOnInit(): void {\n this.initControlBase();\n\n this.control.valueChanges\n .pipe(\n untilDestroyed(this),\n distinctUntilChanged(),\n tap(value => this.onChanged(value))\n )\n .subscribe();\n }\n\n writeValue(value: any): void {\n if (value != this.control.value) {\n this.control.setValue(value);\n }\n }\n\n ngOnDestroy(): void {}\n}\n","

{{ editMode ? 'Edit' : 'Add' }} board

\n
\n \n
\n
\n \n \n
\n\n
\n \n
\n\n
\n
\n
\n \n\n
\n\n \n\n \n\n \n\n \n
\n\n \n
\n
\n
\n
\n \n
\n \n \n
\n
\n
\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, OnInit } from '@angular/core';\nimport { FormBuilder, Validators } from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { Store } from '@ngrx/store';\nimport { last, remove } from 'lodash';\nimport { BehaviorSubject } from 'rxjs';\nimport { distinctUntilChanged, filter, tap } from 'rxjs/operators';\n\nimport {\n Board,\n BoardConfiguration,\n BoardOutputBehaviourList,\n BoardOutputTypeList,\n BoardSourceTypeList,\n BoardTypeList,\n ProgressTypeList,\n RestBoardModel,\n disallowSourceTypeOutputTypeMap,\n} from '@main-application/boards/interfaces/board';\nimport { selectPortfolios } from '@portfolio/store/portfolio.selectors';\nimport { AppRoutes } from '@shared/constants/app-routes.const';\nimport { ButtonType } from '@shared/enums/button-type';\nimport { IRadioButtonOption } from '@shared/interfaces/radio-button-option.interface';\nimport { RestPortfolioModel } from '@shared/interfaces/rest-portfolio-model.interface';\nimport { EnumerationValuePipe } from '@shared/pipes/enumeration-value.pipe';\nimport { SnackbarService } from '@ui-components/components/customized-snackbar/snackbar.service';\n\nimport {\n BoardOutputBehaviour,\n BoardOutputType,\n BoardProgressType,\n BoardSourceType,\n BoardType,\n} from '../interfaces/board.enums';\nimport { BoardService } from '../services/board.service';\n\n@UntilDestroy()\n@Component({\n selector: 'app-boards-create',\n templateUrl: './boards-create.component.html',\n styleUrls: ['./boards-create.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BoardsCreateComponent implements OnInit {\n constructor(\n private router: Router,\n private activatedRoute: ActivatedRoute,\n private dialogRef: MatDialogRef,\n private formBuilder: FormBuilder,\n private boardService: BoardService,\n private store: Store<{}>,\n private cdr: ChangeDetectorRef,\n private snackbarService: SnackbarService,\n private enumerationValuePipe: EnumerationValuePipe,\n @Inject(MAT_DIALOG_DATA) public data?: BoardConfiguration\n ) {}\n\n private boardActionSubject = new BehaviorSubject(false);\n inProgress$ = this.boardActionSubject.asObservable();\n ButtonType = ButtonType;\n form = this.formBuilder.group({\n selectedPortfolioIds: [this.data?.selectedPortfolioIds],\n boardType: [this.data?.boardType, [Validators.required]],\n name: [this.data?.name, [Validators.required]],\n progressType: [this.data?.progressType, [Validators.required]],\n datasource: [this.data?.datasource, [Validators.required]],\n outputAction: [this.data?.outputAction, []],\n outputBehaviour: [this.data?.outputBehaviour, []],\n boardCellColor: [this.data?.boardCellColor ?? '#ffffff'],\n });\n progressTypeList = ProgressTypeList;\n boardSourceTypeList = BoardSourceTypeList;\n boardTypeList = BoardTypeList;\n boardOutputTypeList = BoardOutputTypeList;\n boardOutputBehaviorList = BoardOutputBehaviourList;\n userPortfolios: IRadioButtonOption[] = [];\n editMode: boolean;\n isSettingsOpened = false;\n\n ngOnInit(): void {\n this.editMode = !!this.data;\n this.form.patchValue(this.data);\n if (!this.data?.selectedPortfolioIds?.length) {\n this.form.controls.selectedPortfolioIds.setValue([-1]);\n }\n this.store\n .select(selectPortfolios)\n .pipe(\n untilDestroyed(this),\n filter(portfolios => !!portfolios?.length),\n tap((portfolios: RestPortfolioModel[]) => {\n this.userPortfolios = [\n {\n value: -1,\n label: 'All portfolios',\n sort: 0,\n },\n ];\n this.userPortfolios.push(\n ...portfolios.map>(item => {\n return {\n value: item.id,\n label: item.name,\n };\n })\n );\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n\n this.form.controls.selectedPortfolioIds.valueChanges\n .pipe(\n untilDestroyed(this),\n distinctUntilChanged(),\n tap(value => {\n if (value?.length > 1 && last(value) > 0) {\n remove(value, x => x < 0);\n this.form.controls.selectedPortfolioIds.setValue(value);\n }\n if (value?.length > 1 && last(value) < 0) {\n this.form.controls.selectedPortfolioIds.setValue([-1]);\n }\n if (!value?.length) {\n this.form.controls.selectedPortfolioIds.setValue([-1]);\n }\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n\n this.form.controls.boardType.valueChanges\n .pipe(\n distinctUntilChanged(),\n untilDestroyed(this),\n tap(value => {\n if (\n !this.form.value.name ||\n this.boardTypeList\n .flat()\n .map(e => e.label)\n .includes(this.form.value.name)\n ) {\n const selected = this.boardTypeList.flat().find(x => x.value === value);\n if (selected) {\n this.form.controls.name.setValue(selected.label);\n\n switch (value) {\n case BoardType.MakeReady:\n this.form.controls.progressType.setValue(BoardProgressType.UpdateMakeReadyProgressBar);\n this.form.controls.datasource.setValue(BoardSourceType.MakeReadyUnits);\n this.form.controls.outputAction.setValue(BoardOutputType.SendToApproval);\n this.form.controls.outputBehaviour.setValue(BoardOutputBehaviour.Automatically);\n this.form.controls.boardCellColor.setValue('#ffffff');\n break;\n case BoardType.Reno:\n this.form.controls.progressType.setValue(BoardProgressType.UpdateRENOProgressBar);\n this.form.controls.datasource.setValue(BoardSourceType.RenoUnits);\n this.form.controls.outputAction.setValue(BoardOutputType.SendToApproval);\n this.form.controls.outputBehaviour.setValue(BoardOutputBehaviour.Automatically);\n this.form.controls.boardCellColor.setValue('#f5fbfb');\n break;\n case BoardType.Marketing:\n this.form.controls.progressType.setValue(BoardProgressType.None);\n this.form.controls.datasource.setValue(BoardSourceType.UnleasedUnits);\n this.form.controls.outputAction.setValue(BoardOutputType.None);\n this.form.controls.outputBehaviour.setValue(null);\n this.form.controls.boardCellColor.setValue('#fafffa');\n break;\n case BoardType.Eviction:\n this.form.controls.progressType.setValue(BoardProgressType.UpdateNoticeProgressBar);\n this.form.controls.datasource.setValue(BoardSourceType.UnitsInNoticeUnderEviction);\n this.form.controls.outputAction.setValue(BoardOutputType.SendToMoveOut);\n this.form.controls.outputBehaviour.setValue(BoardOutputBehaviour.Automatically);\n this.form.controls.boardCellColor.setValue('#FFF7F7');\n break;\n case BoardType.MoveIn:\n this.form.controls.progressType.setValue(BoardProgressType.UpdateMoveInProgressBar);\n this.form.controls.datasource.setValue(BoardSourceType.UnitsInMoveIn);\n this.form.controls.outputAction.setValue(BoardOutputType.SendToArchive);\n this.form.controls.outputBehaviour.setValue(BoardOutputBehaviour.Automatically);\n this.form.controls.boardCellColor.setValue('#ffffff');\n break;\n case BoardType.MoveOut:\n this.form.controls.progressType.setValue(BoardProgressType.UpdateMoveOutProgressBar);\n this.form.controls.datasource.setValue(BoardSourceType.MoveOutUnits);\n this.form.controls.outputAction.setValue(BoardOutputType.SendToMakeReady);\n this.form.controls.outputBehaviour.setValue(BoardOutputBehaviour.Automatically);\n this.form.controls.boardCellColor.setValue('#ffffff');\n break;\n case BoardType.Approval:\n this.form.controls.progressType.setValue(BoardProgressType.UpdateApprovalProgressBar);\n this.form.controls.datasource.setValue(BoardSourceType.NonPmsUnits);\n this.form.controls.outputAction.setValue(BoardOutputType.SendToArchive);\n this.form.controls.outputBehaviour.setValue(BoardOutputBehaviour.Automatically);\n this.form.controls.boardCellColor.setValue('#ffffff');\n break;\n case BoardType.NonPms:\n this.form.controls.progressType.setValue(BoardProgressType.None);\n this.form.controls.datasource.setValue(BoardSourceType.NonPmsUnits);\n this.form.controls.outputAction.setValue(BoardOutputType.SendToArchive);\n this.form.controls.outputBehaviour.setValue(BoardOutputBehaviour.Automatically);\n this.form.controls.boardCellColor.setValue('#fdfdf2');\n break;\n case BoardType.Custom:\n this.form.controls.progressType.setValue(BoardProgressType.None);\n this.form.controls.datasource.setValue(undefined);\n this.form.controls.outputAction.setValue(undefined);\n this.form.controls.outputBehaviour.setValue(BoardOutputBehaviour.Automatically);\n this.form.controls.boardCellColor.setValue('#ffffff');\n this.isSettingsOpened = true;\n }\n }\n }\n\n switch (value) {\n case BoardType.MakeReady:\n case BoardType.Reno:\n this.form.controls.outputAction.setValidators(Validators.required);\n this.form.controls.outputAction.updateValueAndValidity();\n break;\n case BoardType.Marketing:\n this.form.controls.outputAction.clearValidators();\n this.form.controls.outputAction.updateValueAndValidity();\n break;\n }\n\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n\n if (!this.editMode) {\n this.form.controls.boardType.setValue(BoardType.MakeReady);\n }\n }\n\n toggleAdvancedSettings() {\n this.isSettingsOpened = !this.isSettingsOpened;\n }\n\n ok() {\n if (\n this.form.value.outputBehaviour === BoardOutputBehaviour.Automatically &&\n this.form.value.datasource != null &&\n this.form.value.outputAction != null &&\n disallowSourceTypeOutputTypeMap[this.form.value.datasource] === this.form.value.outputAction\n ) {\n this.snackbarService.error(\n `Turns cannot auto-progress to the same step they started in. Either set “Remove rows” to \"manual\" or choose an ending destination that is not \"${this.enumerationValuePipe.transform(\n this.form.value.outputAction,\n BoardOutputTypeList\n )}\"`\n );\n return;\n }\n\n if (this.form.valid) {\n this.boardActionSubject.next(true);\n if (this.editMode) {\n this.dialogRef.close({\n ...this.data,\n ...this.form.value,\n });\n return;\n }\n const board = new Board(Object.assign({}, this.data, this.form.value));\n this.boardService.add(new RestBoardModel(board)).subscribe(id => {\n this.router.navigate([AppRoutes.BOARDS, id], { relativeTo: this.activatedRoute });\n this.dialogRef.close();\n });\n } else {\n this.form.markAllAsTouched();\n }\n }\n\n close() {\n this.dialogRef.close();\n }\n}\n","export enum BoardColumnType {\n Unselected = 0,\n Unit = 'Unit',\n Comments = 'Comments',\n PropertyName = 'PropertyName',\n\n // == Date ==\n MoveIn = 'MoveIn',\n MoveOut = 'MoveOut',\n Available = 'Available',\n Showable = 'Showable',\n CustomDate = 'CustomDate',\n\n // == Dollar ==\n NewRent = 'NewRent',\n OldRent = 'OldRent',\n MarketRent = 'MarketRent',\n AdvertisedRent = 'AdvertisedRent',\n CustomAmount = 'CustomAmount',\n UnitTotal = 'UnitTotal',\n Budget = 'Budget',\n Delta = 'Variance',\n\n // == Info ==\n UnitType = 'UnitType',\n NewTenant = 'NewTenant',\n\n // == Enum ==\n NewFinish = 'NewFinish',\n OldFinish = 'OldFinish',\n Finish = 'Finish',\n\n // == Schedule ==\n Simple = 'Simple',\n Timed = 'Timed',\n Workorder = 'Workorder',\n\n // == Time ==\n Days = 'Days', // -- days in current step\n TotalDays = 'TotalDays', // -- days since move-out date\n}\n\nexport enum BoardType {\n MakeReady,\n Reno,\n Marketing,\n Custom,\n Eviction,\n MoveOut,\n MoveIn,\n Approval,\n NonPms,\n}\n\nexport enum BoardOutputType {\n SendToApproval,\n SendToLeaseUpOrMoveIn,\n None,\n SendToMoveOut,\n SendToMakeReady,\n SendToPunch,\n SendToReno,\n SendToArchive,\n}\n\nexport enum BoardOutputBehaviour {\n Manually,\n Automatically,\n}\n\nexport enum BoardProgressType {\n None,\n UpdateMakeReadyProgressBar,\n UpdateRENOProgressBar,\n UpdateNoticeProgressBar,\n UpdateMoveInProgressBar,\n UpdateMoveOutProgressBar,\n UpdateApprovalProgressBar,\n}\n\nexport enum BoardSourceType {\n MakeReadyUnits,\n RenoUnits,\n UnleasedUnits,\n OnNoticeUnits,\n MoveOutUnits,\n MarketingUnits,\n OnNoticeAndUnleasedUnits,\n Manual,\n UnitsInNoticeUnderEviction,\n UnitsInMoveIn,\n UnitsInApproval,\n UnitsInPunch,\n None,\n NonPmsUnits,\n}\n\nexport enum BoardMakeReadySteps {\n TrashOut = 'Trash out',\n Painting = 'Painting',\n Hardware = 'Hardware',\n Flooring = 'Flooring',\n RemoveOldApp = 'Remove old app.',\n InstallNewApp = 'Install new app.',\n}\n\nexport enum ScheduleCellStatus {\n Due,\n Skipped,\n Done,\n Late,\n Unscheduled,\n Pending,\n Moved,\n}\n\nexport enum BoardView {\n Unit,\n Calendar,\n}\n","import { extend } from 'lodash';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { InspectionType } from '@main-application/inspections/models/rest-inspections-model.interface';\nimport { WorkflowStepEnumType } from '@shared/enums/workflow-step.enum';\nimport { IRadioButtonOption } from '@shared/interfaces/radio-button-option.interface';\nimport { RestTurnoverTaskModel } from '@shared/interfaces/turnover.interface';\n\nimport {\n BoardColumnType,\n BoardOutputBehaviour,\n BoardOutputType,\n BoardProgressType,\n BoardSourceType,\n BoardType,\n ScheduleCellStatus,\n} from './board.enums';\nimport { CellValueHelper } from '../services/cell-value.helper';\n\nexport class RestTurnStepScheduleBaseModel {\n turnoverDateAvailable: Date;\n turnoverDateShowable: Date;\n dateCompleted: Date;\n originalDueDate: Date;\n}\n\nexport class RestTurnStepScheduleModel extends RestTurnStepScheduleBaseModel {\n id: number;\n turnoverId: number;\n boardColumnUID: string;\n boardLayoutsId: number;\n workflowStepId: number;\n assignee: number;\n notifyAssignee: boolean;\n dueDate: Date;\n status: ScheduleCellStatus;\n note: string;\n sortOrder: number;\n amount?: number;\n inspectionId?: number;\n inspectionType?: InspectionType;\n inspectionTemplateId?: number;\n inspectionItemsCompleted?: number;\n inspectionItemsTotal?: number;\n}\n\nexport class RestBoardModel {\n id: number;\n name: string;\n allPortfolios: boolean;\n selectedPortfolioIds?: string;\n boardType: BoardType;\n boardColumnsConfig: string;\n progressType: BoardProgressType;\n datasource: BoardSourceType;\n outputAction: BoardOutputType;\n outputBehaviour: BoardOutputBehaviour;\n boardCellColor: string;\n\n constructor(board: Board) {\n this.id = board.id;\n this.name = board.name;\n this.progressType = board.progressType;\n this.datasource = board.datasource;\n this.boardType = board.boardType;\n this.outputAction = board.outputAction;\n this.outputBehaviour = board.outputBehaviour;\n this.boardCellColor = board.boardCellColor;\n this.allPortfolios = board.allPortfolios;\n this.selectedPortfolioIds = board.selectedPortfolioIds?.length ? board.selectedPortfolioIds.join(',') : undefined;\n this.boardColumnsConfig = JSON.stringify(board.columns.filter(e => e.type !== BoardColumnType.Unselected));\n }\n}\n\nfunction isBoardResponse(entity: any): entity is RestBoardModel {\n return (\n typeof entity.datasource === 'number' &&\n typeof entity.id === 'number' &&\n typeof entity.boardColumnsConfig === 'string' &&\n typeof entity.name === 'string'\n );\n}\n\nexport interface BoardConfiguration {\n id: number;\n name: string;\n allPortfolios: boolean;\n selectedPortfolioIds?: number[];\n boardType: BoardType;\n progressType: BoardProgressType;\n datasource: BoardSourceType;\n outputAction: BoardOutputType;\n outputBehaviour: BoardOutputBehaviour;\n boardCellColor: string;\n}\n\nexport class Board implements BoardConfiguration {\n id: number;\n name: string;\n allPortfolios: boolean;\n selectedPortfolioIds?: number[];\n boardType: BoardType;\n progressType: BoardProgressType;\n datasource: BoardSourceType;\n outputAction: BoardOutputType;\n outputBehaviour: BoardOutputBehaviour;\n boardCellColor: string;\n columns: BoardColumn[] = [];\n\n constructor(config: BoardConfiguration | RestBoardModel) {\n if (isBoardResponse(config)) {\n const columns = JSON.parse(config.boardColumnsConfig);\n if (Array.isArray(columns)) {\n this.columns = columns.filter(e => isBoardColumn(e));\n this.columns.forEach(c => (c.id = c.id ?? uuidv4()));\n\n const propertyColumnIndex = this.columns.findIndex(c => c.type == BoardColumnType.PropertyName);\n let unitColumnIndex = this.columns.findIndex(c => c.type == BoardColumnType.Unit);\n\n if (propertyColumnIndex === -1 || propertyColumnIndex !== unitColumnIndex + 1) {\n // make Property columns always next after Unit\n if (propertyColumnIndex !== -1) {\n this.columns.splice(propertyColumnIndex, 1);\n }\n unitColumnIndex = this.columns.findIndex(c => c.type == BoardColumnType.Unit);\n\n this.columns.splice(unitColumnIndex + 1, 0, {\n id: uuidv4(),\n name: 'Property',\n type: BoardColumnType.PropertyName,\n editable: false,\n visible: true,\n frozen: false,\n });\n }\n } else {\n this.initDefaultColumns();\n }\n this.id = config.id;\n this.name = config.name;\n this.progressType = config.progressType;\n this.boardType = config.boardType;\n this.datasource = config.datasource;\n this.outputAction = config.outputAction;\n this.outputBehaviour = config.outputBehaviour;\n this.selectedPortfolioIds = config.selectedPortfolioIds\n ? config.selectedPortfolioIds.split(',').map(Number)\n : undefined;\n this.allPortfolios = config.allPortfolios;\n this.boardCellColor = config.boardCellColor ?? '#ffffff';\n } else {\n extend(this, config);\n this.initDefaultColumns();\n }\n }\n\n addColumn(\n name: string,\n type: BoardColumnType,\n editable = true,\n workflowStep = null,\n visible = true,\n frozen = false,\n poisition?: number\n ): string {\n const id = uuidv4();\n const column = {\n id,\n name,\n type,\n workflowStep,\n editable,\n visible,\n frozen,\n };\n if (poisition === undefined) {\n this.columns.push(column);\n } else {\n this.columns.splice(poisition, 0, column);\n }\n return id;\n }\n\n private initDefaultColumns() {\n this.addColumn('Unit', BoardColumnType.Unit, false, null, true, true);\n this.addColumn('Property', BoardColumnType.PropertyName, false, null, true, true);\n\n switch (this.boardType) {\n case BoardType.MakeReady:\n this.addColumn('Conversation', BoardColumnType.Comments);\n this.addColumn('Move out', BoardColumnType.MoveOut, false);\n this.addColumn('Move in', BoardColumnType.MoveIn, false);\n this.addColumn('Avail', BoardColumnType.Available, true);\n this.addColumn('Trash out', BoardColumnType.Simple);\n this.addColumn('Paint', BoardColumnType.Simple);\n this.addColumn('Flooring', BoardColumnType.Simple);\n this.addColumn('Clean', BoardColumnType.Simple);\n break;\n case BoardType.Reno:\n this.addColumn('Conversation', BoardColumnType.Comments);\n this.addColumn('Move out', BoardColumnType.MoveOut, false);\n this.addColumn('Move in', BoardColumnType.MoveIn, false);\n this.addColumn('Avail', BoardColumnType.Available, true);\n this.addColumn('Demo', BoardColumnType.Simple);\n this.addColumn('Paint', BoardColumnType.Simple);\n this.addColumn('Flooring', BoardColumnType.Simple);\n this.addColumn('Trimout', BoardColumnType.Simple);\n this.addColumn('Appliances', BoardColumnType.Simple);\n this.addColumn('Final clean', BoardColumnType.Simple);\n break;\n case BoardType.Marketing:\n this.addColumn('Conversation', BoardColumnType.Comments);\n this.addColumn('Type', BoardColumnType.UnitType, false);\n this.addColumn('Finish', BoardColumnType.Finish, false);\n this.addColumn('Move out', BoardColumnType.MoveOut, false);\n this.addColumn('Avail', BoardColumnType.Available, true);\n this.addColumn('Adv.Rent', BoardColumnType.AdvertisedRent, false);\n this.addColumn('Market Rent', BoardColumnType.MarketRent, false);\n break;\n case BoardType.Eviction:\n this.addColumn('Conversation', BoardColumnType.Comments);\n this.addColumn('NTV', BoardColumnType.Simple);\n this.addColumn('Eviction Filed', BoardColumnType.Simple);\n this.addColumn('Hearing', BoardColumnType.Simple);\n this.addColumn('Judgment', BoardColumnType.Simple);\n this.addColumn('Appeal', BoardColumnType.Simple);\n this.addColumn('Writ Filed', BoardColumnType.Simple);\n this.addColumn('Writ Posted', BoardColumnType.Simple);\n this.addColumn('Writ Executed', BoardColumnType.Simple);\n break;\n case BoardType.MoveIn:\n this.addColumn('Conversation', BoardColumnType.Comments);\n this.addColumn('Move in', BoardColumnType.MoveIn, false);\n this.addColumn('Application', BoardColumnType.Simple);\n this.addColumn('Set MI Date', BoardColumnType.Simple);\n this.addColumn('Lease signed', BoardColumnType.Simple);\n this.addColumn('Key prep', BoardColumnType.Simple);\n this.addColumn('Final Sparkle', BoardColumnType.Simple);\n this.addColumn('Key handover', BoardColumnType.Simple);\n this.addColumn('MI Inspection', BoardColumnType.Simple);\n this.addColumn('PMS MoveIn', BoardColumnType.Simple);\n break;\n case BoardType.MoveOut:\n this.addColumn('Conversation', BoardColumnType.Comments);\n this.addColumn('Move out', BoardColumnType.MoveOut, false);\n this.addColumn('Move in', BoardColumnType.MoveIn, false);\n this.addColumn('Inspection', BoardColumnType.Simple);\n this.addColumn('Bid', BoardColumnType.Simple);\n this.addColumn('Keys', BoardColumnType.Simple);\n this.addColumn('Deposit', BoardColumnType.Simple);\n this.addColumn('PMS MoveOut', BoardColumnType.Simple);\n this.addColumn('Marketing', BoardColumnType.Simple);\n break;\n case BoardType.Approval:\n this.addColumn('Conversation', BoardColumnType.Comments);\n this.addColumn('Move in', BoardColumnType.MoveIn, false);\n this.addColumn('Avail', BoardColumnType.Available, true);\n this.addColumn('Blue Tape', BoardColumnType.Simple);\n this.addColumn('Final Clean', BoardColumnType.Simple);\n break;\n case BoardType.Custom:\n this.addColumn('Conversation', BoardColumnType.Comments);\n this.addColumn('Move out', BoardColumnType.MoveOut, false);\n this.addColumn('Anything', BoardColumnType.Simple);\n this.addColumn('your', BoardColumnType.Simple);\n this.addColumn('heart', BoardColumnType.Simple);\n this.addColumn('desires!', BoardColumnType.Simple);\n break;\n default:\n this.addColumn('Conversation', BoardColumnType.Comments);\n this.addColumn('Trash out', BoardColumnType.Simple);\n this.addColumn('Hardware', BoardColumnType.Simple);\n break;\n }\n }\n}\n\nexport type Sorting = 'ascending' | 'descending' | null;\n\nexport class ColumnSorting {\n columnId: string;\n sortFunction: (e1: RestTurnoverTaskModel, e2: RestTurnoverTaskModel) => number;\n\n constructor(column: BoardColumn, sorting: Sorting, primaryValue: boolean, private cellValueHelper: CellValueHelper) {\n this.columnId = column.id;\n const fieldFunction = this.getComparedValueFunction(column, this.columnId, primaryValue);\n this.sortFunction =\n fieldFunction == null\n ? null\n : (e1, e2) => {\n const value1 = fieldFunction(e1);\n const value2 = fieldFunction(e2);\n if (value1 != value2) {\n return (value1 > value2 ? 1 : -1) * (sorting == 'ascending' ? 1 : -1);\n }\n return 0;\n };\n }\n\n private getComparedValueFunction(\n column: BoardColumn,\n columnId: string,\n primaryValue: boolean\n ): (e: RestTurnoverTaskModel) => string | number {\n return primaryValue ? e => this.cellValueHelper.getComparableValue(column, e, columnId) : e => e.phasePriority;\n }\n}\n\nexport class BoardColumn {\n id: string;\n editable: boolean;\n name: string;\n type: BoardColumnType;\n workflowStep?: WorkflowStepEnumType;\n inspectionTemplateId?: number;\n frozen = false;\n visible = true;\n\n constructor(config: Partial) {\n Object.assign(this, config);\n this.id = this.id ?? uuidv4();\n }\n}\n\nfunction isBoardColumn(entity: any): entity is BoardColumn {\n return typeof entity.name === 'string' && typeof entity.type === 'string';\n}\n\nexport const isColumnSummable = (column: BoardColumn): boolean => {\n return [\n BoardColumnType.CustomAmount,\n BoardColumnType.Simple,\n BoardColumnType.UnitTotal,\n BoardColumnType.Budget,\n BoardColumnType.Delta,\n ].includes(column.type);\n};\n\nexport const isCostColumn = (column: BoardColumn): boolean => {\n return [BoardColumnType.CustomAmount, BoardColumnType.Simple].includes(column.type);\n};\n\nexport const ProgressTypeList: IRadioButtonOption[] = [\n {\n label: 'None',\n value: BoardProgressType.None,\n },\n {\n label: 'MAKE READY',\n value: BoardProgressType.UpdateMakeReadyProgressBar,\n },\n {\n label: 'RENO',\n value: BoardProgressType.UpdateRENOProgressBar,\n },\n {\n label: 'NOTICE',\n value: BoardProgressType.UpdateNoticeProgressBar,\n },\n {\n label: 'MOVE IN',\n value: BoardProgressType.UpdateMoveInProgressBar,\n },\n {\n label: 'MOVE OUT',\n value: BoardProgressType.UpdateMoveOutProgressBar,\n },\n {\n label: 'APPROVAL',\n value: BoardProgressType.UpdateApprovalProgressBar,\n },\n];\n\nexport const BoardSourceTypeList: IRadioButtonOption[] = [\n {\n label: 'MAKE READY',\n value: BoardSourceType.MakeReadyUnits,\n },\n {\n label: 'RENO',\n value: BoardSourceType.RenoUnits,\n },\n {\n label: 'Unleased',\n value: BoardSourceType.UnleasedUnits,\n },\n {\n label: 'NOTICE',\n value: BoardSourceType.OnNoticeUnits,\n },\n {\n label: 'MOVE OUT',\n value: BoardSourceType.MoveOutUnits,\n },\n {\n label: 'NOTICE and Unleased',\n value: BoardSourceType.OnNoticeAndUnleasedUnits,\n },\n {\n label: 'NOTICE under Eviction',\n value: BoardSourceType.UnitsInNoticeUnderEviction,\n },\n {\n label: 'APPROVAL',\n value: BoardSourceType.UnitsInApproval,\n },\n {\n label: 'MOVE IN',\n value: BoardSourceType.UnitsInMoveIn,\n },\n {\n label: 'PUNCH',\n value: BoardSourceType.UnitsInPunch,\n },\n {\n label: 'Non-PMS',\n value: BoardSourceType.NonPmsUnits,\n },\n];\n\nexport const BoardTypeList: IRadioButtonOption[][] = [\n [\n {\n label: 'Make Ready',\n value: BoardType.MakeReady,\n },\n {\n label: 'Reno',\n value: BoardType.Reno,\n },\n {\n label: 'Marketing',\n value: BoardType.Marketing,\n },\n {\n label: 'Eviction',\n value: BoardType.Eviction,\n },\n {\n label: 'Move In',\n value: BoardType.MoveIn,\n },\n {\n label: 'Move Out',\n value: BoardType.MoveOut,\n },\n {\n label: 'Approval',\n value: BoardType.Approval,\n },\n {\n label: 'Non-PMS',\n value: BoardType.NonPms,\n },\n ],\n [\n {\n label: 'Custom',\n value: BoardType.Custom,\n },\n ],\n];\n\nexport const BoardOutputBehaviourList: IRadioButtonOption[] = [\n {\n label: 'Automatically',\n value: BoardOutputBehaviour.Automatically,\n },\n {\n label: 'Manually',\n value: BoardOutputBehaviour.Manually,\n },\n];\n\nexport const BoardOutputTypeList: IRadioButtonOption[] = [\n {\n label: 'None',\n value: BoardOutputType.None,\n },\n {\n label: 'APPROVAL',\n value: BoardOutputType.SendToApproval,\n },\n {\n label: 'LEASE UP/MOVE IN',\n value: BoardOutputType.SendToLeaseUpOrMoveIn,\n },\n {\n label: 'MOVE OUT',\n value: BoardOutputType.SendToMoveOut,\n },\n {\n label: 'MAKE READY',\n value: BoardOutputType.SendToMakeReady,\n },\n {\n label: 'PUNCH',\n value: BoardOutputType.SendToPunch,\n },\n {\n label: 'RENO',\n value: BoardOutputType.SendToReno,\n },\n {\n label: 'ARCHIVE',\n value: BoardOutputType.SendToArchive,\n },\n];\n\nexport const disallowSourceTypeOutputTypeMap: Record = {\n [BoardSourceType.MakeReadyUnits]: BoardOutputType.SendToMakeReady,\n [BoardSourceType.UnitsInPunch]: BoardOutputType.SendToPunch,\n [BoardSourceType.RenoUnits]: BoardOutputType.SendToReno,\n [BoardSourceType.MoveOutUnits]: BoardOutputType.SendToMoveOut,\n [BoardSourceType.UnitsInMoveIn]: BoardOutputType.SendToLeaseUpOrMoveIn,\n [BoardSourceType.UnitsInApproval]: BoardOutputType.SendToApproval,\n};\n\nexport function getNextStepType(outputAction: BoardOutputType, turnover: RestTurnoverTaskModel): WorkflowStepEnumType {\n switch (outputAction) {\n case BoardOutputType.SendToLeaseUpOrMoveIn:\n return turnover.turnoverData.dateMoveIn !== null ? WorkflowStepEnumType.MoveIn : WorkflowStepEnumType.LeaseUp;\n case BoardOutputType.SendToApproval:\n return WorkflowStepEnumType.Approval;\n case BoardOutputType.SendToMoveOut:\n return WorkflowStepEnumType.MoveOut;\n case BoardOutputType.SendToReno:\n return WorkflowStepEnumType.Reno;\n case BoardOutputType.SendToMakeReady:\n return WorkflowStepEnumType.MakeReady;\n case BoardOutputType.SendToPunch:\n return WorkflowStepEnumType.Punch;\n case BoardOutputType.SendToArchive:\n return WorkflowStepEnumType.Archive;\n case BoardOutputType.None:\n return null;\n default:\n return WorkflowStepEnumType.Approval;\n }\n}\n\nexport function getCurrentStep(sourceType: BoardSourceType): WorkflowStepEnumType {\n switch (sourceType) {\n case BoardSourceType.MakeReadyUnits:\n return WorkflowStepEnumType.MakeReady;\n case BoardSourceType.RenoUnits:\n return WorkflowStepEnumType.Reno;\n case BoardSourceType.OnNoticeUnits:\n return WorkflowStepEnumType.Notice;\n case BoardSourceType.MoveOutUnits:\n return WorkflowStepEnumType.MoveOut;\n case BoardSourceType.MarketingUnits:\n return WorkflowStepEnumType.Marketing;\n case BoardSourceType.OnNoticeAndUnleasedUnits:\n return WorkflowStepEnumType.Notice;\n case BoardSourceType.UnitsInNoticeUnderEviction:\n return WorkflowStepEnumType.Notice;\n case BoardSourceType.UnitsInMoveIn:\n return WorkflowStepEnumType.MoveIn;\n case BoardSourceType.UnitsInApproval:\n return WorkflowStepEnumType.Approval;\n case BoardSourceType.UnitsInPunch:\n return WorkflowStepEnumType.Punch;\n default:\n return WorkflowStepEnumType.MoveOut;\n }\n}\n\nexport class BoardFilter {\n searchStr?: string;\n events?: EventActivityFilter[];\n types?: string[];\n finish?: number[];\n assignees?: number[];\n schedule?: string[];\n status?: ScheduleCellStatus[];\n boards?: number[];\n\n //Not used but keeped controls\n startMoveInDate?: Date;\n endMoveInDate?: Date;\n startMoveOutDate?: Date;\n endMoveOutDate?: Date;\n startAvailableDate?: Date;\n endAvailableDate?: Date;\n startShowableDate?: Date;\n endShowableDate?: Date;\n}\n\nexport class BoardEvent {\n name: string;\n id: string;\n colorScheme: number;\n}\n\nexport interface EventActivityFilter {\n eventType: number;\n value?: any;\n label: string;\n}\n","\n \n \n \n Back\n \n \n
\n \n
\n\n\n\n \n\n\n\n
\n
\n

Hello, {{ userData?.firstName || '' }}! 👋

\n \n \n \n {{ userData.id === assignee.value ? 'You have ' : '' }} {{ data.myTasksTurnovers }}\n {{ data.myTasksTurnovers === 1 ? 'turn' : 'turns' }} and {{ data.myTasksTickets }}\n {{ data.myTasksTickets === 1 ? 'ticket' : 'tickets' }}.\n \n {{ data.staleTurnovers }} stale\n \n \n \n {{ data.lateTurnovers }} late\n \n \n
\n \n
\n
\n \n
\n \n
\n\n\n

{{ headerValue || '' }}!

\n
\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnDestroy,\n OnInit,\n TemplateRef,\n} from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { Store } from '@ngrx/store';\nimport { Observable, combineLatest } from 'rxjs';\nimport { distinctUntilChanged, filter, tap } from 'rxjs/operators';\n\nimport { DashboardsAbstract } from '@dashboards/components/abstract/dashboards.abstract';\nimport { setDashboardFilter } from '@dashboards/store/actions/dashboard-filter.actions';\nimport { selectDashboardFilterState } from '@dashboards/store/selectors/dashboard-filter.selectors';\nimport {\n selectLateTurnoversCount,\n selectMyTasksLoading,\n selectMyTasksTicketsCount,\n selectMyTasksTurnoversCount,\n selectStaleTurnoversCount,\n} from '@dashboards/store/selectors/dashboards.selectors';\nimport { selectActiveUsers } from '@main-application/administration/selectors/administration.selectors';\nimport { PriorityType } from '@shared/enums/priority-type';\nimport { RestUserModel } from '@shared/interfaces/user.interface';\nimport { selectUserData } from '@shared/selectors/user.selectors';\n\n@UntilDestroy()\n@Component({\n selector: 'app-dashboard-user-header',\n templateUrl: './dashboard-user-header.component.html',\n styleUrls: ['./dashboard-user-header.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DashboardUserHeaderComponent extends DashboardsAbstract implements OnInit, OnDestroy {\n myTasksTurnovers$: Observable;\n staleTurnovers$: Observable;\n lateTurnovers$: Observable;\n myTasksTickets$: Observable;\n myTasksLoading$: Observable;\n assignee: UntypedFormControl = new UntypedFormControl();\n users: RestUserModel[];\n\n @Input() previousRoute?: string;\n @Input() headerValue = '';\n @Input() customHeaderTemplate: TemplateRef;\n @Input() containerCss = '';\n @Input() showAssigneeControl = false;\n\n get showBack() {\n return this.previousRoute;\n }\n\n constructor(protected cdr: ChangeDetectorRef, private store: Store<{}>, private router: Router) {\n super(cdr);\n }\n\n ngOnInit(): void {\n combineLatest([this.store.select(selectUserData), this.store.select(selectDashboardFilterState)])\n .pipe(\n untilDestroyed(this),\n filter(([userData]) => !!userData),\n tap(([userData, filter]) => {\n this.userData = userData;\n if (filter?.assignee !== undefined) {\n this.assignee.setValue(filter.assignee ?? -1);\n } else {\n this.store.dispatch(setDashboardFilter({ assignee: this.userData.id }));\n }\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n\n this.store\n .select(selectActiveUsers)\n .pipe(\n untilDestroyed(this),\n filter((users: RestUserModel[]) => !!users?.length),\n tap((users: RestUserModel[]) => {\n this.users = users;\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n\n this.assignee.valueChanges\n .pipe(\n untilDestroyed(this),\n distinctUntilChanged(),\n tap(assignee => {\n this.store.dispatch(setDashboardFilter({ assignee: assignee > 0 ? assignee : null }));\n })\n )\n .subscribe();\n\n this.myTasksLoading$ = this.store.select(selectMyTasksLoading);\n this.myTasksTurnovers$ = this.store.select(selectMyTasksTurnoversCount);\n this.myTasksTickets$ = this.store.select(selectMyTasksTicketsCount);\n this.staleTurnovers$ = this.store.select(selectStaleTurnoversCount);\n this.lateTurnovers$ = this.store.select(selectLateTurnoversCount);\n }\n\n goBack(evt: Event) {\n evt.preventDefault();\n this.router.navigateByUrl(this.previousRoute);\n }\n\n ngOnDestroy(): void {}\n\n protected readonly PriorityType = PriorityType;\n}\n","import { createFeatureSelector } from '@ngrx/store';\n\nimport * as fromDashboardFilter from '@dashboards/store/reducers/dashboard-filter.reducer';\n\nexport const selectDashboardFilterState = createFeatureSelector(\n fromDashboardFilter.dashboardFilterFeatureKey\n);\n","import { ChangeDetectorRef, Directive } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { filter, map, mergeMap } from 'rxjs';\nimport { catchError, tap } from 'rxjs/operators';\n\nimport { ComponentAbstract } from '@app/components/abstract/component.abstract';\nimport { InspectionModel } from '@main-application/inspections/models/inspection.model';\nimport { InspectionService } from '@main-application/inspections/services/inspection.service';\nimport { RoutePath } from '@shared/enums/route-path.enum';\nimport { SnackbarService } from '@ui-components/components/customized-snackbar/snackbar.service';\nimport { DialogResult } from '@ui-components/modals/config/dialog-result.enum';\nimport { ModalsService } from '@ui-components/modals/modals.service';\n\nimport { InspectionStatus } from '../models/rest-inspections-model.interface';\n\n@Directive()\nexport class InspectionsBaseComponent extends ComponentAbstract {\n readonly InspectionStatus = InspectionStatus;\n\n constructor(\n protected cdr: ChangeDetectorRef,\n protected inspectionService: InspectionService,\n protected snackbarService: SnackbarService,\n protected modalService: ModalsService,\n public router: Router\n ) {\n super(cdr);\n }\n\n share(inspection: InspectionModel, evt?: Event) {\n if (evt) {\n evt.preventDefault();\n }\n\n if (inspection.entityDetails.status === InspectionStatus.Completed) {\n this.inspectionService.openSendDialog(\n inspection.entityDetails.id,\n `${inspection.inspectionType} inspection: ${inspection.entityDetails.unit.propertyName} - ${inspection.entityDetails.unit.name}`\n );\n } else {\n this.snackbarService.error(`You can only share a completed inspection`);\n }\n }\n\n protected tableSortPredicate = (inspection: InspectionModel, sortHeaderId: string) => {\n switch (sortHeaderId) {\n case 'unit.name':\n return inspection.entityDetails.unit.name?.toLocaleLowerCase();\n case 'turboMode':\n return inspection.entityDetails.isTurboMode;\n case 'unit.propertyName':\n return inspection.entityDetails.unit.propertyName?.toLocaleLowerCase();\n case 'inspectionType':\n return (inspection.inspectionTemplate?.name ?? inspection.inspectionType)?.toLocaleLowerCase();\n case 'rooms':\n return inspection.areasLabel;\n case 'assignee':\n return inspection.entityDetails.assigneeUser?.displayName?.toLocaleLowerCase();\n case 'createdAt':\n return inspection.entityDetails.createdAt;\n case 'completedAt':\n return inspection.entityDetails.completedAt;\n case 'dueDate':\n return inspection.entityDetails.dueDate;\n default:\n return inspection[sortHeaderId];\n }\n };\n\n download(inspection: InspectionModel, evt?: Event) {\n if (evt) {\n evt.preventDefault();\n }\n\n if (inspection.entityDetails.status === InspectionStatus.Completed) {\n if (inspection.entityDetails.attachments?.attachment?.url) {\n window.open(inspection.entityDetails.attachments.attachment.url);\n } else {\n this.snackbarService.error('Inspection .pdf not found');\n }\n } else {\n this.snackbarService.error('Inpspection must be completed first');\n }\n }\n\n delete(inspection: InspectionModel) {\n return this.modalService\n .openConfirmationModal(\n {\n title: `Delete inspection?`,\n content: `Delete inspection for ${inspection.propertyName} - ${inspection.unitName}?`,\n confirmColor: 'warn',\n confirmLabel: 'Delete',\n },\n 'xs'\n )\n .afterClosed()\n .pipe(\n filter(result => result === DialogResult.Success),\n mergeMap(() => {\n return this.inspectionService.delete(inspection.id).pipe(\n catchError((_, caught) => {\n this.snackbarService.error('Error deleting inspection');\n return caught;\n })\n );\n })\n );\n }\n\n open(inspection: InspectionModel, evt?: Event) {\n if (evt) {\n evt.preventDefault();\n }\n\n if (inspection.entityDetails.status === InspectionStatus.Completed) {\n this.router.navigate([RoutePath.INSPECTIONS, inspection.entityDetails.id]);\n } else {\n this.snackbarService.error('Only completed inspections can be viewed');\n }\n }\n}\n","import { InspectionPage } from './inspection-area.model';\nimport { PropertyState } from './inspection.model';\n\nexport class InspectionStepModel {\n readonly propertyState: PropertyState;\n readonly propertyStateCount: number;\n readonly fileUploadCount: number;\n readonly notesCount: number;\n readonly imagesCount: number;\n readonly note: string;\n readonly files: { fileUploadId: number }[];\n readonly questions: [string, boolean][];\n\n constructor(public readonly page: InspectionPage, public readonly stepNumber: number) {\n const questionsElms = page.elements?.find(elm => elm.type === 'panel' && elm.elements.length)?.elements;\n const noteElms = page.elements?.filter(elm => elm.type === 'comment');\n const fileElms = page.elements?.filter(elm => elm.type === 'file');\n const stateElms = page.elements?.filter(elm => elm.type === 'propertystate');\n\n this.questions = questionsElms?.map(qElm => [qElm.title, qElm?.isRequired ? qElm.value === 'true' : true]);\n this.notesCount = noteElms?.length ?? 0;\n this.fileUploadCount = fileElms?.length ?? 0;\n this.propertyStateCount = stateElms?.length ?? 0;\n this.imagesCount = page.mainImage?.length ?? 0;\n\n this.note = noteElms?.[0]?.value ?? '';\n this.files = page.mainImage;\n this.propertyState = this.propertyStateCount ? (stateElms[0].value as PropertyState) : undefined;\n }\n\n get isCustomStep() {\n return this.notesCount === 1 && this.fileUploadCount === 1 && this.propertyStateCount === 0;\n }\n\n get flagsCount() {\n return 0; // TODO\n }\n}\n","import { parseJSON } from '@shared/utils/extensions';\n\nimport { InspectionStepModel } from './inspection-step.model';\nimport { InspectionItemStatus, RestInspectionContents } from './rest-inspections-model.interface';\n\nexport interface InspectionAnswer {\n title: string;\n pages: InspectionPage[];\n}\n\nexport interface InspectionPage {\n name: string;\n title: string;\n mainImage?: InspectionImage[];\n isCompleted: boolean;\n elements?: InspectionElement[];\n}\n\nexport interface InspectionImage {\n fileUploadId: number;\n filePath: string;\n}\n\nexport interface InspectionElement {\n title: string;\n name: string;\n type: string;\n isRequired: boolean;\n guid: string;\n value: string;\n choices: string[];\n visibleIf: null;\n requiredIf: null;\n elements: InspectionElement[];\n}\n\nexport class InspectionAreaModel {\n readonly steps: InspectionStepModel[];\n readonly stepsCount: number;\n readonly completedStepsCount: number;\n readonly isCompleted: boolean;\n readonly isSkipped: boolean;\n readonly title: string;\n\n constructor(public readonly content: RestInspectionContents) {\n const answer = parseJSON(content.answerJSON);\n this.steps = answer?.pages?.map((page, idx) => new InspectionStepModel(page, idx + 1)) ?? [];\n this.stepsCount = answer?.pages?.length ?? 1;\n this.completedStepsCount = this.steps?.filter(step => step.page.isCompleted).length ?? 0;\n\n this.isCompleted = content.status === InspectionItemStatus.Completed;\n this.isSkipped = content.status === InspectionItemStatus.Skipped;\n\n this.title = this.content.inspectionTemplateAreaTitle || this.content.sharedInspectionLibrarySpaceTitle;\n if (this.steps.length === 1 && this.steps[0].isCustomStep) {\n this.title = this.steps[0].page.title;\n }\n }\n}\n","import { HumanizePipe } from '@shared/pipes/humanize.pipe';\nimport { RestTemplateModel } from '@template/models/rest-template-model.interface';\n\nimport { InspectionAreaModel } from './inspection-area.model';\nimport { InspectionStepModel } from './inspection-step.model';\nimport { InspectionStatus, InspectionType, RestInspectionsModel } from './rest-inspections-model.interface';\n\nexport declare type PropertyState = 'good' | 'fair' | 'poor' | 'skipped' | undefined;\n\nexport class InspectionModel {\n readonly id: number;\n readonly completedOrSkippedAreasCount: number;\n readonly areasCount: number;\n readonly title: string;\n readonly status: string;\n readonly inspectionType: string;\n readonly areas: InspectionAreaModel[];\n\n readonly summary: { [key: string]: number } = { flagsCount: 0 };\n readonly allSteps: InspectionStepModel[];\n readonly propertyId: number;\n readonly portfolioId: number;\n readonly unitName: string;\n readonly propertyName: string;\n\n constructor(\n public readonly entityDetails: RestInspectionsModel,\n public readonly inspectionTemplate: RestTemplateModel\n ) {\n this.id = entityDetails.id;\n this.inspectionType =\n entityDetails.inspectionType != null\n ? HumanizePipe.transform(InspectionType[entityDetails.inspectionType])\n : 'Inspection';\n this.title = `${this.inspectionType} - ${entityDetails.unit.name}`;\n this.status = HumanizePipe.transform(InspectionStatus[entityDetails.status]);\n this.propertyId = entityDetails.unit?.propertyId;\n this.portfolioId = entityDetails.unit?.property?.portfolioId;\n this.unitName = entityDetails?.unit?.name;\n this.propertyName = entityDetails?.unit?.property?.name;\n\n if (entityDetails?.inspectionContents.length) {\n this.areas = entityDetails.inspectionContents.map(content => new InspectionAreaModel(content));\n this.allSteps = this.areas.flatMap(area => area.steps).filter(Boolean);\n this.areasCount = this.areas.length;\n\n this.completedOrSkippedAreasCount = this.areas.filter(area => area.isCompleted || area.isSkipped).length;\n this.allSteps.reduce((acc, curStep) => {\n acc[curStep.propertyState] = (acc[curStep.propertyState] ?? 0) + 1;\n acc.notesCount = (acc.notesCount ?? 0) + (curStep.note ? 1 : 0);\n return acc;\n }, this.summary);\n } else {\n this.completedOrSkippedAreasCount = entityDetails.completedRooms;\n this.areasCount = entityDetails.totalRooms;\n }\n }\n\n get areasLabel() {\n return `${this.completedOrSkippedAreasCount}/${this.areasCount}`;\n }\n}\n","import { RestUnitSummaryModel } from '@shared/interfaces/unit.interface';\nimport { RestUserModel } from '@shared/interfaces/user.interface';\n\nexport interface RestInspectionCreateModel {\n inspectionTemplateId: number;\n unitId: number;\n assignee: number;\n dueDate: Date;\n notifyAssignee: boolean;\n turboMode: boolean;\n}\n\nexport interface RestInspectionsModel {\n id: number;\n inspectionTemplateId: number;\n unitId: number;\n unit: RestUnitSummaryModel;\n assignee: number;\n assigneeUser: RestUserModel;\n status: InspectionStatus;\n inspectionContents?: RestInspectionContents[];\n completedAt: Date;\n modifiedAt: Date;\n createdAt: Date;\n dueDate: Date;\n calendarPosition: number;\n inspectionType: InspectionType;\n isTurboMode?: boolean;\n attachments?: {\n attachment?: RestTypedInspectionAttachment;\n none: RestTypedInspectionAttachment[];\n };\n totalRooms?: number;\n completedRooms?: number;\n}\n\nexport interface RestTypedInspectionAttachment {\n id: number;\n dateCreated: string;\n dateUpdated: string;\n isActive: boolean;\n fileUploadId: number;\n internalName: string;\n originalFileName: string;\n size: number;\n url: string;\n attachmentTypeUrn: string;\n title: string;\n description: string;\n externalUrl: string;\n inspectionAttachmentType: number;\n trueType: number;\n}\n\nexport interface RestInspectionContents {\n id: number;\n inspectionId: number;\n inspectionTemplateAreaId: number;\n sharedInspectionLibrarySpaceId: number;\n status: InspectionItemStatus;\n surveyJSON: string;\n answerJSON: string;\n inspectionTemplateAreaTitle: string;\n sharedInspectionLibrarySpaceTitle?: string;\n}\n\nexport interface SendInspectionReportRequest {\n to: string[];\n subject: string;\n mody: string;\n}\n\nexport enum InspectionStatus {\n NotStarted,\n InProgress,\n Completed,\n Cancelled,\n}\n\nexport enum InspectionItemStatus {\n Incompleted,\n Skipped,\n Completed,\n}\n\nexport enum InspectionType {\n MoveOutVacant,\n Annual,\n MaintenanceCheck,\n MoveIn,\n CustomInspection,\n Periodic,\n MoveOutOccupied,\n Diligence,\n}\n","import { createFeatureSelector, createSelector } from '@ngrx/store';\n\nimport * as fromTemplate from './template.reducer';\n\nexport const selectTemplateState = createFeatureSelector(fromTemplate.templateFeatureKey);\n\nexport const selectTemplates = createSelector(selectTemplateState, templateState => templateState.listItems);\n\nexport const selectTemplatesLoading = createSelector(\n selectTemplateState,\n templateState => templateState.listItemsLoading\n);\n\nexport const selectTemplateUpdate = createSelector(\n selectTemplateState,\n templateState => templateState.entityUpdateOngoing\n);\n\nexport const selectTemplateDeleteOngoing = createSelector(\n selectTemplateState,\n templateState => templateState.deleteEntityOngoing\n);\n\nexport const selectTemplateAreaUpdateStatus = createSelector(\n selectTemplateState,\n templateState => templateState.templateAreaUpdateStatus\n);\n\nexport const selectTemplateAreaUpdateOngoing = createSelector(\n selectTemplateState,\n templateState => templateState.templateAreaUpdateOngoing\n);\n\nexport const selectTemplateAreaDeleteOngoing = createSelector(\n selectTemplateState,\n templateState => templateState.templateAreaRemoveOngoing\n);\n\nexport const selectUnitTypes = createSelector(selectTemplateState, templateState => templateState.unitTypes);\n","export enum UnitDetailsComponentForm {\n FINISH = 'finish',\n DESCRIPTION = 'description',\n RENT = 'rent',\n OLDRENT = 'oldRent',\n MARKETRENT = 'marketRent',\n ADVERTISEDRENT = 'advertisedRent',\n}\n","import { ChangeDetectorRef, Directive, Input } from '@angular/core';\nimport { UntypedFormGroup } from '@angular/forms';\nimport { MatTableDataSource } from '@angular/material/table';\n\nimport { ComponentAbstract } from '@app/components/abstract/component.abstract';\nimport { UnitDetailsComponentForm } from '@portfolio/components/unit-details/config/enums/unit-details-component-form';\nimport { RestAddressModel } from '@shared/interfaces/address.interface';\nimport { RestApplianceModel } from '@shared/interfaces/appliance.interface';\nimport { IRadioButtonOption } from '@shared/interfaces/radio-button-option.interface';\nimport { RestUnitModel } from '@shared/interfaces/unit.interface';\nimport { RestUserModel } from '@shared/interfaces/user.interface';\n\n@Directive()\nexport abstract class UnitDetailsAbstract extends ComponentAbstract {\n readonly displayedColumns = [\n 'applianceType',\n 'id',\n 'brand',\n 'modelNumber',\n 'serialNumberReplaced',\n 'serialNumber',\n 'applianceColor',\n ];\n dataSource: MatTableDataSource;\n\n propertyAddress = '';\n propertyManager = '';\n\n form: UntypedFormGroup;\n portfolioId: number;\n propertyId: number;\n turnoverId: number;\n applianceId: number;\n bulkBidId: number;\n unit: RestUnitModel;\n applianceInUnit: RestApplianceModel[] = [];\n applianceTypeList: IRadioButtonOption[] = [];\n colorTypeList: IRadioButtonOption[] = [];\n\n @Input() unitId: number;\n @Input() readOnly = true;\n\n protected constructor(protected cdr: ChangeDetectorRef) {\n super(cdr);\n }\n\n get UnitDetailsComponentForm(): typeof UnitDetailsComponentForm {\n return UnitDetailsComponentForm;\n }\n\n getPropertyAddress(physicalAddress: RestAddressModel): string {\n if (physicalAddress) {\n return `${physicalAddress?.street1 || ''} ${physicalAddress?.street2 || ''}, ${physicalAddress?.city || ''} ${\n physicalAddress?.zip || ''\n }`;\n }\n return '';\n }\n\n getPropertyManager(propertyManager: RestUserModel) {\n if (!propertyManager?.firstName && !propertyManager?.lastName) {\n return 'N/A';\n }\n return `${propertyManager?.firstName || ''} ${propertyManager?.lastName || ''}`;\n }\n}\n","
\n
\n
Photos ({{ unitPhotos?.length || 0 }})
\n
\n \n
\n
\n
displayedUnitPhotos?.length\">\n
\n \n
\n
\n \n
\n
\n
\n
Floor plan ({{ unitFloorPlan?.length || 0 }})
\n
\n \n
\n
\n
displayedUnitFloorPlan?.length\">\n
\n \n
\n
\n \n
\n
\n
\n\n\n
\n \n Add photos\n \n
\n
\n\n\n
\n \n Add floor plan\n \n
\n
\n\n\n \n\n\n\n \n\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { Store } from '@ngrx/store';\nimport { BehaviorSubject } from 'rxjs';\nimport { filter, tap } from 'rxjs/operators';\n\nimport { UnitDetailsAbstract } from '@portfolio/components/unit-details/abstract/unit-details.abstract';\nimport { getUnitAttachments, setUnitAttachment } from '@portfolio/store/portfolio.actions';\nimport { selectUnitAttachments } from '@portfolio/store/portfolio.selectors';\nimport { imageVideoFileExtensions } from '@shared/constants/file-extensions.const';\nimport { UnitAttachmentType } from '@shared/enums/attachment-type';\nimport { AttachmentItem } from '@shared/interfaces/attachment-item';\nimport { RestGenericTypedAttachment } from '@shared/interfaces/attachment.interface';\nimport { UpdateTypedAttachmentToEntityModel } from '@shared/interfaces/turnover.interface';\nimport { Upload } from '@shared/interfaces/upload';\nimport { ModalsService } from '@ui-components/modals/modals.service';\n\nexport enum UnitDetailsPicturesSectionComponentForm {\n PHOTO = 'photo',\n FLOOR_PLAN = 'floorPlan',\n}\n\n@UntilDestroy()\n@Component({\n selector: 'app-unit-details-pictures-section',\n templateUrl: './unit-details-pictures-section.component.html',\n styleUrls: ['./unit-details-pictures-section.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UnitDetailsPicturesSectionComponent extends UnitDetailsAbstract implements OnInit, OnDestroy {\n fileUploadInProgress = false;\n form: UntypedFormGroup;\n unitPhotos: RestGenericTypedAttachment[] = [];\n unitFloorPlan: RestGenericTypedAttachment[] = [];\n unitPhotosBSubject: BehaviorSubject = new BehaviorSubject(\n []\n );\n unitFloorPlanBSubject: BehaviorSubject = new BehaviorSubject<\n RestGenericTypedAttachment[]\n >([]);\n displayedUnitPhotos: RestGenericTypedAttachment[] = [];\n displayedUnitFloorPlan: RestGenericTypedAttachment[] = [];\n UnitAttachmentType = UnitAttachmentType;\n protected readonly acceptedFormats = imageVideoFileExtensions;\n\n constructor(\n protected cdr: ChangeDetectorRef,\n private store: Store<{}>,\n private formBuilder: UntypedFormBuilder,\n private modalsService: ModalsService\n ) {\n super(cdr);\n }\n\n ngOnInit(): void {\n this.initForm();\n\n this.store.dispatch(getUnitAttachments({ unitId: this.unitId }));\n\n this.store\n .select(selectUnitAttachments)\n .pipe(\n untilDestroyed(this),\n filter((unitAttachments: RestGenericTypedAttachment[]) => !!unitAttachments),\n tap((unitAttachments: RestGenericTypedAttachment[]) => {\n this.prepareUnitAttachments(unitAttachments);\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n }\n\n ngOnDestroy(): void {}\n\n fileUploaded(item: AttachmentItem, unitAttachmentType: UnitAttachmentType) {\n if (item?.upload) {\n this.setAttachment(item.upload, unitAttachmentType);\n }\n }\n\n showUnitPictures() {\n this.modalsService.openGalleryModal({\n attachmentType: UnitAttachmentType.Photo,\n attachmentsBSubject: this.unitPhotosBSubject,\n readOnly: this.readOnly,\n unitId: this.unitId,\n });\n }\n\n showUnitFloorPlans() {\n this.modalsService.openGalleryModal({\n attachmentType: UnitAttachmentType.FloorPlan,\n attachmentsBSubject: this.unitFloorPlanBSubject,\n readOnly: this.readOnly,\n unitId: this.unitId,\n });\n }\n\n private setAttachment(upload: Upload, attachmentType: UnitAttachmentType) {\n const attachmentToEntity: UpdateTypedAttachmentToEntityModel = {\n externalUrl: '',\n unitId: this.unitId,\n propertyId: 0,\n portfolioId: 0,\n turnoverIds: [],\n applianceId: 0,\n bidId: 0,\n ticketId: 0,\n attachmentType,\n fileUploadId: upload?.id,\n title: upload?.originalFileName,\n description: '',\n };\n this.store.dispatch(setUnitAttachment({ attachmentToEntity }));\n }\n\n private initForm() {\n this.form = this.formBuilder.group({\n [UnitDetailsPicturesSectionComponentForm.PHOTO]: [null, [Validators.required]],\n [UnitDetailsPicturesSectionComponentForm.FLOOR_PLAN]: [null, [Validators.required]],\n });\n }\n\n private prepareUnitAttachments(unitAttachments: RestGenericTypedAttachment[]) {\n this.unitPhotos = [];\n this.unitFloorPlan = [];\n\n unitAttachments?.forEach(item => {\n switch (item.targetAttachmentType as UnitAttachmentType) {\n case UnitAttachmentType.Photo:\n {\n this.unitPhotos.push(item);\n }\n break;\n case UnitAttachmentType.FloorPlan:\n {\n this.unitFloorPlan.push(item);\n }\n break;\n }\n });\n\n this.unitPhotosBSubject.next(this.unitPhotos);\n this.unitFloorPlanBSubject.next(this.unitFloorPlan);\n\n this.displayedUnitPhotos = this.unitPhotos.slice(0, 2);\n this.displayedUnitFloorPlan = this.unitFloorPlan.slice(0, 2);\n }\n}\n","
\n
\n
\n
\n
\n
Property manager:
\n
\n {{ propertyManager }}\n {{ propertyManager }}\n
\n
\n
\n
Unit type:
\n
{{ unit?.unitType || '' }}
\n
\n
\n
Finish:
\n \n \n \n \n
{{ unit?.finish | enumerationValue: finishList }}
\n
\n
\n
\n
\n
\n
Lease expires:
\n
{{ unit?.dateLeaseExpires | date: 'MM/dd/yy' }}
\n
\n
\n
Bd/Br:
\n
{{ unit?.numberOfBedrooms || '-' }} / {{ unit?.numberOfBathrooms || '-' }}
\n
\n
\n
Sf:
\n
{{ unit?.squareFootage || '' }}
\n
\n
\n
\n
\n
\n
Description
\n \n \n \n \n
{{ unit?.description || '' }}
\n
\n
\n
\n
Address:
\n
{{ propertyAddress || '' }}
\n
\n
\n
\n
\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { Store } from '@ngrx/store';\nimport { filter, tap } from 'rxjs/operators';\n\nimport { selectUnit } from '@dashboards/store/selectors/dashboards.selectors';\nimport { UnitDetailsAbstract } from '@portfolio/components/unit-details/abstract/unit-details.abstract';\nimport { getEnumerationRadioListFunction } from '@shared/functions/get-enumeration-radio-list.function';\nimport { IRadioButtonOption } from '@shared/interfaces/radio-button-option.interface';\nimport { RestUnitModel } from '@shared/interfaces/unit.interface';\nimport { selectFinishTypesEnumeration } from '@shared/selectors/enumeration.selectors';\n\n@UntilDestroy()\n@Component({\n selector: 'app-unit-details-property-section',\n templateUrl: './unit-details-property-section.component.html',\n styleUrls: ['./unit-details-property-section.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UnitDetailsPropertySectionComponent extends UnitDetailsAbstract implements OnInit, OnDestroy {\n propertyManagerEmail = '';\n finishList: IRadioButtonOption[] = [];\n\n @Input() descriptionGroup: UntypedFormGroup;\n\n get description(): UntypedFormControl {\n return this.descriptionGroup?.get(this.UnitDetailsComponentForm.DESCRIPTION) as UntypedFormControl;\n }\n\n get finish(): UntypedFormControl {\n return this.descriptionGroup?.get(this.UnitDetailsComponentForm.FINISH) as UntypedFormControl;\n }\n\n constructor(protected cdr: ChangeDetectorRef, private store: Store<{}>) {\n super(cdr);\n }\n\n ngOnInit(): void {\n this.store\n .select(selectUnit)\n .pipe(\n untilDestroyed(this),\n filter((unit: RestUnitModel) => !!unit),\n tap((unit: RestUnitModel) => {\n this.unit = unit;\n this.propertyAddress = this.getPropertyAddress(this.unit.property?.addresses?.physicalAddress);\n this.propertyManager = this.getPropertyManager(this.unit?.property?.propertyManager);\n this.propertyManagerEmail = this.unit?.property?.propertyManager?.email;\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n\n this.store\n .select(selectFinishTypesEnumeration)\n .pipe(\n untilDestroyed(this),\n tap(finishEnumeration => {\n this.finishList = getEnumerationRadioListFunction(finishEnumeration, '', false);\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n }\n\n ngOnDestroy(): void {}\n}\n","
\n
\n
\n \n
\n \n \n \n \n
\n
\n \n
\n
Market Rent:
\n
\n
{{ unit?.marketRent | currency: 'USD':'symbol':'1.0-0' }}
\n \n
\n
Adv. Rent:
\n
\n
{{ unit?.advertisedRent | currency: 'USD':'symbol':'1.0-0' }}
\n \n
\n
Old Rent:
\n
\n
{{ unit?.oldRent | currency: 'USD':'symbol':'1.0-0' }}
\n \n
\n
Rent:
\n
\n
{{ unit?.rent | currency: 'USD':'symbol':'1.0-0' }}
\n \n
\n
\n
\n
\n
\n
\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { Store } from '@ngrx/store';\nimport { Observable } from 'rxjs';\nimport { filter, tap } from 'rxjs/operators';\n\nimport {\n selectRenewalStrategyForUnit,\n selectRenewalStrategyForUnitLoading,\n selectUnit,\n} from '@dashboards/store/selectors/dashboards.selectors';\nimport { UnitDetailsAbstract } from '@portfolio/components/unit-details/abstract/unit-details.abstract';\nimport { RestUnitRenewalTargetModel } from '@shared/interfaces/renevals.interface';\nimport { RestUnitModel } from '@shared/interfaces/unit.interface';\n\n@UntilDestroy()\n@Component({\n selector: 'app-unit-details-description-section',\n templateUrl: './unit-details-description-section.component.html',\n styleUrls: ['./unit-details-description-section.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UnitDetailsDescriptionSectionComponent extends UnitDetailsAbstract implements OnInit, OnDestroy {\n restUnitTypeRentTargetModel: RestUnitRenewalTargetModel;\n renewalStrategyLoading$: Observable;\n\n @Input() descriptionGroup: UntypedFormGroup;\n\n constructor(protected cdr: ChangeDetectorRef, private store: Store<{}>) {\n super(cdr);\n }\n\n get rent(): UntypedFormControl {\n return this.descriptionGroup?.get(this.UnitDetailsComponentForm.RENT) as UntypedFormControl;\n }\n\n get marketRent(): UntypedFormControl {\n return this.descriptionGroup?.get(this.UnitDetailsComponentForm.MARKETRENT) as UntypedFormControl;\n }\n\n get advertisedRent(): UntypedFormControl {\n return this.descriptionGroup?.get(this.UnitDetailsComponentForm.ADVERTISEDRENT) as UntypedFormControl;\n }\n\n get oldRent(): UntypedFormControl {\n return this.descriptionGroup?.get(this.UnitDetailsComponentForm.OLDRENT) as UntypedFormControl;\n }\n\n ngOnInit(): void {\n this.renewalStrategyLoading$ = this.store.select(selectRenewalStrategyForUnitLoading);\n\n this.store\n .select(selectRenewalStrategyForUnit)\n .pipe(\n untilDestroyed(this),\n filter((restUnitTypeRentTargetModel: RestUnitRenewalTargetModel) => !!restUnitTypeRentTargetModel),\n tap((restUnitTypeRentTargetModel: RestUnitRenewalTargetModel) => {\n this.restUnitTypeRentTargetModel = restUnitTypeRentTargetModel;\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n\n this.store\n .select(selectUnit)\n .pipe(\n untilDestroyed(this),\n filter((unit: RestUnitModel) => !!unit),\n tap((unit: RestUnitModel) => {\n this.unit = unit;\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n }\n\n ngOnDestroy(): void {}\n}\n","
0; else noInspections\">\n
\n \n \n Turbo\n \n \n \n \n \n Type\n \n {{ inspection.inspectionTemplate?.name ?? inspection.inspectionType }}\n \n \n \n Status\n \n \n {{ inspection.status }}\n \n \n \n \n Spaces\n {{ inspection.areasLabel }}\n \n \n Due\n \n {{ inspection.entityDetails.dueDate | date: 'MM/dd/yy' }}\n \n \n \n Completed\n \n {{ inspection.entityDetails.completedAt | date: 'MM/dd/yy' }}\n \n \n \n Assignee\n {{ inspection.entityDetails.assigneeUser?.displayName }}\n \n \n Actions\n \n \n more_vert\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n\n\n No inspections. Go have a look! 🔎\n\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit, ViewChild } from '@angular/core';\nimport { MatSort, SortDirection } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { Router } from '@angular/router';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { Store } from '@ngrx/store';\nimport { combineLatest } from 'rxjs';\nimport { filter, tap } from 'rxjs/operators';\n\nimport { selectUnit } from '@dashboards/store/selectors/dashboards.selectors';\nimport { InspectionsBaseComponent } from '@main-application/inspections/components/inspections-base.component';\nimport { InspectionModel } from '@main-application/inspections/models/inspection.model';\nimport { InspectionService } from '@main-application/inspections/services/inspection.service';\nimport { RestUnitModel } from '@shared/interfaces/unit.interface';\nimport { RestTemplateModel } from '@template/models/rest-template-model.interface';\nimport { loadAllUserTemplates } from '@template/store/template.actions';\nimport { selectTemplates } from '@template/store/template.selectors';\nimport { SnackbarService } from '@ui-components/components/customized-snackbar/snackbar.service';\nimport { ModalsService } from '@ui-components/modals/modals.service';\n\n@UntilDestroy()\n@Component({\n selector: 'app-unit-details-inspections',\n templateUrl: './unit-details-inspections.component.html',\n styleUrls: [\n '../../../../../../../inspections/components/inspections-base.component.scss',\n './unit-details-inspections.component.scss',\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UnitDetailsInspectionsComponent extends InspectionsBaseComponent implements OnInit {\n sortDirection: SortDirection = 'desc';\n sortActive = 'completedAt';\n inspectionsSource: MatTableDataSource;\n unit: RestUnitModel;\n templateList: RestTemplateModel[];\n\n @Input()\n readonly displayedColumns = [\n 'inspectionType',\n 'turboMode',\n 'status',\n 'rooms',\n 'dueDate',\n 'completedAt',\n 'assignee',\n 'actions',\n ];\n\n @ViewChild(MatSort, { static: false }) set content(sort: MatSort) {\n if (sort) {\n if (this.inspectionsSource) {\n this.inspectionsSource.sort = sort;\n this.cdr.detectChanges();\n }\n }\n }\n\n constructor(\n cdr: ChangeDetectorRef,\n router: Router,\n snackbarService: SnackbarService,\n inspectionService: InspectionService,\n modalService: ModalsService,\n private store: Store<{}>\n ) {\n super(cdr, inspectionService, snackbarService, modalService, router);\n }\n\n ngOnInit(): void {\n this.store.dispatch(loadAllUserTemplates());\n\n combineLatest([this.store.select(selectUnit), this.store.select(selectTemplates)])\n .pipe(\n untilDestroyed(this),\n filter(([unit, templates]) => !!unit && !!templates),\n tap(([unit, templateList]) => {\n this.unit = unit;\n this.templateList = templateList;\n this.initDataSource();\n })\n )\n .subscribe();\n }\n\n private initDataSource() {\n this.inspectionService.getBeUnitId(this.unit.id).subscribe(inspections => {\n this.inspectionsSource = new MatTableDataSource(\n inspections.map(\n e =>\n new InspectionModel(\n e,\n this.templateList.find(t => t.id == e.inspectionTemplateId)\n )\n )\n );\n this.inspectionsSource.sortingDataAccessor = this.tableSortPredicate.bind(this);\n this.cdr.detectChanges();\n });\n }\n\n deleteInspection(inspectionModel: InspectionModel) {\n super.delete(inspectionModel).subscribe(() => {\n this.snackbarService.success('Inspection deleted');\n this.initDataSource();\n });\n }\n}\n","
\n \n
\n \n
\n
\n
\n
\n
unit details
\n
\n \n \n Do not auto create turns for this unit\n \n
\n
\n
\n
Inspections
\n \n
\n
\n \n
\n
\n
Property information
\n
\n \n
\n
\n
\n
Rents
\n
\n \n
\n
\n
\n
\n \n
\n\n\n
\n
\n \n \n \n
\n \n Back\n
\n
\n

{{ unit?.propertyName || '' }} - {{ unit?.name || '' }}

\n\n {{ moveOutType | enumerationValue: moveOutTypeListConst:true }}\n
\n \n \n
\n Delete unit\n \n
\n \n
\n
\n
\n\n\n \n\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport { FormBuilder, Validators } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { Store } from '@ngrx/store';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { debounceTime, filter, finalize, take, tap } from 'rxjs/operators';\n\nimport { TurnoversService } from '@app/services/turnovers.service';\nimport { UnitNonPmsService } from '@app/services/unit-non-pms.service';\nimport { UnitsService } from '@app/services/units.service';\nimport {\n clearUnit,\n getRenewalStrategyForUnit,\n loadUnit,\n setCustomBreadcrumbs,\n updateUnitDoNotAutoCreateTurns,\n} from '@dashboards/store/actions/dashboard.actions';\nimport {\n selectUnit,\n selectUnitDoNotAutoCreateTurnsLoading,\n selectUnitLoading,\n} from '@dashboards/store/selectors/dashboards.selectors';\nimport { deleteTurnover } from '@main-application/turnovers/actions/turnovers.actions';\nimport { selectTurnoverDeleteStatus } from '@main-application/turnovers/selectors/turnovers.selectors';\nimport { UnitDetailsAbstract } from '@portfolio/components/unit-details/abstract/unit-details.abstract';\nimport { AppRoutes } from '@shared/constants/app-routes.const';\nimport { MoveOutTypeListConst } from '@shared/constants/move-out-type-list.const';\nimport { EIcon } from '@shared/enums/icon.enum';\nimport { PermissionLevelType } from '@shared/enums/permission-level.enum';\nimport { RouteData } from '@shared/enums/route-data';\nimport { RoutePath } from '@shared/enums/route-path.enum';\nimport { UpdateStatus } from '@shared/enums/update-status';\nimport { checkPermissionLevel } from '@shared/functions/check-permission-level.function';\nimport { getEnumerationRadioListFunction } from '@shared/functions/get-enumeration-radio-list.function';\nimport { BreadcrumbItem } from '@shared/interfaces/breadcrumb-item';\nimport { EnumerationConfig } from '@shared/interfaces/enumeration-config';\nimport { RestUnitModel, UnitDetailsForm } from '@shared/interfaces/unit.interface';\nimport { UserData } from '@shared/interfaces/user-data';\nimport { selectLoadEnumerations } from '@shared/selectors/enumeration.selectors';\nimport { selectPreviousRoute } from '@shared/selectors/route-state.selector';\nimport { selectUserData, selectUserPermissionLevel } from '@shared/selectors/user.selectors';\nimport { DigitsValidator } from '@shared/validators/digits.validator';\nimport { SnackbarService } from '@ui-components/components/customized-snackbar/snackbar.service';\nimport { DialogResult } from '@ui-components/modals/config/dialog-result.enum';\nimport { ModalsService } from '@ui-components/modals/modals.service';\n\n@UntilDestroy()\n@Component({\n selector: 'app-unit-details',\n templateUrl: './unit-details.component.html',\n styleUrls: ['./unit-details.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UnitDetailsComponent extends UnitDetailsAbstract implements OnInit, OnDestroy {\n private sourceView: RoutePath;\n previousRoute?: string;\n doNotAutoCreateTurns: boolean;\n isUnitDoNotAutoCreateTurnsLoading$: Observable;\n nameControl = this.formBuilder.control('', [Validators.required]);\n deleteInProgress$ = new BehaviorSubject(false);\n protected readonly moveOutTypeListConst = MoveOutTypeListConst;\n moveOutType = null;\n\n constructor(\n protected cdr: ChangeDetectorRef,\n private router: Router,\n private activatedRoute: ActivatedRoute,\n private formBuilder: FormBuilder,\n private store: Store<{}>,\n private unitNonPmsService: UnitNonPmsService,\n private unitService: UnitsService,\n private modalsService: ModalsService,\n private snackbarService: SnackbarService,\n private turnoverService: TurnoversService\n ) {\n super(cdr);\n\n this.store\n .select(selectPreviousRoute)\n .pipe(untilDestroyed(this))\n .subscribe(prevRoute => (this.previousRoute = prevRoute));\n }\n\n ngOnInit(): void {\n this.sourceView = this.activatedRoute?.snapshot?.queryParams[RouteData.SOURCE_VIEW] as RoutePath;\n this.unitId = parseInt(this.activatedRoute.snapshot.paramMap.get('unitId'), 10);\n this.portfolioId = parseInt(this.activatedRoute.snapshot.paramMap.get('portfolioId'), 10);\n this.propertyId = parseInt(this.activatedRoute.snapshot.paramMap.get('propertyId'), 10);\n this.turnoverId = parseInt(this.activatedRoute.snapshot.paramMap.get('turnoverId'), 10);\n this.applianceId = parseInt(this.activatedRoute.snapshot.paramMap.get('applianceId'), 10);\n this.bulkBidId = this.activatedRoute?.snapshot?.queryParams[RouteData.BULK_SECTION_ID] as number;\n this.isLoading$ = this.store.select(selectUnitLoading);\n this.isUnitDoNotAutoCreateTurnsLoading$ = this.store.select(selectUnitDoNotAutoCreateTurnsLoading);\n\n this.nameControl.valueChanges\n .pipe(\n debounceTime(500),\n filter(name => !!name)\n )\n .subscribe(name =>\n this.unitNonPmsService\n .update({\n id: this.unit.id,\n propertyId: this.unit.propertyId,\n name: name,\n })\n .subscribe(() => {\n this.snackbarService.success(`Unit name changed to \"${name}\"`);\n this.unit.name = name;\n this.cdr.detectChanges();\n })\n );\n\n this.store.dispatch(loadUnit({ unitId: this.unitId }));\n this.store.dispatch(getRenewalStrategyForUnit({ unitId: this.unitId }));\n this.store\n .select(selectUserPermissionLevel)\n .pipe(\n untilDestroyed(this),\n filter((permissionList: PermissionLevelType[]) => !!permissionList),\n tap((permissionList: PermissionLevelType[]) => {\n this.readOnly = !checkPermissionLevel(permissionList, PermissionLevelType.PropertyManager_UnitList_Edit);\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n\n this.store\n .select(selectLoadEnumerations)\n .pipe(\n untilDestroyed(this),\n filter(value => !!value),\n tap((enumerationConfig: EnumerationConfig) => {\n this.applianceTypeList = getEnumerationRadioListFunction(enumerationConfig.applianceTypes, '');\n this.colorTypeList = getEnumerationRadioListFunction(enumerationConfig.applianceColors, '');\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n\n this.store\n .select(selectTurnoverDeleteStatus)\n .pipe(\n untilDestroyed(this),\n filter((turnoverDeleteStatus: UpdateStatus) => turnoverDeleteStatus === UpdateStatus.DELETED)\n )\n .subscribe(turnoverDeleteStatus => {\n if (turnoverDeleteStatus === UpdateStatus.DELETED) {\n this.snackbarService.success(`Turn ${this.nameControl.value} has been deleted`);\n this.store.dispatch(loadUnit({ unitId: this.unitId }));\n }\n });\n\n this.store\n .select(selectUnit)\n .pipe(\n untilDestroyed(this),\n filter((unit: RestUnitModel) => !!unit),\n tap((unit: RestUnitModel) => {\n this.unit = { ...unit };\n this.nameControl.setValue(unit.name, { emitEvent: false });\n this.doNotAutoCreateTurns = this.unit.doNotAutoCreateTurns;\n this.updateBreadcrumb();\n this.initForm();\n this.initTurnover();\n this.propertyAddress = this.getPropertyAddress(this.unit.property?.addresses?.physicalAddress);\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n\n this.store\n .select(selectUserData)\n .pipe(\n untilDestroyed(this),\n filter((userData: UserData) => !!userData),\n tap((userData: UserData) => {\n this.userData = userData;\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n }\n\n ngOnDestroy() {\n this.store.dispatch(clearUnit());\n }\n initTurnover() {\n if (this.unit.turnoverId) {\n this.turnoverService.getTurnover(this.unit.turnoverId).subscribe(turnover => {\n this.moveOutType = turnover.moveOutType;\n this.cdr.detectChanges();\n });\n }\n }\n\n goBack(evt: Event) {\n evt?.preventDefault();\n this.router.navigateByUrl(this.previousRoute).then();\n }\n\n changeDoNotAutoCreateTurns(value: boolean) {\n this.doNotAutoCreateTurns = value;\n this.store.dispatch(\n updateUnitDoNotAutoCreateTurns({ unitId: this.unit.id, doNotAutoCreateTurns: this.doNotAutoCreateTurns })\n );\n\n if (this.unit?.turnoverId && value) {\n this.modalsService\n .openConfirmationModal({\n title: `${this.nameControl.value} is an active turn 😱`,\n content: 'Are you 💯 you want to delete it?',\n confirmColor: 'warn',\n confirmLabel: 'Delete',\n })\n .afterClosed()\n .pipe(\n take(1),\n tap(result => {\n if (result === DialogResult.Success) {\n this.store.dispatch(deleteTurnover({ turnoverId: this.unit.turnoverId }));\n }\n })\n )\n .subscribe();\n }\n }\n\n // NOTE: commented temporary, do not delete\n // backToParent(): void {\n // if (this.sourceView) {\n // switch (this.sourceView) {\n // case RoutePath.JOBS_AVAILABLE_AND_BIDS_SENT:\n // {\n // if (this.userData.companyId) {\n // this.router.navigate(['.'], { relativeTo: this.activatedRoute.parent }).then();\n // } else {\n // this.goToHome();\n // }\n // }\n // break;\n\n // case RoutePath.MOVE_OUT_CONFIRMATION:\n // case RoutePath.BID:\n // case RoutePath.RENO:\n // case RoutePath.APPROVAL:\n // case RoutePath.MARKETING:\n // case RoutePath.LEASE_UP:\n // case RoutePath.MOVE_IN:\n // case RoutePath.ARCHIVE:\n // case RoutePath.HISTORY:\n // {\n // if (this.turnoverId) {\n // this.router\n // .navigate([this.sourceView, this.turnoverId], {\n // relativeTo: this.activatedRoute.parent,\n // })\n // .then();\n // } else {\n // this.goToHome();\n // }\n // }\n // break;\n // case RoutePath.APPLIANCE_DETAIL:\n // {\n // if (this.turnoverId && this.applianceId) {\n // this.router\n // .navigate([RoutePath.BID, this.turnoverId, this.sourceView, this.applianceId], {\n // relativeTo: this.activatedRoute.parent,\n // })\n // .then();\n // } else {\n // this.goToHome();\n // }\n // }\n // break;\n\n // case RoutePath.DELINQUENCY:\n // {\n // this.router.navigate([AppRoutes.REPORTS_DELINQUENCIES]).then();\n // }\n // break;\n\n // case RoutePath.UNIT_LIST:\n // {\n // this.router.navigate([`AppRoutes.REPORTS_RENT_ROLL]).then();\n // }\n // break;\n\n // case RoutePath.RENEWALS:\n // {\n // this.router.navigate([`AppRoutes.REPORTS_RENEWALS]).then();\n // }\n // break;\n // case RoutePath.RENEWALS_LIST:\n // {\n // this.router.navigate([AppRoutes.REPORTS_RENEWALS]).then();\n // }\n // break;\n\n // case RoutePath.DELINQUENCY_LIST:\n // {\n // this.router.navigate([AppRoutes.DELINQUENCIES]).then();\n // }\n // break;\n\n // case RoutePath.ACTIVE_TURNOVERS:\n // {\n // this.router.navigate([AppRoutes.TURNOVERS_ACTIVE]).then();\n // }\n // break;\n\n // case RoutePath.ARCHIVED:\n // {\n // this.router.navigate([AppRoutes.TURNOVERS_ARCHIVED]).then();\n // }\n // break;\n\n // case RoutePath.PROPERTY_DASHBOARD:\n // {\n // this.router.navigate([AppRoutes.PROPERTY_MANAGER_HOME_DASHBOARD]).then();\n // }\n // break;\n\n // case RoutePath.TICKETS:\n // {\n // this.router.navigate([AppRoutes.TICKETS]).then();\n // }\n // break;\n\n // case RoutePath.DASHBOARD_TICKETS:\n // {\n // this.router.navigate([AppRoutes.DASHBOARD_TICKETS]).then();\n // }\n // break;\n\n // case RoutePath.MOVE_OUT_PROPERTY:\n // {\n // this.router.navigate([AppRoutes.MOVE_OUT_PROPERTY_MANAGER]).then();\n // }\n // break;\n\n // case RoutePath.MOVE_OUT_PORTFOLIO:\n // {\n // this.router.navigate([AppRoutes.MOVE_OUT_ASSET_MANAGER]).then();\n // }\n // break;\n\n // case RoutePath.BULK_BIDS:\n // {\n // this.router.navigate([AppRoutes.TURNOVERS_BULK_BIDS]).then();\n // }\n // break;\n // case RoutePath.BULK_BIDS_EDIT:\n // {\n // this.router.navigate([`${AppRoutes.TURNOVERS_BULK_BIDS}/${RoutePath.EDIT}/${this.bulkBidId}`]).then();\n // }\n // break;\n // default: {\n // this.goToHome();\n // }\n // }\n // } else {\n // if (this.portfolioId && this.propertyId) {\n // this.router.navigate([AppRoutes.SETTINGS_PORTFOLIO, this.portfolioId, this.propertyId]).then();\n // } else {\n // this.goToHome();\n // }\n // }\n // }\n\n goToHome() {\n this.router.navigate([AppRoutes.HOME]).then();\n }\n\n private initForm() {\n this.form = this.formBuilder.group({\n [this.UnitDetailsComponentForm.RENT]: [this.unit?.rent, [DigitsValidator(true), Validators.maxLength(5)]],\n [this.UnitDetailsComponentForm.OLDRENT]: [this.unit?.oldRent, [DigitsValidator(true), Validators.maxLength(5)]],\n [this.UnitDetailsComponentForm.MARKETRENT]: [\n this.unit?.marketRent,\n [DigitsValidator(true), Validators.maxLength(5)],\n ],\n [this.UnitDetailsComponentForm.ADVERTISEDRENT]: [\n this.unit?.advertisedRent,\n [DigitsValidator(true), Validators.maxLength(5)],\n ],\n [this.UnitDetailsComponentForm.FINISH]: [this.unit?.finish],\n [this.UnitDetailsComponentForm.DESCRIPTION]: [this.unit?.description || null, [Validators.maxLength(1024)]],\n });\n\n this.form.valueChanges\n .pipe(\n debounceTime(500),\n filter(() => !this.form.invalid)\n )\n .subscribe((value: UnitDetailsForm) => {\n const formValue: UnitDetailsForm = this.form.value;\n\n const unit: RestUnitModel = {\n ...this.unit,\n ...formValue,\n name: this.nameControl.value,\n doNotAutoCreateTurns: this.doNotAutoCreateTurns,\n };\n this.unitService.update(unit).subscribe();\n });\n }\n\n private updateBreadcrumb() {\n let breadcrumbList: BreadcrumbItem[] = [];\n\n if (this.unit?.property) {\n breadcrumbList = [\n ...breadcrumbList,\n {\n icon: EIcon.BUILDING,\n label: this.unit?.property.name,\n },\n ];\n }\n\n breadcrumbList = [\n ...breadcrumbList,\n {\n icon: EIcon.BUILDING,\n label: this.unit?.name,\n },\n ];\n\n this.store.dispatch(setCustomBreadcrumbs({ breadcrumbList }));\n }\n\n deleteUnit() {\n this.modalsService\n .openConfirmationModal({\n title: 'Delete unit?',\n content:\n \"This will permanently delete all of this unit's data including its turn history. Flex if you are sure. 💪\",\n confirmColor: 'warn',\n confirmLabel: 'Delete',\n })\n .afterClosed()\n .pipe(\n take(1),\n filter(result => result === DialogResult.Success)\n )\n .subscribe(() => {\n this.deleteInProgress$.next(true);\n this.unitNonPmsService\n .delete(this.unitId)\n .pipe(finalize(() => this.deleteInProgress$.next(false)))\n .subscribe(() => {\n this.snackbarService.success(`${this.unit.name} deleted`);\n this.goBack(null);\n });\n });\n }\n}\n","export const allFileExtensions = [\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/tiff',\n 'video/x-msvideo',\n 'video/mp4',\n 'video/mpeg',\n 'video/ogg',\n 'video/webm',\n 'video/3gpp',\n 'video/3gpp2',\n 'video/x-matroska',\n 'application/pdf',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'text/csv',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'text/html',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'text/plain',\n];\n\nexport const imageVideoFileExtensions = [\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/tiff',\n 'video/x-msvideo',\n 'video/mp4',\n 'video/mpeg',\n 'video/ogg',\n 'video/mov',\n 'video/webm',\n 'video/3gpp',\n 'video/3gpp2',\n 'video/x-matroska',\n];\n","import { MoveOutType } from '@shared/enums/move-out-type.enum';\nimport { IRadioButtonOption } from '@shared/interfaces/radio-button-option.interface';\n\nexport const MoveOutTypeListConst: IRadioButtonOption[] = [\n /**\n * new enum values\n */\n {\n value: MoveOutType.Evict,\n label: 'evict',\n },\n {\n value: MoveOutType.Notice_Rented,\n label: 'notice-rented',\n },\n\n {\n value: MoveOutType.Notice_Unrented,\n label: 'notice-unrented',\n },\n\n {\n value: MoveOutType.Vacant_Rented,\n label: 'vacant-rented',\n },\n\n {\n value: MoveOutType.Vacant_Unrented,\n label: 'vacant-unrented',\n },\n];\n","import { BoardsCreateComponent } from '@main-application/boards/boards-create/boards-create.component';\nimport { AppRoutes } from '@shared/constants/app-routes.const';\nimport { EIcon } from '@shared/enums/icon.enum';\nimport { PermissionLevelType } from '@shared/enums/permission-level.enum';\nimport { MenuSection } from '@shared/interfaces/menu-config.interface';\nimport { NewTurnoverModalComponent } from '@ui-components/modals/new-turnover-modal/new-turnover-modal.component';\n\nexport const PROPUP_EMAIL_DOMAINS = ['gopropup.com'];\nexport const MANAGEMENT_EMAIL_DOMAINS = PROPUP_EMAIL_DOMAINS.concat(['onmicrosoft.com']);\n\n/**\n * HOME SECTION\n * */\nexport const homeSection: MenuSection = {\n label: 'Home',\n urlPath: AppRoutes.HOME,\n icon: EIcon.HOME,\n hideWithoutSubsection: false,\n sectionItem: [],\n};\n\n/**\n * ROLES SECTION\n * */\nexport const rolesSection: MenuSection = {\n label: 'Home',\n urlPath: AppRoutes.ROLES,\n icon: EIcon.HOME,\n hideWithoutSubsection: true,\n sectionItem: [\n {\n label: 'Admin',\n urlPath: AppRoutes.ROLES_ADMIN_HOME,\n icon: EIcon.DASHBOARD,\n permissionLevel: PermissionLevelType.Administrator_Dashboard_Read,\n },\n {\n label: 'Asset',\n urlPath: AppRoutes.ROLES_ASSET_HOME,\n icon: EIcon.DASHBOARD2,\n permissionLevel: PermissionLevelType.AssetManager_PropertyDashboard_Read,\n },\n {\n label: 'Property',\n urlPath: AppRoutes.ROLES_PROPERTY_HOME,\n icon: EIcon.DASHBOARD4,\n permissionLevel: PermissionLevelType.PropertyManager_Dashboard_Read,\n },\n {\n label: 'Resident',\n urlPath: AppRoutes.RESIDENT_SERVICE,\n newTab: true,\n icon: EIcon.DASHBOARD5,\n permissionLevel: [PermissionLevelType.Resident_Dashboard_Read, PermissionLevelType.Resident_Dashboard_Write],\n },\n {\n label: 'Vendor',\n urlPath: AppRoutes.ROLES_VENDOR_HOME,\n permissionLevel: PermissionLevelType.Turnovers_Kanban_Read,\n forExternalOnly: true,\n icon: EIcon.TOOLS,\n },\n ],\n};\n\n/**\n * TURNOVERS SECTION\n * */\nexport const turnoversSection: MenuSection = {\n label: 'Turns',\n urlPath: AppRoutes.TURNOVERS,\n icon: EIcon.TIME_SCHEDULE,\n passQueryParams: true,\n permissionLevel: [\n PermissionLevelType.AllPermissions,\n PermissionLevelType.PropertyManager_ActiveTurnovers_Edit,\n PermissionLevelType.PropertyManager_ActiveTurnovers_Read,\n PermissionLevelType.Turnovers_Archived_Read,\n ],\n hideWithoutSubsection: false,\n sectionItem: [\n {\n label: 'Add turn',\n permissionLevelWarning: PermissionLevelType.PropertyManager_ActiveTurnovers_Edit,\n modalDialogComponent: NewTurnoverModalComponent,\n },\n ],\n};\n\nexport const boardsSection: MenuSection = {\n label: 'Boards',\n urlPath: AppRoutes.BOARDS,\n icon: EIcon.BOARD,\n passQueryParams: true,\n permissionLevel: [\n PermissionLevelType.AllPermissions,\n PermissionLevelType.Board_Use,\n PermissionLevelType.Board_Edit,\n PermissionLevelType.Board_View,\n ],\n hideWithoutSubsection: false,\n sectionItem: [\n {\n label: 'Add board',\n permissionLevelWarning: PermissionLevelType.Board_Edit,\n modalDialogComponent: BoardsCreateComponent,\n },\n ],\n};\n\n/**\n * INSPECTIONS SECTION\n * */\nexport const inspectionsSection: MenuSection = {\n label: 'Inspect',\n urlPath: AppRoutes.INSPECTIONS,\n icon: EIcon.SEARCH,\n passQueryParams: true,\n hideWithoutSubsection: false,\n sectionItem: [\n {\n label: 'Designer',\n urlPath: AppRoutes.SETTINGS_SURVEYS,\n permissionLevel: PermissionLevelType.AllPermissions,\n emailDomains: MANAGEMENT_EMAIL_DOMAINS,\n icon: EIcon.SETTINGS2,\n },\n {\n label: 'Templates',\n urlPath: AppRoutes.SETTINGS_TEMPLATE,\n permissionLevel: PermissionLevelType.InspectionTemplates_List,\n emailDomains: MANAGEMENT_EMAIL_DOMAINS,\n icon: EIcon.SETTINGS2,\n },\n {\n label: 'Spaces',\n urlPath: AppRoutes.SETTINGS_SPACE_TEMPLATE,\n permissionLevel: PermissionLevelType.Inspections_SharedLibrary_List,\n emailDomains: MANAGEMENT_EMAIL_DOMAINS,\n icon: EIcon.SETTINGS2,\n },\n ],\n};\n\nexport const calendarSection: MenuSection = {\n label: 'Calendar',\n urlPath: AppRoutes.CALENDAR,\n icon: EIcon.ICON_CALENDAR,\n //permissionLevel: PermissionLevelType.,//ToDo: use correct rights later\n hideWithoutSubsection: false,\n sectionItem: [],\n};\n\nexport const maintenanceSection: MenuSection = {\n label: 'Service',\n urlPath: AppRoutes.Maintenance,\n icon: EIcon.Maintenance,\n //permissionLevel: PermissionLevelType.,//ToDo: use correct rights later\n hideWithoutSubsection: false,\n sectionItem: [],\n};\n\n/**\n * REPORTS SECTION\n * */\nexport const reportsSection: MenuSection = {\n label: 'Reports',\n urlPath: AppRoutes.REPORTS,\n icon: EIcon.CHART_LINE,\n passQueryParams: true,\n hideWithoutSubsection: true,\n sectionItem: [\n {\n label: 'Rent Roll',\n urlPath: AppRoutes.REPORTS_RENT_ROLL,\n permissionLevel: [\n PermissionLevelType.PropertyManager_UnitList_Read,\n PermissionLevelType.PropertyManager_Dashboard_Read,\n ],\n icon: EIcon.DASHBOARD,\n },\n {\n label: 'ROC',\n urlPath: AppRoutes.REPORTS_ROC,\n permissionLevel: [\n PermissionLevelType.PropertyManager_UnitList_Read,\n PermissionLevelType.PropertyManager_Dashboard_Read,\n ],\n icon: EIcon.DASHBOARD,\n },\n {\n label: 'Billing',\n urlPath: AppRoutes.REPORTS_BILLING,\n permissionLevel: [PermissionLevelType.AllPermissions],\n emailDomains: MANAGEMENT_EMAIL_DOMAINS,\n icon: EIcon.DASHBOARD,\n },\n // {\n // label: 'Unit Mix',\n // urlPath: AppRoutes.REPORTS_UNIT_MIX,\n // permissionLevel: [\n // PermissionLevelType.PropertyManager_UnitMix_Read,\n // PermissionLevelType.PropertyManager_Dashboard_Read,\n // ],\n // icon: EIcon.DASHBOARD2,\n // },\n // {\n // label: 'Delinquencies',\n // urlPath: AppRoutes.REPORTS_DELINQUENCIES,\n // permissionLevel: [\n // PermissionLevelType.PropertyManager_Delinquencies_Read,\n // PermissionLevelType.PropertyManager_Dashboard_Read,\n // ],\n // icon: EIcon.THUNDER_CIRCLE,\n // },\n // {\n // label: 'Renewals',\n // urlPath: AppRoutes.REPORTS_RENEWALS,\n // permissionLevel: [\n // PermissionLevelType.PropertyManager_Renewals_Read,\n // PermissionLevelType.PropertyManager_Dashboard_Read,\n // ],\n // icon: EIcon.REPEAT,\n // },\n ],\n};\n\n/**\n * TICKET SECTION\n * */\nexport const ticketsSection: MenuSection = {\n label: 'Tickets',\n urlPath: AppRoutes.TICKETS,\n permissionLevel: PermissionLevelType.Tickets_Read,\n icon: EIcon.TICKET,\n hideWithoutSubsection: false,\n sectionItem: [],\n};\n\n/**\n * MANAGEMENT SECTION\n * */\nexport const managementSection: MenuSection = {\n label: 'Settings',\n urlPath: AppRoutes.SETTINGS,\n icon: EIcon.SETTINGS,\n hideWithoutSubsection: true,\n sectionItem: [\n {\n label: 'Users',\n urlPath: AppRoutes.SETTINGS_USERS,\n permissionLevel: PermissionLevelType.Management_Users,\n icon: EIcon.USER_GROUP,\n },\n {\n label: 'Roles',\n urlPath: AppRoutes.SETTINGS_ROLES,\n permissionLevel: [PermissionLevelType.Management_Roles],\n icon: EIcon.USER,\n },\n // {\n // label: 'Renewals',\n // urlPath: AppRoutes.SETTINGS_RENEWAL_STRATEGY,\n // permissionLevel: PermissionLevelType.Management_UnitTargetRents_Read,\n // icon: EIcon.DOLLAR,\n // },\n // {\n // label: 'KPIs',\n // urlPath: AppRoutes.SETTINGS_KPI,\n // permissionLevel: PermissionLevelType.Management_KPI_Read,\n // icon: EIcon.DASHBOARD,\n // },\n {\n label: 'Portfolios',\n urlPath: AppRoutes.SETTINGS_PORTFOLIO,\n permissionLevel: PermissionLevelType.Management_Portfolio_Read,\n icon: EIcon.PORTFOLIOS,\n },\n {\n label: 'Vendors',\n urlPath: AppRoutes.SETTINGS_VENDOR,\n permissionLevel: PermissionLevelType.Companies_Read,\n icon: EIcon.HALF_STAR,\n },\n {\n label: 'Turns',\n urlPath: AppRoutes.SETTINGS_TURNOVER_CONFIGURATION,\n permissionLevel: PermissionLevelType.Management_TurnoverConfiguration_Read,\n icon: EIcon.TIME_SCHEDULE,\n },\n {\n label: 'System',\n urlPath: AppRoutes.SETTINGS_SYSTEM,\n permissionLevel: PermissionLevelType.Chat_Hooks,\n icon: EIcon.SETTINGS2,\n },\n ],\n};\n","export enum MoveOutType {\n /**\n * legacy values for backwards compatibility\n * to be removed in the future\n */\n None,\n PmNonRenewal,\n TenantNonRenewal,\n Eviction,\n Other,\n\n /**\n * new enum values\n */\n Evict,\n Notice_Rented,\n Notice_Unrented,\n Vacant_Rented,\n Vacant_Unrented,\n Down,\n\n //FE only type\n NonPms = 100,\n}\n","export const isUserEmailDomainAllowed = (email: string, allowedDomains: string[]): boolean =>\n !allowedDomains?.length || allowedDomains.some(domain => email.includes(domain));\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, Router, UrlTree } from '@angular/router';\nimport { Observable } from 'rxjs';\nimport { filter, map } from 'rxjs/operators';\n\nimport { UserService } from '@app/services/user.service';\nimport { AppRoutes } from '@shared/constants/app-routes.const';\nimport { PermissionLevelType } from '@shared/enums/permission-level.enum';\nimport { UserType } from '@shared/enums/user-type';\nimport { checkPermissionLevel } from '@shared/functions/check-permission-level.function';\nimport { UserData } from '@shared/interfaces/user-data';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HomeRedirectGuard implements CanActivate {\n constructor(private userService: UserService, private router: Router) {}\n\n canActivate(route: ActivatedRouteSnapshot): Observable {\n return this.userService.getCashedUserData().pipe(\n filter((userData: UserData) => !!userData),\n map((userData: UserData) => {\n const permissionLevel: PermissionLevelType[] = userData.permissionLevel;\n const navigationExtras = { queryParams: route.queryParams, fragment: route.fragment };\n if (userData.userType === UserType.Employee) {\n if (checkPermissionLevel(permissionLevel, PermissionLevelType.AllPermissions)) {\n return this.router.createUrlTree([AppRoutes.ROLES_ADMIN_HOME], navigationExtras);\n }\n\n if (checkPermissionLevel(permissionLevel, PermissionLevelType.AssetManager_PropertyDashboard_Read)) {\n return this.router.createUrlTree([AppRoutes.ROLES_ASSET_HOME], navigationExtras);\n }\n\n if (checkPermissionLevel(permissionLevel, PermissionLevelType.ConstructionManager_Dashboard_Read)) {\n return this.router.createUrlTree([AppRoutes.ROLES_CONSTRUCTION_HOME], navigationExtras);\n }\n\n if (checkPermissionLevel(permissionLevel, PermissionLevelType.PropertyManager_Dashboard_Read)) {\n return this.router.createUrlTree([AppRoutes.ROLES_PROPERTY_HOME], navigationExtras);\n }\n }\n\n if (userData.userType === UserType.Contractor) {\n if (checkPermissionLevel(permissionLevel, PermissionLevelType.Turnovers_Kanban_Read)) {\n return this.router.createUrlTree([AppRoutes.ROLES_VENDOR_HOME], navigationExtras);\n }\n }\n return true;\n })\n );\n }\n}\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\nimport { filter, map } from 'rxjs/operators';\n\nimport { UserService } from '@app/services/user.service';\nimport { AppRoutes } from '@shared/constants/app-routes.const';\nimport { PermissionLevelType } from '@shared/enums/permission-level.enum';\nimport { checkPermissionLevel } from '@shared/functions/check-permission-level.function';\n\nexport const PermissionLevelGuardFactory = (permissionToCheck: PermissionLevelType): CanActivateFn => {\n return AnyPermissionLevelGuardFactory([permissionToCheck]);\n};\n\n/**\n * Allows activate if user has any permission\n * @param permissionsToCheck\n * @returns CanActivateFn\n */\nexport const AnyPermissionLevelGuardFactory = (permissionsToCheck: PermissionLevelType[]): CanActivateFn => {\n return () => {\n const router = inject(Router);\n const userService = inject(UserService);\n\n return userService.getCashedUserData().pipe(\n map(user => user.permissionLevel),\n filter((permissionLevel: PermissionLevelType[]) => !!permissionLevel?.length),\n map((permissionLevel: PermissionLevelType[]) => {\n if (checkPermissionLevel(permissionLevel, permissionsToCheck, 'any')) {\n return true;\n }\n const noPermissionUrlTree = router.parseUrl(AppRoutes.NO_PERMISSION);\n if (permissionsToCheck.length <= 1) {\n noPermissionUrlTree.queryParams['permission-required'] = permissionsToCheck[0];\n } else {\n noPermissionUrlTree.queryParams['any-permission-required'] = permissionsToCheck.join(',');\n }\n return noPermissionUrlTree;\n })\n );\n };\n};\n","import { createSelector } from '@ngrx/store';\n\nimport { routeStateFeatureKey } from '@shared/reducers/route.reducer';\n\nimport { selectCoreModule } from './core.selector';\n\nconst routeState = createSelector(selectCoreModule, coreState => coreState[routeStateFeatureKey]);\n\nexport const selectPreviousRoute = createSelector(routeState, state => state.previousRoute);\n","import { Injectable } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { JwtHelperService } from '@auth0/angular-jwt';\n\nimport { RouteData } from '@shared/enums/route-data';\n\nconst jwt = new JwtHelperService();\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HelpRouterService {\n constructor(private activatedRoute: ActivatedRoute) {}\n\n public getGlobalPreservedParams() {\n const queryParams = this.activatedRoute?.snapshot?.queryParams || {};\n return {\n [RouteData.PORTFOLIO_ID]: queryParams[RouteData.PORTFOLIO_ID],\n [RouteData.PROPERTY_ID]: queryParams[RouteData.PROPERTY_ID],\n };\n }\n}\n","export function getStorageItem(key: string): T | undefined {\n const storageValue = localStorage.getItem(key);\n if (storageValue) {\n try {\n const parsedValue = JSON.parse(storageValue);\n return parsedValue as T;\n } catch (err) {\n console.error(err);\n }\n }\n}\n\nexport function setStorageItem(key: string, value: T) {\n try {\n const storageValue = JSON.stringify(value);\n localStorage.setItem(key, storageValue);\n } catch (err) {\n console.error(err);\n }\n}\n\nexport function parseJSON(json: string) {\n return json != null ? (JSON.parse(json) as T) : undefined;\n}\n","import { AbstractControl, ValidatorFn } from '@angular/forms';\n\nexport const DigitsValidator = (positiveOnly = false): ValidatorFn => {\n const regex = positiveOnly\n ? RegExp(/(^0(([,.]?)\\d)\\d*$)|(^[1-9]+\\d*(([,.]?)\\d)\\d*$)|(^\\d+$)/)\n : new RegExp(/^[-]?(0(([,.]?)\\d)\\d*$)|(^[-]?[1-9]+\\d*(([,.]?)\\d)\\d*$)|(^[-]?\\d+$)/);\n\n return (control: AbstractControl): { [key: string]: boolean } => {\n if (control?.value && !regex.test(control.value)) {\n return positiveOnly\n ? {\n digitsPositive: true,\n }\n : {\n digits: true,\n };\n }\n return null;\n };\n};\n","\n \n \n \n \n \n\n\n\n
{{ firstName | formatToAvatar: lastName }}
\n
\n\n\n \n\n\n\n
{{ fullName }}
\n
\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit } from '@angular/core';\n\nimport { ComponentAbstract } from '@app/components/abstract/component.abstract';\nimport { EIcon } from '@shared/enums/icon.enum';\nimport { UserData } from '@shared/interfaces/user-data';\nimport { RestUserModel } from '@shared/interfaces/user.interface';\nimport { AvatarService } from '@ui-components/components/avatar/services/avatar.service';\n\n@Component({\n selector: 'app-avatar',\n templateUrl: './avatar.component.html',\n styleUrls: ['./avatar.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AvatarComponent extends ComponentAbstract implements OnInit {\n readonly SYSTEM_USER_ID = 1;\n\n userId = 0;\n fullName = '';\n firstName = '';\n lastName = '';\n avatarTheme = 'default';\n\n @Input() set userInfo(userInfo: RestUserModel | UserData) {\n this.avatarTheme = this.avatarService.getUserConfig(userInfo?.id);\n this.userId = userInfo?.id;\n if (userInfo?.id === this.SYSTEM_USER_ID) {\n this.avatarTheme = 'system';\n this.firstName = 'System';\n this.lastName = '';\n } else {\n this.firstName = userInfo?.firstName || '?';\n this.lastName = userInfo?.lastName || '?';\n }\n this.setFullName();\n }\n\n @Input() containerCss = '';\n @Input() icon: EIcon;\n @Input() iconSize = 24;\n @Input() showFullName = false;\n @Input() showIcon = true;\n\n constructor(protected cdr: ChangeDetectorRef, private avatarService: AvatarService) {\n super(cdr);\n }\n\n ngOnInit(): void {}\n\n private setFullName() {\n this.fullName = `${this.firstName || ''} ${this.lastName || ''}`;\n this.cdr.detectChanges();\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { AvatarComponent } from '@app/modules/ui-components/components/avatar/avatar.component';\nimport { PipesModule } from '@shared/pipes/pipes.module';\nimport { AvatarService } from '@ui-components/components/avatar/services/avatar.service';\nimport { IconComponent } from '@ui-components/components/icon/icon.component';\n\n@NgModule({\n declarations: [AvatarComponent],\n imports: [CommonModule, PipesModule, IconComponent, MatTooltipModule],\n providers: [AvatarService],\n exports: [AvatarComponent],\n})\nexport class AvatarModule {}\n","import { Injectable } from '@angular/core';\nimport { first } from 'lodash';\n\nimport { LocalStorageDataEnum } from '@shared/enums/local-storage-data.enum';\nimport { getRandomValue } from '@shared/functions/get-random-value.function';\nimport { AvatarThemeItem } from '@ui-components/components/avatar/config/iterfaces/avatar-theme-item';\n\n@Injectable()\nexport class AvatarService {\n configList: AvatarThemeItem[] = [];\n private readonly themePrefix = 'theme-';\n private readonly themeAmount = 16;\n\n constructor() {\n this.setThemeConfigList();\n }\n\n getUserConfig(userId: number): string {\n if (!userId) {\n return 'default';\n }\n\n let avatarThemeItem = first(this.configList.filter(item => item.userId === userId));\n const themeNumber = +avatarThemeItem?.themeNumber;\n\n if (!avatarThemeItem || isNaN(themeNumber) || themeNumber > this.themeAmount || themeNumber < 0) {\n avatarThemeItem = {\n userId,\n themeNumber: this.getAvatarTheme(),\n };\n\n this.updateAvatarTheme(avatarThemeItem);\n }\n\n return `${this.themePrefix}${avatarThemeItem.themeNumber}`;\n }\n\n private updateAvatarTheme(avatarThemeItem: AvatarThemeItem) {\n this.configList = this.configList.filter(c => c.userId != avatarThemeItem.userId);\n this.configList.push(avatarThemeItem);\n localStorage.setItem(LocalStorageDataEnum.AVATAR_USER_CONFIG_LIST, JSON.stringify(this.configList));\n }\n\n private setThemeConfigList() {\n this.configList =\n (JSON.parse(localStorage.getItem(LocalStorageDataEnum.AVATAR_USER_CONFIG_LIST)) as AvatarThemeItem[]) || [];\n }\n\n private getAvatarTheme(): number {\n return getRandomValue(1, this.themeAmount);\n }\n}\n","export function getRandomValue(minValue: number, maxValue: number) {\n minValue = Math.ceil(minValue);\n maxValue = Math.floor(maxValue);\n return Math.floor(Math.random() * (maxValue - minValue + 1)) + minValue;\n}\n","
\n \n
\n\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n\n
\n \n
\n
\n\n\n \n\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n Output,\n TemplateRef,\n} from '@angular/core';\n\nimport { DashboardsAbstract } from '@dashboards/components/abstract/dashboards.abstract';\n\n@Component({\n selector: 'app-dashboard-container',\n templateUrl: './dashboard-container.component.html',\n styleUrls: ['./dashboard-container.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DashboardContainerComponent extends DashboardsAbstract {\n loading = true;\n emptyDashboard = false;\n\n @Input() containerCss = '';\n @Input() bodyCss = '';\n @Input() stickyFooter = false;\n @Input() customEmptyDashboardTemplate: TemplateRef;\n\n @Input() set isLoading(isLoading: boolean) {\n this.loading = isLoading === undefined ? true : isLoading;\n this.cdr.detectChanges();\n }\n\n @Input() set isEmptyDashboard(isEmptyDashboard: boolean) {\n this.emptyDashboard = isEmptyDashboard === undefined ? false : isEmptyDashboard;\n this.cdr.detectChanges();\n }\n\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n @Output() onScroll = new EventEmitter<{ position: number }>();\n\n constructor(protected cdr: ChangeDetectorRef) {\n super(cdr);\n }\n\n onBodyScroll($event) {\n this.onScroll.emit({ position: $event.target.scrollTop });\n }\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { Store } from '@ngrx/store';\nimport { Observable } from 'rxjs';\nimport { filter, tap } from 'rxjs/operators';\n\nimport { ComponentAbstract } from '@app/components/abstract/component.abstract';\nimport { UserData } from '@shared/interfaces/user-data';\nimport { selectUserData } from '@shared/selectors/user.selectors';\n\n@UntilDestroy()\n@Component({\n selector: 'app-empty-dashboard',\n templateUrl: './empty-dashboard.component.html',\n styleUrls: ['./empty-dashboard.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EmptyDashboardComponent extends ComponentAbstract implements OnInit, OnDestroy {\n userData: UserData;\n userData$: Observable;\n\n constructor(protected cdr: ChangeDetectorRef, private store: Store<{}>) {\n super(cdr);\n }\n\n ngOnInit(): void {\n this.userData$ = this.store.select(selectUserData);\n this.userData$\n .pipe(\n untilDestroyed(this),\n filter((userData: UserData) => !!userData),\n tap((userData: UserData) => {\n this.userData = userData;\n })\n )\n .subscribe();\n }\n\n ngOnDestroy(): void {}\n}\n","
\n
\n

Hello {{ userData?.firstName || '' }} {{ userData?.lastName || '' }}!

\n Here you will see your tasks\n
\n
\n \"\"\n
No data to display.
\n
\n
\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit } from '@angular/core';\n\nimport { ComponentAbstract } from '@app/components/abstract/component.abstract';\nimport { EIcon } from '@shared/enums/icon.enum';\n\n@Component({\n selector: 'app-empty-data',\n templateUrl: './empty-data.component.html',\n styleUrls: ['./empty-data.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EmptyDataComponent extends ComponentAbstract implements OnInit {\n @Input() header = 'No data to display';\n @Input() info = 'The selected turnover does not exist, or there was an error retrieving it';\n @Input() icon: EIcon = EIcon.ERROR;\n\n constructor(protected cdr: ChangeDetectorRef) {\n super(cdr);\n }\n\n ngOnInit(): void {}\n}\n","\n \n

{{ header }}

\n
{{ info }}
\n\n","\n \n \n
\n
\n play_circle_outline\n
\n
\n
\n\n \n \n \n \n \n\n \n \n \n \n \n\n\n\n \n\n\n\n \n {{ comment.value | textMask: 50 }}\n \n \n \n \n\n\n\n \n \n \n\n\n\n \n
\n \n \n \n \n \n \n
\n
\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport { UntypedFormControl, Validators } from '@angular/forms';\n\nimport { ComponentAbstract } from '@app/components/abstract/component.abstract';\nimport { RestGenericTypedAttachment } from '@shared/interfaces/attachment.interface';\nimport { FileMimeType } from '@shared/interfaces/file-mime-types';\nimport { FileMimeTypePipe } from '@shared/pipes/file-mime-type.pipe';\n\n@Component({\n selector: 'app-picture',\n templateUrl: './picture.component.html',\n styleUrls: ['./picture.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PictureComponent extends ComponentAbstract implements OnInit {\n currentComment = '';\n comment: UntypedFormControl = new UntypedFormControl(null, [Validators.maxLength(256)]);\n editMode = false;\n\n @Input() picture: RestGenericTypedAttachment;\n @Input() file: File;\n @Input() active: boolean;\n @Input() showDeleteButton = false;\n @Input() lockDeleteButton = false;\n @Input() showCommentSection = false;\n @Input() lockCommentActionButtons = false;\n @Input() showCommentActionButtons = false;\n\n @Output() selectPictureEvent: EventEmitter = new EventEmitter();\n @Output() deletePictureEvent: EventEmitter = new EventEmitter();\n @Output() updatePictureEvent: EventEmitter =\n new EventEmitter();\n\n protected readonly FileMimeType = FileMimeType;\n\n constructor(protected cdr: ChangeDetectorRef, private fileMimeType: FileMimeTypePipe) {\n super(cdr);\n }\n\n ngOnInit(): void {\n this.comment.setValue(this.picture?.description || null);\n }\n\n selectPicture() {\n this.selectPictureEvent.emit();\n }\n\n deleteItem() {\n this.deletePictureEvent.emit();\n }\n\n toggleEditMode(editMode: boolean) {\n if (this.showCommentActionButtons) {\n this.editMode = editMode;\n if (this.editMode) {\n this.currentComment = this.comment.value;\n }\n\n this.cdr.detectChanges();\n }\n }\n\n save() {\n const attachment: RestGenericTypedAttachment = {\n ...this.picture,\n description: this.comment.value,\n };\n\n this.updatePictureEvent.emit(attachment);\n this.toggleEditMode(false);\n }\n\n cancel() {\n this.comment.setValue(this.currentComment);\n this.currentComment = '';\n this.toggleEditMode(false);\n }\n}\n","\n {{ option.label }}\n\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n Self,\n ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, UntypedFormControl } from '@angular/forms';\nimport { MatChipList } from '@angular/material/chips';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { tap } from 'rxjs/operators';\n\nimport { PillOptions } from '@shared/enums/pill-options.enum';\nimport { ITooltipRadioButtonOption } from '@shared/interfaces/radio-button-option.interface';\n\n@UntilDestroy()\n@Component({\n selector: 'app-pill-list',\n templateUrl: './pill-list.component.html',\n styleUrls: ['./pill-list.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PillListComponent implements OnInit, OnDestroy, ControlValueAccessor {\n availableOptionsValue: ITooltipRadioButtonOption[] = [];\n @Input() set availableOptions(value: (PillOptions | string | ITooltipRadioButtonOption)[]) {\n if (value.length && typeof value[0] != 'object') {\n this.availableOptionsValue = value.map(e => ({\n label: e as string,\n value: e as T,\n tooltip: '',\n }));\n } else {\n this.availableOptionsValue = value as ITooltipRadioButtonOption[];\n }\n }\n @Input() selectable = true;\n @Input() pillCss = '';\n @Input() pillListCss: string;\n @Input() disabled = false;\n\n @ViewChild(MatChipList) chipList!: MatChipList;\n\n control = new UntypedFormControl();\n\n constructor(@Self() @Optional() protected ngControl: NgControl, private cdr: ChangeDetectorRef) {\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n writeValue(value: string): void {\n this.control.setValue(value);\n this.cdr.detectChanges();\n }\n\n registerOnChange(fn: any): void {\n this.onChanged = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched();\n }\n\n setDisabledState?(isDisabled: boolean): void {\n isDisabled ? this.control.disable() : this.control.enable();\n }\n\n ngOnInit(): void {\n this.control.valueChanges\n .pipe(\n untilDestroyed(this),\n tap(value => {\n this.onChanged(value);\n })\n )\n .subscribe();\n }\n\n selectOption(option: T) {\n if (this.selectable) {\n this.control.setValue(option);\n }\n }\n\n ngOnDestroy(): void {}\n\n private onChanged = (value: string) => {};\n\n private onTouched = () => {};\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { PillListComponent } from './pill-list.component';\n\n@NgModule({\n declarations: [PillListComponent],\n imports: [CommonModule, MatChipsModule, MatTooltipModule],\n exports: [PillListComponent],\n})\nexport class PillListModule {}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nimport { SearchInputComponent } from '@app/modules/ui-components/components/search-input/search-input.component';\nimport { IconComponent } from '@ui-components/components/icon/icon.component';\n\n@NgModule({\n declarations: [SearchInputComponent],\n imports: [CommonModule, IconComponent, ReactiveFormsModule],\n exports: [SearchInputComponent],\n})\nexport class SearchInputModule {}\n","/**\n * Take input from [0, n] and return it as [0, 1]\n * @hidden\n */\nexport function bound01(n, max) {\n if (isOnePointZero(n)) {\n n = '100%';\n }\n var isPercent = isPercentage(n);\n n = max === 360 ? n : Math.min(max, Math.max(0, parseFloat(n)));\n // Automatically convert percentage into number\n if (isPercent) {\n n = parseInt(String(n * max), 10) / 100;\n }\n // Handle floating point rounding errors\n if (Math.abs(n - max) < 0.000001) {\n return 1;\n }\n // Convert into [0, 1] range if it isn't already\n if (max === 360) {\n // If n is a hue given in degrees,\n // wrap around out-of-range values into [0, 360] range\n // then convert into [0, 1].\n n = (n < 0 ? (n % max) + max : n % max) / parseFloat(String(max));\n }\n else {\n // If n not a hue given in degrees\n // Convert into [0, 1] range if it isn't already.\n n = (n % max) / parseFloat(String(max));\n }\n return n;\n}\n/**\n * Force a number between 0 and 1\n * @hidden\n */\nexport function clamp01(val) {\n return Math.min(1, Math.max(0, val));\n}\n/**\n * Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n * \n * @hidden\n */\nexport function isOnePointZero(n) {\n return typeof n === 'string' && n.indexOf('.') !== -1 && parseFloat(n) === 1;\n}\n/**\n * Check to see if string passed in is a percentage\n * @hidden\n */\nexport function isPercentage(n) {\n return typeof n === 'string' && n.indexOf('%') !== -1;\n}\n/**\n * Return a valid alpha value [0,1] with all invalid values being set to 1\n * @hidden\n */\nexport function boundAlpha(a) {\n a = parseFloat(a);\n if (isNaN(a) || a < 0 || a > 1) {\n a = 1;\n }\n return a;\n}\n/**\n * Replace a decimal with it's percentage value\n * @hidden\n */\nexport function convertToPercentage(n) {\n if (n <= 1) {\n return \"\".concat(Number(n) * 100, \"%\");\n }\n return n;\n}\n/**\n * Force a hex value to have 2 characters\n * @hidden\n */\nexport function pad2(c) {\n return c.length === 1 ? '0' + c : String(c);\n}\n","import { bound01, pad2 } from './util';\n// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:\n// \n/**\n * Handle bounds / percentage checking to conform to CSS color spec\n * \n * *Assumes:* r, g, b in [0, 255] or [0, 1]\n * *Returns:* { r, g, b } in [0, 255]\n */\nexport function rgbToRgb(r, g, b) {\n return {\n r: bound01(r, 255) * 255,\n g: bound01(g, 255) * 255,\n b: bound01(b, 255) * 255,\n };\n}\n/**\n * Converts an RGB color value to HSL.\n * *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]\n * *Returns:* { h, s, l } in [0,1]\n */\nexport function rgbToHsl(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = Math.max(r, g, b);\n var min = Math.min(r, g, b);\n var h = 0;\n var s = 0;\n var l = (max + min) / 2;\n if (max === min) {\n s = 0;\n h = 0; // achromatic\n }\n else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n default:\n break;\n }\n h /= 6;\n }\n return { h: h, s: s, l: l };\n}\nfunction hue2rgb(p, q, t) {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * (6 * t);\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n}\n/**\n * Converts an HSL color value to RGB.\n *\n * *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]\n * *Returns:* { r, g, b } in the set [0, 255]\n */\nexport function hslToRgb(h, s, l) {\n var r;\n var g;\n var b;\n h = bound01(h, 360);\n s = bound01(s, 100);\n l = bound01(l, 100);\n if (s === 0) {\n // achromatic\n g = l;\n b = l;\n r = l;\n }\n else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return { r: r * 255, g: g * 255, b: b * 255 };\n}\n/**\n * Converts an RGB color value to HSV\n *\n * *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n * *Returns:* { h, s, v } in [0,1]\n */\nexport function rgbToHsv(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = Math.max(r, g, b);\n var min = Math.min(r, g, b);\n var h = 0;\n var v = max;\n var d = max - min;\n var s = max === 0 ? 0 : d / max;\n if (max === min) {\n h = 0; // achromatic\n }\n else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n default:\n break;\n }\n h /= 6;\n }\n return { h: h, s: s, v: v };\n}\n/**\n * Converts an HSV color value to RGB.\n *\n * *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n * *Returns:* { r, g, b } in the set [0, 255]\n */\nexport function hsvToRgb(h, s, v) {\n h = bound01(h, 360) * 6;\n s = bound01(s, 100);\n v = bound01(v, 100);\n var i = Math.floor(h);\n var f = h - i;\n var p = v * (1 - s);\n var q = v * (1 - f * s);\n var t = v * (1 - (1 - f) * s);\n var mod = i % 6;\n var r = [v, q, p, p, t, v][mod];\n var g = [t, v, v, q, p, p][mod];\n var b = [p, p, t, v, v, q][mod];\n return { r: r * 255, g: g * 255, b: b * 255 };\n}\n/**\n * Converts an RGB color to hex\n *\n * Assumes r, g, and b are contained in the set [0, 255]\n * Returns a 3 or 6 character hex\n */\nexport function rgbToHex(r, g, b, allow3Char) {\n var hex = [\n pad2(Math.round(r).toString(16)),\n pad2(Math.round(g).toString(16)),\n pad2(Math.round(b).toString(16)),\n ];\n // Return a 3 character hex if possible\n if (allow3Char &&\n hex[0].startsWith(hex[0].charAt(1)) &&\n hex[1].startsWith(hex[1].charAt(1)) &&\n hex[2].startsWith(hex[2].charAt(1))) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);\n }\n return hex.join('');\n}\n/**\n * Converts an RGBA color plus alpha transparency to hex\n *\n * Assumes r, g, b are contained in the set [0, 255] and\n * a in [0, 1]. Returns a 4 or 8 character rgba hex\n */\n// eslint-disable-next-line max-params\nexport function rgbaToHex(r, g, b, a, allow4Char) {\n var hex = [\n pad2(Math.round(r).toString(16)),\n pad2(Math.round(g).toString(16)),\n pad2(Math.round(b).toString(16)),\n pad2(convertDecimalToHex(a)),\n ];\n // Return a 4 character hex if possible\n if (allow4Char &&\n hex[0].startsWith(hex[0].charAt(1)) &&\n hex[1].startsWith(hex[1].charAt(1)) &&\n hex[2].startsWith(hex[2].charAt(1)) &&\n hex[3].startsWith(hex[3].charAt(1))) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);\n }\n return hex.join('');\n}\n/**\n * Converts an RGBA color to an ARGB Hex8 string\n * Rarely used, but required for \"toFilter()\"\n */\nexport function rgbaToArgbHex(r, g, b, a) {\n var hex = [\n pad2(convertDecimalToHex(a)),\n pad2(Math.round(r).toString(16)),\n pad2(Math.round(g).toString(16)),\n pad2(Math.round(b).toString(16)),\n ];\n return hex.join('');\n}\n/** Converts a decimal to a hex value */\nexport function convertDecimalToHex(d) {\n return Math.round(parseFloat(d) * 255).toString(16);\n}\n/** Converts a hex value to a decimal */\nexport function convertHexToDecimal(h) {\n return parseIntFromHex(h) / 255;\n}\n/** Parse a base-16 hex value into a base-10 integer */\nexport function parseIntFromHex(val) {\n return parseInt(val, 16);\n}\nexport function numberInputToObject(color) {\n return {\n r: color >> 16,\n g: (color & 0xff00) >> 8,\n b: color & 0xff,\n };\n}\n","// https://github.com/bahamas10/css-color-names/blob/master/css-color-names.json\n/**\n * @hidden\n */\nexport var names = {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyan: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkgrey: '#a9a9a9',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkslategrey: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n goldenrod: '#daa520',\n gold: '#ffd700',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n grey: '#808080',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n indianred: '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n lavenderblush: '#fff0f5',\n lavender: '#e6e6fa',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrodyellow: '#fafad2',\n lightgray: '#d3d3d3',\n lightgreen: '#90ee90',\n lightgrey: '#d3d3d3',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370db',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#db7093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n rebeccapurple: '#663399',\n red: '#ff0000',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n steelblue: '#4682b4',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n tomato: '#ff6347',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32',\n};\n","/* eslint-disable @typescript-eslint/no-redundant-type-constituents */\nimport { convertHexToDecimal, hslToRgb, hsvToRgb, parseIntFromHex, rgbToRgb } from './conversion';\nimport { names } from './css-color-names';\nimport { boundAlpha, convertToPercentage } from './util';\n/**\n * Given a string or object, convert that input to RGB\n *\n * Possible string inputs:\n * ```\n * \"red\"\n * \"#f00\" or \"f00\"\n * \"#ff0000\" or \"ff0000\"\n * \"#ff000000\" or \"ff000000\"\n * \"rgb 255 0 0\" or \"rgb (255, 0, 0)\"\n * \"rgb 1.0 0 0\" or \"rgb (1, 0, 0)\"\n * \"rgba (255, 0, 0, 1)\" or \"rgba 255, 0, 0, 1\"\n * \"rgba (1.0, 0, 0, 1)\" or \"rgba 1.0, 0, 0, 1\"\n * \"hsl(0, 100%, 50%)\" or \"hsl 0 100% 50%\"\n * \"hsla(0, 100%, 50%, 1)\" or \"hsla 0 100% 50%, 1\"\n * \"hsv(0, 100%, 100%)\" or \"hsv 0 100% 100%\"\n * ```\n */\nexport function inputToRGB(color) {\n var rgb = { r: 0, g: 0, b: 0 };\n var a = 1;\n var s = null;\n var v = null;\n var l = null;\n var ok = false;\n var format = false;\n if (typeof color === 'string') {\n color = stringInputToObject(color);\n }\n if (typeof color === 'object') {\n if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {\n rgb = rgbToRgb(color.r, color.g, color.b);\n ok = true;\n format = String(color.r).substr(-1) === '%' ? 'prgb' : 'rgb';\n }\n else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {\n s = convertToPercentage(color.s);\n v = convertToPercentage(color.v);\n rgb = hsvToRgb(color.h, s, v);\n ok = true;\n format = 'hsv';\n }\n else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {\n s = convertToPercentage(color.s);\n l = convertToPercentage(color.l);\n rgb = hslToRgb(color.h, s, l);\n ok = true;\n format = 'hsl';\n }\n if (Object.prototype.hasOwnProperty.call(color, 'a')) {\n a = color.a;\n }\n }\n a = boundAlpha(a);\n return {\n ok: ok,\n format: color.format || format,\n r: Math.min(255, Math.max(rgb.r, 0)),\n g: Math.min(255, Math.max(rgb.g, 0)),\n b: Math.min(255, Math.max(rgb.b, 0)),\n a: a,\n };\n}\n// \nvar CSS_INTEGER = '[-\\\\+]?\\\\d+%?';\n// \nvar CSS_NUMBER = '[-\\\\+]?\\\\d*\\\\.\\\\d+%?';\n// Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.\nvar CSS_UNIT = \"(?:\".concat(CSS_NUMBER, \")|(?:\").concat(CSS_INTEGER, \")\");\n// Actual matching.\n// Parentheses and commas are optional, but not required.\n// Whitespace can take the place of commas or opening paren\nvar PERMISSIVE_MATCH3 = \"[\\\\s|\\\\(]+(\".concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")\\\\s*\\\\)?\");\nvar PERMISSIVE_MATCH4 = \"[\\\\s|\\\\(]+(\".concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")\\\\s*\\\\)?\");\nvar matchers = {\n CSS_UNIT: new RegExp(CSS_UNIT),\n rgb: new RegExp('rgb' + PERMISSIVE_MATCH3),\n rgba: new RegExp('rgba' + PERMISSIVE_MATCH4),\n hsl: new RegExp('hsl' + PERMISSIVE_MATCH3),\n hsla: new RegExp('hsla' + PERMISSIVE_MATCH4),\n hsv: new RegExp('hsv' + PERMISSIVE_MATCH3),\n hsva: new RegExp('hsva' + PERMISSIVE_MATCH4),\n hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n};\n/**\n * Permissive string parsing. Take in a number of formats, and output an object\n * based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`\n */\nexport function stringInputToObject(color) {\n color = color.trim().toLowerCase();\n if (color.length === 0) {\n return false;\n }\n var named = false;\n if (names[color]) {\n color = names[color];\n named = true;\n }\n else if (color === 'transparent') {\n return { r: 0, g: 0, b: 0, a: 0, format: 'name' };\n }\n // Try to match string input using regular expressions.\n // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]\n // Just return an object and let the conversion functions handle that.\n // This way the result will be the same whether the tinycolor is initialized with string or object.\n var match = matchers.rgb.exec(color);\n if (match) {\n return { r: match[1], g: match[2], b: match[3] };\n }\n match = matchers.rgba.exec(color);\n if (match) {\n return { r: match[1], g: match[2], b: match[3], a: match[4] };\n }\n match = matchers.hsl.exec(color);\n if (match) {\n return { h: match[1], s: match[2], l: match[3] };\n }\n match = matchers.hsla.exec(color);\n if (match) {\n return { h: match[1], s: match[2], l: match[3], a: match[4] };\n }\n match = matchers.hsv.exec(color);\n if (match) {\n return { h: match[1], s: match[2], v: match[3] };\n }\n match = matchers.hsva.exec(color);\n if (match) {\n return { h: match[1], s: match[2], v: match[3], a: match[4] };\n }\n match = matchers.hex8.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n a: convertHexToDecimal(match[4]),\n format: named ? 'name' : 'hex8',\n };\n }\n match = matchers.hex6.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n format: named ? 'name' : 'hex',\n };\n }\n match = matchers.hex4.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1] + match[1]),\n g: parseIntFromHex(match[2] + match[2]),\n b: parseIntFromHex(match[3] + match[3]),\n a: convertHexToDecimal(match[4] + match[4]),\n format: named ? 'name' : 'hex8',\n };\n }\n match = matchers.hex3.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1] + match[1]),\n g: parseIntFromHex(match[2] + match[2]),\n b: parseIntFromHex(match[3] + match[3]),\n format: named ? 'name' : 'hex',\n };\n }\n return false;\n}\n/**\n * Check to see if it looks like a CSS unit\n * (see `matchers` above for definition).\n */\nexport function isValidCSSUnit(color) {\n return Boolean(matchers.CSS_UNIT.exec(String(color)));\n}\n","import { numberInputToObject, rgbaToHex, rgbToHex, rgbToHsl, rgbToHsv } from './conversion';\nimport { names } from './css-color-names';\nimport { inputToRGB } from './format-input';\nimport { bound01, boundAlpha, clamp01 } from './util';\nvar TinyColor = /** @class */ (function () {\n function TinyColor(color, opts) {\n if (color === void 0) { color = ''; }\n if (opts === void 0) { opts = {}; }\n var _a;\n // If input is already a tinycolor, return itself\n if (color instanceof TinyColor) {\n // eslint-disable-next-line no-constructor-return\n return color;\n }\n if (typeof color === 'number') {\n color = numberInputToObject(color);\n }\n this.originalInput = color;\n var rgb = inputToRGB(color);\n this.originalInput = color;\n this.r = rgb.r;\n this.g = rgb.g;\n this.b = rgb.b;\n this.a = rgb.a;\n this.roundA = Math.round(100 * this.a) / 100;\n this.format = (_a = opts.format) !== null && _a !== void 0 ? _a : rgb.format;\n this.gradientType = opts.gradientType;\n // Don't let the range of [0,255] come back in [0,1].\n // Potentially lose a little bit of precision here, but will fix issues where\n // .5 gets interpreted as half of the total, instead of half of 1\n // If it was supposed to be 128, this was already taken care of by `inputToRgb`\n if (this.r < 1) {\n this.r = Math.round(this.r);\n }\n if (this.g < 1) {\n this.g = Math.round(this.g);\n }\n if (this.b < 1) {\n this.b = Math.round(this.b);\n }\n this.isValid = rgb.ok;\n }\n TinyColor.prototype.isDark = function () {\n return this.getBrightness() < 128;\n };\n TinyColor.prototype.isLight = function () {\n return !this.isDark();\n };\n /**\n * Returns the perceived brightness of the color, from 0-255.\n */\n TinyColor.prototype.getBrightness = function () {\n // http://www.w3.org/TR/AERT#color-contrast\n var rgb = this.toRgb();\n return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n };\n /**\n * Returns the perceived luminance of a color, from 0-1.\n */\n TinyColor.prototype.getLuminance = function () {\n // http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n var rgb = this.toRgb();\n var R;\n var G;\n var B;\n var RsRGB = rgb.r / 255;\n var GsRGB = rgb.g / 255;\n var BsRGB = rgb.b / 255;\n if (RsRGB <= 0.03928) {\n R = RsRGB / 12.92;\n }\n else {\n // eslint-disable-next-line prefer-exponentiation-operator\n R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);\n }\n if (GsRGB <= 0.03928) {\n G = GsRGB / 12.92;\n }\n else {\n // eslint-disable-next-line prefer-exponentiation-operator\n G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);\n }\n if (BsRGB <= 0.03928) {\n B = BsRGB / 12.92;\n }\n else {\n // eslint-disable-next-line prefer-exponentiation-operator\n B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);\n }\n return 0.2126 * R + 0.7152 * G + 0.0722 * B;\n };\n /**\n * Returns the alpha value of a color, from 0-1.\n */\n TinyColor.prototype.getAlpha = function () {\n return this.a;\n };\n /**\n * Sets the alpha value on the current color.\n *\n * @param alpha - The new alpha value. The accepted range is 0-1.\n */\n TinyColor.prototype.setAlpha = function (alpha) {\n this.a = boundAlpha(alpha);\n this.roundA = Math.round(100 * this.a) / 100;\n return this;\n };\n /**\n * Returns whether the color is monochrome.\n */\n TinyColor.prototype.isMonochrome = function () {\n var s = this.toHsl().s;\n return s === 0;\n };\n /**\n * Returns the object as a HSVA object.\n */\n TinyColor.prototype.toHsv = function () {\n var hsv = rgbToHsv(this.r, this.g, this.b);\n return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this.a };\n };\n /**\n * Returns the hsva values interpolated into a string with the following format:\n * \"hsva(xxx, xxx, xxx, xx)\".\n */\n TinyColor.prototype.toHsvString = function () {\n var hsv = rgbToHsv(this.r, this.g, this.b);\n var h = Math.round(hsv.h * 360);\n var s = Math.round(hsv.s * 100);\n var v = Math.round(hsv.v * 100);\n return this.a === 1 ? \"hsv(\".concat(h, \", \").concat(s, \"%, \").concat(v, \"%)\") : \"hsva(\".concat(h, \", \").concat(s, \"%, \").concat(v, \"%, \").concat(this.roundA, \")\");\n };\n /**\n * Returns the object as a HSLA object.\n */\n TinyColor.prototype.toHsl = function () {\n var hsl = rgbToHsl(this.r, this.g, this.b);\n return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this.a };\n };\n /**\n * Returns the hsla values interpolated into a string with the following format:\n * \"hsla(xxx, xxx, xxx, xx)\".\n */\n TinyColor.prototype.toHslString = function () {\n var hsl = rgbToHsl(this.r, this.g, this.b);\n var h = Math.round(hsl.h * 360);\n var s = Math.round(hsl.s * 100);\n var l = Math.round(hsl.l * 100);\n return this.a === 1 ? \"hsl(\".concat(h, \", \").concat(s, \"%, \").concat(l, \"%)\") : \"hsla(\".concat(h, \", \").concat(s, \"%, \").concat(l, \"%, \").concat(this.roundA, \")\");\n };\n /**\n * Returns the hex value of the color.\n * @param allow3Char will shorten hex value to 3 char if possible\n */\n TinyColor.prototype.toHex = function (allow3Char) {\n if (allow3Char === void 0) { allow3Char = false; }\n return rgbToHex(this.r, this.g, this.b, allow3Char);\n };\n /**\n * Returns the hex value of the color -with a # prefixed.\n * @param allow3Char will shorten hex value to 3 char if possible\n */\n TinyColor.prototype.toHexString = function (allow3Char) {\n if (allow3Char === void 0) { allow3Char = false; }\n return '#' + this.toHex(allow3Char);\n };\n /**\n * Returns the hex 8 value of the color.\n * @param allow4Char will shorten hex value to 4 char if possible\n */\n TinyColor.prototype.toHex8 = function (allow4Char) {\n if (allow4Char === void 0) { allow4Char = false; }\n return rgbaToHex(this.r, this.g, this.b, this.a, allow4Char);\n };\n /**\n * Returns the hex 8 value of the color -with a # prefixed.\n * @param allow4Char will shorten hex value to 4 char if possible\n */\n TinyColor.prototype.toHex8String = function (allow4Char) {\n if (allow4Char === void 0) { allow4Char = false; }\n return '#' + this.toHex8(allow4Char);\n };\n /**\n * Returns the shorter hex value of the color depends on its alpha -with a # prefixed.\n * @param allowShortChar will shorten hex value to 3 or 4 char if possible\n */\n TinyColor.prototype.toHexShortString = function (allowShortChar) {\n if (allowShortChar === void 0) { allowShortChar = false; }\n return this.a === 1 ? this.toHexString(allowShortChar) : this.toHex8String(allowShortChar);\n };\n /**\n * Returns the object as a RGBA object.\n */\n TinyColor.prototype.toRgb = function () {\n return {\n r: Math.round(this.r),\n g: Math.round(this.g),\n b: Math.round(this.b),\n a: this.a,\n };\n };\n /**\n * Returns the RGBA values interpolated into a string with the following format:\n * \"RGBA(xxx, xxx, xxx, xx)\".\n */\n TinyColor.prototype.toRgbString = function () {\n var r = Math.round(this.r);\n var g = Math.round(this.g);\n var b = Math.round(this.b);\n return this.a === 1 ? \"rgb(\".concat(r, \", \").concat(g, \", \").concat(b, \")\") : \"rgba(\".concat(r, \", \").concat(g, \", \").concat(b, \", \").concat(this.roundA, \")\");\n };\n /**\n * Returns the object as a RGBA object.\n */\n TinyColor.prototype.toPercentageRgb = function () {\n var fmt = function (x) { return \"\".concat(Math.round(bound01(x, 255) * 100), \"%\"); };\n return {\n r: fmt(this.r),\n g: fmt(this.g),\n b: fmt(this.b),\n a: this.a,\n };\n };\n /**\n * Returns the RGBA relative values interpolated into a string\n */\n TinyColor.prototype.toPercentageRgbString = function () {\n var rnd = function (x) { return Math.round(bound01(x, 255) * 100); };\n return this.a === 1\n ? \"rgb(\".concat(rnd(this.r), \"%, \").concat(rnd(this.g), \"%, \").concat(rnd(this.b), \"%)\")\n : \"rgba(\".concat(rnd(this.r), \"%, \").concat(rnd(this.g), \"%, \").concat(rnd(this.b), \"%, \").concat(this.roundA, \")\");\n };\n /**\n * The 'real' name of the color -if there is one.\n */\n TinyColor.prototype.toName = function () {\n if (this.a === 0) {\n return 'transparent';\n }\n if (this.a < 1) {\n return false;\n }\n var hex = '#' + rgbToHex(this.r, this.g, this.b, false);\n for (var _i = 0, _a = Object.entries(names); _i < _a.length; _i++) {\n var _b = _a[_i], key = _b[0], value = _b[1];\n if (hex === value) {\n return key;\n }\n }\n return false;\n };\n TinyColor.prototype.toString = function (format) {\n var formatSet = Boolean(format);\n format = format !== null && format !== void 0 ? format : this.format;\n var formattedString = false;\n var hasAlpha = this.a < 1 && this.a >= 0;\n var needsAlphaFormat = !formatSet && hasAlpha && (format.startsWith('hex') || format === 'name');\n if (needsAlphaFormat) {\n // Special case for \"transparent\", all other non-alpha formats\n // will return rgba when there is transparency.\n if (format === 'name' && this.a === 0) {\n return this.toName();\n }\n return this.toRgbString();\n }\n if (format === 'rgb') {\n formattedString = this.toRgbString();\n }\n if (format === 'prgb') {\n formattedString = this.toPercentageRgbString();\n }\n if (format === 'hex' || format === 'hex6') {\n formattedString = this.toHexString();\n }\n if (format === 'hex3') {\n formattedString = this.toHexString(true);\n }\n if (format === 'hex4') {\n formattedString = this.toHex8String(true);\n }\n if (format === 'hex8') {\n formattedString = this.toHex8String();\n }\n if (format === 'name') {\n formattedString = this.toName();\n }\n if (format === 'hsl') {\n formattedString = this.toHslString();\n }\n if (format === 'hsv') {\n formattedString = this.toHsvString();\n }\n return formattedString || this.toHexString();\n };\n TinyColor.prototype.toNumber = function () {\n return (Math.round(this.r) << 16) + (Math.round(this.g) << 8) + Math.round(this.b);\n };\n TinyColor.prototype.clone = function () {\n return new TinyColor(this.toString());\n };\n /**\n * Lighten the color a given amount. Providing 100 will always return white.\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.lighten = function (amount) {\n if (amount === void 0) { amount = 10; }\n var hsl = this.toHsl();\n hsl.l += amount / 100;\n hsl.l = clamp01(hsl.l);\n return new TinyColor(hsl);\n };\n /**\n * Brighten the color a given amount, from 0 to 100.\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.brighten = function (amount) {\n if (amount === void 0) { amount = 10; }\n var rgb = this.toRgb();\n rgb.r = Math.max(0, Math.min(255, rgb.r - Math.round(255 * -(amount / 100))));\n rgb.g = Math.max(0, Math.min(255, rgb.g - Math.round(255 * -(amount / 100))));\n rgb.b = Math.max(0, Math.min(255, rgb.b - Math.round(255 * -(amount / 100))));\n return new TinyColor(rgb);\n };\n /**\n * Darken the color a given amount, from 0 to 100.\n * Providing 100 will always return black.\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.darken = function (amount) {\n if (amount === void 0) { amount = 10; }\n var hsl = this.toHsl();\n hsl.l -= amount / 100;\n hsl.l = clamp01(hsl.l);\n return new TinyColor(hsl);\n };\n /**\n * Mix the color with pure white, from 0 to 100.\n * Providing 0 will do nothing, providing 100 will always return white.\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.tint = function (amount) {\n if (amount === void 0) { amount = 10; }\n return this.mix('white', amount);\n };\n /**\n * Mix the color with pure black, from 0 to 100.\n * Providing 0 will do nothing, providing 100 will always return black.\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.shade = function (amount) {\n if (amount === void 0) { amount = 10; }\n return this.mix('black', amount);\n };\n /**\n * Desaturate the color a given amount, from 0 to 100.\n * Providing 100 will is the same as calling greyscale\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.desaturate = function (amount) {\n if (amount === void 0) { amount = 10; }\n var hsl = this.toHsl();\n hsl.s -= amount / 100;\n hsl.s = clamp01(hsl.s);\n return new TinyColor(hsl);\n };\n /**\n * Saturate the color a given amount, from 0 to 100.\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.saturate = function (amount) {\n if (amount === void 0) { amount = 10; }\n var hsl = this.toHsl();\n hsl.s += amount / 100;\n hsl.s = clamp01(hsl.s);\n return new TinyColor(hsl);\n };\n /**\n * Completely desaturates a color into greyscale.\n * Same as calling `desaturate(100)`\n */\n TinyColor.prototype.greyscale = function () {\n return this.desaturate(100);\n };\n /**\n * Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.\n * Values outside of this range will be wrapped into this range.\n */\n TinyColor.prototype.spin = function (amount) {\n var hsl = this.toHsl();\n var hue = (hsl.h + amount) % 360;\n hsl.h = hue < 0 ? 360 + hue : hue;\n return new TinyColor(hsl);\n };\n /**\n * Mix the current color a given amount with another color, from 0 to 100.\n * 0 means no mixing (return current color).\n */\n TinyColor.prototype.mix = function (color, amount) {\n if (amount === void 0) { amount = 50; }\n var rgb1 = this.toRgb();\n var rgb2 = new TinyColor(color).toRgb();\n var p = amount / 100;\n var rgba = {\n r: (rgb2.r - rgb1.r) * p + rgb1.r,\n g: (rgb2.g - rgb1.g) * p + rgb1.g,\n b: (rgb2.b - rgb1.b) * p + rgb1.b,\n a: (rgb2.a - rgb1.a) * p + rgb1.a,\n };\n return new TinyColor(rgba);\n };\n TinyColor.prototype.analogous = function (results, slices) {\n if (results === void 0) { results = 6; }\n if (slices === void 0) { slices = 30; }\n var hsl = this.toHsl();\n var part = 360 / slices;\n var ret = [this];\n for (hsl.h = (hsl.h - ((part * results) >> 1) + 720) % 360; --results;) {\n hsl.h = (hsl.h + part) % 360;\n ret.push(new TinyColor(hsl));\n }\n return ret;\n };\n /**\n * taken from https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js\n */\n TinyColor.prototype.complement = function () {\n var hsl = this.toHsl();\n hsl.h = (hsl.h + 180) % 360;\n return new TinyColor(hsl);\n };\n TinyColor.prototype.monochromatic = function (results) {\n if (results === void 0) { results = 6; }\n var hsv = this.toHsv();\n var h = hsv.h;\n var s = hsv.s;\n var v = hsv.v;\n var res = [];\n var modification = 1 / results;\n while (results--) {\n res.push(new TinyColor({ h: h, s: s, v: v }));\n v = (v + modification) % 1;\n }\n return res;\n };\n TinyColor.prototype.splitcomplement = function () {\n var hsl = this.toHsl();\n var h = hsl.h;\n return [\n this,\n new TinyColor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l }),\n new TinyColor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l }),\n ];\n };\n /**\n * Compute how the color would appear on a background\n */\n TinyColor.prototype.onBackground = function (background) {\n var fg = this.toRgb();\n var bg = new TinyColor(background).toRgb();\n var alpha = fg.a + bg.a * (1 - fg.a);\n return new TinyColor({\n r: (fg.r * fg.a + bg.r * bg.a * (1 - fg.a)) / alpha,\n g: (fg.g * fg.a + bg.g * bg.a * (1 - fg.a)) / alpha,\n b: (fg.b * fg.a + bg.b * bg.a * (1 - fg.a)) / alpha,\n a: alpha,\n });\n };\n /**\n * Alias for `polyad(3)`\n */\n TinyColor.prototype.triad = function () {\n return this.polyad(3);\n };\n /**\n * Alias for `polyad(4)`\n */\n TinyColor.prototype.tetrad = function () {\n return this.polyad(4);\n };\n /**\n * Get polyad colors, like (for 1, 2, 3, 4, 5, 6, 7, 8, etc...)\n * monad, dyad, triad, tetrad, pentad, hexad, heptad, octad, etc...\n */\n TinyColor.prototype.polyad = function (n) {\n var hsl = this.toHsl();\n var h = hsl.h;\n var result = [this];\n var increment = 360 / n;\n for (var i = 1; i < n; i++) {\n result.push(new TinyColor({ h: (h + i * increment) % 360, s: hsl.s, l: hsl.l }));\n }\n return result;\n };\n /**\n * compare color vs current color\n */\n TinyColor.prototype.equals = function (color) {\n return this.toRgbString() === new TinyColor(color).toRgbString();\n };\n return TinyColor;\n}());\nexport { TinyColor };\n// kept for backwards compatability with v1\nexport function tinycolor(color, opts) {\n if (color === void 0) { color = ''; }\n if (opts === void 0) { opts = {}; }\n return new TinyColor(color, opts);\n}\n","import { ActiveDescendantKeyManager } from '@angular/cdk/a11y';\nimport { coerceBooleanProperty, coerceStringArray } from '@angular/cdk/coercion';\nimport * as i1 from '@angular/cdk/platform';\nimport { _getEventTarget } from '@angular/cdk/platform';\nimport * as i0 from '@angular/core';\nimport { InjectionToken, EventEmitter, TemplateRef, Directive, Inject, ViewChild, Input, Output, Component, ViewEncapsulation, ChangeDetectionStrategy, ContentChildren, forwardRef, Optional, Host, NgModule } from '@angular/core';\nimport { mixinDisableRipple, MAT_OPTION_PARENT_COMPONENT, MAT_OPTGROUP, MatOption, MatOptionSelectionChange, _countGroupLabelsBeforeOption, _getOptionScrollPosition, MatOptionModule, MatCommonModule } from '@angular/material/core';\nimport { Subscription, Subject, defer, merge, of, fromEvent } from 'rxjs';\nimport * as i2 from '@angular/common';\nimport { DOCUMENT, CommonModule } from '@angular/common';\nimport * as i1$1 from '@angular/cdk/overlay';\nimport { Overlay, OverlayConfig, OverlayModule } from '@angular/cdk/overlay';\nimport * as i3 from '@angular/cdk/scrolling';\nimport { CdkScrollableModule } from '@angular/cdk/scrolling';\nimport * as i2$1 from '@angular/cdk/bidi';\nimport { hasModifierKey, ESCAPE, ENTER, UP_ARROW, DOWN_ARROW, TAB } from '@angular/cdk/keycodes';\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, take, filter, map, tap, delay } from 'rxjs/operators';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\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(\n /** Reference to the autocomplete panel that emitted the event. */\n source, \n /** Option that was selected. */\n option) {\n this.source = source;\n this.option = option;\n }\n}\n// Boilerplate for applying mixins to MatAutocomplete.\n/** @docs-private */\nconst _MatAutocompleteMixinBase = mixinDisableRipple(class {\n});\n/** Injection token to be used to override the default options for `mat-autocomplete`. */\nconst MAT_AUTOCOMPLETE_DEFAULT_OPTIONS = 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 { autoActiveFirstOption: false, autoSelectActiveOption: false };\n}\n/** Base class with all of the `MatAutocomplete` functionality. */\nclass _MatAutocompleteBase extends _MatAutocompleteMixinBase {\n constructor(_changeDetectorRef, _elementRef, defaults, platform) {\n super();\n this._changeDetectorRef = _changeDetectorRef;\n this._elementRef = _elementRef;\n this._activeOptionChanges = Subscription.EMPTY;\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 this._classList = {};\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 }\n /** Whether the autocomplete panel is open. */\n get isOpen() {\n return this._isOpen && this.showPanel;\n }\n /**\n * Whether the first option should be highlighted when the autocomplete panel is opened.\n * Can be configured globally through the `MAT_AUTOCOMPLETE_DEFAULT_OPTIONS` token.\n */\n get autoActiveFirstOption() {\n return this._autoActiveFirstOption;\n }\n set autoActiveFirstOption(value) {\n this._autoActiveFirstOption = coerceBooleanProperty(value);\n }\n /** Whether the active option should be selected as the user is navigating. */\n get autoSelectActiveOption() {\n return this._autoSelectActiveOption;\n }\n set autoSelectActiveOption(value) {\n this._autoSelectActiveOption = coerceBooleanProperty(value);\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 if (value && value.length) {\n this._classList = coerceStringArray(value).reduce((classList, className) => {\n classList[className] = true;\n return classList;\n }, {});\n }\n else {\n this._classList = {};\n }\n this._setVisibilityClasses(this._classList);\n this._elementRef.nativeElement.className = '';\n }\n ngAfterContentInit() {\n this._keyManager = new ActiveDescendantKeyManager(this.options).withWrap();\n this._activeOptionChanges = this._keyManager.change.subscribe(index => {\n if (this.isOpen) {\n this.optionActivated.emit({ source: this, option: this.options.toArray()[index] || null });\n }\n });\n // Set the initial visibility state.\n this._setVisibility();\n }\n ngOnDestroy() {\n this._activeOptionChanges.unsubscribe();\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._setVisibilityClasses(this._classList);\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 /** Sets the autocomplete visibility classes on a classlist based on the panel is visible. */\n _setVisibilityClasses(classList) {\n classList[this._visibleClass] = this.showPanel;\n classList[this._hiddenClass] = !this.showPanel;\n }\n}\n_MatAutocompleteBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: _MatAutocompleteBase, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: MAT_AUTOCOMPLETE_DEFAULT_OPTIONS }, { token: i1.Platform }], target: i0.ɵɵFactoryTarget.Directive });\n_MatAutocompleteBase.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: _MatAutocompleteBase, inputs: { ariaLabel: [\"aria-label\", \"ariaLabel\"], ariaLabelledby: [\"aria-labelledby\", \"ariaLabelledby\"], displayWith: \"displayWith\", autoActiveFirstOption: \"autoActiveFirstOption\", autoSelectActiveOption: \"autoSelectActiveOption\", panelWidth: \"panelWidth\", classList: [\"class\", \"classList\"] }, outputs: { optionSelected: \"optionSelected\", opened: \"opened\", closed: \"closed\", optionActivated: \"optionActivated\" }, viewQueries: [{ propertyName: \"template\", first: true, predicate: TemplateRef, descendants: true, static: true }, { propertyName: \"panel\", first: true, predicate: [\"panel\"], descendants: true }], usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: _MatAutocompleteBase, decorators: [{\n type: Directive\n }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: undefined, decorators: [{\n type: Inject,\n args: [MAT_AUTOCOMPLETE_DEFAULT_OPTIONS]\n }] }, { type: i1.Platform }]; }, propDecorators: { template: [{\n type: ViewChild,\n args: [TemplateRef, { static: true }]\n }], panel: [{\n type: ViewChild,\n args: ['panel']\n }], ariaLabel: [{\n type: Input,\n args: ['aria-label']\n }], ariaLabelledby: [{\n type: Input,\n args: ['aria-labelledby']\n }], displayWith: [{\n type: Input\n }], autoActiveFirstOption: [{\n type: Input\n }], autoSelectActiveOption: [{\n type: Input\n }], panelWidth: [{\n type: Input\n }], optionSelected: [{\n type: Output\n }], opened: [{\n type: Output\n }], closed: [{\n type: Output\n }], optionActivated: [{\n type: Output\n }], classList: [{\n type: Input,\n args: ['class']\n }] } });\nclass MatAutocomplete extends _MatAutocompleteBase {\n constructor() {\n super(...arguments);\n this._visibleClass = 'mat-autocomplete-visible';\n this._hiddenClass = 'mat-autocomplete-hidden';\n }\n}\nMatAutocomplete.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatAutocomplete, deps: null, target: i0.ɵɵFactoryTarget.Component });\nMatAutocomplete.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatAutocomplete, selector: \"mat-autocomplete\", inputs: { disableRipple: \"disableRipple\" }, host: { classAttribute: \"mat-autocomplete\" }, providers: [{ provide: MAT_OPTION_PARENT_COMPONENT, useExisting: MatAutocomplete }], queries: [{ propertyName: \"optionGroups\", predicate: MAT_OPTGROUP, descendants: true }, { propertyName: \"options\", predicate: MatOption, descendants: true }], exportAs: [\"matAutocomplete\"], usesInheritance: true, ngImport: i0, template: \"\\n
\\n \\n
\\n
\\n\", styles: [\".mat-autocomplete-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;visibility:hidden;max-width:none;max-height:256px;position:relative;width:100%;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.mat-autocomplete-panel.mat-autocomplete-visible{visibility:visible}.mat-autocomplete-panel.mat-autocomplete-hidden{visibility:hidden}.mat-autocomplete-panel-above .mat-autocomplete-panel{border-radius:0;border-top-left-radius:4px;border-top-right-radius:4px}.mat-autocomplete-panel .mat-divider-horizontal{margin-top:-1px}.cdk-high-contrast-active .mat-autocomplete-panel{outline:solid 1px}mat-autocomplete{display:none}\"], dependencies: [{ kind: \"directive\", type: i2.NgClass, selector: \"[ngClass]\", inputs: [\"class\", \"ngClass\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatAutocomplete, decorators: [{\n type: Component,\n args: [{ selector: 'mat-autocomplete', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'matAutocomplete', inputs: ['disableRipple'], host: {\n 'class': 'mat-autocomplete',\n }, providers: [{ provide: MAT_OPTION_PARENT_COMPONENT, useExisting: MatAutocomplete }], template: \"\\n
\\n \\n
\\n
\\n\", styles: [\".mat-autocomplete-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;visibility:hidden;max-width:none;max-height:256px;position:relative;width:100%;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.mat-autocomplete-panel.mat-autocomplete-visible{visibility:visible}.mat-autocomplete-panel.mat-autocomplete-hidden{visibility:hidden}.mat-autocomplete-panel-above .mat-autocomplete-panel{border-radius:0;border-top-left-radius:4px;border-top-right-radius:4px}.mat-autocomplete-panel .mat-divider-horizontal{margin-top:-1px}.cdk-high-contrast-active .mat-autocomplete-panel{outline:solid 1px}mat-autocomplete{display:none}\"] }]\n }], propDecorators: { optionGroups: [{\n type: ContentChildren,\n args: [MAT_OPTGROUP, { descendants: true }]\n }], options: [{\n type: ContentChildren,\n args: [MatOption, { descendants: true }]\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Base class containing all of the functionality for `MatAutocompleteOrigin`. */\nclass _MatAutocompleteOriginBase {\n constructor(\n /** Reference to the element on which the directive is applied. */\n elementRef) {\n this.elementRef = elementRef;\n }\n}\n_MatAutocompleteOriginBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: _MatAutocompleteOriginBase, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });\n_MatAutocompleteOriginBase.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: _MatAutocompleteOriginBase, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: _MatAutocompleteOriginBase, decorators: [{\n type: Directive\n }], ctorParameters: function () { return [{ type: i0.ElementRef }]; } });\n/**\n * Directive applied to an element to make it usable\n * as a connection point for an autocomplete panel.\n */\nclass MatAutocompleteOrigin extends _MatAutocompleteOriginBase {\n}\nMatAutocompleteOrigin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatAutocompleteOrigin, deps: null, target: i0.ɵɵFactoryTarget.Directive });\nMatAutocompleteOrigin.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatAutocompleteOrigin, selector: \"[matAutocompleteOrigin]\", exportAs: [\"matAutocompleteOrigin\"], usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatAutocompleteOrigin, decorators: [{\n type: Directive,\n args: [{\n selector: '[matAutocompleteOrigin]',\n exportAs: 'matAutocompleteOrigin',\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Injection token that determines the scroll handling while the autocomplete panel is open. */\nconst MAT_AUTOCOMPLETE_SCROLL_STRATEGY = new InjectionToken('mat-autocomplete-scroll-strategy');\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/**\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: 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`. ' +\n 'Make sure that the id passed to the `matAutocomplete` is correct and that ' +\n \"you're attempting to open it after the ngAfterContentInit hook.\");\n}\n/** Base class with all of the `MatAutocompleteTrigger` functionality. */\nclass _MatAutocompleteTriggerBase {\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 this._autocompleteDisabled = 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 /**\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 =\n 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._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._zone.onStable.pipe(take(1), switchMap(() => this.optionSelections));\n });\n this._scrollStrategy = scrollStrategy;\n }\n /**\n * Whether the autocomplete is disabled. When disabled, the element will\n * act as a regular input and the user won't be able to open the panel.\n */\n get autocompleteDisabled() {\n return this._autocompleteDisabled;\n }\n set autocompleteDisabled(value) {\n this._autocompleteDisabled = coerceBooleanProperty(value);\n }\n ngAfterViewInit() {\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._viewportSubscription.unsubscribe();\n this._componentDestroyed = true;\n this._destroyPanel();\n this._closeKeyEventStream.complete();\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._attachOverlay();\n this._floatLabel();\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 // The `NgZone.onStable` always emits outside of the Angular zone,\n // so all the subscriptions from `_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 this.autocomplete._isOpen = this._overlayAttached = false;\n this._pendingAutoselectedOption = null;\n if (this._overlayRef && this._overlayRef.hasAttached()) {\n this._overlayRef.detach();\n this._closingActionsSubscription.unsubscribe();\n }\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 }\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\n ? this._overlayRef.detachments().pipe(filter(() => this._overlayAttached))\n : 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._elementRef.nativeElement : null;\n const customOrigin = this.connectedTo ? this.connectedTo.elementRef.nativeElement : null;\n return (this._overlayAttached &&\n 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 &&\n (!formField || !formField.contains(clickTarget)) &&\n (!customOrigin || !customOrigin.contains(clickTarget)) &&\n !!this._overlayRef &&\n !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 if (this.activeOption && keyCode === ENTER && this.panelOpen && !hasModifier) {\n this.activeOption._selectViaInteraction();\n this._resetActiveItem();\n event.preventDefault();\n }\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 }\n else if (isArrowKey && this._canOpen()) {\n this.openPanel();\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._element.nativeElement.value;\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 this._onChange(value);\n if (this._canOpen() && this._document.activeElement === event.target) {\n this.openPanel();\n }\n }\n }\n _handleFocus() {\n if (!this._canOpenOnNextFocus) {\n this._canOpenOnNextFocus = true;\n }\n else if (this._canOpen()) {\n this._previousValue = this._element.nativeElement.value;\n this._attachOverlay();\n this._floatLabel(true);\n }\n }\n _handleClick() {\n if (this._canOpen() && !this.panelOpen) {\n this.openPanel();\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 }\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 this._formField.floatLabel = 'auto';\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 firstStable = this._zone.onStable.pipe(take(1));\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 zone is stable initially, and when the option list changes...\n return (merge(firstStable, optionChanges)\n .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(() => {\n // The `NgZone.onStable` always emits 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 this._zone.run(() => {\n const wasOpen = this.panelOpen;\n this._resetActiveItem();\n this.autocomplete._setVisibility();\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.autocomplete.opened.emit();\n }\n else {\n this.autocomplete.closed.emit();\n }\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 /** 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 _assignOptionValue(value) {\n const toDisplay = this.autocomplete && this.autocomplete.displayWith\n ? this.autocomplete.displayWith(value)\n : value;\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 }\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 toSelect = event ? event.source : this._pendingAutoselectedOption;\n if (toSelect) {\n this._clearPreviousSelectedOption(toSelect);\n this._assignOptionValue(toSelect.value);\n this._onChange(toSelect.value);\n this.autocomplete._emitSelectEvent(toSelect);\n this._element.nativeElement.focus();\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) {\n this.autocomplete.options.forEach(option => {\n if (option !== skip && option.selected) {\n option.deselect();\n }\n });\n }\n _attachOverlay() {\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._handleOverlayEvents(overlayRef);\n this._viewportSubscription = this._viewportRuler.change().subscribe(() => {\n if (this.panelOpen && overlayRef) {\n overlayRef.updateSize({ width: this._getPanelWidth() });\n }\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({ width: this._getPanelWidth() });\n }\n if (overlayRef && !overlayRef.hasAttached()) {\n overlayRef.attach(this._portal);\n this._closingActionsSubscription = this._subscribeToClosingActions();\n }\n const wasOpen = this.panelOpen;\n this.autocomplete._setVisibility();\n this.autocomplete._isOpen = this._overlayAttached = true;\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.autocomplete.opened.emit();\n }\n }\n _getOverlayConfig() {\n return new OverlayConfig({\n positionStrategy: this._getOverlayPosition(),\n scrollStrategy: this._scrollStrategy(),\n width: this._getPanelWidth(),\n direction: this._dir,\n panelClass: this._defaults?.overlayPanelClass,\n });\n }\n _getOverlayPosition() {\n const strategy = this._overlay\n .position()\n .flexibleConnectedTo(this._getConnectedElement())\n .withFlexibleDimensions(false)\n .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', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n { originX: 'end', originY: 'bottom', overlayX: 'end', 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', originY: 'top', overlayX: 'start', overlayY: 'bottom', panelClass },\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', panelClass },\n ];\n let positions;\n if (this.position === 'above') {\n positions = abovePositions;\n }\n else if (this.position === 'below') {\n positions = belowPositions;\n }\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 * Resets the active item to -1 so arrow events will activate the\n * correct options, or to 0 if the consumer opted into it.\n */\n _resetActiveItem() {\n const autocomplete = this.autocomplete;\n if (autocomplete.autoActiveFirstOption) {\n // Note that we go through `setFirstItemActive`, rather than `setActiveItem(0)`, because\n // the former will find the next enabled option, if the first one is disabled.\n autocomplete._keyManager.setFirstItemActive();\n }\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 }\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 /** Handles keyboard events coming from the overlay panel. */\n _handleOverlayEvents(overlayRef) {\n // Use the `keydownEvents` in order to take advantage of\n // the overlay event targeting provided by the CDK overlay.\n overlayRef.keydownEvents().subscribe(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)) ||\n (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 // 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 overlayRef.outsidePointerEvents().subscribe();\n }\n}\n_MatAutocompleteTriggerBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: _MatAutocompleteTriggerBase, deps: [{ token: i0.ElementRef }, { token: i1$1.Overlay }, { token: i0.ViewContainerRef }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: MAT_AUTOCOMPLETE_SCROLL_STRATEGY }, { token: i2$1.Directionality, optional: true }, { token: MAT_FORM_FIELD, host: true, optional: true }, { token: DOCUMENT, optional: true }, { token: i3.ViewportRuler }, { token: MAT_AUTOCOMPLETE_DEFAULT_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Directive });\n_MatAutocompleteTriggerBase.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: _MatAutocompleteTriggerBase, inputs: { autocomplete: [\"matAutocomplete\", \"autocomplete\"], position: [\"matAutocompletePosition\", \"position\"], connectedTo: [\"matAutocompleteConnectedTo\", \"connectedTo\"], autocompleteAttribute: [\"autocomplete\", \"autocompleteAttribute\"], autocompleteDisabled: [\"matAutocompleteDisabled\", \"autocompleteDisabled\"] }, usesOnChanges: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: _MatAutocompleteTriggerBase, decorators: [{\n type: Directive\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1$1.Overlay }, { type: i0.ViewContainerRef }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{\n type: Inject,\n args: [MAT_AUTOCOMPLETE_SCROLL_STRATEGY]\n }] }, { type: i2$1.Directionality, decorators: [{\n type: Optional\n }] }, { type: i4.MatFormField, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_FORM_FIELD]\n }, {\n type: Host\n }] }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: i3.ViewportRuler }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_AUTOCOMPLETE_DEFAULT_OPTIONS]\n }] }]; }, propDecorators: { autocomplete: [{\n type: Input,\n args: ['matAutocomplete']\n }], position: [{\n type: Input,\n args: ['matAutocompletePosition']\n }], connectedTo: [{\n type: Input,\n args: ['matAutocompleteConnectedTo']\n }], autocompleteAttribute: [{\n type: Input,\n args: ['autocomplete']\n }], autocompleteDisabled: [{\n type: Input,\n args: ['matAutocompleteDisabled']\n }] } });\nclass MatAutocompleteTrigger extends _MatAutocompleteTriggerBase {\n constructor() {\n super(...arguments);\n this._aboveClass = 'mat-autocomplete-panel-above';\n }\n}\nMatAutocompleteTrigger.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatAutocompleteTrigger, deps: null, target: i0.ɵɵFactoryTarget.Directive });\nMatAutocompleteTrigger.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatAutocompleteTrigger, selector: \"input[matAutocomplete], textarea[matAutocomplete]\", host: { listeners: { \"focusin\": \"_handleFocus()\", \"blur\": \"_onTouched()\", \"input\": \"_handleInput($event)\", \"keydown\": \"_handleKeydown($event)\", \"click\": \"_handleClick()\" }, properties: { \"attr.autocomplete\": \"autocompleteAttribute\", \"attr.role\": \"autocompleteDisabled ? null : \\\"combobox\\\"\", \"attr.aria-autocomplete\": \"autocompleteDisabled ? null : \\\"list\\\"\", \"attr.aria-activedescendant\": \"(panelOpen && activeOption) ? activeOption.id : null\", \"attr.aria-expanded\": \"autocompleteDisabled ? null : panelOpen.toString()\", \"attr.aria-owns\": \"(autocompleteDisabled || !panelOpen) ? null : autocomplete?.id\", \"attr.aria-haspopup\": \"autocompleteDisabled ? null : \\\"listbox\\\"\" }, classAttribute: \"mat-autocomplete-trigger\" }, providers: [MAT_AUTOCOMPLETE_VALUE_ACCESSOR], exportAs: [\"matAutocompleteTrigger\"], usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatAutocompleteTrigger, decorators: [{\n type: Directive,\n args: [{\n selector: `input[matAutocomplete], textarea[matAutocomplete]`,\n host: {\n 'class': 'mat-autocomplete-trigger',\n '[attr.autocomplete]': 'autocompleteAttribute',\n '[attr.role]': 'autocompleteDisabled ? null : \"combobox\"',\n '[attr.aria-autocomplete]': 'autocompleteDisabled ? null : \"list\"',\n '[attr.aria-activedescendant]': '(panelOpen && activeOption) ? activeOption.id : null',\n '[attr.aria-expanded]': 'autocompleteDisabled ? null : panelOpen.toString()',\n '[attr.aria-owns]': '(autocompleteDisabled || !panelOpen) ? null : autocomplete?.id',\n '[attr.aria-haspopup]': 'autocompleteDisabled ? null : \"listbox\"',\n // Note: we use `focusin`, as opposed to `focus`, in order to open the panel\n // a little earlier. This avoids issues where IE delays the focusing of the input.\n '(focusin)': '_handleFocus()',\n '(blur)': '_onTouched()',\n '(input)': '_handleInput($event)',\n '(keydown)': '_handleKeydown($event)',\n '(click)': '_handleClick()',\n },\n exportAs: 'matAutocompleteTrigger',\n providers: [MAT_AUTOCOMPLETE_VALUE_ACCESSOR],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatAutocompleteModule {\n}\nMatAutocompleteModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatAutocompleteModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nMatAutocompleteModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.2.0\", ngImport: i0, type: MatAutocompleteModule, declarations: [MatAutocomplete, MatAutocompleteTrigger, MatAutocompleteOrigin], imports: [OverlayModule, MatOptionModule, MatCommonModule, CommonModule], exports: [MatAutocomplete,\n MatAutocompleteTrigger,\n MatAutocompleteOrigin,\n CdkScrollableModule,\n MatOptionModule,\n MatCommonModule] });\nMatAutocompleteModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatAutocompleteModule, providers: [MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER], imports: [OverlayModule, MatOptionModule, MatCommonModule, CommonModule, CdkScrollableModule,\n MatOptionModule,\n MatCommonModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatAutocompleteModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [OverlayModule, MatOptionModule, MatCommonModule, CommonModule],\n exports: [\n MatAutocomplete,\n MatAutocompleteTrigger,\n MatAutocompleteOrigin,\n CdkScrollableModule,\n MatOptionModule,\n MatCommonModule,\n ],\n declarations: [MatAutocomplete, MatAutocompleteTrigger, MatAutocompleteOrigin],\n providers: [MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\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, _MatAutocompleteBase, _MatAutocompleteOriginBase, _MatAutocompleteTriggerBase, getMatAutocompleteMissingPanelError };\n","import * as i0 from '@angular/core';\nimport { Directive, Input, Component, ViewEncapsulation, ChangeDetectionStrategy, Optional, Inject, NgModule } from '@angular/core';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\nimport { MatCommonModule } from '@angular/material/core';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Content of a card, needed as it's used as a selector in the API.\n * @docs-private\n */\nclass MatCardContent {\n}\nMatCardContent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nMatCardContent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatCardContent, selector: \"mat-card-content, [mat-card-content], [matCardContent]\", host: { classAttribute: \"mat-card-content\" }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardContent, decorators: [{\n type: Directive,\n args: [{\n selector: 'mat-card-content, [mat-card-content], [matCardContent]',\n host: { 'class': 'mat-card-content' },\n }]\n }] });\n/**\n * Title of a card, needed as it's used as a selector in the API.\n * @docs-private\n */\nclass MatCardTitle {\n}\nMatCardTitle.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardTitle, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nMatCardTitle.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatCardTitle, selector: \"mat-card-title, [mat-card-title], [matCardTitle]\", host: { classAttribute: \"mat-card-title\" }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardTitle, decorators: [{\n type: Directive,\n args: [{\n selector: `mat-card-title, [mat-card-title], [matCardTitle]`,\n host: {\n 'class': 'mat-card-title',\n },\n }]\n }] });\n/**\n * Sub-title of a card, needed as it's used as a selector in the API.\n * @docs-private\n */\nclass MatCardSubtitle {\n}\nMatCardSubtitle.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardSubtitle, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nMatCardSubtitle.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatCardSubtitle, selector: \"mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]\", host: { classAttribute: \"mat-card-subtitle\" }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardSubtitle, decorators: [{\n type: Directive,\n args: [{\n selector: `mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]`,\n host: {\n 'class': 'mat-card-subtitle',\n },\n }]\n }] });\n/**\n * Action section of a card, needed as it's used as a selector in the API.\n * @docs-private\n */\nclass MatCardActions {\n constructor() {\n /** Position of the actions inside the card. */\n this.align = 'start';\n }\n}\nMatCardActions.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardActions, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nMatCardActions.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatCardActions, selector: \"mat-card-actions\", inputs: { align: \"align\" }, host: { properties: { \"class.mat-card-actions-align-end\": \"align === \\\"end\\\"\" }, classAttribute: \"mat-card-actions\" }, exportAs: [\"matCardActions\"], ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardActions, decorators: [{\n type: Directive,\n args: [{\n selector: 'mat-card-actions',\n exportAs: 'matCardActions',\n host: {\n 'class': 'mat-card-actions',\n '[class.mat-card-actions-align-end]': 'align === \"end\"',\n },\n }]\n }], propDecorators: { align: [{\n type: Input\n }] } });\n/**\n * Footer of a card, needed as it's used as a selector in the API.\n * @docs-private\n */\nclass MatCardFooter {\n}\nMatCardFooter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardFooter, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nMatCardFooter.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatCardFooter, selector: \"mat-card-footer\", host: { classAttribute: \"mat-card-footer\" }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardFooter, decorators: [{\n type: Directive,\n args: [{\n selector: 'mat-card-footer',\n host: { 'class': 'mat-card-footer' },\n }]\n }] });\n/**\n * Image used in a card, needed to add the mat- CSS styling.\n * @docs-private\n */\nclass MatCardImage {\n}\nMatCardImage.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardImage, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nMatCardImage.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatCardImage, selector: \"[mat-card-image], [matCardImage]\", host: { classAttribute: \"mat-card-image\" }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardImage, decorators: [{\n type: Directive,\n args: [{\n selector: '[mat-card-image], [matCardImage]',\n host: { 'class': 'mat-card-image' },\n }]\n }] });\n/**\n * Image used in a card, needed to add the mat- CSS styling.\n * @docs-private\n */\nclass MatCardSmImage {\n}\nMatCardSmImage.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardSmImage, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nMatCardSmImage.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatCardSmImage, selector: \"[mat-card-sm-image], [matCardImageSmall]\", host: { classAttribute: \"mat-card-sm-image\" }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardSmImage, decorators: [{\n type: Directive,\n args: [{\n selector: '[mat-card-sm-image], [matCardImageSmall]',\n host: { 'class': 'mat-card-sm-image' },\n }]\n }] });\n/**\n * Image used in a card, needed to add the mat- CSS styling.\n * @docs-private\n */\nclass MatCardMdImage {\n}\nMatCardMdImage.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardMdImage, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nMatCardMdImage.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatCardMdImage, selector: \"[mat-card-md-image], [matCardImageMedium]\", host: { classAttribute: \"mat-card-md-image\" }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardMdImage, decorators: [{\n type: Directive,\n args: [{\n selector: '[mat-card-md-image], [matCardImageMedium]',\n host: { 'class': 'mat-card-md-image' },\n }]\n }] });\n/**\n * Image used in a card, needed to add the mat- CSS styling.\n * @docs-private\n */\nclass MatCardLgImage {\n}\nMatCardLgImage.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardLgImage, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nMatCardLgImage.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatCardLgImage, selector: \"[mat-card-lg-image], [matCardImageLarge]\", host: { classAttribute: \"mat-card-lg-image\" }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardLgImage, decorators: [{\n type: Directive,\n args: [{\n selector: '[mat-card-lg-image], [matCardImageLarge]',\n host: { 'class': 'mat-card-lg-image' },\n }]\n }] });\n/**\n * Large image used in a card, needed to add the mat- CSS styling.\n * @docs-private\n */\nclass MatCardXlImage {\n}\nMatCardXlImage.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardXlImage, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nMatCardXlImage.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatCardXlImage, selector: \"[mat-card-xl-image], [matCardImageXLarge]\", host: { classAttribute: \"mat-card-xl-image\" }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardXlImage, decorators: [{\n type: Directive,\n args: [{\n selector: '[mat-card-xl-image], [matCardImageXLarge]',\n host: { 'class': 'mat-card-xl-image' },\n }]\n }] });\n/**\n * Avatar image used in a card, needed to add the mat- CSS styling.\n * @docs-private\n */\nclass MatCardAvatar {\n}\nMatCardAvatar.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardAvatar, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nMatCardAvatar.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatCardAvatar, selector: \"[mat-card-avatar], [matCardAvatar]\", host: { classAttribute: \"mat-card-avatar\" }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardAvatar, decorators: [{\n type: Directive,\n args: [{\n selector: '[mat-card-avatar], [matCardAvatar]',\n host: { 'class': 'mat-card-avatar' },\n }]\n }] });\n/**\n * A basic content container component that adds the styles of a Material design card.\n *\n * While this component can be used alone, it also provides a number\n * of preset styles for common card sections, including:\n * - mat-card-title\n * - mat-card-subtitle\n * - mat-card-content\n * - mat-card-actions\n * - mat-card-footer\n */\nclass MatCard {\n // @breaking-change 9.0.0 `_animationMode` parameter to be made required.\n constructor(_animationMode) {\n this._animationMode = _animationMode;\n }\n}\nMatCard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCard, deps: [{ token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Component });\nMatCard.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatCard, selector: \"mat-card\", host: { properties: { \"class._mat-animation-noopable\": \"_animationMode === \\\"NoopAnimations\\\"\" }, classAttribute: \"mat-card mat-focus-indicator\" }, exportAs: [\"matCard\"], ngImport: i0, template: \"\\n\\n\", styles: [\".mat-card{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);display:block;position:relative;padding:16px;border-radius:4px}.mat-card._mat-animation-noopable{transition:none !important;animation:none !important}.mat-card>.mat-divider-horizontal{position:absolute;left:0;width:100%}[dir=rtl] .mat-card>.mat-divider-horizontal{left:auto;right:0}.mat-card>.mat-divider-horizontal.mat-divider-inset{position:static;margin:0}[dir=rtl] .mat-card>.mat-divider-horizontal.mat-divider-inset{margin-right:0}.cdk-high-contrast-active .mat-card{outline:solid 1px}.mat-card-actions,.mat-card-subtitle,.mat-card-content{display:block;margin-bottom:16px}.mat-card-title{display:block;margin-bottom:8px}.mat-card-actions{margin-left:-8px;margin-right:-8px;padding:8px 0}.mat-card-actions-align-end{display:flex;justify-content:flex-end}.mat-card-image{width:calc(100% + 32px);margin:0 -16px 16px -16px;display:block;overflow:hidden}.mat-card-image img{width:100%}.mat-card-footer{display:block;margin:0 -16px -16px -16px}.mat-card-actions .mat-button,.mat-card-actions .mat-raised-button,.mat-card-actions .mat-stroked-button{margin:0 8px}.mat-card-header{display:flex;flex-direction:row}.mat-card-header .mat-card-title{margin-bottom:12px}.mat-card-header-text{margin:0 16px}.mat-card-avatar{height:40px;width:40px;border-radius:50%;flex-shrink:0;object-fit:cover}.mat-card-title-group{display:flex;justify-content:space-between}.mat-card-sm-image{width:80px;height:80px}.mat-card-md-image{width:112px;height:112px}.mat-card-lg-image{width:152px;height:152px}.mat-card-xl-image{width:240px;height:240px;margin:-8px}.mat-card-title-group>.mat-card-xl-image{margin:-8px 0 8px}@media(max-width: 599px){.mat-card-title-group{margin:0}.mat-card-xl-image{margin-left:0;margin-right:0}}.mat-card>:first-child,.mat-card-content>:first-child{margin-top:0}.mat-card>:last-child:not(.mat-card-footer),.mat-card-content>:last-child:not(.mat-card-footer){margin-bottom:0}.mat-card-image:first-child{margin-top:-16px;border-top-left-radius:inherit;border-top-right-radius:inherit}.mat-card>.mat-card-actions:last-child{margin-bottom:-8px;padding-bottom:0}.mat-card-actions:not(.mat-card-actions-align-end) .mat-button:first-child,.mat-card-actions:not(.mat-card-actions-align-end) .mat-raised-button:first-child,.mat-card-actions:not(.mat-card-actions-align-end) .mat-stroked-button:first-child{margin-left:0;margin-right:0}.mat-card-actions-align-end .mat-button:last-child,.mat-card-actions-align-end .mat-raised-button:last-child,.mat-card-actions-align-end .mat-stroked-button:last-child{margin-left:0;margin-right:0}.mat-card-title:not(:first-child),.mat-card-subtitle:not(:first-child){margin-top:-4px}.mat-card-header .mat-card-subtitle:not(:first-child){margin-top:-8px}.mat-card>.mat-card-xl-image:first-child{margin-top:-8px}.mat-card>.mat-card-xl-image:last-child{margin-bottom:-8px}\"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCard, decorators: [{\n type: Component,\n args: [{ selector: 'mat-card', exportAs: 'matCard', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {\n 'class': 'mat-card mat-focus-indicator',\n '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n }, template: \"\\n\\n\", styles: [\".mat-card{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);display:block;position:relative;padding:16px;border-radius:4px}.mat-card._mat-animation-noopable{transition:none !important;animation:none !important}.mat-card>.mat-divider-horizontal{position:absolute;left:0;width:100%}[dir=rtl] .mat-card>.mat-divider-horizontal{left:auto;right:0}.mat-card>.mat-divider-horizontal.mat-divider-inset{position:static;margin:0}[dir=rtl] .mat-card>.mat-divider-horizontal.mat-divider-inset{margin-right:0}.cdk-high-contrast-active .mat-card{outline:solid 1px}.mat-card-actions,.mat-card-subtitle,.mat-card-content{display:block;margin-bottom:16px}.mat-card-title{display:block;margin-bottom:8px}.mat-card-actions{margin-left:-8px;margin-right:-8px;padding:8px 0}.mat-card-actions-align-end{display:flex;justify-content:flex-end}.mat-card-image{width:calc(100% + 32px);margin:0 -16px 16px -16px;display:block;overflow:hidden}.mat-card-image img{width:100%}.mat-card-footer{display:block;margin:0 -16px -16px -16px}.mat-card-actions .mat-button,.mat-card-actions .mat-raised-button,.mat-card-actions .mat-stroked-button{margin:0 8px}.mat-card-header{display:flex;flex-direction:row}.mat-card-header .mat-card-title{margin-bottom:12px}.mat-card-header-text{margin:0 16px}.mat-card-avatar{height:40px;width:40px;border-radius:50%;flex-shrink:0;object-fit:cover}.mat-card-title-group{display:flex;justify-content:space-between}.mat-card-sm-image{width:80px;height:80px}.mat-card-md-image{width:112px;height:112px}.mat-card-lg-image{width:152px;height:152px}.mat-card-xl-image{width:240px;height:240px;margin:-8px}.mat-card-title-group>.mat-card-xl-image{margin:-8px 0 8px}@media(max-width: 599px){.mat-card-title-group{margin:0}.mat-card-xl-image{margin-left:0;margin-right:0}}.mat-card>:first-child,.mat-card-content>:first-child{margin-top:0}.mat-card>:last-child:not(.mat-card-footer),.mat-card-content>:last-child:not(.mat-card-footer){margin-bottom:0}.mat-card-image:first-child{margin-top:-16px;border-top-left-radius:inherit;border-top-right-radius:inherit}.mat-card>.mat-card-actions:last-child{margin-bottom:-8px;padding-bottom:0}.mat-card-actions:not(.mat-card-actions-align-end) .mat-button:first-child,.mat-card-actions:not(.mat-card-actions-align-end) .mat-raised-button:first-child,.mat-card-actions:not(.mat-card-actions-align-end) .mat-stroked-button:first-child{margin-left:0;margin-right:0}.mat-card-actions-align-end .mat-button:last-child,.mat-card-actions-align-end .mat-raised-button:last-child,.mat-card-actions-align-end .mat-stroked-button:last-child{margin-left:0;margin-right:0}.mat-card-title:not(:first-child),.mat-card-subtitle:not(:first-child){margin-top:-4px}.mat-card-header .mat-card-subtitle:not(:first-child){margin-top:-8px}.mat-card>.mat-card-xl-image:first-child{margin-top:-8px}.mat-card>.mat-card-xl-image:last-child{margin-bottom:-8px}\"] }]\n }], ctorParameters: function () { return [{ type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }]; } });\n/**\n * Component intended to be used within the `` component. It adds styles for a\n * preset header section (i.e. a title, subtitle, and avatar layout).\n * @docs-private\n */\nclass MatCardHeader {\n}\nMatCardHeader.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardHeader, deps: [], target: i0.ɵɵFactoryTarget.Component });\nMatCardHeader.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatCardHeader, selector: \"mat-card-header\", host: { classAttribute: \"mat-card-header\" }, ngImport: i0, template: \"\\n
\\n \\n
\\n\\n\", changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardHeader, decorators: [{\n type: Component,\n args: [{ selector: 'mat-card-header', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { 'class': 'mat-card-header' }, template: \"\\n
\\n \\n
\\n\\n\" }]\n }] });\n/**\n * Component intended to be used within the `` component. It adds styles for a preset\n * layout that groups an image with a title section.\n * @docs-private\n */\nclass MatCardTitleGroup {\n}\nMatCardTitleGroup.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardTitleGroup, deps: [], target: i0.ɵɵFactoryTarget.Component });\nMatCardTitleGroup.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatCardTitleGroup, selector: \"mat-card-title-group\", host: { classAttribute: \"mat-card-title-group\" }, ngImport: i0, template: \"
\\n \\n
\\n\\n\\n\", changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardTitleGroup, decorators: [{\n type: Component,\n args: [{ selector: 'mat-card-title-group', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { 'class': 'mat-card-title-group' }, template: \"
\\n \\n
\\n\\n\\n\" }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatCardModule {\n}\nMatCardModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nMatCardModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardModule, declarations: [MatCard,\n MatCardHeader,\n MatCardTitleGroup,\n MatCardContent,\n MatCardTitle,\n MatCardSubtitle,\n MatCardActions,\n MatCardFooter,\n MatCardSmImage,\n MatCardMdImage,\n MatCardLgImage,\n MatCardImage,\n MatCardXlImage,\n MatCardAvatar], imports: [MatCommonModule], exports: [MatCard,\n MatCardHeader,\n MatCardTitleGroup,\n MatCardContent,\n MatCardTitle,\n MatCardSubtitle,\n MatCardActions,\n MatCardFooter,\n MatCardSmImage,\n MatCardMdImage,\n MatCardLgImage,\n MatCardImage,\n MatCardXlImage,\n MatCardAvatar,\n MatCommonModule] });\nMatCardModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardModule, imports: [MatCommonModule, MatCommonModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatCardModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [MatCommonModule],\n exports: [\n MatCard,\n MatCardHeader,\n MatCardTitleGroup,\n MatCardContent,\n MatCardTitle,\n MatCardSubtitle,\n MatCardActions,\n MatCardFooter,\n MatCardSmImage,\n MatCardMdImage,\n MatCardLgImage,\n MatCardImage,\n MatCardXlImage,\n MatCardAvatar,\n MatCommonModule,\n ],\n declarations: [\n MatCard,\n MatCardHeader,\n MatCardTitleGroup,\n MatCardContent,\n MatCardTitle,\n MatCardSubtitle,\n MatCardActions,\n MatCardFooter,\n MatCardSmImage,\n MatCardMdImage,\n MatCardLgImage,\n MatCardImage,\n MatCardXlImage,\n MatCardAvatar,\n ],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MatCard, MatCardActions, MatCardAvatar, MatCardContent, MatCardFooter, MatCardHeader, MatCardImage, MatCardLgImage, MatCardMdImage, MatCardModule, MatCardSmImage, MatCardSubtitle, MatCardTitle, MatCardTitleGroup, MatCardXlImage };\n","import { SPACE, BACKSPACE, DELETE, TAB, hasModifierKey, ENTER } from '@angular/cdk/keycodes';\nimport * as i0 from '@angular/core';\nimport { InjectionToken, Directive, EventEmitter, Optional, Inject, Attribute, ContentChild, Input, Output, Component, ViewEncapsulation, ChangeDetectionStrategy, Self, ContentChildren, NgModule } from '@angular/core';\nimport * as i3 from '@angular/material/core';\nimport { mixinTabIndex, mixinColor, mixinDisableRipple, RippleRenderer, MAT_RIPPLE_GLOBAL_OPTIONS, mixinErrorState, MatCommonModule, ErrorStateMatcher } from '@angular/material/core';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport * as i1 from '@angular/cdk/platform';\nimport { DOCUMENT } from '@angular/common';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\nimport { Subject, merge } from 'rxjs';\nimport { take, takeUntil, startWith } from 'rxjs/operators';\nimport { FocusKeyManager } from '@angular/cdk/a11y';\nimport * as i1$1 from '@angular/cdk/bidi';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport * as i2 from '@angular/forms';\nimport { Validators } from '@angular/forms';\nimport { MatFormFieldControl } from '@angular/material/form-field';\n\n/** Event object emitted by MatChip when selected or deselected. */\nclass MatChipSelectionChange {\n constructor(\n /** Reference to the chip that emitted the event. */\n source, \n /** Whether the chip that emitted the event is selected. */\n selected, \n /** Whether the selection change was a result of a user interaction. */\n isUserInput = false) {\n this.source = source;\n this.selected = selected;\n this.isUserInput = isUserInput;\n }\n}\n/**\n * Injection token that can be used to reference instances of `MatChipRemove`. It serves as\n * alternative token to the actual `MatChipRemove` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst MAT_CHIP_REMOVE = new InjectionToken('MatChipRemove');\n/**\n * Injection token that can be used to reference instances of `MatChipAvatar`. It serves as\n * alternative token to the actual `MatChipAvatar` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst MAT_CHIP_AVATAR = new InjectionToken('MatChipAvatar');\n/**\n * Injection token that can be used to reference instances of `MatChipTrailingIcon`. It serves as\n * alternative token to the actual `MatChipTrailingIcon` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst MAT_CHIP_TRAILING_ICON = new InjectionToken('MatChipTrailingIcon');\n// Boilerplate for applying mixins to MatChip.\n/** @docs-private */\nclass MatChipBase {\n constructor(_elementRef) {\n this._elementRef = _elementRef;\n }\n}\nconst _MatChipMixinBase = mixinTabIndex(mixinColor(mixinDisableRipple(MatChipBase), 'primary'), -1);\n/**\n * Dummy directive to add CSS class to chip avatar.\n * @docs-private\n */\nclass MatChipAvatar {\n}\nMatChipAvatar.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatChipAvatar, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nMatChipAvatar.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatChipAvatar, selector: \"mat-chip-avatar, [matChipAvatar]\", host: { classAttribute: \"mat-chip-avatar\" }, providers: [{ provide: MAT_CHIP_AVATAR, useExisting: MatChipAvatar }], ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatChipAvatar, decorators: [{\n type: Directive,\n args: [{\n selector: 'mat-chip-avatar, [matChipAvatar]',\n host: { 'class': 'mat-chip-avatar' },\n providers: [{ provide: MAT_CHIP_AVATAR, useExisting: MatChipAvatar }],\n }]\n }] });\n/**\n * Dummy directive to add CSS class to chip trailing icon.\n * @docs-private\n */\nclass MatChipTrailingIcon {\n}\nMatChipTrailingIcon.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatChipTrailingIcon, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nMatChipTrailingIcon.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatChipTrailingIcon, selector: \"mat-chip-trailing-icon, [matChipTrailingIcon]\", host: { classAttribute: \"mat-chip-trailing-icon\" }, providers: [{ provide: MAT_CHIP_TRAILING_ICON, useExisting: MatChipTrailingIcon }], ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatChipTrailingIcon, decorators: [{\n type: Directive,\n args: [{\n selector: 'mat-chip-trailing-icon, [matChipTrailingIcon]',\n host: { 'class': 'mat-chip-trailing-icon' },\n providers: [{ provide: MAT_CHIP_TRAILING_ICON, useExisting: MatChipTrailingIcon }],\n }]\n }] });\n/** Material Design styled chip directive. Used inside the MatChipList component. */\nclass MatChip extends _MatChipMixinBase {\n constructor(elementRef, _ngZone, platform, globalRippleOptions, _changeDetectorRef, _document, animationMode, tabIndex) {\n super(elementRef);\n this._ngZone = _ngZone;\n this._changeDetectorRef = _changeDetectorRef;\n /** Whether the chip has focus. */\n this._hasFocus = false;\n /** Whether the chip list is selectable */\n this.chipListSelectable = true;\n /** Whether the chip list is in multi-selection mode. */\n this._chipListMultiple = false;\n /** Whether the chip list as a whole is disabled. */\n this._chipListDisabled = false;\n /** ARIA role that should be applied to the chip. */\n this.role = 'option';\n this._selected = false;\n this._selectable = true;\n this._disabled = false;\n this._removable = true;\n /** Emits when the chip is focused. */\n this._onFocus = new Subject();\n /** Emits when the chip is blurred. */\n this._onBlur = new Subject();\n /** Emitted when the chip is selected or deselected. */\n this.selectionChange = new EventEmitter();\n /** Emitted when the chip is destroyed. */\n this.destroyed = new EventEmitter();\n /** Emitted when a chip is to be removed. */\n this.removed = new EventEmitter();\n this._addHostClassName();\n // Dynamically create the ripple target, append it within the chip, and use it as the\n // chip's ripple target. Adding the class '.mat-chip-ripple' ensures that it will have\n // the proper styles.\n this._chipRippleTarget = _document.createElement('div');\n this._chipRippleTarget.classList.add('mat-chip-ripple');\n this._elementRef.nativeElement.appendChild(this._chipRippleTarget);\n this._chipRipple = new RippleRenderer(this, _ngZone, this._chipRippleTarget, platform);\n this._chipRipple.setupTriggerEvents(elementRef);\n this.rippleConfig = globalRippleOptions || {};\n this._animationsDisabled = animationMode === 'NoopAnimations';\n this.tabIndex = tabIndex != null ? parseInt(tabIndex) || -1 : -1;\n }\n /**\n * Whether ripples are disabled on interaction\n * @docs-private\n */\n get rippleDisabled() {\n return (this.disabled ||\n this.disableRipple ||\n this._animationsDisabled ||\n !!this.rippleConfig.disabled);\n }\n /** Whether the chip is selected. */\n get selected() {\n return this._selected;\n }\n set selected(value) {\n const coercedValue = coerceBooleanProperty(value);\n if (coercedValue !== this._selected) {\n this._selected = coercedValue;\n this._dispatchSelectionChange();\n }\n }\n /** The value of the chip. Defaults to the content inside `` tags. */\n get value() {\n return this._value !== undefined ? this._value : this._elementRef.nativeElement.textContent;\n }\n set value(value) {\n this._value = value;\n }\n /**\n * Whether or not the chip is selectable. When a chip is not selectable,\n * changes to its selected state are always ignored. By default a chip is\n * selectable, and it becomes non-selectable if its parent chip list is\n * not selectable.\n */\n get selectable() {\n return this._selectable && this.chipListSelectable;\n }\n set selectable(value) {\n this._selectable = coerceBooleanProperty(value);\n }\n /** Whether the chip is disabled. */\n get disabled() {\n return this._chipListDisabled || this._disabled;\n }\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n }\n /**\n * Determines whether or not the chip displays the remove styling and emits (removed) events.\n */\n get removable() {\n return this._removable;\n }\n set removable(value) {\n this._removable = coerceBooleanProperty(value);\n }\n /** The ARIA selected applied to the chip. */\n get ariaSelected() {\n // Remove the `aria-selected` when the chip is deselected in single-selection mode, because\n // it adds noise to NVDA users where \"not selected\" will be read out for each chip.\n return this.selectable && (this._chipListMultiple || this.selected)\n ? this.selected.toString()\n : null;\n }\n _addHostClassName() {\n const basicChipAttrName = 'mat-basic-chip';\n const element = this._elementRef.nativeElement;\n if (element.hasAttribute(basicChipAttrName) ||\n element.tagName.toLowerCase() === basicChipAttrName) {\n element.classList.add(basicChipAttrName);\n return;\n }\n else {\n element.classList.add('mat-standard-chip');\n }\n }\n ngOnDestroy() {\n this.destroyed.emit({ chip: this });\n this._chipRipple._removeTriggerEvents();\n }\n /** Selects the chip. */\n select() {\n if (!this._selected) {\n this._selected = true;\n this._dispatchSelectionChange();\n this._changeDetectorRef.markForCheck();\n }\n }\n /** Deselects the chip. */\n deselect() {\n if (this._selected) {\n this._selected = false;\n this._dispatchSelectionChange();\n this._changeDetectorRef.markForCheck();\n }\n }\n /** Select this chip and emit selected event */\n selectViaInteraction() {\n if (!this._selected) {\n this._selected = true;\n this._dispatchSelectionChange(true);\n this._changeDetectorRef.markForCheck();\n }\n }\n /** Toggles the current selected state of this chip. */\n toggleSelected(isUserInput = false) {\n this._selected = !this.selected;\n this._dispatchSelectionChange(isUserInput);\n this._changeDetectorRef.markForCheck();\n return this.selected;\n }\n /** Allows for programmatic focusing of the chip. */\n focus() {\n if (!this._hasFocus) {\n this._elementRef.nativeElement.focus();\n this._onFocus.next({ chip: this });\n }\n this._hasFocus = true;\n }\n /**\n * Allows for programmatic removal of the chip. Called by the MatChipList when the DELETE or\n * BACKSPACE keys are pressed.\n *\n * Informs any listeners of the removal request. Does not remove the chip from the DOM.\n */\n remove() {\n if (this.removable) {\n this.removed.emit({ chip: this });\n }\n }\n /** Handles click events on the chip. */\n _handleClick(event) {\n if (this.disabled) {\n event.preventDefault();\n }\n }\n /** Handle custom key presses. */\n _handleKeydown(event) {\n if (this.disabled) {\n return;\n }\n switch (event.keyCode) {\n case DELETE:\n case BACKSPACE:\n // If we are removable, remove the focused chip\n this.remove();\n // Always prevent so page navigation does not occur\n event.preventDefault();\n break;\n case SPACE:\n // If we are selectable, toggle the focused chip\n if (this.selectable) {\n this.toggleSelected(true);\n }\n // Always prevent space from scrolling the page since the list has focus\n event.preventDefault();\n break;\n }\n }\n _blur() {\n // When animations are enabled, Angular may end up removing the chip from the DOM a little\n // earlier than usual, causing it to be blurred and throwing off the logic in the chip list\n // that moves focus not the next item. To work around the issue, we defer marking the chip\n // as not focused until the next time the zone stabilizes.\n this._ngZone.onStable.pipe(take(1)).subscribe(() => {\n this._ngZone.run(() => {\n this._hasFocus = false;\n this._onBlur.next({ chip: this });\n });\n });\n }\n _dispatchSelectionChange(isUserInput = false) {\n this.selectionChange.emit({\n source: this,\n isUserInput,\n selected: this._selected,\n });\n }\n}\nMatChip.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatChip, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i1.Platform }, { token: MAT_RIPPLE_GLOBAL_OPTIONS, optional: true }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }, { token: ANIMATION_MODULE_TYPE, optional: true }, { token: 'tabindex', attribute: true }], target: i0.ɵɵFactoryTarget.Directive });\nMatChip.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatChip, selector: \"mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]\", inputs: { color: \"color\", disableRipple: \"disableRipple\", tabIndex: \"tabIndex\", role: \"role\", selected: \"selected\", value: \"value\", selectable: \"selectable\", disabled: \"disabled\", removable: \"removable\" }, outputs: { selectionChange: \"selectionChange\", destroyed: \"destroyed\", removed: \"removed\" }, host: { listeners: { \"click\": \"_handleClick($event)\", \"keydown\": \"_handleKeydown($event)\", \"focus\": \"focus()\", \"blur\": \"_blur()\" }, properties: { \"attr.tabindex\": \"disabled ? null : tabIndex\", \"attr.role\": \"role\", \"class.mat-chip-selected\": \"selected\", \"class.mat-chip-with-avatar\": \"avatar\", \"class.mat-chip-with-trailing-icon\": \"trailingIcon || removeIcon\", \"class.mat-chip-disabled\": \"disabled\", \"class._mat-animation-noopable\": \"_animationsDisabled\", \"attr.disabled\": \"disabled || null\", \"attr.aria-disabled\": \"disabled.toString()\", \"attr.aria-selected\": \"ariaSelected\" }, classAttribute: \"mat-chip mat-focus-indicator\" }, queries: [{ propertyName: \"avatar\", first: true, predicate: MAT_CHIP_AVATAR, descendants: true }, { propertyName: \"trailingIcon\", first: true, predicate: MAT_CHIP_TRAILING_ICON, descendants: true }, { propertyName: \"removeIcon\", first: true, predicate: MAT_CHIP_REMOVE, descendants: true }], exportAs: [\"matChip\"], usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatChip, decorators: [{\n type: Directive,\n args: [{\n selector: `mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]`,\n inputs: ['color', 'disableRipple', 'tabIndex'],\n exportAs: 'matChip',\n host: {\n 'class': 'mat-chip mat-focus-indicator',\n '[attr.tabindex]': 'disabled ? null : tabIndex',\n '[attr.role]': 'role',\n '[class.mat-chip-selected]': 'selected',\n '[class.mat-chip-with-avatar]': 'avatar',\n '[class.mat-chip-with-trailing-icon]': 'trailingIcon || removeIcon',\n '[class.mat-chip-disabled]': 'disabled',\n '[class._mat-animation-noopable]': '_animationsDisabled',\n '[attr.disabled]': 'disabled || null',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[attr.aria-selected]': 'ariaSelected',\n '(click)': '_handleClick($event)',\n '(keydown)': '_handleKeydown($event)',\n '(focus)': 'focus()',\n '(blur)': '_blur()',\n },\n }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i1.Platform }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_RIPPLE_GLOBAL_OPTIONS]\n }] }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }, { type: undefined, decorators: [{\n type: Attribute,\n args: ['tabindex']\n }] }]; }, propDecorators: { avatar: [{\n type: ContentChild,\n args: [MAT_CHIP_AVATAR]\n }], trailingIcon: [{\n type: ContentChild,\n args: [MAT_CHIP_TRAILING_ICON]\n }], removeIcon: [{\n type: ContentChild,\n args: [MAT_CHIP_REMOVE]\n }], role: [{\n type: Input\n }], selected: [{\n type: Input\n }], value: [{\n type: Input\n }], selectable: [{\n type: Input\n }], disabled: [{\n type: Input\n }], removable: [{\n type: Input\n }], selectionChange: [{\n type: Output\n }], destroyed: [{\n type: Output\n }], removed: [{\n type: Output\n }] } });\n/**\n * Applies proper (click) support and adds styling for use with the Material Design \"cancel\" icon\n * available at https://material.io/icons/#ic_cancel.\n *\n * Example:\n *\n * `\n * cancel\n * `\n *\n * You *may* use a custom icon, but you may need to override the `mat-chip-remove` positioning\n * styles to properly center the icon within the chip.\n */\nclass MatChipRemove {\n constructor(_parentChip, elementRef) {\n this._parentChip = _parentChip;\n if (elementRef.nativeElement.nodeName === 'BUTTON') {\n elementRef.nativeElement.setAttribute('type', 'button');\n }\n }\n /** Calls the parent chip's public `remove()` method if applicable. */\n _handleClick(event) {\n const parentChip = this._parentChip;\n if (parentChip.removable && !parentChip.disabled) {\n parentChip.remove();\n }\n // We need to stop event propagation because otherwise the event will bubble up to the\n // form field and cause the `onContainerClick` method to be invoked. This method would then\n // reset the focused chip that has been focused after chip removal. Usually the parent\n // the parent click listener of the `MatChip` would prevent propagation, but it can happen\n // that the chip is being removed before the event bubbles up.\n event.stopPropagation();\n event.preventDefault();\n }\n}\nMatChipRemove.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatChipRemove, deps: [{ token: MatChip }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });\nMatChipRemove.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatChipRemove, selector: \"[matChipRemove]\", host: { listeners: { \"click\": \"_handleClick($event)\" }, classAttribute: \"mat-chip-remove mat-chip-trailing-icon\" }, providers: [{ provide: MAT_CHIP_REMOVE, useExisting: MatChipRemove }], ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatChipRemove, decorators: [{\n type: Directive,\n args: [{\n selector: '[matChipRemove]',\n host: {\n 'class': 'mat-chip-remove mat-chip-trailing-icon',\n '(click)': '_handleClick($event)',\n },\n providers: [{ provide: MAT_CHIP_REMOVE, useExisting: MatChipRemove }],\n }]\n }], ctorParameters: function () { return [{ type: MatChip }, { type: i0.ElementRef }]; } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Injection token to be used to override the default options for the chips module. */\nconst MAT_CHIPS_DEFAULT_OPTIONS = new InjectionToken('mat-chips-default-options');\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n// Boilerplate for applying mixins to MatChipList.\n/** @docs-private */\nconst _MatChipListBase = mixinErrorState(class {\n constructor(_defaultErrorStateMatcher, _parentForm, _parentFormGroup, \n /**\n * Form control bound to the component.\n * Implemented as part of `MatFormFieldControl`.\n * @docs-private\n */\n ngControl) {\n this._defaultErrorStateMatcher = _defaultErrorStateMatcher;\n this._parentForm = _parentForm;\n this._parentFormGroup = _parentFormGroup;\n this.ngControl = ngControl;\n /**\n * Emits whenever the component state changes and should cause the parent\n * form-field to update. Implemented as part of `MatFormFieldControl`.\n * @docs-private\n */\n this.stateChanges = new Subject();\n }\n});\n// Increasing integer for generating unique ids for chip-list components.\nlet nextUniqueId$1 = 0;\n/** Change event object that is emitted when the chip list value has changed. */\nclass MatChipListChange {\n constructor(\n /** Chip list that emitted the event. */\n source, \n /** Value of the chip list when the event was emitted. */\n value) {\n this.source = source;\n this.value = value;\n }\n}\n/**\n * A material design chips component (named ChipList for its similarity to the List component).\n */\nclass MatChipList extends _MatChipListBase {\n constructor(_elementRef, _changeDetectorRef, _dir, _parentForm, _parentFormGroup, _defaultErrorStateMatcher, ngControl) {\n super(_defaultErrorStateMatcher, _parentForm, _parentFormGroup, ngControl);\n this._elementRef = _elementRef;\n this._changeDetectorRef = _changeDetectorRef;\n this._dir = _dir;\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n this.controlType = 'mat-chip-list';\n /**\n * When a chip is destroyed, we store the index of the destroyed chip until the chips\n * query list notifies about the update. This is necessary because we cannot determine an\n * appropriate chip that should receive focus until the array of chips updated completely.\n */\n this._lastDestroyedChipIndex = null;\n /** Subject that emits when the component has been destroyed. */\n this._destroyed = new Subject();\n /** Uid of the chip list */\n this._uid = `mat-chip-list-${nextUniqueId$1++}`;\n /** Tab index for the chip list. */\n this._tabIndex = 0;\n /**\n * User defined tab index.\n * When it is not null, use user defined tab index. Otherwise use _tabIndex\n */\n this._userTabIndex = null;\n /** Function when touched */\n this._onTouched = () => { };\n /** Function when changed */\n this._onChange = () => { };\n this._multiple = false;\n this._compareWith = (o1, o2) => o1 === o2;\n this._disabled = false;\n /** Orientation of the chip list. */\n this.ariaOrientation = 'horizontal';\n this._selectable = true;\n /** Event emitted when the selected chip list value has been changed by the user. */\n this.change = new EventEmitter();\n /**\n * Event that emits whenever the raw value of the chip-list changes. This is here primarily\n * to facilitate the two-way binding for the `value` input.\n * @docs-private\n */\n this.valueChange = new EventEmitter();\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n /** The array of selected chips inside chip list. */\n get selected() {\n return this.multiple ? this._selectionModel?.selected || [] : this._selectionModel?.selected[0];\n }\n /** The ARIA role applied to the chip list. */\n get role() {\n if (this._explicitRole) {\n return this._explicitRole;\n }\n return this.empty ? null : 'listbox';\n }\n set role(role) {\n this._explicitRole = role;\n }\n /** Whether the user should be allowed to select multiple chips. */\n get multiple() {\n return this._multiple;\n }\n set multiple(value) {\n this._multiple = coerceBooleanProperty(value);\n this._syncChipsState();\n }\n /**\n * A function to compare the option values with the selected values. The first argument\n * is a value from an option. The second is a value from the selection. A boolean\n * should be returned.\n */\n get compareWith() {\n return this._compareWith;\n }\n set compareWith(fn) {\n this._compareWith = fn;\n if (this._selectionModel) {\n // A different comparator means the selection could change.\n this._initializeSelection();\n }\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get value() {\n return this._value;\n }\n set value(value) {\n this.writeValue(value);\n this._value = value;\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get id() {\n return this._chipInput ? this._chipInput.id : 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 this.stateChanges.next();\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get placeholder() {\n return this._chipInput ? this._chipInput.placeholder : this._placeholder;\n }\n set placeholder(value) {\n this._placeholder = value;\n this.stateChanges.next();\n }\n /** Whether any chips or the matChipInput inside of this chip-list has focus. */\n get focused() {\n return (this._chipInput && this._chipInput.focused) || this._hasFocusedChip();\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get empty() {\n return (!this._chipInput || this._chipInput.empty) && (!this.chips || this.chips.length === 0);\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get shouldLabelFloat() {\n return !this.empty || this.focused;\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get disabled() {\n return this.ngControl ? !!this.ngControl.disabled : this._disabled;\n }\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n this._syncChipsState();\n }\n /**\n * Whether or not this chip list is selectable. When a chip list is not selectable,\n * the selected states for all the chips inside the chip list are always ignored.\n */\n get selectable() {\n return this._selectable;\n }\n set selectable(value) {\n this._selectable = coerceBooleanProperty(value);\n this._syncChipsState();\n }\n set tabIndex(value) {\n this._userTabIndex = value;\n this._tabIndex = value;\n }\n /** Combined stream of all of the child chips' selection change events. */\n get chipSelectionChanges() {\n return merge(...this.chips.map(chip => chip.selectionChange));\n }\n /** Combined stream of all of the child chips' focus change events. */\n get chipFocusChanges() {\n return merge(...this.chips.map(chip => chip._onFocus));\n }\n /** Combined stream of all of the child chips' blur change events. */\n get chipBlurChanges() {\n return merge(...this.chips.map(chip => chip._onBlur));\n }\n /** Combined stream of all of the child chips' remove change events. */\n get chipRemoveChanges() {\n return merge(...this.chips.map(chip => chip.destroyed));\n }\n ngAfterContentInit() {\n this._keyManager = new FocusKeyManager(this.chips)\n .withWrap()\n .withVerticalOrientation()\n .withHomeAndEnd()\n .withHorizontalOrientation(this._dir ? this._dir.value : 'ltr');\n if (this._dir) {\n this._dir.change\n .pipe(takeUntil(this._destroyed))\n .subscribe(dir => this._keyManager.withHorizontalOrientation(dir));\n }\n this._keyManager.tabOut.pipe(takeUntil(this._destroyed)).subscribe(() => {\n this._allowFocusEscape();\n });\n // When the list changes, re-subscribe\n this.chips.changes.pipe(startWith(null), takeUntil(this._destroyed)).subscribe(() => {\n if (this.disabled || !this.selectable) {\n // Since this happens after the content has been\n // checked, we need to defer it to the next tick.\n Promise.resolve().then(() => {\n this._syncChipsState();\n });\n }\n this._resetChips();\n // Reset chips selected/deselected status\n this._initializeSelection();\n // Check to see if we need to update our tab index\n this._updateTabIndex();\n // Check to see if we have a destroyed chip and need to refocus\n this._updateFocusForDestroyedChips();\n this.stateChanges.next();\n });\n }\n ngOnInit() {\n this._selectionModel = new SelectionModel(this.multiple, undefined, false);\n this.stateChanges.next();\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 if (this.ngControl.disabled !== this._disabled) {\n this.disabled = !!this.ngControl.disabled;\n }\n }\n }\n ngOnDestroy() {\n this._destroyed.next();\n this._destroyed.complete();\n this.stateChanges.complete();\n this._dropSubscriptions();\n }\n /** Associates an HTML input element with this chip list. */\n registerInput(inputElement) {\n this._chipInput = inputElement;\n // We use this attribute to match the chip list to its input in test harnesses.\n // Set the attribute directly here to avoid \"changed after checked\" errors.\n this._elementRef.nativeElement.setAttribute('data-mat-chip-input', inputElement.id);\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 }\n else {\n this._elementRef.nativeElement.removeAttribute('aria-describedby');\n }\n }\n // Implemented as part of ControlValueAccessor.\n writeValue(value) {\n if (this.chips) {\n this._setSelectionByValue(value, false);\n }\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.disabled = isDisabled;\n this.stateChanges.next();\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n onContainerClick(event) {\n if (!this._originatesFromChip(event)) {\n this.focus();\n }\n }\n /**\n * Focuses the first non-disabled chip in this chip list, or the associated input when there\n * are no eligible chips.\n */\n focus(options) {\n if (this.disabled) {\n return;\n }\n // TODO: ARIA says this should focus the first `selected` chip if any are selected.\n // Focus on first element if there's no chipInput inside chip-list\n if (this._chipInput && this._chipInput.focused) {\n // do nothing\n }\n else if (this.chips.length > 0) {\n this._keyManager.setFirstItemActive();\n this.stateChanges.next();\n }\n else {\n this._focusInput(options);\n this.stateChanges.next();\n }\n }\n /** Attempt to focus an input if we have one. */\n _focusInput(options) {\n if (this._chipInput) {\n this._chipInput.focus(options);\n }\n }\n /**\n * Pass events to the keyboard manager. Available here for tests.\n */\n _keydown(event) {\n const target = event.target;\n if (target && target.classList.contains('mat-chip')) {\n this._keyManager.onKeydown(event);\n this.stateChanges.next();\n }\n }\n /**\n * Check the tab index as you should not be allowed to focus an empty list.\n */\n _updateTabIndex() {\n // If we have 0 chips, we should not allow keyboard focus\n this._tabIndex = this._userTabIndex || (this.chips.length === 0 ? -1 : 0);\n }\n /**\n * If the amount of chips changed, we need to update the\n * key manager state and focus the next closest chip.\n */\n _updateFocusForDestroyedChips() {\n // Move focus to the closest chip. If no other chips remain, focus the chip-list itself.\n if (this._lastDestroyedChipIndex != null) {\n if (this.chips.length) {\n const newChipIndex = Math.min(this._lastDestroyedChipIndex, this.chips.length - 1);\n this._keyManager.setActiveItem(newChipIndex);\n }\n else {\n this.focus();\n }\n }\n this._lastDestroyedChipIndex = null;\n }\n /**\n * Utility to ensure all indexes are valid.\n *\n * @param index The index to be checked.\n * @returns True if the index is valid for our list of chips.\n */\n _isValidIndex(index) {\n return index >= 0 && index < this.chips.length;\n }\n _setSelectionByValue(value, isUserInput = true) {\n this._clearSelection();\n this.chips.forEach(chip => chip.deselect());\n if (Array.isArray(value)) {\n value.forEach(currentValue => this._selectValue(currentValue, isUserInput));\n this._sortValues();\n }\n else {\n const correspondingChip = this._selectValue(value, isUserInput);\n // Shift focus to the active item. Note that we shouldn't do this in multiple\n // mode, because we don't know what chip the user interacted with last.\n if (correspondingChip) {\n if (isUserInput) {\n this._keyManager.setActiveItem(correspondingChip);\n }\n }\n }\n }\n /**\n * Finds and selects the chip based on its value.\n * @returns Chip that has the corresponding value.\n */\n _selectValue(value, isUserInput = true) {\n const correspondingChip = this.chips.find(chip => {\n return chip.value != null && this._compareWith(chip.value, value);\n });\n if (correspondingChip) {\n isUserInput ? correspondingChip.selectViaInteraction() : correspondingChip.select();\n this._selectionModel.select(correspondingChip);\n }\n return correspondingChip;\n }\n _initializeSelection() {\n // Defer setting the value in order to avoid the \"Expression\n // has changed after it was checked\" errors from Angular.\n Promise.resolve().then(() => {\n if (this.ngControl || this._value) {\n this._setSelectionByValue(this.ngControl ? this.ngControl.value : this._value, false);\n this.stateChanges.next();\n }\n });\n }\n /**\n * Deselects every chip in the list.\n * @param skip Chip that should not be deselected.\n */\n _clearSelection(skip) {\n this._selectionModel.clear();\n this.chips.forEach(chip => {\n if (chip !== skip) {\n chip.deselect();\n }\n });\n this.stateChanges.next();\n }\n /**\n * Sorts the model values, ensuring that they keep the same\n * order that they have in the panel.\n */\n _sortValues() {\n if (this._multiple) {\n this._selectionModel.clear();\n this.chips.forEach(chip => {\n if (chip.selected) {\n this._selectionModel.select(chip);\n }\n });\n this.stateChanges.next();\n }\n }\n /** Emits change event to set the model value. */\n _propagateChanges(fallbackValue) {\n let valueToEmit = null;\n if (Array.isArray(this.selected)) {\n valueToEmit = this.selected.map(chip => chip.value);\n }\n else {\n valueToEmit = this.selected ? this.selected.value : fallbackValue;\n }\n this._value = valueToEmit;\n this.change.emit(new MatChipListChange(this, valueToEmit));\n this.valueChange.emit(valueToEmit);\n this._onChange(valueToEmit);\n this._changeDetectorRef.markForCheck();\n }\n /** When blurred, mark the field as touched when focus moved outside the chip list. */\n _blur() {\n if (!this._hasFocusedChip()) {\n this._keyManager.setActiveItem(-1);\n }\n if (!this.disabled) {\n if (this._chipInput) {\n // If there's a chip input, we should check whether the focus moved to chip input.\n // If the focus is not moved to chip input, mark the field as touched. If the focus moved\n // to chip input, do nothing.\n // Timeout is needed to wait for the focus() event trigger on chip input.\n setTimeout(() => {\n if (!this.focused) {\n this._markAsTouched();\n }\n });\n }\n else {\n // If there's no chip input, then mark the field as touched.\n this._markAsTouched();\n }\n }\n }\n /** Mark the field as touched */\n _markAsTouched() {\n this._onTouched();\n this._changeDetectorRef.markForCheck();\n this.stateChanges.next();\n }\n /**\n * Removes the `tabindex` from the chip list and resets it back afterwards, allowing the\n * user to tab out of it. This prevents the list from capturing focus and redirecting\n * it back to the first chip, creating a focus trap, if it user tries to tab away.\n */\n _allowFocusEscape() {\n if (this._tabIndex !== -1) {\n this._tabIndex = -1;\n setTimeout(() => {\n this._tabIndex = this._userTabIndex || 0;\n this._changeDetectorRef.markForCheck();\n });\n }\n }\n _resetChips() {\n this._dropSubscriptions();\n this._listenToChipsFocus();\n this._listenToChipsSelection();\n this._listenToChipsRemoved();\n }\n _dropSubscriptions() {\n if (this._chipFocusSubscription) {\n this._chipFocusSubscription.unsubscribe();\n this._chipFocusSubscription = null;\n }\n if (this._chipBlurSubscription) {\n this._chipBlurSubscription.unsubscribe();\n this._chipBlurSubscription = null;\n }\n if (this._chipSelectionSubscription) {\n this._chipSelectionSubscription.unsubscribe();\n this._chipSelectionSubscription = null;\n }\n if (this._chipRemoveSubscription) {\n this._chipRemoveSubscription.unsubscribe();\n this._chipRemoveSubscription = null;\n }\n }\n /** Listens to user-generated selection events on each chip. */\n _listenToChipsSelection() {\n this._chipSelectionSubscription = this.chipSelectionChanges.subscribe(event => {\n event.source.selected\n ? this._selectionModel.select(event.source)\n : this._selectionModel.deselect(event.source);\n // For single selection chip list, make sure the deselected value is unselected.\n if (!this.multiple) {\n this.chips.forEach(chip => {\n if (!this._selectionModel.isSelected(chip) && chip.selected) {\n chip.deselect();\n }\n });\n }\n if (event.isUserInput) {\n this._propagateChanges();\n }\n });\n }\n /** Listens to user-generated selection events on each chip. */\n _listenToChipsFocus() {\n this._chipFocusSubscription = this.chipFocusChanges.subscribe(event => {\n let chipIndex = this.chips.toArray().indexOf(event.chip);\n if (this._isValidIndex(chipIndex)) {\n this._keyManager.updateActiveItem(chipIndex);\n }\n this.stateChanges.next();\n });\n this._chipBlurSubscription = this.chipBlurChanges.subscribe(() => {\n this._blur();\n this.stateChanges.next();\n });\n }\n _listenToChipsRemoved() {\n this._chipRemoveSubscription = this.chipRemoveChanges.subscribe(event => {\n const chip = event.chip;\n const chipIndex = this.chips.toArray().indexOf(event.chip);\n // In case the chip that will be removed is currently focused, we temporarily store\n // the index in order to be able to determine an appropriate sibling chip that will\n // receive focus.\n if (this._isValidIndex(chipIndex) && chip._hasFocus) {\n this._lastDestroyedChipIndex = chipIndex;\n }\n });\n }\n /** Checks whether an event comes from inside a chip element. */\n _originatesFromChip(event) {\n let currentElement = event.target;\n while (currentElement && currentElement !== this._elementRef.nativeElement) {\n if (currentElement.classList.contains('mat-chip')) {\n return true;\n }\n currentElement = currentElement.parentElement;\n }\n return false;\n }\n /** Checks whether any of the chips is focused. */\n _hasFocusedChip() {\n return this.chips && this.chips.some(chip => chip._hasFocus);\n }\n /** Syncs the list's state with the individual chips. */\n _syncChipsState() {\n if (this.chips) {\n this.chips.forEach(chip => {\n chip._chipListDisabled = this._disabled;\n chip._chipListMultiple = this.multiple;\n chip.chipListSelectable = this._selectable;\n });\n }\n }\n}\nMatChipList.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatChipList, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1$1.Directionality, optional: true }, { token: i2.NgForm, optional: true }, { token: i2.FormGroupDirective, optional: true }, { token: i3.ErrorStateMatcher }, { token: i2.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component });\nMatChipList.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatChipList, selector: \"mat-chip-list\", inputs: { role: \"role\", userAriaDescribedBy: [\"aria-describedby\", \"userAriaDescribedBy\"], errorStateMatcher: \"errorStateMatcher\", multiple: \"multiple\", compareWith: \"compareWith\", value: \"value\", required: \"required\", placeholder: \"placeholder\", disabled: \"disabled\", ariaOrientation: [\"aria-orientation\", \"ariaOrientation\"], selectable: \"selectable\", tabIndex: \"tabIndex\" }, outputs: { change: \"change\", valueChange: \"valueChange\" }, host: { listeners: { \"focus\": \"focus()\", \"blur\": \"_blur()\", \"keydown\": \"_keydown($event)\" }, properties: { \"attr.tabindex\": \"disabled ? null : _tabIndex\", \"attr.aria-required\": \"role ? required : null\", \"attr.aria-disabled\": \"disabled.toString()\", \"attr.aria-invalid\": \"errorState\", \"attr.aria-multiselectable\": \"multiple\", \"attr.role\": \"role\", \"class.mat-chip-list-disabled\": \"disabled\", \"class.mat-chip-list-invalid\": \"errorState\", \"class.mat-chip-list-required\": \"required\", \"attr.aria-orientation\": \"ariaOrientation\", \"id\": \"_uid\" }, classAttribute: \"mat-chip-list\" }, providers: [{ provide: MatFormFieldControl, useExisting: MatChipList }], queries: [{ propertyName: \"chips\", predicate: MatChip, descendants: true }], exportAs: [\"matChipList\"], usesInheritance: true, ngImport: i0, template: `
`, isInline: true, styles: [\".mat-chip{position:relative;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0);border:none;-webkit-appearance:none;-moz-appearance:none}.mat-chip::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px) * -1)}.mat-standard-chip{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);display:inline-flex;padding:7px 12px;border-radius:16px;align-items:center;cursor:default;min-height:32px;height:1px}.mat-standard-chip._mat-animation-noopable{transition:none !important;animation:none !important}.mat-standard-chip .mat-chip-remove{border:none;-webkit-appearance:none;-moz-appearance:none;padding:0;background:none}.mat-standard-chip .mat-chip-remove.mat-icon,.mat-standard-chip .mat-chip-remove .mat-icon{width:18px;height:18px;font-size:18px}.mat-standard-chip::after{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit;opacity:0;content:\\\"\\\";pointer-events:none;transition:opacity 200ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-standard-chip:hover::after{opacity:.12}.mat-standard-chip:focus{outline:none}.mat-standard-chip:focus::after{opacity:.16}.cdk-high-contrast-active .mat-standard-chip{outline:solid 1px}.cdk-high-contrast-active .mat-standard-chip.mat-chip-selected{outline-width:3px}.mat-standard-chip.mat-chip-disabled::after{opacity:0}.mat-standard-chip.mat-chip-disabled .mat-chip-remove,.mat-standard-chip.mat-chip-disabled .mat-chip-trailing-icon{cursor:default}.mat-standard-chip.mat-chip-with-trailing-icon.mat-chip-with-avatar,.mat-standard-chip.mat-chip-with-avatar{padding-top:0;padding-bottom:0}.mat-standard-chip.mat-chip-with-trailing-icon.mat-chip-with-avatar{padding-right:8px;padding-left:0}[dir=rtl] .mat-standard-chip.mat-chip-with-trailing-icon.mat-chip-with-avatar{padding-left:8px;padding-right:0}.mat-standard-chip.mat-chip-with-trailing-icon{padding-top:7px;padding-bottom:7px;padding-right:8px;padding-left:12px}[dir=rtl] .mat-standard-chip.mat-chip-with-trailing-icon{padding-left:8px;padding-right:12px}.mat-standard-chip.mat-chip-with-avatar{padding-left:0;padding-right:12px}[dir=rtl] .mat-standard-chip.mat-chip-with-avatar{padding-right:0;padding-left:12px}.mat-standard-chip .mat-chip-avatar{width:24px;height:24px;margin-right:8px;margin-left:4px}[dir=rtl] .mat-standard-chip .mat-chip-avatar{margin-left:8px;margin-right:4px}.mat-standard-chip .mat-chip-remove,.mat-standard-chip .mat-chip-trailing-icon{width:18px;height:18px;cursor:pointer}.mat-standard-chip .mat-chip-remove,.mat-standard-chip .mat-chip-trailing-icon{margin-left:8px;margin-right:0}[dir=rtl] .mat-standard-chip .mat-chip-remove,[dir=rtl] .mat-standard-chip .mat-chip-trailing-icon{margin-right:8px;margin-left:0}.mat-chip-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit;overflow:hidden;transform:translateZ(0)}.mat-chip-list-wrapper{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;margin:-4px}.mat-chip-list-wrapper input.mat-input-element,.mat-chip-list-wrapper .mat-standard-chip{margin:4px}.mat-chip-list-stacked .mat-chip-list-wrapper{flex-direction:column;align-items:flex-start}.mat-chip-list-stacked .mat-chip-list-wrapper .mat-standard-chip{width:100%}.mat-chip-avatar{border-radius:50%;justify-content:center;align-items:center;display:flex;overflow:hidden;object-fit:cover}input.mat-chip-input{width:150px;margin:4px;flex:1 0 150px}\"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatChipList, decorators: [{\n type: Component,\n args: [{ selector: 'mat-chip-list', template: `
`, exportAs: 'matChipList', host: {\n '[attr.tabindex]': 'disabled ? null : _tabIndex',\n '[attr.aria-required]': 'role ? required : null',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[attr.aria-invalid]': 'errorState',\n '[attr.aria-multiselectable]': 'multiple',\n '[attr.role]': 'role',\n '[class.mat-chip-list-disabled]': 'disabled',\n '[class.mat-chip-list-invalid]': 'errorState',\n '[class.mat-chip-list-required]': 'required',\n '[attr.aria-orientation]': 'ariaOrientation',\n 'class': 'mat-chip-list',\n '(focus)': 'focus()',\n '(blur)': '_blur()',\n '(keydown)': '_keydown($event)',\n '[id]': '_uid',\n }, providers: [{ provide: MatFormFieldControl, useExisting: MatChipList }], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [\".mat-chip{position:relative;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0);border:none;-webkit-appearance:none;-moz-appearance:none}.mat-chip::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px) * -1)}.mat-standard-chip{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);display:inline-flex;padding:7px 12px;border-radius:16px;align-items:center;cursor:default;min-height:32px;height:1px}.mat-standard-chip._mat-animation-noopable{transition:none !important;animation:none !important}.mat-standard-chip .mat-chip-remove{border:none;-webkit-appearance:none;-moz-appearance:none;padding:0;background:none}.mat-standard-chip .mat-chip-remove.mat-icon,.mat-standard-chip .mat-chip-remove .mat-icon{width:18px;height:18px;font-size:18px}.mat-standard-chip::after{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit;opacity:0;content:\\\"\\\";pointer-events:none;transition:opacity 200ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-standard-chip:hover::after{opacity:.12}.mat-standard-chip:focus{outline:none}.mat-standard-chip:focus::after{opacity:.16}.cdk-high-contrast-active .mat-standard-chip{outline:solid 1px}.cdk-high-contrast-active .mat-standard-chip.mat-chip-selected{outline-width:3px}.mat-standard-chip.mat-chip-disabled::after{opacity:0}.mat-standard-chip.mat-chip-disabled .mat-chip-remove,.mat-standard-chip.mat-chip-disabled .mat-chip-trailing-icon{cursor:default}.mat-standard-chip.mat-chip-with-trailing-icon.mat-chip-with-avatar,.mat-standard-chip.mat-chip-with-avatar{padding-top:0;padding-bottom:0}.mat-standard-chip.mat-chip-with-trailing-icon.mat-chip-with-avatar{padding-right:8px;padding-left:0}[dir=rtl] .mat-standard-chip.mat-chip-with-trailing-icon.mat-chip-with-avatar{padding-left:8px;padding-right:0}.mat-standard-chip.mat-chip-with-trailing-icon{padding-top:7px;padding-bottom:7px;padding-right:8px;padding-left:12px}[dir=rtl] .mat-standard-chip.mat-chip-with-trailing-icon{padding-left:8px;padding-right:12px}.mat-standard-chip.mat-chip-with-avatar{padding-left:0;padding-right:12px}[dir=rtl] .mat-standard-chip.mat-chip-with-avatar{padding-right:0;padding-left:12px}.mat-standard-chip .mat-chip-avatar{width:24px;height:24px;margin-right:8px;margin-left:4px}[dir=rtl] .mat-standard-chip .mat-chip-avatar{margin-left:8px;margin-right:4px}.mat-standard-chip .mat-chip-remove,.mat-standard-chip .mat-chip-trailing-icon{width:18px;height:18px;cursor:pointer}.mat-standard-chip .mat-chip-remove,.mat-standard-chip .mat-chip-trailing-icon{margin-left:8px;margin-right:0}[dir=rtl] .mat-standard-chip .mat-chip-remove,[dir=rtl] .mat-standard-chip .mat-chip-trailing-icon{margin-right:8px;margin-left:0}.mat-chip-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit;overflow:hidden;transform:translateZ(0)}.mat-chip-list-wrapper{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;margin:-4px}.mat-chip-list-wrapper input.mat-input-element,.mat-chip-list-wrapper .mat-standard-chip{margin:4px}.mat-chip-list-stacked .mat-chip-list-wrapper{flex-direction:column;align-items:flex-start}.mat-chip-list-stacked .mat-chip-list-wrapper .mat-standard-chip{width:100%}.mat-chip-avatar{border-radius:50%;justify-content:center;align-items:center;display:flex;overflow:hidden;object-fit:cover}input.mat-chip-input{width:150px;margin:4px;flex:1 0 150px}\"] }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1$1.Directionality, decorators: [{\n type: Optional\n }] }, { type: i2.NgForm, decorators: [{\n type: Optional\n }] }, { type: i2.FormGroupDirective, decorators: [{\n type: Optional\n }] }, { type: i3.ErrorStateMatcher }, { type: i2.NgControl, decorators: [{\n type: Optional\n }, {\n type: Self\n }] }]; }, propDecorators: { role: [{\n type: Input\n }], userAriaDescribedBy: [{\n type: Input,\n args: ['aria-describedby']\n }], errorStateMatcher: [{\n type: Input\n }], multiple: [{\n type: Input\n }], compareWith: [{\n type: Input\n }], value: [{\n type: Input\n }], required: [{\n type: Input\n }], placeholder: [{\n type: Input\n }], disabled: [{\n type: Input\n }], ariaOrientation: [{\n type: Input,\n args: ['aria-orientation']\n }], selectable: [{\n type: Input\n }], tabIndex: [{\n type: Input\n }], change: [{\n type: Output\n }], valueChange: [{\n type: Output\n }], chips: [{\n type: ContentChildren,\n args: [MatChip, {\n // We need to use `descendants: true`, because Ivy will no longer match\n // indirect descendants if it's left as false.\n descendants: true,\n }]\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n// Increasing integer for generating unique ids.\nlet nextUniqueId = 0;\n/**\n * Directive that adds chip-specific behaviors to an input element inside ``.\n * May be placed inside or outside of an ``.\n */\nclass MatChipInput {\n constructor(_elementRef, _defaultOptions) {\n this._elementRef = _elementRef;\n this._defaultOptions = _defaultOptions;\n /** Whether the control is focused. */\n this.focused = false;\n this._addOnBlur = false;\n /**\n * The list of key codes that will trigger a chipEnd event.\n *\n * Defaults to `[ENTER]`.\n */\n this.separatorKeyCodes = this._defaultOptions.separatorKeyCodes;\n /** Emitted when a chip is to be added. */\n this.chipEnd = new EventEmitter();\n /** The input's placeholder text. */\n this.placeholder = '';\n /** Unique id for the input. */\n this.id = `mat-chip-list-input-${nextUniqueId++}`;\n this._disabled = false;\n this.inputElement = this._elementRef.nativeElement;\n }\n /** Register input for chip list */\n set chipList(value) {\n if (value) {\n this._chipList = value;\n this._chipList.registerInput(this);\n }\n }\n /**\n * Whether or not the chipEnd event will be emitted when the input is blurred.\n */\n get addOnBlur() {\n return this._addOnBlur;\n }\n set addOnBlur(value) {\n this._addOnBlur = coerceBooleanProperty(value);\n }\n /** Whether the input is disabled. */\n get disabled() {\n return this._disabled || (this._chipList && this._chipList.disabled);\n }\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n }\n /** Whether the input is empty. */\n get empty() {\n return !this.inputElement.value;\n }\n ngOnChanges() {\n this._chipList.stateChanges.next();\n }\n ngOnDestroy() {\n this.chipEnd.complete();\n }\n ngAfterContentInit() {\n this._focusLastChipOnBackspace = this.empty;\n }\n /** Utility method to make host definition/tests more clear. */\n _keydown(event) {\n if (event) {\n // Allow the user's focus to escape when they're tabbing forward. Note that we don't\n // want to do this when going backwards, because focus should go back to the first chip.\n if (event.keyCode === TAB && !hasModifierKey(event, 'shiftKey')) {\n this._chipList._allowFocusEscape();\n }\n // To prevent the user from accidentally deleting chips when pressing BACKSPACE continuously,\n // We focus the last chip on backspace only after the user has released the backspace button,\n // and the input is empty (see behaviour in _keyup)\n if (event.keyCode === BACKSPACE && this._focusLastChipOnBackspace) {\n this._chipList._keyManager.setLastItemActive();\n event.preventDefault();\n return;\n }\n else {\n this._focusLastChipOnBackspace = false;\n }\n }\n this._emitChipEnd(event);\n }\n /**\n * Pass events to the keyboard manager. Available here for tests.\n */\n _keyup(event) {\n // Allow user to move focus to chips next time he presses backspace\n if (!this._focusLastChipOnBackspace && event.keyCode === BACKSPACE && this.empty) {\n this._focusLastChipOnBackspace = true;\n event.preventDefault();\n }\n }\n /** Checks to see if the blur should emit the (chipEnd) event. */\n _blur() {\n if (this.addOnBlur) {\n this._emitChipEnd();\n }\n this.focused = false;\n // Blur the chip list if it is not focused\n if (!this._chipList.focused) {\n this._chipList._blur();\n }\n this._chipList.stateChanges.next();\n }\n _focus() {\n this.focused = true;\n this._focusLastChipOnBackspace = this.empty;\n this._chipList.stateChanges.next();\n }\n /** Checks to see if the (chipEnd) event needs to be emitted. */\n _emitChipEnd(event) {\n if (!this.inputElement.value && !!event) {\n this._chipList._keydown(event);\n }\n if (!event || this._isSeparatorKey(event)) {\n this.chipEnd.emit({\n input: this.inputElement,\n value: this.inputElement.value,\n chipInput: this,\n });\n event?.preventDefault();\n }\n }\n _onInput() {\n // Let chip list know whenever the value changes.\n this._chipList.stateChanges.next();\n }\n /** Focuses the input. */\n focus(options) {\n this.inputElement.focus(options);\n }\n /** Clears the input */\n clear() {\n this.inputElement.value = '';\n this._focusLastChipOnBackspace = true;\n }\n /** Checks whether a keycode is one of the configured separators. */\n _isSeparatorKey(event) {\n return !hasModifierKey(event) && new Set(this.separatorKeyCodes).has(event.keyCode);\n }\n}\nMatChipInput.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatChipInput, deps: [{ token: i0.ElementRef }, { token: MAT_CHIPS_DEFAULT_OPTIONS }], target: i0.ɵɵFactoryTarget.Directive });\nMatChipInput.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatChipInput, selector: \"input[matChipInputFor]\", inputs: { chipList: [\"matChipInputFor\", \"chipList\"], addOnBlur: [\"matChipInputAddOnBlur\", \"addOnBlur\"], separatorKeyCodes: [\"matChipInputSeparatorKeyCodes\", \"separatorKeyCodes\"], placeholder: \"placeholder\", id: \"id\", disabled: \"disabled\" }, outputs: { chipEnd: \"matChipInputTokenEnd\" }, host: { listeners: { \"keydown\": \"_keydown($event)\", \"keyup\": \"_keyup($event)\", \"blur\": \"_blur()\", \"focus\": \"_focus()\", \"input\": \"_onInput()\" }, properties: { \"id\": \"id\", \"attr.disabled\": \"disabled || null\", \"attr.placeholder\": \"placeholder || null\", \"attr.aria-invalid\": \"_chipList && _chipList.ngControl ? _chipList.ngControl.invalid : null\", \"attr.aria-required\": \"_chipList && _chipList.required || null\" }, classAttribute: \"mat-chip-input mat-input-element\" }, exportAs: [\"matChipInput\", \"matChipInputFor\"], usesOnChanges: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatChipInput, decorators: [{\n type: Directive,\n args: [{\n selector: 'input[matChipInputFor]',\n exportAs: 'matChipInput, matChipInputFor',\n host: {\n 'class': 'mat-chip-input mat-input-element',\n '(keydown)': '_keydown($event)',\n '(keyup)': '_keyup($event)',\n '(blur)': '_blur()',\n '(focus)': '_focus()',\n '(input)': '_onInput()',\n '[id]': 'id',\n '[attr.disabled]': 'disabled || null',\n '[attr.placeholder]': 'placeholder || null',\n '[attr.aria-invalid]': '_chipList && _chipList.ngControl ? _chipList.ngControl.invalid : null',\n '[attr.aria-required]': '_chipList && _chipList.required || null',\n },\n }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: undefined, decorators: [{\n type: Inject,\n args: [MAT_CHIPS_DEFAULT_OPTIONS]\n }] }]; }, propDecorators: { chipList: [{\n type: Input,\n args: ['matChipInputFor']\n }], addOnBlur: [{\n type: Input,\n args: ['matChipInputAddOnBlur']\n }], separatorKeyCodes: [{\n type: Input,\n args: ['matChipInputSeparatorKeyCodes']\n }], chipEnd: [{\n type: Output,\n args: ['matChipInputTokenEnd']\n }], placeholder: [{\n type: Input\n }], id: [{\n type: Input\n }], disabled: [{\n type: Input\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nconst CHIP_DECLARATIONS = [\n MatChipList,\n MatChip,\n MatChipInput,\n MatChipRemove,\n MatChipAvatar,\n MatChipTrailingIcon,\n];\nclass MatChipsModule {\n}\nMatChipsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatChipsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nMatChipsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.2.0\", ngImport: i0, type: MatChipsModule, declarations: [MatChipList,\n MatChip,\n MatChipInput,\n MatChipRemove,\n MatChipAvatar,\n MatChipTrailingIcon], imports: [MatCommonModule], exports: [MatChipList,\n MatChip,\n MatChipInput,\n MatChipRemove,\n MatChipAvatar,\n MatChipTrailingIcon] });\nMatChipsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatChipsModule, providers: [\n ErrorStateMatcher,\n {\n provide: MAT_CHIPS_DEFAULT_OPTIONS,\n useValue: {\n separatorKeyCodes: [ENTER],\n },\n },\n ], imports: [MatCommonModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatChipsModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [MatCommonModule],\n exports: CHIP_DECLARATIONS,\n declarations: CHIP_DECLARATIONS,\n providers: [\n ErrorStateMatcher,\n {\n provide: MAT_CHIPS_DEFAULT_OPTIONS,\n useValue: {\n separatorKeyCodes: [ENTER],\n },\n },\n ],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MAT_CHIPS_DEFAULT_OPTIONS, MAT_CHIP_AVATAR, MAT_CHIP_REMOVE, MAT_CHIP_TRAILING_ICON, MatChip, MatChipAvatar, MatChipInput, MatChipList, MatChipListChange, MatChipRemove, MatChipSelectionChange, MatChipTrailingIcon, MatChipsModule };\n","import * as i0 from '@angular/core';\nimport { InjectionToken, Component, ViewEncapsulation, ChangeDetectionStrategy, Optional, Inject, Input, ContentChildren, Directive, NgModule } from '@angular/core';\nimport { setLines, MatLine, MatLineModule, MatCommonModule } from '@angular/material/core';\nimport { coerceNumberProperty } from '@angular/cdk/coercion';\nimport * as i1 from '@angular/cdk/bidi';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Class for determining, from a list of tiles, the (row, col) position of each of those tiles\n * in the grid. This is necessary (rather than just rendering the tiles in normal document flow)\n * because the tiles can have a rowspan.\n *\n * The positioning algorithm greedily places each tile as soon as it encounters a gap in the grid\n * large enough to accommodate it so that the tiles still render in the same order in which they\n * are given.\n *\n * The basis of the algorithm is the use of an array to track the already placed tiles. Each\n * element of the array corresponds to a column, and the value indicates how many cells in that\n * column are already occupied; zero indicates an empty cell. Moving \"down\" to the next row\n * decrements each value in the tracking array (indicating that the column is one cell closer to\n * being free).\n *\n * @docs-private\n */\nclass TileCoordinator {\n constructor() {\n /** Index at which the search for the next gap will start. */\n this.columnIndex = 0;\n /** The current row index. */\n this.rowIndex = 0;\n }\n /** Gets the total number of rows occupied by tiles */\n get rowCount() {\n return this.rowIndex + 1;\n }\n /**\n * Gets the total span of rows occupied by tiles.\n * Ex: A list with 1 row that contains a tile with rowspan 2 will have a total rowspan of 2.\n */\n get rowspan() {\n const lastRowMax = Math.max(...this.tracker);\n // if any of the tiles has a rowspan that pushes it beyond the total row count,\n // add the difference to the rowcount\n return lastRowMax > 1 ? this.rowCount + lastRowMax - 1 : this.rowCount;\n }\n /**\n * Updates the tile positions.\n * @param numColumns Amount of columns in the grid.\n * @param tiles Tiles to be positioned.\n */\n update(numColumns, tiles) {\n this.columnIndex = 0;\n this.rowIndex = 0;\n this.tracker = new Array(numColumns);\n this.tracker.fill(0, 0, this.tracker.length);\n this.positions = tiles.map(tile => this._trackTile(tile));\n }\n /** Calculates the row and col position of a tile. */\n _trackTile(tile) {\n // Find a gap large enough for this tile.\n const gapStartIndex = this._findMatchingGap(tile.colspan);\n // Place tile in the resulting gap.\n this._markTilePosition(gapStartIndex, tile);\n // The next time we look for a gap, the search will start at columnIndex, which should be\n // immediately after the tile that has just been placed.\n this.columnIndex = gapStartIndex + tile.colspan;\n return new TilePosition(this.rowIndex, gapStartIndex);\n }\n /** Finds the next available space large enough to fit the tile. */\n _findMatchingGap(tileCols) {\n if (tileCols > this.tracker.length && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error(`mat-grid-list: tile with colspan ${tileCols} is wider than ` +\n `grid with cols=\"${this.tracker.length}\".`);\n }\n // Start index is inclusive, end index is exclusive.\n let gapStartIndex = -1;\n let gapEndIndex = -1;\n // Look for a gap large enough to fit the given tile. Empty spaces are marked with a zero.\n do {\n // If we've reached the end of the row, go to the next row.\n if (this.columnIndex + tileCols > this.tracker.length) {\n this._nextRow();\n gapStartIndex = this.tracker.indexOf(0, this.columnIndex);\n gapEndIndex = this._findGapEndIndex(gapStartIndex);\n continue;\n }\n gapStartIndex = this.tracker.indexOf(0, this.columnIndex);\n // If there are no more empty spaces in this row at all, move on to the next row.\n if (gapStartIndex == -1) {\n this._nextRow();\n gapStartIndex = this.tracker.indexOf(0, this.columnIndex);\n gapEndIndex = this._findGapEndIndex(gapStartIndex);\n continue;\n }\n gapEndIndex = this._findGapEndIndex(gapStartIndex);\n // If a gap large enough isn't found, we want to start looking immediately after the current\n // gap on the next iteration.\n this.columnIndex = gapStartIndex + 1;\n // Continue iterating until we find a gap wide enough for this tile. Since gapEndIndex is\n // exclusive, gapEndIndex is 0 means we didn't find a gap and should continue.\n } while (gapEndIndex - gapStartIndex < tileCols || gapEndIndex == 0);\n // If we still didn't manage to find a gap, ensure that the index is\n // at least zero so the tile doesn't get pulled out of the grid.\n return Math.max(gapStartIndex, 0);\n }\n /** Move \"down\" to the next row. */\n _nextRow() {\n this.columnIndex = 0;\n this.rowIndex++;\n // Decrement all spaces by one to reflect moving down one row.\n for (let i = 0; i < this.tracker.length; i++) {\n this.tracker[i] = Math.max(0, this.tracker[i] - 1);\n }\n }\n /**\n * Finds the end index (exclusive) of a gap given the index from which to start looking.\n * The gap ends when a non-zero value is found.\n */\n _findGapEndIndex(gapStartIndex) {\n for (let i = gapStartIndex + 1; i < this.tracker.length; i++) {\n if (this.tracker[i] != 0) {\n return i;\n }\n }\n // The gap ends with the end of the row.\n return this.tracker.length;\n }\n /** Update the tile tracker to account for the given tile in the given space. */\n _markTilePosition(start, tile) {\n for (let i = 0; i < tile.colspan; i++) {\n this.tracker[start + i] = tile.rowspan;\n }\n }\n}\n/**\n * Simple data structure for tile position (row, col).\n * @docs-private\n */\nclass TilePosition {\n constructor(row, col) {\n this.row = row;\n this.col = col;\n }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Injection token used to provide a grid list to a tile and to avoid circular imports.\n * @docs-private\n */\nconst MAT_GRID_LIST = new InjectionToken('MAT_GRID_LIST');\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatGridTile {\n constructor(_element, _gridList) {\n this._element = _element;\n this._gridList = _gridList;\n this._rowspan = 1;\n this._colspan = 1;\n }\n /** Amount of rows that the grid tile takes up. */\n get rowspan() {\n return this._rowspan;\n }\n set rowspan(value) {\n this._rowspan = Math.round(coerceNumberProperty(value));\n }\n /** Amount of columns that the grid tile takes up. */\n get colspan() {\n return this._colspan;\n }\n set colspan(value) {\n this._colspan = Math.round(coerceNumberProperty(value));\n }\n /**\n * Sets the style of the grid-tile element. Needs to be set manually to avoid\n * \"Changed after checked\" errors that would occur with HostBinding.\n */\n _setStyle(property, value) {\n this._element.nativeElement.style[property] = value;\n }\n}\nMatGridTile.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatGridTile, deps: [{ token: i0.ElementRef }, { token: MAT_GRID_LIST, optional: true }], target: i0.ɵɵFactoryTarget.Component });\nMatGridTile.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatGridTile, selector: \"mat-grid-tile\", inputs: { rowspan: \"rowspan\", colspan: \"colspan\" }, host: { properties: { \"attr.rowspan\": \"rowspan\", \"attr.colspan\": \"colspan\" }, classAttribute: \"mat-grid-tile\" }, exportAs: [\"matGridTile\"], ngImport: i0, template: \"
\\n \\n
\\n\", styles: [\".mat-grid-list{display:block;position:relative}.mat-grid-tile{display:block;position:absolute;overflow:hidden}.mat-grid-tile .mat-grid-tile-header,.mat-grid-tile .mat-grid-tile-footer{display:flex;align-items:center;height:48px;color:#fff;background:rgba(0,0,0,.38);overflow:hidden;padding:0 16px;position:absolute;left:0;right:0}.mat-grid-tile .mat-grid-tile-header>*,.mat-grid-tile .mat-grid-tile-footer>*{margin:0;padding:0;font-weight:normal;font-size:inherit}.mat-grid-tile .mat-grid-tile-header.mat-2-line,.mat-grid-tile .mat-grid-tile-footer.mat-2-line{height:68px}.mat-grid-tile .mat-grid-list-text{display:flex;flex-direction:column;flex:auto;box-sizing:border-box;overflow:hidden}.mat-grid-tile .mat-grid-list-text>*{margin:0;padding:0;font-weight:normal;font-size:inherit}.mat-grid-tile .mat-grid-list-text:empty{display:none}.mat-grid-tile .mat-grid-tile-header{top:0}.mat-grid-tile .mat-grid-tile-footer{bottom:0}.mat-grid-tile .mat-grid-avatar{padding-right:16px}[dir=rtl] .mat-grid-tile .mat-grid-avatar{padding-right:0;padding-left:16px}.mat-grid-tile .mat-grid-avatar:empty{display:none}.mat-grid-tile-content{top:0;left:0;right:0;bottom:0;position:absolute;display:flex;align-items:center;justify-content:center;height:100%;padding:0;margin:0}\"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatGridTile, decorators: [{\n type: Component,\n args: [{ selector: 'mat-grid-tile', exportAs: 'matGridTile', host: {\n 'class': 'mat-grid-tile',\n // Ensures that the \"rowspan\" and \"colspan\" input value is reflected in\n // the DOM. This is needed for the grid-tile harness.\n '[attr.rowspan]': 'rowspan',\n '[attr.colspan]': 'colspan',\n }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: \"
\\n \\n
\\n\", styles: [\".mat-grid-list{display:block;position:relative}.mat-grid-tile{display:block;position:absolute;overflow:hidden}.mat-grid-tile .mat-grid-tile-header,.mat-grid-tile .mat-grid-tile-footer{display:flex;align-items:center;height:48px;color:#fff;background:rgba(0,0,0,.38);overflow:hidden;padding:0 16px;position:absolute;left:0;right:0}.mat-grid-tile .mat-grid-tile-header>*,.mat-grid-tile .mat-grid-tile-footer>*{margin:0;padding:0;font-weight:normal;font-size:inherit}.mat-grid-tile .mat-grid-tile-header.mat-2-line,.mat-grid-tile .mat-grid-tile-footer.mat-2-line{height:68px}.mat-grid-tile .mat-grid-list-text{display:flex;flex-direction:column;flex:auto;box-sizing:border-box;overflow:hidden}.mat-grid-tile .mat-grid-list-text>*{margin:0;padding:0;font-weight:normal;font-size:inherit}.mat-grid-tile .mat-grid-list-text:empty{display:none}.mat-grid-tile .mat-grid-tile-header{top:0}.mat-grid-tile .mat-grid-tile-footer{bottom:0}.mat-grid-tile .mat-grid-avatar{padding-right:16px}[dir=rtl] .mat-grid-tile .mat-grid-avatar{padding-right:0;padding-left:16px}.mat-grid-tile .mat-grid-avatar:empty{display:none}.mat-grid-tile-content{top:0;left:0;right:0;bottom:0;position:absolute;display:flex;align-items:center;justify-content:center;height:100%;padding:0;margin:0}\"] }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_GRID_LIST]\n }] }]; }, propDecorators: { rowspan: [{\n type: Input\n }], colspan: [{\n type: Input\n }] } });\nclass MatGridTileText {\n constructor(_element) {\n this._element = _element;\n }\n ngAfterContentInit() {\n setLines(this._lines, this._element);\n }\n}\nMatGridTileText.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatGridTileText, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });\nMatGridTileText.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatGridTileText, selector: \"mat-grid-tile-header, mat-grid-tile-footer\", queries: [{ propertyName: \"_lines\", predicate: MatLine, descendants: true }], ngImport: i0, template: \"\\n
\\n\\n\", changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatGridTileText, decorators: [{\n type: Component,\n args: [{ selector: 'mat-grid-tile-header, mat-grid-tile-footer', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: \"\\n
\\n\\n\" }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { _lines: [{\n type: ContentChildren,\n args: [MatLine, { descendants: true }]\n }] } });\n/**\n * Directive whose purpose is to add the mat- CSS styling to this selector.\n * @docs-private\n */\nclass MatGridAvatarCssMatStyler {\n}\nMatGridAvatarCssMatStyler.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatGridAvatarCssMatStyler, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nMatGridAvatarCssMatStyler.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatGridAvatarCssMatStyler, selector: \"[mat-grid-avatar], [matGridAvatar]\", host: { classAttribute: \"mat-grid-avatar\" }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatGridAvatarCssMatStyler, decorators: [{\n type: Directive,\n args: [{\n selector: '[mat-grid-avatar], [matGridAvatar]',\n host: { 'class': 'mat-grid-avatar' },\n }]\n }] });\n/**\n * Directive whose purpose is to add the mat- CSS styling to this selector.\n * @docs-private\n */\nclass MatGridTileHeaderCssMatStyler {\n}\nMatGridTileHeaderCssMatStyler.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatGridTileHeaderCssMatStyler, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nMatGridTileHeaderCssMatStyler.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatGridTileHeaderCssMatStyler, selector: \"mat-grid-tile-header\", host: { classAttribute: \"mat-grid-tile-header\" }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatGridTileHeaderCssMatStyler, decorators: [{\n type: Directive,\n args: [{\n selector: 'mat-grid-tile-header',\n host: { 'class': 'mat-grid-tile-header' },\n }]\n }] });\n/**\n * Directive whose purpose is to add the mat- CSS styling to this selector.\n * @docs-private\n */\nclass MatGridTileFooterCssMatStyler {\n}\nMatGridTileFooterCssMatStyler.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatGridTileFooterCssMatStyler, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nMatGridTileFooterCssMatStyler.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatGridTileFooterCssMatStyler, selector: \"mat-grid-tile-footer\", host: { classAttribute: \"mat-grid-tile-footer\" }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatGridTileFooterCssMatStyler, decorators: [{\n type: Directive,\n args: [{\n selector: 'mat-grid-tile-footer',\n host: { 'class': 'mat-grid-tile-footer' },\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * RegExp that can be used to check whether a value will\n * be allowed inside a CSS `calc()` expression.\n */\nconst cssCalcAllowedValue = /^-?\\d+((\\.\\d+)?[A-Za-z%$]?)+$/;\n/**\n * Sets the style properties for an individual tile, given the position calculated by the\n * Tile Coordinator.\n * @docs-private\n */\nclass TileStyler {\n constructor() {\n this._rows = 0;\n this._rowspan = 0;\n }\n /**\n * Adds grid-list layout info once it is available. Cannot be processed in the constructor\n * because these properties haven't been calculated by that point.\n *\n * @param gutterSize Size of the grid's gutter.\n * @param tracker Instance of the TileCoordinator.\n * @param cols Amount of columns in the grid.\n * @param direction Layout direction of the grid.\n */\n init(gutterSize, tracker, cols, direction) {\n this._gutterSize = normalizeUnits(gutterSize);\n this._rows = tracker.rowCount;\n this._rowspan = tracker.rowspan;\n this._cols = cols;\n this._direction = direction;\n }\n /**\n * Computes the amount of space a single 1x1 tile would take up (width or height).\n * Used as a basis for other calculations.\n * @param sizePercent Percent of the total grid-list space that one 1x1 tile would take up.\n * @param gutterFraction Fraction of the gutter size taken up by one 1x1 tile.\n * @return The size of a 1x1 tile as an expression that can be evaluated via CSS calc().\n */\n getBaseTileSize(sizePercent, gutterFraction) {\n // Take the base size percent (as would be if evenly dividing the size between cells),\n // and then subtracting the size of one gutter. However, since there are no gutters on the\n // edges, each tile only uses a fraction (gutterShare = numGutters / numCells) of the gutter\n // size. (Imagine having one gutter per tile, and then breaking up the extra gutter on the\n // edge evenly among the cells).\n return `(${sizePercent}% - (${this._gutterSize} * ${gutterFraction}))`;\n }\n /**\n * Gets The horizontal or vertical position of a tile, e.g., the 'top' or 'left' property value.\n * @param offset Number of tiles that have already been rendered in the row/column.\n * @param baseSize Base size of a 1x1 tile (as computed in getBaseTileSize).\n * @return Position of the tile as a CSS calc() expression.\n */\n getTilePosition(baseSize, offset) {\n // The position comes the size of a 1x1 tile plus gutter for each previous tile in the\n // row/column (offset).\n return offset === 0 ? '0' : calc(`(${baseSize} + ${this._gutterSize}) * ${offset}`);\n }\n /**\n * Gets the actual size of a tile, e.g., width or height, taking rowspan or colspan into account.\n * @param baseSize Base size of a 1x1 tile (as computed in getBaseTileSize).\n * @param span The tile's rowspan or colspan.\n * @return Size of the tile as a CSS calc() expression.\n */\n getTileSize(baseSize, span) {\n return `(${baseSize} * ${span}) + (${span - 1} * ${this._gutterSize})`;\n }\n /**\n * Sets the style properties to be applied to a tile for the given row and column index.\n * @param tile Tile to which to apply the styling.\n * @param rowIndex Index of the tile's row.\n * @param colIndex Index of the tile's column.\n */\n setStyle(tile, rowIndex, colIndex) {\n // Percent of the available horizontal space that one column takes up.\n let percentWidthPerTile = 100 / this._cols;\n // Fraction of the vertical gutter size that each column takes up.\n // For example, if there are 5 columns, each column uses 4/5 = 0.8 times the gutter width.\n let gutterWidthFractionPerTile = (this._cols - 1) / this._cols;\n this.setColStyles(tile, colIndex, percentWidthPerTile, gutterWidthFractionPerTile);\n this.setRowStyles(tile, rowIndex, percentWidthPerTile, gutterWidthFractionPerTile);\n }\n /** Sets the horizontal placement of the tile in the list. */\n setColStyles(tile, colIndex, percentWidth, gutterWidth) {\n // Base horizontal size of a column.\n let baseTileWidth = this.getBaseTileSize(percentWidth, gutterWidth);\n // The width and horizontal position of each tile is always calculated the same way, but the\n // height and vertical position depends on the rowMode.\n let side = this._direction === 'rtl' ? 'right' : 'left';\n tile._setStyle(side, this.getTilePosition(baseTileWidth, colIndex));\n tile._setStyle('width', calc(this.getTileSize(baseTileWidth, tile.colspan)));\n }\n /**\n * Calculates the total size taken up by gutters across one axis of a list.\n */\n getGutterSpan() {\n return `${this._gutterSize} * (${this._rowspan} - 1)`;\n }\n /**\n * Calculates the total size taken up by tiles across one axis of a list.\n * @param tileHeight Height of the tile.\n */\n getTileSpan(tileHeight) {\n return `${this._rowspan} * ${this.getTileSize(tileHeight, 1)}`;\n }\n /**\n * Calculates the computed height and returns the correct style property to set.\n * This method can be implemented by each type of TileStyler.\n * @docs-private\n */\n getComputedHeight() {\n return null;\n }\n}\n/**\n * This type of styler is instantiated when the user passes in a fixed row height.\n * Example ``\n * @docs-private\n */\nclass FixedTileStyler extends TileStyler {\n constructor(fixedRowHeight) {\n super();\n this.fixedRowHeight = fixedRowHeight;\n }\n init(gutterSize, tracker, cols, direction) {\n super.init(gutterSize, tracker, cols, direction);\n this.fixedRowHeight = normalizeUnits(this.fixedRowHeight);\n if (!cssCalcAllowedValue.test(this.fixedRowHeight) &&\n (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error(`Invalid value \"${this.fixedRowHeight}\" set as rowHeight.`);\n }\n }\n setRowStyles(tile, rowIndex) {\n tile._setStyle('top', this.getTilePosition(this.fixedRowHeight, rowIndex));\n tile._setStyle('height', calc(this.getTileSize(this.fixedRowHeight, tile.rowspan)));\n }\n getComputedHeight() {\n return ['height', calc(`${this.getTileSpan(this.fixedRowHeight)} + ${this.getGutterSpan()}`)];\n }\n reset(list) {\n list._setListStyle(['height', null]);\n if (list._tiles) {\n list._tiles.forEach(tile => {\n tile._setStyle('top', null);\n tile._setStyle('height', null);\n });\n }\n }\n}\n/**\n * This type of styler is instantiated when the user passes in a width:height ratio\n * for the row height. Example ``\n * @docs-private\n */\nclass RatioTileStyler extends TileStyler {\n constructor(value) {\n super();\n this._parseRatio(value);\n }\n setRowStyles(tile, rowIndex, percentWidth, gutterWidth) {\n let percentHeightPerTile = percentWidth / this.rowHeightRatio;\n this.baseTileHeight = this.getBaseTileSize(percentHeightPerTile, gutterWidth);\n // Use padding-top and margin-top to maintain the given aspect ratio, as\n // a percentage-based value for these properties is applied versus the *width* of the\n // containing block. See http://www.w3.org/TR/CSS2/box.html#margin-properties\n tile._setStyle('marginTop', this.getTilePosition(this.baseTileHeight, rowIndex));\n tile._setStyle('paddingTop', calc(this.getTileSize(this.baseTileHeight, tile.rowspan)));\n }\n getComputedHeight() {\n return [\n 'paddingBottom',\n calc(`${this.getTileSpan(this.baseTileHeight)} + ${this.getGutterSpan()}`),\n ];\n }\n reset(list) {\n list._setListStyle(['paddingBottom', null]);\n list._tiles.forEach(tile => {\n tile._setStyle('marginTop', null);\n tile._setStyle('paddingTop', null);\n });\n }\n _parseRatio(value) {\n const ratioParts = value.split(':');\n if (ratioParts.length !== 2 && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error(`mat-grid-list: invalid ratio given for row-height: \"${value}\"`);\n }\n this.rowHeightRatio = parseFloat(ratioParts[0]) / parseFloat(ratioParts[1]);\n }\n}\n/**\n * This type of styler is instantiated when the user selects a \"fit\" row height mode.\n * In other words, the row height will reflect the total height of the container divided\n * by the number of rows. Example ``\n *\n * @docs-private\n */\nclass FitTileStyler extends TileStyler {\n setRowStyles(tile, rowIndex) {\n // Percent of the available vertical space that one row takes up.\n let percentHeightPerTile = 100 / this._rowspan;\n // Fraction of the horizontal gutter size that each column takes up.\n let gutterHeightPerTile = (this._rows - 1) / this._rows;\n // Base vertical size of a column.\n let baseTileHeight = this.getBaseTileSize(percentHeightPerTile, gutterHeightPerTile);\n tile._setStyle('top', this.getTilePosition(baseTileHeight, rowIndex));\n tile._setStyle('height', calc(this.getTileSize(baseTileHeight, tile.rowspan)));\n }\n reset(list) {\n if (list._tiles) {\n list._tiles.forEach(tile => {\n tile._setStyle('top', null);\n tile._setStyle('height', null);\n });\n }\n }\n}\n/** Wraps a CSS string in a calc function */\nfunction calc(exp) {\n return `calc(${exp})`;\n}\n/** Appends pixels to a CSS string if no units are given. */\nfunction normalizeUnits(value) {\n return value.match(/([A-Za-z%]+)$/) ? value : `${value}px`;\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n// TODO(kara): Conditional (responsive) column count / row size.\n// TODO(kara): Re-layout on window resize / media change (debounced).\n// TODO(kara): gridTileHeader and gridTileFooter.\nconst MAT_FIT_MODE = 'fit';\nclass MatGridList {\n constructor(_element, _dir) {\n this._element = _element;\n this._dir = _dir;\n /** The amount of space between tiles. This will be something like '5px' or '2em'. */\n this._gutter = '1px';\n }\n /** Amount of columns in the grid list. */\n get cols() {\n return this._cols;\n }\n set cols(value) {\n this._cols = Math.max(1, Math.round(coerceNumberProperty(value)));\n }\n /** Size of the grid list's gutter in pixels. */\n get gutterSize() {\n return this._gutter;\n }\n set gutterSize(value) {\n this._gutter = `${value == null ? '' : value}`;\n }\n /** Set internal representation of row height from the user-provided value. */\n get rowHeight() {\n return this._rowHeight;\n }\n set rowHeight(value) {\n const newValue = `${value == null ? '' : value}`;\n if (newValue !== this._rowHeight) {\n this._rowHeight = newValue;\n this._setTileStyler(this._rowHeight);\n }\n }\n ngOnInit() {\n this._checkCols();\n this._checkRowHeight();\n }\n /**\n * The layout calculation is fairly cheap if nothing changes, so there's little cost\n * to run it frequently.\n */\n ngAfterContentChecked() {\n this._layoutTiles();\n }\n /** Throw a friendly error if cols property is missing */\n _checkCols() {\n if (!this.cols && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error(`mat-grid-list: must pass in number of columns. ` + `Example: `);\n }\n }\n /** Default to equal width:height if rowHeight property is missing */\n _checkRowHeight() {\n if (!this._rowHeight) {\n this._setTileStyler('1:1');\n }\n }\n /** Creates correct Tile Styler subtype based on rowHeight passed in by user */\n _setTileStyler(rowHeight) {\n if (this._tileStyler) {\n this._tileStyler.reset(this);\n }\n if (rowHeight === MAT_FIT_MODE) {\n this._tileStyler = new FitTileStyler();\n }\n else if (rowHeight && rowHeight.indexOf(':') > -1) {\n this._tileStyler = new RatioTileStyler(rowHeight);\n }\n else {\n this._tileStyler = new FixedTileStyler(rowHeight);\n }\n }\n /** Computes and applies the size and position for all children grid tiles. */\n _layoutTiles() {\n if (!this._tileCoordinator) {\n this._tileCoordinator = new TileCoordinator();\n }\n const tracker = this._tileCoordinator;\n const tiles = this._tiles.filter(tile => !tile._gridList || tile._gridList === this);\n const direction = this._dir ? this._dir.value : 'ltr';\n this._tileCoordinator.update(this.cols, tiles);\n this._tileStyler.init(this.gutterSize, tracker, this.cols, direction);\n tiles.forEach((tile, index) => {\n const pos = tracker.positions[index];\n this._tileStyler.setStyle(tile, pos.row, pos.col);\n });\n this._setListStyle(this._tileStyler.getComputedHeight());\n }\n /** Sets style on the main grid-list element, given the style name and value. */\n _setListStyle(style) {\n if (style) {\n this._element.nativeElement.style[style[0]] = style[1];\n }\n }\n}\nMatGridList.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatGridList, deps: [{ token: i0.ElementRef }, { token: i1.Directionality, optional: true }], target: i0.ɵɵFactoryTarget.Component });\nMatGridList.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatGridList, selector: \"mat-grid-list\", inputs: { cols: \"cols\", gutterSize: \"gutterSize\", rowHeight: \"rowHeight\" }, host: { properties: { \"attr.cols\": \"cols\" }, classAttribute: \"mat-grid-list\" }, providers: [\n {\n provide: MAT_GRID_LIST,\n useExisting: MatGridList,\n },\n ], queries: [{ propertyName: \"_tiles\", predicate: MatGridTile, descendants: true }], exportAs: [\"matGridList\"], ngImport: i0, template: \"
\\n \\n
\", styles: [\".mat-grid-list{display:block;position:relative}.mat-grid-tile{display:block;position:absolute;overflow:hidden}.mat-grid-tile .mat-grid-tile-header,.mat-grid-tile .mat-grid-tile-footer{display:flex;align-items:center;height:48px;color:#fff;background:rgba(0,0,0,.38);overflow:hidden;padding:0 16px;position:absolute;left:0;right:0}.mat-grid-tile .mat-grid-tile-header>*,.mat-grid-tile .mat-grid-tile-footer>*{margin:0;padding:0;font-weight:normal;font-size:inherit}.mat-grid-tile .mat-grid-tile-header.mat-2-line,.mat-grid-tile .mat-grid-tile-footer.mat-2-line{height:68px}.mat-grid-tile .mat-grid-list-text{display:flex;flex-direction:column;flex:auto;box-sizing:border-box;overflow:hidden}.mat-grid-tile .mat-grid-list-text>*{margin:0;padding:0;font-weight:normal;font-size:inherit}.mat-grid-tile .mat-grid-list-text:empty{display:none}.mat-grid-tile .mat-grid-tile-header{top:0}.mat-grid-tile .mat-grid-tile-footer{bottom:0}.mat-grid-tile .mat-grid-avatar{padding-right:16px}[dir=rtl] .mat-grid-tile .mat-grid-avatar{padding-right:0;padding-left:16px}.mat-grid-tile .mat-grid-avatar:empty{display:none}.mat-grid-tile-content{top:0;left:0;right:0;bottom:0;position:absolute;display:flex;align-items:center;justify-content:center;height:100%;padding:0;margin:0}\"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatGridList, decorators: [{\n type: Component,\n args: [{ selector: 'mat-grid-list', exportAs: 'matGridList', host: {\n 'class': 'mat-grid-list',\n // Ensures that the \"cols\" input value is reflected in the DOM. This is\n // needed for the grid-list harness.\n '[attr.cols]': 'cols',\n }, providers: [\n {\n provide: MAT_GRID_LIST,\n useExisting: MatGridList,\n },\n ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: \"
\\n \\n
\", styles: [\".mat-grid-list{display:block;position:relative}.mat-grid-tile{display:block;position:absolute;overflow:hidden}.mat-grid-tile .mat-grid-tile-header,.mat-grid-tile .mat-grid-tile-footer{display:flex;align-items:center;height:48px;color:#fff;background:rgba(0,0,0,.38);overflow:hidden;padding:0 16px;position:absolute;left:0;right:0}.mat-grid-tile .mat-grid-tile-header>*,.mat-grid-tile .mat-grid-tile-footer>*{margin:0;padding:0;font-weight:normal;font-size:inherit}.mat-grid-tile .mat-grid-tile-header.mat-2-line,.mat-grid-tile .mat-grid-tile-footer.mat-2-line{height:68px}.mat-grid-tile .mat-grid-list-text{display:flex;flex-direction:column;flex:auto;box-sizing:border-box;overflow:hidden}.mat-grid-tile .mat-grid-list-text>*{margin:0;padding:0;font-weight:normal;font-size:inherit}.mat-grid-tile .mat-grid-list-text:empty{display:none}.mat-grid-tile .mat-grid-tile-header{top:0}.mat-grid-tile .mat-grid-tile-footer{bottom:0}.mat-grid-tile .mat-grid-avatar{padding-right:16px}[dir=rtl] .mat-grid-tile .mat-grid-avatar{padding-right:0;padding-left:16px}.mat-grid-tile .mat-grid-avatar:empty{display:none}.mat-grid-tile-content{top:0;left:0;right:0;bottom:0;position:absolute;display:flex;align-items:center;justify-content:center;height:100%;padding:0;margin:0}\"] }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.Directionality, decorators: [{\n type: Optional\n }] }]; }, propDecorators: { _tiles: [{\n type: ContentChildren,\n args: [MatGridTile, { descendants: true }]\n }], cols: [{\n type: Input\n }], gutterSize: [{\n type: Input\n }], rowHeight: [{\n type: Input\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatGridListModule {\n}\nMatGridListModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatGridListModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nMatGridListModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.2.0\", ngImport: i0, type: MatGridListModule, declarations: [MatGridList,\n MatGridTile,\n MatGridTileText,\n MatGridTileHeaderCssMatStyler,\n MatGridTileFooterCssMatStyler,\n MatGridAvatarCssMatStyler], imports: [MatLineModule, MatCommonModule], exports: [MatGridList,\n MatGridTile,\n MatGridTileText,\n MatLineModule,\n MatCommonModule,\n MatGridTileHeaderCssMatStyler,\n MatGridTileFooterCssMatStyler,\n MatGridAvatarCssMatStyler] });\nMatGridListModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatGridListModule, imports: [MatLineModule, MatCommonModule, MatLineModule,\n MatCommonModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatGridListModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [MatLineModule, MatCommonModule],\n exports: [\n MatGridList,\n MatGridTile,\n MatGridTileText,\n MatLineModule,\n MatCommonModule,\n MatGridTileHeaderCssMatStyler,\n MatGridTileFooterCssMatStyler,\n MatGridAvatarCssMatStyler,\n ],\n declarations: [\n MatGridList,\n MatGridTile,\n MatGridTileText,\n MatGridTileHeaderCssMatStyler,\n MatGridTileFooterCssMatStyler,\n MatGridAvatarCssMatStyler,\n ],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n// Privately exported for the grid-list harness.\nconst ɵTileCoordinator = TileCoordinator;\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MatGridAvatarCssMatStyler, MatGridList, MatGridListModule, MatGridTile, MatGridTileFooterCssMatStyler, MatGridTileHeaderCssMatStyler, MatGridTileText, ɵTileCoordinator };\n","import * as i8 from '@angular/cdk/overlay';\nimport { Overlay, CdkConnectedOverlay, OverlayModule } from '@angular/cdk/overlay';\nimport * as i7 from '@angular/common';\nimport { CommonModule } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { InjectionToken, Directive, EventEmitter, Optional, Inject, Self, Attribute, Input, ViewChild, Output, Component, ViewEncapsulation, ChangeDetectionStrategy, ContentChildren, ContentChild, NgModule } from '@angular/core';\nimport * as i2 from '@angular/material/core';\nimport { mixinDisableRipple, mixinTabIndex, mixinDisabled, mixinErrorState, _countGroupLabelsBeforeOption, _getOptionScrollPosition, MAT_OPTION_PARENT_COMPONENT, MatOption, MAT_OPTGROUP, MatOptionModule, MatCommonModule } from '@angular/material/core';\nimport * as i6 from '@angular/material/form-field';\nimport { MAT_FORM_FIELD, MatFormFieldControl, MatFormFieldModule } from '@angular/material/form-field';\nimport * as i1 from '@angular/cdk/scrolling';\nimport { CdkScrollableModule } from '@angular/cdk/scrolling';\nimport * as i5 from '@angular/cdk/a11y';\nimport { ActiveDescendantKeyManager } from '@angular/cdk/a11y';\nimport * as i3 from '@angular/cdk/bidi';\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { DOWN_ARROW, UP_ARROW, LEFT_ARROW, RIGHT_ARROW, ENTER, SPACE, hasModifierKey, A } from '@angular/cdk/keycodes';\nimport * as i4 from '@angular/forms';\nimport { Validators } from '@angular/forms';\nimport { Subject, defer, merge } from 'rxjs';\nimport { startWith, switchMap, take, filter, map, distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { trigger, transition, query, animateChild, state, style, animate } from '@angular/animations';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * The following are all the animations for the mat-select component, with each\n * const containing the metadata for one animation.\n *\n * The values below match the implementation of the AngularJS Material mat-select animation.\n * @docs-private\n */\nconst matSelectAnimations = {\n /**\n * This animation ensures the select's overlay panel animation (transformPanel) is called when\n * closing the select.\n * This is needed due to https://github.com/angular/angular/issues/23302\n */\n transformPanelWrap: trigger('transformPanelWrap', [\n transition('* => void', query('@transformPanel', [animateChild()], { optional: true })),\n ]),\n /**\n * This animation transforms the select's overlay panel on and off the page.\n *\n * When the panel is attached to the DOM, it expands its width by the amount of padding, scales it\n * up to 100% on the Y axis, fades in its border, and translates slightly up and to the\n * side to ensure the option text correctly overlaps the trigger text.\n *\n * When the panel is removed from the DOM, it simply fades out linearly.\n */\n transformPanel: trigger('transformPanel', [\n state('void', style({\n transform: 'scaleY(0.8)',\n minWidth: '100%',\n opacity: 0,\n })),\n state('showing', style({\n opacity: 1,\n minWidth: 'calc(100% + 32px)',\n transform: 'scaleY(1)',\n })),\n state('showing-multiple', style({\n opacity: 1,\n minWidth: 'calc(100% + 64px)',\n transform: 'scaleY(1)',\n })),\n transition('void => *', animate('120ms cubic-bezier(0, 0, 0.2, 1)')),\n transition('* => void', animate('100ms 25ms linear', style({ opacity: 0 }))),\n ]),\n};\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Returns an exception to be thrown when attempting to change a select's `multiple` option\n * after initialization.\n * @docs-private\n */\nfunction getMatSelectDynamicMultipleError() {\n return Error('Cannot change `multiple` mode of select after initialization.');\n}\n/**\n * Returns an exception to be thrown when attempting to assign a non-array value to a select\n * in `multiple` mode. Note that `undefined` and `null` are still valid values to allow for\n * resetting the value.\n * @docs-private\n */\nfunction getMatSelectNonArrayValueError() {\n return Error('Value must be an array in multiple-selection mode.');\n}\n/**\n * Returns an exception to be thrown when assigning a non-function value to the comparator\n * used to determine if a value corresponds to an option. Note that whether the function\n * actually takes two values and returns a boolean is not checked.\n */\nfunction getMatSelectNonFunctionValueError() {\n return Error('`compareWith` must be a function.');\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nlet nextUniqueId = 0;\n/**\n * The following style constants are necessary to save here in order\n * to properly calculate the alignment of the selected option over\n * the trigger element.\n */\n/** The max height of the select's overlay panel. */\nconst SELECT_PANEL_MAX_HEIGHT = 256;\n/** The panel's padding on the x-axis. */\nconst SELECT_PANEL_PADDING_X = 16;\n/** The panel's x axis padding if it is indented (e.g. there is an option group). */\nconst SELECT_PANEL_INDENT_PADDING_X = SELECT_PANEL_PADDING_X * 2;\n/** The height of the select items in `em` units. */\nconst SELECT_ITEM_HEIGHT_EM = 3;\n// TODO(josephperrott): Revert to a constant after 2018 spec updates are fully merged.\n/**\n * Distance between the panel edge and the option text in\n * multi-selection mode.\n *\n * Calculated as:\n * (SELECT_PANEL_PADDING_X * 1.5) + 16 = 40\n * The padding is multiplied by 1.5 because the checkbox's margin is half the padding.\n * The checkbox width is 16px.\n */\nconst SELECT_MULTIPLE_PANEL_PADDING_X = SELECT_PANEL_PADDING_X * 1.5 + 16;\n/**\n * The select panel will only \"fit\" inside the viewport if it is positioned at\n * this value or more away from the viewport boundary.\n */\nconst SELECT_PANEL_VIEWPORT_PADDING = 8;\n/** Injection token that determines the scroll handling while a select is open. */\nconst MAT_SELECT_SCROLL_STRATEGY = new InjectionToken('mat-select-scroll-strategy');\n/** @docs-private */\nfunction MAT_SELECT_SCROLL_STRATEGY_PROVIDER_FACTORY(overlay) {\n return () => overlay.scrollStrategies.reposition();\n}\n/** Injection token that can be used to provide the default options the select module. */\nconst MAT_SELECT_CONFIG = new InjectionToken('MAT_SELECT_CONFIG');\n/** @docs-private */\nconst MAT_SELECT_SCROLL_STRATEGY_PROVIDER = {\n provide: MAT_SELECT_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: MAT_SELECT_SCROLL_STRATEGY_PROVIDER_FACTORY,\n};\n/** Change event object that is emitted when the select value has changed. */\nclass MatSelectChange {\n constructor(\n /** Reference to the select that emitted the change event. */\n source, \n /** Current value of the select that emitted the event. */\n value) {\n this.source = source;\n this.value = value;\n }\n}\n// Boilerplate for applying mixins to MatSelect.\n/** @docs-private */\nconst _MatSelectMixinBase = mixinDisableRipple(mixinTabIndex(mixinDisabled(mixinErrorState(class {\n constructor(_elementRef, _defaultErrorStateMatcher, _parentForm, _parentFormGroup, \n /**\n * Form control bound to the component.\n * Implemented as part of `MatFormFieldControl`.\n * @docs-private\n */\n ngControl) {\n this._elementRef = _elementRef;\n this._defaultErrorStateMatcher = _defaultErrorStateMatcher;\n this._parentForm = _parentForm;\n this._parentFormGroup = _parentFormGroup;\n this.ngControl = ngControl;\n /**\n * Emits whenever the component state changes and should cause the parent\n * form-field to update. Implemented as part of `MatFormFieldControl`.\n * @docs-private\n */\n this.stateChanges = new Subject();\n }\n}))));\n/**\n * Injection token that can be used to reference instances of `MatSelectTrigger`. It serves as\n * alternative token to the actual `MatSelectTrigger` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst MAT_SELECT_TRIGGER = new InjectionToken('MatSelectTrigger');\n/**\n * Allows the user to customize the trigger that is displayed when the select has a value.\n */\nclass MatSelectTrigger {\n}\nMatSelectTrigger.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatSelectTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nMatSelectTrigger.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatSelectTrigger, selector: \"mat-select-trigger\", providers: [{ provide: MAT_SELECT_TRIGGER, useExisting: MatSelectTrigger }], ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatSelectTrigger, decorators: [{\n type: Directive,\n args: [{\n selector: 'mat-select-trigger',\n providers: [{ provide: MAT_SELECT_TRIGGER, useExisting: MatSelectTrigger }],\n }]\n }] });\n/** Base class with all of the `MatSelect` functionality. */\nclass _MatSelectBase extends _MatSelectMixinBase {\n constructor(_viewportRuler, _changeDetectorRef, _ngZone, _defaultErrorStateMatcher, elementRef, _dir, _parentForm, _parentFormGroup, _parentFormField, ngControl, tabIndex, scrollStrategyFactory, _liveAnnouncer, _defaultOptions) {\n super(elementRef, _defaultErrorStateMatcher, _parentForm, _parentFormGroup, ngControl);\n this._viewportRuler = _viewportRuler;\n this._changeDetectorRef = _changeDetectorRef;\n this._ngZone = _ngZone;\n this._dir = _dir;\n this._parentFormField = _parentFormField;\n this._liveAnnouncer = _liveAnnouncer;\n this._defaultOptions = _defaultOptions;\n /** Whether or not the overlay panel is open. */\n this._panelOpen = false;\n /** Comparison function to specify which option is displayed. Defaults to object equality. */\n this._compareWith = (o1, o2) => o1 === o2;\n /** Unique id for this input. */\n this._uid = `mat-select-${nextUniqueId++}`;\n /** Current `aria-labelledby` value for the select trigger. */\n this._triggerAriaLabelledBy = null;\n /** Emits whenever the component is destroyed. */\n this._destroy = new Subject();\n /** `View -> model callback called when value changes` */\n this._onChange = () => { };\n /** `View -> model callback called when select has been touched` */\n this._onTouched = () => { };\n /** ID for the DOM node containing the select's value. */\n this._valueId = `mat-select-value-${nextUniqueId++}`;\n /** Emits when the panel element is finished transforming in. */\n this._panelDoneAnimatingStream = new Subject();\n this._overlayPanelClass = this._defaultOptions?.overlayPanelClass || '';\n this._focused = false;\n /** A name for this control that can be used by `mat-form-field`. */\n this.controlType = 'mat-select';\n this._multiple = false;\n this._disableOptionCentering = this._defaultOptions?.disableOptionCentering ?? false;\n /** Aria label of the select. */\n this.ariaLabel = '';\n /** Combined stream of all of the child options' change events. */\n this.optionSelectionChanges = defer(() => {\n const options = this.options;\n if (options) {\n return options.changes.pipe(startWith(options), switchMap(() => merge(...options.map(option => option.onSelectionChange))));\n }\n return this._ngZone.onStable.pipe(take(1), switchMap(() => this.optionSelectionChanges));\n });\n /** Event emitted when the select panel has been toggled. */\n this.openedChange = new EventEmitter();\n /** Event emitted when the select has been opened. */\n this._openedStream = this.openedChange.pipe(filter(o => o), map(() => { }));\n /** Event emitted when the select has been closed. */\n this._closedStream = this.openedChange.pipe(filter(o => !o), map(() => { }));\n /** Event emitted when the selected value has been changed by the user. */\n this.selectionChange = new EventEmitter();\n /**\n * Event that emits whenever the raw value of the select changes. This is here primarily\n * to facilitate the two-way binding for the `value` input.\n * @docs-private\n */\n this.valueChange = new EventEmitter();\n if (this.ngControl) {\n // Note: we provide the value accessor through here, instead of\n // the `providers` to avoid running into a circular import.\n this.ngControl.valueAccessor = this;\n }\n // Note that we only want to set this when the defaults pass it in, otherwise it should\n // stay as `undefined` so that it falls back to the default in the key manager.\n if (_defaultOptions?.typeaheadDebounceInterval != null) {\n this._typeaheadDebounceInterval = _defaultOptions.typeaheadDebounceInterval;\n }\n this._scrollStrategyFactory = scrollStrategyFactory;\n this._scrollStrategy = this._scrollStrategyFactory();\n this.tabIndex = parseInt(tabIndex) || 0;\n // Force setter to be called in case id was not specified.\n this.id = this.id;\n }\n /** Whether the select is focused. */\n get focused() {\n return this._focused || this._panelOpen;\n }\n /** Placeholder to be shown if no value has been selected. */\n get placeholder() {\n return this._placeholder;\n }\n set placeholder(value) {\n this._placeholder = value;\n this.stateChanges.next();\n }\n /** Whether the component is required. */\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 this.stateChanges.next();\n }\n /** Whether the user should be allowed to select multiple options. */\n get multiple() {\n return this._multiple;\n }\n set multiple(value) {\n if (this._selectionModel && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getMatSelectDynamicMultipleError();\n }\n this._multiple = coerceBooleanProperty(value);\n }\n /** Whether to center the active option over the trigger. */\n get disableOptionCentering() {\n return this._disableOptionCentering;\n }\n set disableOptionCentering(value) {\n this._disableOptionCentering = coerceBooleanProperty(value);\n }\n /**\n * Function to compare the option values with the selected values. The first argument\n * is a value from an option. The second is a value from the selection. A boolean\n * should be returned.\n */\n get compareWith() {\n return this._compareWith;\n }\n set compareWith(fn) {\n if (typeof fn !== 'function' && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getMatSelectNonFunctionValueError();\n }\n this._compareWith = fn;\n if (this._selectionModel) {\n // A different comparator means the selection could change.\n this._initializeSelection();\n }\n }\n /** Value of the select control. */\n get value() {\n return this._value;\n }\n set value(newValue) {\n const hasAssigned = this._assignValue(newValue);\n if (hasAssigned) {\n this._onChange(newValue);\n }\n }\n /** Time to wait in milliseconds after the last keystroke before moving focus to an item. */\n get typeaheadDebounceInterval() {\n return this._typeaheadDebounceInterval;\n }\n set typeaheadDebounceInterval(value) {\n this._typeaheadDebounceInterval = coerceNumberProperty(value);\n }\n /** Unique id of the element. */\n get id() {\n return this._id;\n }\n set id(value) {\n this._id = value || this._uid;\n this.stateChanges.next();\n }\n ngOnInit() {\n this._selectionModel = new SelectionModel(this.multiple);\n this.stateChanges.next();\n // We need `distinctUntilChanged` here, because some browsers will\n // fire the animation end event twice for the same animation. See:\n // https://github.com/angular/angular/issues/24084\n this._panelDoneAnimatingStream\n .pipe(distinctUntilChanged(), takeUntil(this._destroy))\n .subscribe(() => this._panelDoneAnimating(this.panelOpen));\n }\n ngAfterContentInit() {\n this._initKeyManager();\n this._selectionModel.changed.pipe(takeUntil(this._destroy)).subscribe(event => {\n event.added.forEach(option => option.select());\n event.removed.forEach(option => option.deselect());\n });\n this.options.changes.pipe(startWith(null), takeUntil(this._destroy)).subscribe(() => {\n this._resetOptions();\n this._initializeSelection();\n });\n }\n ngDoCheck() {\n const newAriaLabelledby = this._getTriggerAriaLabelledby();\n const ngControl = this.ngControl;\n // We have to manage setting the `aria-labelledby` ourselves, because part of its value\n // is computed as a result of a content query which can cause this binding to trigger a\n // \"changed after checked\" error.\n if (newAriaLabelledby !== this._triggerAriaLabelledBy) {\n const element = this._elementRef.nativeElement;\n this._triggerAriaLabelledBy = newAriaLabelledby;\n if (newAriaLabelledby) {\n element.setAttribute('aria-labelledby', newAriaLabelledby);\n }\n else {\n element.removeAttribute('aria-labelledby');\n }\n }\n if (ngControl) {\n // The disabled state might go out of sync if the form group is swapped out. See #17860.\n if (this._previousControl !== ngControl.control) {\n if (this._previousControl !== undefined &&\n ngControl.disabled !== null &&\n ngControl.disabled !== this.disabled) {\n this.disabled = ngControl.disabled;\n }\n this._previousControl = ngControl.control;\n }\n this.updateErrorState();\n }\n }\n ngOnChanges(changes) {\n // Updating the disabled state is handled by `mixinDisabled`, but we need to additionally let\n // the parent form field know to run change detection when the disabled state changes.\n if (changes['disabled'] || changes['userAriaDescribedBy']) {\n this.stateChanges.next();\n }\n if (changes['typeaheadDebounceInterval'] && this._keyManager) {\n this._keyManager.withTypeAhead(this._typeaheadDebounceInterval);\n }\n }\n ngOnDestroy() {\n this._destroy.next();\n this._destroy.complete();\n this.stateChanges.complete();\n }\n /** Toggles the overlay panel open or closed. */\n toggle() {\n this.panelOpen ? this.close() : this.open();\n }\n /** Opens the overlay panel. */\n open() {\n if (this._canOpen()) {\n this._panelOpen = true;\n this._keyManager.withHorizontalOrientation(null);\n this._highlightCorrectOption();\n this._changeDetectorRef.markForCheck();\n }\n }\n /** Closes the overlay panel and focuses the host element. */\n close() {\n if (this._panelOpen) {\n this._panelOpen = false;\n this._keyManager.withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr');\n this._changeDetectorRef.markForCheck();\n this._onTouched();\n }\n }\n /**\n * Sets the select's value. Part of the ControlValueAccessor interface\n * required to integrate with Angular's core forms API.\n *\n * @param value New value to be written to the model.\n */\n writeValue(value) {\n this._assignValue(value);\n }\n /**\n * Saves a callback function to be invoked when the select's value\n * changes from user input. Part of the ControlValueAccessor interface\n * required to integrate with Angular's core forms API.\n *\n * @param fn Callback to be triggered when the value changes.\n */\n registerOnChange(fn) {\n this._onChange = fn;\n }\n /**\n * Saves a callback function to be invoked when the select is blurred\n * by the user. Part of the ControlValueAccessor interface required\n * to integrate with Angular's core forms API.\n *\n * @param fn Callback to be triggered when the component has been touched.\n */\n registerOnTouched(fn) {\n this._onTouched = fn;\n }\n /**\n * Disables the select. Part of the ControlValueAccessor interface required\n * to integrate with Angular's core forms API.\n *\n * @param isDisabled Sets whether the component is disabled.\n */\n setDisabledState(isDisabled) {\n this.disabled = isDisabled;\n this._changeDetectorRef.markForCheck();\n this.stateChanges.next();\n }\n /** Whether or not the overlay panel is open. */\n get panelOpen() {\n return this._panelOpen;\n }\n /** The currently selected option. */\n get selected() {\n return this.multiple ? this._selectionModel?.selected || [] : this._selectionModel?.selected[0];\n }\n /** The value displayed in the trigger. */\n get triggerValue() {\n if (this.empty) {\n return '';\n }\n if (this._multiple) {\n const selectedOptions = this._selectionModel.selected.map(option => option.viewValue);\n if (this._isRtl()) {\n selectedOptions.reverse();\n }\n // TODO(crisbeto): delimiter should be configurable for proper localization.\n return selectedOptions.join(', ');\n }\n return this._selectionModel.selected[0].viewValue;\n }\n /** Whether the element is in RTL mode. */\n _isRtl() {\n return this._dir ? this._dir.value === 'rtl' : false;\n }\n /** Handles all keydown events on the select. */\n _handleKeydown(event) {\n if (!this.disabled) {\n this.panelOpen ? this._handleOpenKeydown(event) : this._handleClosedKeydown(event);\n }\n }\n /** Handles keyboard events while the select is closed. */\n _handleClosedKeydown(event) {\n const keyCode = event.keyCode;\n const isArrowKey = keyCode === DOWN_ARROW ||\n keyCode === UP_ARROW ||\n keyCode === LEFT_ARROW ||\n keyCode === RIGHT_ARROW;\n const isOpenKey = keyCode === ENTER || keyCode === SPACE;\n const manager = this._keyManager;\n // Open the select on ALT + arrow key to match the native \n event.preventDefault();\n this.close();\n // Don't do anything in this case if the user is typing,\n // because the typing sequence can include the space key.\n }\n else if (!isTyping &&\n (keyCode === ENTER || keyCode === SPACE) &&\n manager.activeItem &&\n !hasModifierKey(event)) {\n event.preventDefault();\n manager.activeItem._selectViaInteraction();\n }\n else if (!isTyping && this._multiple && keyCode === A && event.ctrlKey) {\n event.preventDefault();\n const hasDeselectedOptions = this.options.some(opt => !opt.disabled && !opt.selected);\n this.options.forEach(option => {\n if (!option.disabled) {\n hasDeselectedOptions ? option.select() : option.deselect();\n }\n });\n }\n else {\n const previouslyFocusedIndex = manager.activeItemIndex;\n manager.onKeydown(event);\n if (this._multiple &&\n isArrowKey &&\n event.shiftKey &&\n manager.activeItem &&\n manager.activeItemIndex !== previouslyFocusedIndex) {\n manager.activeItem._selectViaInteraction();\n }\n }\n }\n _onFocus() {\n if (!this.disabled) {\n this._focused = true;\n this.stateChanges.next();\n }\n }\n /**\n * Calls the touched callback only if the panel is closed. Otherwise, the trigger will\n * \"blur\" to the panel when it opens, causing a false positive.\n */\n _onBlur() {\n this._focused = false;\n if (!this.disabled && !this.panelOpen) {\n this._onTouched();\n this._changeDetectorRef.markForCheck();\n this.stateChanges.next();\n }\n }\n /**\n * Callback that is invoked when the overlay panel has been attached.\n */\n _onAttached() {\n this._overlayDir.positionChange.pipe(take(1)).subscribe(() => {\n this._changeDetectorRef.detectChanges();\n this._positioningSettled();\n });\n }\n /** Returns the theme to be used on the panel. */\n _getPanelTheme() {\n return this._parentFormField ? `mat-${this._parentFormField.color}` : '';\n }\n /** Whether the select has a value. */\n get empty() {\n return !this._selectionModel || this._selectionModel.isEmpty();\n }\n _initializeSelection() {\n // Defer setting the value in order to avoid the \"Expression\n // has changed after it was checked\" errors from Angular.\n Promise.resolve().then(() => {\n if (this.ngControl) {\n this._value = this.ngControl.value;\n }\n this._setSelectionByValue(this._value);\n this.stateChanges.next();\n });\n }\n /**\n * Sets the selected option based on a value. If no option can be\n * found with the designated value, the select trigger is cleared.\n */\n _setSelectionByValue(value) {\n this._selectionModel.selected.forEach(option => option.setInactiveStyles());\n this._selectionModel.clear();\n if (this.multiple && value) {\n if (!Array.isArray(value) && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getMatSelectNonArrayValueError();\n }\n value.forEach((currentValue) => this._selectOptionByValue(currentValue));\n this._sortValues();\n }\n else {\n const correspondingOption = this._selectOptionByValue(value);\n // Shift focus to the active item. Note that we shouldn't do this in multiple\n // mode, because we don't know what option the user interacted with last.\n if (correspondingOption) {\n this._keyManager.updateActiveItem(correspondingOption);\n }\n else if (!this.panelOpen) {\n // Otherwise reset the highlighted option. Note that we only want to do this while\n // closed, because doing it while open can shift the user's focus unnecessarily.\n this._keyManager.updateActiveItem(-1);\n }\n }\n this._changeDetectorRef.markForCheck();\n }\n /**\n * Finds and selects and option based on its value.\n * @returns Option that has the corresponding value.\n */\n _selectOptionByValue(value) {\n const correspondingOption = this.options.find((option) => {\n // Skip options that are already in the model. This allows us to handle cases\n // where the same primitive value is selected multiple times.\n if (this._selectionModel.isSelected(option)) {\n return false;\n }\n try {\n // Treat null as a special reset value.\n return option.value != null && this._compareWith(option.value, value);\n }\n catch (error) {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n // Notify developers of errors in their comparator.\n console.warn(error);\n }\n return false;\n }\n });\n if (correspondingOption) {\n this._selectionModel.select(correspondingOption);\n }\n return correspondingOption;\n }\n /** Assigns a specific value to the select. Returns whether the value has changed. */\n _assignValue(newValue) {\n // Always re-assign an array, because it might have been mutated.\n if (newValue !== this._value || (this._multiple && Array.isArray(newValue))) {\n if (this.options) {\n this._setSelectionByValue(newValue);\n }\n this._value = newValue;\n return true;\n }\n return false;\n }\n /** Sets up a key manager to listen to keyboard events on the overlay panel. */\n _initKeyManager() {\n this._keyManager = new ActiveDescendantKeyManager(this.options)\n .withTypeAhead(this._typeaheadDebounceInterval)\n .withVerticalOrientation()\n .withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr')\n .withHomeAndEnd()\n .withAllowedModifierKeys(['shiftKey']);\n this._keyManager.tabOut.pipe(takeUntil(this._destroy)).subscribe(() => {\n if (this.panelOpen) {\n // Select the active item when tabbing away. This is consistent with how the native\n // select behaves. Note that we only want to do this in single selection mode.\n if (!this.multiple && this._keyManager.activeItem) {\n this._keyManager.activeItem._selectViaInteraction();\n }\n // Restore focus to the trigger before closing. Ensures that the focus\n // position won't be lost if the user got focus into the overlay.\n this.focus();\n this.close();\n }\n });\n this._keyManager.change.pipe(takeUntil(this._destroy)).subscribe(() => {\n if (this._panelOpen && this.panel) {\n this._scrollOptionIntoView(this._keyManager.activeItemIndex || 0);\n }\n else if (!this._panelOpen && !this.multiple && this._keyManager.activeItem) {\n this._keyManager.activeItem._selectViaInteraction();\n }\n });\n }\n /** Drops current option subscriptions and IDs and resets from scratch. */\n _resetOptions() {\n const changedOrDestroyed = merge(this.options.changes, this._destroy);\n this.optionSelectionChanges.pipe(takeUntil(changedOrDestroyed)).subscribe(event => {\n this._onSelect(event.source, event.isUserInput);\n if (event.isUserInput && !this.multiple && this._panelOpen) {\n this.close();\n this.focus();\n }\n });\n // Listen to changes in the internal state of the options and react accordingly.\n // Handles cases like the labels of the selected options changing.\n merge(...this.options.map(option => option._stateChanges))\n .pipe(takeUntil(changedOrDestroyed))\n .subscribe(() => {\n this._changeDetectorRef.markForCheck();\n this.stateChanges.next();\n });\n }\n /** Invoked when an option is clicked. */\n _onSelect(option, isUserInput) {\n const wasSelected = this._selectionModel.isSelected(option);\n if (option.value == null && !this._multiple) {\n option.deselect();\n this._selectionModel.clear();\n if (this.value != null) {\n this._propagateChanges(option.value);\n }\n }\n else {\n if (wasSelected !== option.selected) {\n option.selected\n ? this._selectionModel.select(option)\n : this._selectionModel.deselect(option);\n }\n if (isUserInput) {\n this._keyManager.setActiveItem(option);\n }\n if (this.multiple) {\n this._sortValues();\n if (isUserInput) {\n // In case the user selected the option with their mouse, we\n // want to restore focus back to the trigger, in order to\n // prevent the select keyboard controls from clashing with\n // the ones from `mat-option`.\n this.focus();\n }\n }\n }\n if (wasSelected !== this._selectionModel.isSelected(option)) {\n this._propagateChanges();\n }\n this.stateChanges.next();\n }\n /** Sorts the selected values in the selected based on their order in the panel. */\n _sortValues() {\n if (this.multiple) {\n const options = this.options.toArray();\n this._selectionModel.sort((a, b) => {\n return this.sortComparator\n ? this.sortComparator(a, b, options)\n : options.indexOf(a) - options.indexOf(b);\n });\n this.stateChanges.next();\n }\n }\n /** Emits change event to set the model value. */\n _propagateChanges(fallbackValue) {\n let valueToEmit = null;\n if (this.multiple) {\n valueToEmit = this.selected.map(option => option.value);\n }\n else {\n valueToEmit = this.selected ? this.selected.value : fallbackValue;\n }\n this._value = valueToEmit;\n this.valueChange.emit(valueToEmit);\n this._onChange(valueToEmit);\n this.selectionChange.emit(this._getChangeEvent(valueToEmit));\n this._changeDetectorRef.markForCheck();\n }\n /**\n * Highlights the selected item. If no option is selected, it will highlight\n * the first item instead.\n */\n _highlightCorrectOption() {\n if (this._keyManager) {\n if (this.empty) {\n this._keyManager.setFirstItemActive();\n }\n else {\n this._keyManager.setActiveItem(this._selectionModel.selected[0]);\n }\n }\n }\n /** Whether the panel is allowed to open. */\n _canOpen() {\n return !this._panelOpen && !this.disabled && this.options?.length > 0;\n }\n /** Focuses the select element. */\n focus(options) {\n this._elementRef.nativeElement.focus(options);\n }\n /** Gets the aria-labelledby for the select panel. */\n _getPanelAriaLabelledby() {\n if (this.ariaLabel) {\n return null;\n }\n const labelId = this._parentFormField?.getLabelId();\n const labelExpression = labelId ? labelId + ' ' : '';\n return this.ariaLabelledby ? labelExpression + this.ariaLabelledby : labelId;\n }\n /** Determines the `aria-activedescendant` to be set on the host. */\n _getAriaActiveDescendant() {\n if (this.panelOpen && this._keyManager && this._keyManager.activeItem) {\n return this._keyManager.activeItem.id;\n }\n return null;\n }\n /** Gets the aria-labelledby of the select component trigger. */\n _getTriggerAriaLabelledby() {\n if (this.ariaLabel) {\n return null;\n }\n const labelId = this._parentFormField?.getLabelId();\n let value = (labelId ? labelId + ' ' : '') + this._valueId;\n if (this.ariaLabelledby) {\n value += ' ' + this.ariaLabelledby;\n }\n return value;\n }\n /** Called when the overlay panel is done animating. */\n _panelDoneAnimating(isOpen) {\n this.openedChange.emit(isOpen);\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 }\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 this.focus();\n this.open();\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get shouldLabelFloat() {\n return this._panelOpen || !this.empty || (this._focused && !!this._placeholder);\n }\n}\n_MatSelectBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: _MatSelectBase, deps: [{ token: i1.ViewportRuler }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i2.ErrorStateMatcher }, { token: i0.ElementRef }, { token: i3.Directionality, optional: true }, { token: i4.NgForm, optional: true }, { token: i4.FormGroupDirective, optional: true }, { token: MAT_FORM_FIELD, optional: true }, { token: i4.NgControl, optional: true, self: true }, { token: 'tabindex', attribute: true }, { token: MAT_SELECT_SCROLL_STRATEGY }, { token: i5.LiveAnnouncer }, { token: MAT_SELECT_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Directive });\n_MatSelectBase.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: _MatSelectBase, inputs: { userAriaDescribedBy: [\"aria-describedby\", \"userAriaDescribedBy\"], panelClass: \"panelClass\", placeholder: \"placeholder\", required: \"required\", multiple: \"multiple\", disableOptionCentering: \"disableOptionCentering\", compareWith: \"compareWith\", value: \"value\", ariaLabel: [\"aria-label\", \"ariaLabel\"], ariaLabelledby: [\"aria-labelledby\", \"ariaLabelledby\"], errorStateMatcher: \"errorStateMatcher\", typeaheadDebounceInterval: \"typeaheadDebounceInterval\", sortComparator: \"sortComparator\", id: \"id\" }, outputs: { openedChange: \"openedChange\", _openedStream: \"opened\", _closedStream: \"closed\", selectionChange: \"selectionChange\", valueChange: \"valueChange\" }, viewQueries: [{ propertyName: \"trigger\", first: true, predicate: [\"trigger\"], descendants: true }, { propertyName: \"panel\", first: true, predicate: [\"panel\"], descendants: true }, { propertyName: \"_overlayDir\", first: true, predicate: CdkConnectedOverlay, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: _MatSelectBase, decorators: [{\n type: Directive\n }], ctorParameters: function () { return [{ type: i1.ViewportRuler }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i2.ErrorStateMatcher }, { type: i0.ElementRef }, { type: i3.Directionality, decorators: [{\n type: Optional\n }] }, { type: i4.NgForm, decorators: [{\n type: Optional\n }] }, { type: i4.FormGroupDirective, decorators: [{\n type: Optional\n }] }, { type: i6.MatFormField, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_FORM_FIELD]\n }] }, { type: i4.NgControl, decorators: [{\n type: Self\n }, {\n type: Optional\n }] }, { type: undefined, decorators: [{\n type: Attribute,\n args: ['tabindex']\n }] }, { type: undefined, decorators: [{\n type: Inject,\n args: [MAT_SELECT_SCROLL_STRATEGY]\n }] }, { type: i5.LiveAnnouncer }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_SELECT_CONFIG]\n }] }]; }, propDecorators: { userAriaDescribedBy: [{\n type: Input,\n args: ['aria-describedby']\n }], trigger: [{\n type: ViewChild,\n args: ['trigger']\n }], panel: [{\n type: ViewChild,\n args: ['panel']\n }], _overlayDir: [{\n type: ViewChild,\n args: [CdkConnectedOverlay]\n }], panelClass: [{\n type: Input\n }], placeholder: [{\n type: Input\n }], required: [{\n type: Input\n }], multiple: [{\n type: Input\n }], disableOptionCentering: [{\n type: Input\n }], compareWith: [{\n type: Input\n }], value: [{\n type: Input\n }], ariaLabel: [{\n type: Input,\n args: ['aria-label']\n }], ariaLabelledby: [{\n type: Input,\n args: ['aria-labelledby']\n }], errorStateMatcher: [{\n type: Input\n }], typeaheadDebounceInterval: [{\n type: Input\n }], sortComparator: [{\n type: Input\n }], id: [{\n type: Input\n }], openedChange: [{\n type: Output\n }], _openedStream: [{\n type: Output,\n args: ['opened']\n }], _closedStream: [{\n type: Output,\n args: ['closed']\n }], selectionChange: [{\n type: Output\n }], valueChange: [{\n type: Output\n }] } });\nclass MatSelect extends _MatSelectBase {\n constructor() {\n super(...arguments);\n /** The scroll position of the overlay panel, calculated to center the selected option. */\n this._scrollTop = 0;\n /** The cached font-size of the trigger element. */\n this._triggerFontSize = 0;\n /** The value of the select panel's transform-origin property. */\n this._transformOrigin = 'top';\n /**\n * The y-offset of the overlay panel in relation to the trigger's top start corner.\n * This must be adjusted to align the selected option text over the trigger text.\n * when the panel opens. Will change based on the y-position of the selected option.\n */\n this._offsetY = 0;\n this._positions = [\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'top',\n },\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'bottom',\n },\n ];\n }\n /**\n * Calculates the scroll position of the select's overlay panel.\n *\n * Attempts to center the selected option in the panel. If the option is\n * too high or too low in the panel to be scrolled to the center, it clamps the\n * scroll position to the min or max scroll positions respectively.\n */\n _calculateOverlayScroll(selectedIndex, scrollBuffer, maxScroll) {\n const itemHeight = this._getItemHeight();\n const optionOffsetFromScrollTop = itemHeight * selectedIndex;\n const halfOptionHeight = itemHeight / 2;\n // Starts at the optionOffsetFromScrollTop, which scrolls the option to the top of the\n // scroll container, then subtracts the scroll buffer to scroll the option down to\n // the center of the overlay panel. Half the option height must be re-added to the\n // scrollTop so the option is centered based on its middle, not its top edge.\n const optimalScrollPosition = optionOffsetFromScrollTop - scrollBuffer + halfOptionHeight;\n return Math.min(Math.max(0, optimalScrollPosition), maxScroll);\n }\n ngOnInit() {\n super.ngOnInit();\n this._viewportRuler\n .change()\n .pipe(takeUntil(this._destroy))\n .subscribe(() => {\n if (this.panelOpen) {\n this._triggerRect = this.trigger.nativeElement.getBoundingClientRect();\n this._changeDetectorRef.markForCheck();\n }\n });\n }\n open() {\n if (super._canOpen()) {\n super.open();\n this._triggerRect = this.trigger.nativeElement.getBoundingClientRect();\n // Note: The computed font-size will be a string pixel value (e.g. \"16px\").\n // `parseInt` ignores the trailing 'px' and converts this to a number.\n this._triggerFontSize = parseInt(getComputedStyle(this.trigger.nativeElement).fontSize || '0');\n this._calculateOverlayPosition();\n // Set the font size on the panel element once it exists.\n this._ngZone.onStable.pipe(take(1)).subscribe(() => {\n if (this._triggerFontSize &&\n this._overlayDir.overlayRef &&\n this._overlayDir.overlayRef.overlayElement) {\n this._overlayDir.overlayRef.overlayElement.style.fontSize = `${this._triggerFontSize}px`;\n }\n });\n }\n }\n /** Scrolls the active option into view. */\n _scrollOptionIntoView(index) {\n const labelCount = _countGroupLabelsBeforeOption(index, this.options, this.optionGroups);\n const itemHeight = this._getItemHeight();\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 this.panel.nativeElement.scrollTop = 0;\n }\n else {\n this.panel.nativeElement.scrollTop = _getOptionScrollPosition((index + labelCount) * itemHeight, itemHeight, this.panel.nativeElement.scrollTop, SELECT_PANEL_MAX_HEIGHT);\n }\n }\n _positioningSettled() {\n this._calculateOverlayOffsetX();\n this.panel.nativeElement.scrollTop = this._scrollTop;\n }\n _panelDoneAnimating(isOpen) {\n if (this.panelOpen) {\n this._scrollTop = 0;\n }\n else {\n this._overlayDir.offsetX = 0;\n this._changeDetectorRef.markForCheck();\n }\n super._panelDoneAnimating(isOpen);\n }\n _getChangeEvent(value) {\n return new MatSelectChange(this, value);\n }\n /**\n * Sets the x-offset of the overlay panel in relation to the trigger's top start corner.\n * This must be adjusted to align the selected option text over the trigger text when\n * the panel opens. Will change based on LTR or RTL text direction. Note that the offset\n * can't be calculated until the panel has been attached, because we need to know the\n * content width in order to constrain the panel within the viewport.\n */\n _calculateOverlayOffsetX() {\n const overlayRect = this._overlayDir.overlayRef.overlayElement.getBoundingClientRect();\n const viewportSize = this._viewportRuler.getViewportSize();\n const isRtl = this._isRtl();\n const paddingWidth = this.multiple\n ? SELECT_MULTIPLE_PANEL_PADDING_X + SELECT_PANEL_PADDING_X\n : SELECT_PANEL_PADDING_X * 2;\n let offsetX;\n // Adjust the offset, depending on the option padding.\n if (this.multiple) {\n offsetX = SELECT_MULTIPLE_PANEL_PADDING_X;\n }\n else if (this.disableOptionCentering) {\n offsetX = SELECT_PANEL_PADDING_X;\n }\n else {\n let selected = this._selectionModel.selected[0] || this.options.first;\n offsetX = selected && selected.group ? SELECT_PANEL_INDENT_PADDING_X : SELECT_PANEL_PADDING_X;\n }\n // Invert the offset in LTR.\n if (!isRtl) {\n offsetX *= -1;\n }\n // Determine how much the select overflows on each side.\n const leftOverflow = 0 - (overlayRect.left + offsetX - (isRtl ? paddingWidth : 0));\n const rightOverflow = overlayRect.right + offsetX - viewportSize.width + (isRtl ? 0 : paddingWidth);\n // If the element overflows on either side, reduce the offset to allow it to fit.\n if (leftOverflow > 0) {\n offsetX += leftOverflow + SELECT_PANEL_VIEWPORT_PADDING;\n }\n else if (rightOverflow > 0) {\n offsetX -= rightOverflow + SELECT_PANEL_VIEWPORT_PADDING;\n }\n // Set the offset directly in order to avoid having to go through change detection and\n // potentially triggering \"changed after it was checked\" errors. Round the value to avoid\n // blurry content in some browsers.\n this._overlayDir.offsetX = Math.round(offsetX);\n this._overlayDir.overlayRef.updatePosition();\n }\n /**\n * Calculates the y-offset of the select's overlay panel in relation to the\n * top start corner of the trigger. It has to be adjusted in order for the\n * selected option to be aligned over the trigger when the panel opens.\n */\n _calculateOverlayOffsetY(selectedIndex, scrollBuffer, maxScroll) {\n const itemHeight = this._getItemHeight();\n const optionHeightAdjustment = (itemHeight - this._triggerRect.height) / 2;\n const maxOptionsDisplayed = Math.floor(SELECT_PANEL_MAX_HEIGHT / itemHeight);\n let optionOffsetFromPanelTop;\n // Disable offset if requested by user by returning 0 as value to offset\n if (this.disableOptionCentering) {\n return 0;\n }\n if (this._scrollTop === 0) {\n optionOffsetFromPanelTop = selectedIndex * itemHeight;\n }\n else if (this._scrollTop === maxScroll) {\n const firstDisplayedIndex = this._getItemCount() - maxOptionsDisplayed;\n const selectedDisplayIndex = selectedIndex - firstDisplayedIndex;\n // The first item is partially out of the viewport. Therefore we need to calculate what\n // portion of it is shown in the viewport and account for it in our offset.\n let partialItemHeight = itemHeight - ((this._getItemCount() * itemHeight - SELECT_PANEL_MAX_HEIGHT) % itemHeight);\n // Because the panel height is longer than the height of the options alone,\n // there is always extra padding at the top or bottom of the panel. When\n // scrolled to the very bottom, this padding is at the top of the panel and\n // must be added to the offset.\n optionOffsetFromPanelTop = selectedDisplayIndex * itemHeight + partialItemHeight;\n }\n else {\n // If the option was scrolled to the middle of the panel using a scroll buffer,\n // its offset will be the scroll buffer minus the half height that was added to\n // center it.\n optionOffsetFromPanelTop = scrollBuffer - itemHeight / 2;\n }\n // The final offset is the option's offset from the top, adjusted for the height difference,\n // multiplied by -1 to ensure that the overlay moves in the correct direction up the page.\n // The value is rounded to prevent some browsers from blurring the content.\n return Math.round(optionOffsetFromPanelTop * -1 - optionHeightAdjustment);\n }\n /**\n * Checks that the attempted overlay position will fit within the viewport.\n * If it will not fit, tries to adjust the scroll position and the associated\n * y-offset so the panel can open fully on-screen. If it still won't fit,\n * sets the offset back to 0 to allow the fallback position to take over.\n */\n _checkOverlayWithinViewport(maxScroll) {\n const itemHeight = this._getItemHeight();\n const viewportSize = this._viewportRuler.getViewportSize();\n const topSpaceAvailable = this._triggerRect.top - SELECT_PANEL_VIEWPORT_PADDING;\n const bottomSpaceAvailable = viewportSize.height - this._triggerRect.bottom - SELECT_PANEL_VIEWPORT_PADDING;\n const panelHeightTop = Math.abs(this._offsetY);\n const totalPanelHeight = Math.min(this._getItemCount() * itemHeight, SELECT_PANEL_MAX_HEIGHT);\n const panelHeightBottom = totalPanelHeight - panelHeightTop - this._triggerRect.height;\n if (panelHeightBottom > bottomSpaceAvailable) {\n this._adjustPanelUp(panelHeightBottom, bottomSpaceAvailable);\n }\n else if (panelHeightTop > topSpaceAvailable) {\n this._adjustPanelDown(panelHeightTop, topSpaceAvailable, maxScroll);\n }\n else {\n this._transformOrigin = this._getOriginBasedOnOption();\n }\n }\n /** Adjusts the overlay panel up to fit in the viewport. */\n _adjustPanelUp(panelHeightBottom, bottomSpaceAvailable) {\n // Browsers ignore fractional scroll offsets, so we need to round.\n const distanceBelowViewport = Math.round(panelHeightBottom - bottomSpaceAvailable);\n // Scrolls the panel up by the distance it was extending past the boundary, then\n // adjusts the offset by that amount to move the panel up into the viewport.\n this._scrollTop -= distanceBelowViewport;\n this._offsetY -= distanceBelowViewport;\n this._transformOrigin = this._getOriginBasedOnOption();\n // If the panel is scrolled to the very top, it won't be able to fit the panel\n // by scrolling, so set the offset to 0 to allow the fallback position to take\n // effect.\n if (this._scrollTop <= 0) {\n this._scrollTop = 0;\n this._offsetY = 0;\n this._transformOrigin = `50% bottom 0px`;\n }\n }\n /** Adjusts the overlay panel down to fit in the viewport. */\n _adjustPanelDown(panelHeightTop, topSpaceAvailable, maxScroll) {\n // Browsers ignore fractional scroll offsets, so we need to round.\n const distanceAboveViewport = Math.round(panelHeightTop - topSpaceAvailable);\n // Scrolls the panel down by the distance it was extending past the boundary, then\n // adjusts the offset by that amount to move the panel down into the viewport.\n this._scrollTop += distanceAboveViewport;\n this._offsetY += distanceAboveViewport;\n this._transformOrigin = this._getOriginBasedOnOption();\n // If the panel is scrolled to the very bottom, it won't be able to fit the\n // panel by scrolling, so set the offset to 0 to allow the fallback position\n // to take effect.\n if (this._scrollTop >= maxScroll) {\n this._scrollTop = maxScroll;\n this._offsetY = 0;\n this._transformOrigin = `50% top 0px`;\n return;\n }\n }\n /** Calculates the scroll position and x- and y-offsets of the overlay panel. */\n _calculateOverlayPosition() {\n const itemHeight = this._getItemHeight();\n const items = this._getItemCount();\n const panelHeight = Math.min(items * itemHeight, SELECT_PANEL_MAX_HEIGHT);\n const scrollContainerHeight = items * itemHeight;\n // The farthest the panel can be scrolled before it hits the bottom\n const maxScroll = scrollContainerHeight - panelHeight;\n // If no value is selected we open the popup to the first item.\n let selectedOptionOffset;\n if (this.empty) {\n selectedOptionOffset = 0;\n }\n else {\n selectedOptionOffset = Math.max(this.options.toArray().indexOf(this._selectionModel.selected[0]), 0);\n }\n selectedOptionOffset += _countGroupLabelsBeforeOption(selectedOptionOffset, this.options, this.optionGroups);\n // We must maintain a scroll buffer so the selected option will be scrolled to the\n // center of the overlay panel rather than the top.\n const scrollBuffer = panelHeight / 2;\n this._scrollTop = this._calculateOverlayScroll(selectedOptionOffset, scrollBuffer, maxScroll);\n this._offsetY = this._calculateOverlayOffsetY(selectedOptionOffset, scrollBuffer, maxScroll);\n this._checkOverlayWithinViewport(maxScroll);\n }\n /** Sets the transform origin point based on the selected option. */\n _getOriginBasedOnOption() {\n const itemHeight = this._getItemHeight();\n const optionHeightAdjustment = (itemHeight - this._triggerRect.height) / 2;\n const originY = Math.abs(this._offsetY) - optionHeightAdjustment + itemHeight / 2;\n return `50% ${originY}px 0px`;\n }\n /** Calculates the height of the select's options. */\n _getItemHeight() {\n return this._triggerFontSize * SELECT_ITEM_HEIGHT_EM;\n }\n /** Calculates the amount of items in the select. This includes options and group labels. */\n _getItemCount() {\n return this.options.length + this.optionGroups.length;\n }\n}\nMatSelect.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatSelect, deps: null, target: i0.ɵɵFactoryTarget.Component });\nMatSelect.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatSelect, selector: \"mat-select\", inputs: { disabled: \"disabled\", disableRipple: \"disableRipple\", tabIndex: \"tabIndex\" }, host: { attributes: { \"role\": \"combobox\", \"aria-autocomplete\": \"none\", \"aria-haspopup\": \"true\" }, listeners: { \"keydown\": \"_handleKeydown($event)\", \"focus\": \"_onFocus()\", \"blur\": \"_onBlur()\" }, properties: { \"attr.id\": \"id\", \"attr.tabindex\": \"tabIndex\", \"attr.aria-controls\": \"panelOpen ? id + \\\"-panel\\\" : null\", \"attr.aria-expanded\": \"panelOpen\", \"attr.aria-label\": \"ariaLabel || null\", \"attr.aria-required\": \"required.toString()\", \"attr.aria-disabled\": \"disabled.toString()\", \"attr.aria-invalid\": \"errorState\", \"attr.aria-activedescendant\": \"_getAriaActiveDescendant()\", \"class.mat-select-disabled\": \"disabled\", \"class.mat-select-invalid\": \"errorState\", \"class.mat-select-required\": \"required\", \"class.mat-select-empty\": \"empty\", \"class.mat-select-multiple\": \"multiple\" }, classAttribute: \"mat-select\" }, providers: [\n { provide: MatFormFieldControl, useExisting: MatSelect },\n { provide: MAT_OPTION_PARENT_COMPONENT, useExisting: MatSelect },\n ], queries: [{ propertyName: \"customTrigger\", first: true, predicate: MAT_SELECT_TRIGGER, descendants: true }, { propertyName: \"options\", predicate: MatOption, descendants: true }, { propertyName: \"optionGroups\", predicate: MAT_OPTGROUP, descendants: true }], exportAs: [\"matSelect\"], usesInheritance: true, ngImport: i0, template: \"\\n
\\n
\\n {{placeholder}}\\n \\n {{triggerValue}}\\n \\n \\n
\\n\\n
\\n
\\n\\n\\n
\\n \\n \\n
\\n \\n\\n\", styles: [\".mat-select{display:inline-block;width:100%;outline:none}.mat-select-trigger{display:inline-flex;align-items:center;cursor:pointer;position:relative;box-sizing:border-box;width:100%}.mat-select-disabled .mat-select-trigger{-webkit-user-select:none;user-select:none;cursor:default}.mat-select-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-select-arrow-wrapper{height:16px;flex-shrink:0;display:inline-flex;align-items:center}.mat-form-field-appearance-fill .mat-select-arrow-wrapper{transform:translateY(-50%)}.mat-form-field-appearance-outline .mat-select-arrow-wrapper{transform:translateY(-25%)}.mat-form-field-appearance-standard.mat-form-field-has-label .mat-select:not(.mat-select-empty) .mat-select-arrow-wrapper{transform:translateY(-50%)}.mat-form-field-appearance-standard .mat-select.mat-select-empty .mat-select-arrow-wrapper{transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}._mat-animation-noopable.mat-form-field-appearance-standard .mat-select.mat-select-empty .mat-select-arrow-wrapper{transition:none}.mat-select-arrow{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;margin:0 4px}.mat-form-field.mat-focused .mat-select-arrow{transform:translateX(0)}.mat-select-panel-wrap{flex-basis:100%}.mat-select-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;padding-top:0;padding-bottom:0;max-height:256px;min-width:100%;border-radius:4px;outline:0}.cdk-high-contrast-active .mat-select-panel{outline:solid 1px}.mat-select-panel .mat-optgroup-label,.mat-select-panel .mat-option{font-size:inherit;line-height:3em;height:3em}.mat-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-form-field-flex{cursor:pointer}.mat-form-field-type-mat-select .mat-form-field-label{width:calc(100% - 18px)}.mat-select-placeholder{transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}._mat-animation-noopable .mat-select-placeholder{transition:none}.mat-form-field-hide-placeholder .mat-select-placeholder{color:rgba(0,0,0,0);-webkit-text-fill-color:rgba(0,0,0,0);transition:none;display:block}.mat-select-min-line:empty::before{content:\\\" \\\";white-space:pre;width:1px;display:inline-block;visibility:hidden}\"], dependencies: [{ kind: \"directive\", type: i7.NgClass, selector: \"[ngClass]\", inputs: [\"class\", \"ngClass\"] }, { kind: \"directive\", type: i7.NgSwitch, selector: \"[ngSwitch]\", inputs: [\"ngSwitch\"] }, { kind: \"directive\", type: i7.NgSwitchCase, selector: \"[ngSwitchCase]\", inputs: [\"ngSwitchCase\"] }, { kind: \"directive\", type: i7.NgSwitchDefault, selector: \"[ngSwitchDefault]\" }, { kind: \"directive\", type: i8.CdkConnectedOverlay, selector: \"[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]\", inputs: [\"cdkConnectedOverlayOrigin\", \"cdkConnectedOverlayPositions\", \"cdkConnectedOverlayPositionStrategy\", \"cdkConnectedOverlayOffsetX\", \"cdkConnectedOverlayOffsetY\", \"cdkConnectedOverlayWidth\", \"cdkConnectedOverlayHeight\", \"cdkConnectedOverlayMinWidth\", \"cdkConnectedOverlayMinHeight\", \"cdkConnectedOverlayBackdropClass\", \"cdkConnectedOverlayPanelClass\", \"cdkConnectedOverlayViewportMargin\", \"cdkConnectedOverlayScrollStrategy\", \"cdkConnectedOverlayOpen\", \"cdkConnectedOverlayDisableClose\", \"cdkConnectedOverlayTransformOriginOn\", \"cdkConnectedOverlayHasBackdrop\", \"cdkConnectedOverlayLockPosition\", \"cdkConnectedOverlayFlexibleDimensions\", \"cdkConnectedOverlayGrowAfterOpen\", \"cdkConnectedOverlayPush\"], outputs: [\"backdropClick\", \"positionChange\", \"attach\", \"detach\", \"overlayKeydown\", \"overlayOutsideClick\"], exportAs: [\"cdkConnectedOverlay\"] }, { kind: \"directive\", type: i8.CdkOverlayOrigin, selector: \"[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]\", exportAs: [\"cdkOverlayOrigin\"] }], animations: [matSelectAnimations.transformPanelWrap, matSelectAnimations.transformPanel], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatSelect, decorators: [{\n type: Component,\n args: [{ selector: 'mat-select', exportAs: 'matSelect', inputs: ['disabled', 'disableRipple', 'tabIndex'], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {\n 'role': 'combobox',\n 'aria-autocomplete': 'none',\n // TODO(crisbeto): the value for aria-haspopup should be `listbox`, but currently it's difficult\n // to sync into Google, because of an outdated automated a11y check which flags it as an invalid\n // value. At some point we should try to switch it back to being `listbox`.\n 'aria-haspopup': 'true',\n 'class': 'mat-select',\n '[attr.id]': 'id',\n '[attr.tabindex]': 'tabIndex',\n '[attr.aria-controls]': 'panelOpen ? id + \"-panel\" : null',\n '[attr.aria-expanded]': 'panelOpen',\n '[attr.aria-label]': 'ariaLabel || null',\n '[attr.aria-required]': 'required.toString()',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[attr.aria-invalid]': 'errorState',\n '[attr.aria-activedescendant]': '_getAriaActiveDescendant()',\n '[class.mat-select-disabled]': 'disabled',\n '[class.mat-select-invalid]': 'errorState',\n '[class.mat-select-required]': 'required',\n '[class.mat-select-empty]': 'empty',\n '[class.mat-select-multiple]': 'multiple',\n '(keydown)': '_handleKeydown($event)',\n '(focus)': '_onFocus()',\n '(blur)': '_onBlur()',\n }, animations: [matSelectAnimations.transformPanelWrap, matSelectAnimations.transformPanel], providers: [\n { provide: MatFormFieldControl, useExisting: MatSelect },\n { provide: MAT_OPTION_PARENT_COMPONENT, useExisting: MatSelect },\n ], template: \"\\n
\\n
\\n {{placeholder}}\\n \\n {{triggerValue}}\\n \\n \\n
\\n\\n
\\n
\\n\\n\\n
\\n \\n \\n
\\n \\n\\n\", styles: [\".mat-select{display:inline-block;width:100%;outline:none}.mat-select-trigger{display:inline-flex;align-items:center;cursor:pointer;position:relative;box-sizing:border-box;width:100%}.mat-select-disabled .mat-select-trigger{-webkit-user-select:none;user-select:none;cursor:default}.mat-select-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-select-arrow-wrapper{height:16px;flex-shrink:0;display:inline-flex;align-items:center}.mat-form-field-appearance-fill .mat-select-arrow-wrapper{transform:translateY(-50%)}.mat-form-field-appearance-outline .mat-select-arrow-wrapper{transform:translateY(-25%)}.mat-form-field-appearance-standard.mat-form-field-has-label .mat-select:not(.mat-select-empty) .mat-select-arrow-wrapper{transform:translateY(-50%)}.mat-form-field-appearance-standard .mat-select.mat-select-empty .mat-select-arrow-wrapper{transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}._mat-animation-noopable.mat-form-field-appearance-standard .mat-select.mat-select-empty .mat-select-arrow-wrapper{transition:none}.mat-select-arrow{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;margin:0 4px}.mat-form-field.mat-focused .mat-select-arrow{transform:translateX(0)}.mat-select-panel-wrap{flex-basis:100%}.mat-select-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;padding-top:0;padding-bottom:0;max-height:256px;min-width:100%;border-radius:4px;outline:0}.cdk-high-contrast-active .mat-select-panel{outline:solid 1px}.mat-select-panel .mat-optgroup-label,.mat-select-panel .mat-option{font-size:inherit;line-height:3em;height:3em}.mat-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-form-field-flex{cursor:pointer}.mat-form-field-type-mat-select .mat-form-field-label{width:calc(100% - 18px)}.mat-select-placeholder{transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}._mat-animation-noopable .mat-select-placeholder{transition:none}.mat-form-field-hide-placeholder .mat-select-placeholder{color:rgba(0,0,0,0);-webkit-text-fill-color:rgba(0,0,0,0);transition:none;display:block}.mat-select-min-line:empty::before{content:\\\" \\\";white-space:pre;width:1px;display:inline-block;visibility:hidden}\"] }]\n }], propDecorators: { options: [{\n type: ContentChildren,\n args: [MatOption, { descendants: true }]\n }], optionGroups: [{\n type: ContentChildren,\n args: [MAT_OPTGROUP, { descendants: true }]\n }], customTrigger: [{\n type: ContentChild,\n args: [MAT_SELECT_TRIGGER]\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatSelectModule {\n}\nMatSelectModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatSelectModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nMatSelectModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.2.0\", ngImport: i0, type: MatSelectModule, declarations: [MatSelect, MatSelectTrigger], imports: [CommonModule, OverlayModule, MatOptionModule, MatCommonModule], exports: [CdkScrollableModule,\n MatFormFieldModule,\n MatSelect,\n MatSelectTrigger,\n MatOptionModule,\n MatCommonModule] });\nMatSelectModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatSelectModule, providers: [MAT_SELECT_SCROLL_STRATEGY_PROVIDER], imports: [CommonModule, OverlayModule, MatOptionModule, MatCommonModule, CdkScrollableModule,\n MatFormFieldModule,\n MatOptionModule,\n MatCommonModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatSelectModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [CommonModule, OverlayModule, MatOptionModule, MatCommonModule],\n exports: [\n CdkScrollableModule,\n MatFormFieldModule,\n MatSelect,\n MatSelectTrigger,\n MatOptionModule,\n MatCommonModule,\n ],\n declarations: [MatSelect, MatSelectTrigger],\n providers: [MAT_SELECT_SCROLL_STRATEGY_PROVIDER],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MAT_SELECT_CONFIG, MAT_SELECT_SCROLL_STRATEGY, MAT_SELECT_SCROLL_STRATEGY_PROVIDER, MAT_SELECT_SCROLL_STRATEGY_PROVIDER_FACTORY, MAT_SELECT_TRIGGER, MatSelect, MatSelectChange, MatSelectModule, MatSelectTrigger, _MatSelectBase, matSelectAnimations };\n","import * as i7 from '@angular/cdk/a11y';\nimport { FocusKeyManager, A11yModule } from '@angular/cdk/a11y';\nimport * as i5 from '@angular/cdk/observers';\nimport { ObserversModule } from '@angular/cdk/observers';\nimport * as i2 from '@angular/cdk/portal';\nimport { CdkPortal, TemplatePortal, CdkPortalOutlet, PortalModule } from '@angular/cdk/portal';\nimport * as i1$2 from '@angular/common';\nimport { DOCUMENT, CommonModule } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { InjectionToken, Directive, Inject, Optional, TemplateRef, Component, ChangeDetectionStrategy, ViewEncapsulation, ContentChild, ViewChild, Input, forwardRef, EventEmitter, Output, ContentChildren, QueryList, Attribute, NgModule } from '@angular/core';\nimport * as i4 from '@angular/material/core';\nimport { mixinDisabled, mixinColor, mixinDisableRipple, mixinTabIndex, MAT_RIPPLE_GLOBAL_OPTIONS, RippleRenderer, MatCommonModule, MatRippleModule } from '@angular/material/core';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\nimport { take, startWith, distinctUntilChanged, takeUntil, switchMap, skip, filter } from 'rxjs/operators';\nimport { Subject, Subscription, fromEvent, of, merge, EMPTY, Observable, timer } from 'rxjs';\nimport * as i1 from '@angular/cdk/bidi';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport * as i1$1 from '@angular/cdk/scrolling';\nimport * as i3 from '@angular/cdk/platform';\nimport { normalizePassiveListenerOptions } from '@angular/cdk/platform';\nimport { hasModifierKey, SPACE, ENTER } from '@angular/cdk/keycodes';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Injection token for the MatInkBar's Positioner. */\nconst _MAT_INK_BAR_POSITIONER = new InjectionToken('MatInkBarPositioner', {\n providedIn: 'root',\n factory: _MAT_INK_BAR_POSITIONER_FACTORY,\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/**\n * The ink-bar is used to display and animate the line underneath the current active tab label.\n * @docs-private\n */\nclass MatInkBar {\n constructor(_elementRef, _ngZone, _inkBarPositioner, _animationMode) {\n this._elementRef = _elementRef;\n this._ngZone = _ngZone;\n this._inkBarPositioner = _inkBarPositioner;\n this._animationMode = _animationMode;\n }\n /**\n * Calculates the styles from the provided element in order to align the ink-bar to that element.\n * Shows the ink bar if previously set as hidden.\n * @param element\n */\n alignToElement(element) {\n this.show();\n // `onStable` might not run for a while if the zone has already stabilized.\n // Wrap the call in `NgZone.run` to ensure that it runs relatively soon.\n this._ngZone.run(() => {\n this._ngZone.onStable.pipe(take(1)).subscribe(() => {\n const positions = this._inkBarPositioner(element);\n const inkBar = this._elementRef.nativeElement;\n inkBar.style.left = positions.left;\n inkBar.style.width = positions.width;\n });\n });\n }\n /** Shows the ink bar. */\n show() {\n this._elementRef.nativeElement.style.visibility = 'visible';\n }\n /** Hides the ink bar. */\n hide() {\n this._elementRef.nativeElement.style.visibility = 'hidden';\n }\n}\nMatInkBar.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatInkBar, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: _MAT_INK_BAR_POSITIONER }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Directive });\nMatInkBar.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatInkBar, selector: \"mat-ink-bar\", host: { properties: { \"class._mat-animation-noopable\": \"_animationMode === 'NoopAnimations'\" }, classAttribute: \"mat-ink-bar\" }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatInkBar, decorators: [{\n type: Directive,\n args: [{\n selector: 'mat-ink-bar',\n host: {\n 'class': 'mat-ink-bar',\n '[class._mat-animation-noopable]': `_animationMode === 'NoopAnimations'`,\n },\n }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: undefined, decorators: [{\n type: Inject,\n args: [_MAT_INK_BAR_POSITIONER]\n }] }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }]; } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\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 MAT_TAB_CONTENT = new InjectionToken('MatTabContent');\n/** Decorates the `ng-template` tags and reads out the template from it. */\nclass MatTabContent {\n constructor(/** Content for the tab. */ template) {\n this.template = template;\n }\n}\nMatTabContent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabContent, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });\nMatTabContent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatTabContent, selector: \"[matTabContent]\", providers: [{ provide: MAT_TAB_CONTENT, useExisting: MatTabContent }], ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabContent, decorators: [{\n type: Directive,\n args: [{\n selector: '[matTabContent]',\n providers: [{ provide: MAT_TAB_CONTENT, useExisting: MatTabContent }],\n }]\n }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\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 = 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 = new InjectionToken('MAT_TAB');\n/** Used to flag tab labels for use with the portal directive */\nclass MatTabLabel extends CdkPortal {\n constructor(templateRef, viewContainerRef, _closestTab) {\n super(templateRef, viewContainerRef);\n this._closestTab = _closestTab;\n }\n}\nMatTabLabel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabLabel, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: MAT_TAB, optional: true }], target: i0.ɵɵFactoryTarget.Directive });\nMatTabLabel.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatTabLabel, selector: \"[mat-tab-label], [matTabLabel]\", providers: [{ provide: MAT_TAB_LABEL, useExisting: MatTabLabel }], usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabLabel, decorators: [{\n type: Directive,\n args: [{\n selector: '[mat-tab-label], [matTabLabel]',\n providers: [{ provide: MAT_TAB_LABEL, useExisting: MatTabLabel }],\n }]\n }], ctorParameters: function () { return [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: undefined, decorators: [{\n type: Inject,\n args: [MAT_TAB]\n }, {\n type: Optional\n }] }]; } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n// Boilerplate for applying mixins to MatTab.\n/** @docs-private */\nconst _MatTabBase = mixinDisabled(class {\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 = new InjectionToken('MAT_TAB_GROUP');\nclass MatTab extends _MatTabBase {\n constructor(_viewContainerRef, _closestTabGroup) {\n super();\n this._viewContainerRef = _viewContainerRef;\n this._closestTabGroup = _closestTabGroup;\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 /** 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 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}\nMatTab.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTab, deps: [{ token: i0.ViewContainerRef }, { token: MAT_TAB_GROUP, optional: true }], target: i0.ɵɵFactoryTarget.Component });\nMatTab.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatTab, selector: \"mat-tab\", inputs: { disabled: \"disabled\", textLabel: [\"label\", \"textLabel\"], ariaLabel: [\"aria-label\", \"ariaLabel\"], ariaLabelledby: [\"aria-labelledby\", \"ariaLabelledby\"], labelClass: \"labelClass\", bodyClass: \"bodyClass\" }, providers: [{ provide: MAT_TAB, useExisting: MatTab }], queries: [{ propertyName: \"templateLabel\", first: true, predicate: MAT_TAB_LABEL, descendants: true }, { propertyName: \"_explicitContent\", first: true, predicate: MAT_TAB_CONTENT, descendants: true, read: TemplateRef, static: true }], viewQueries: [{ propertyName: \"_implicitContent\", first: true, predicate: TemplateRef, descendants: true, static: true }], exportAs: [\"matTab\"], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: \"\\n\\n\", changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTab, decorators: [{\n type: Component,\n args: [{ selector: 'mat-tab', inputs: ['disabled'], changeDetection: ChangeDetectionStrategy.Default, encapsulation: ViewEncapsulation.None, exportAs: 'matTab', providers: [{ provide: MAT_TAB, useExisting: MatTab }], template: \"\\n\\n\" }]\n }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: undefined, decorators: [{\n type: Inject,\n args: [MAT_TAB_GROUP]\n }, {\n type: Optional\n }] }]; }, propDecorators: { templateLabel: [{\n type: ContentChild,\n args: [MAT_TAB_LABEL]\n }], _explicitContent: [{\n type: ContentChild,\n args: [MAT_TAB_CONTENT, { read: TemplateRef, static: true }]\n }], _implicitContent: [{\n type: ViewChild,\n args: [TemplateRef, { static: true }]\n }], textLabel: [{\n type: Input,\n args: ['label']\n }], ariaLabel: [{\n type: Input,\n args: ['aria-label']\n }], ariaLabelledby: [{\n type: Input,\n args: ['aria-labelledby']\n }], labelClass: [{\n type: Input\n }], bodyClass: [{\n type: Input\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\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: trigger('translateTab', [\n // Transitions to `none` instead of 0, because some browsers might blur the content.\n state('center, void, left-origin-center, right-origin-center', style({ transform: 'none' })),\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', 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 })),\n state('right', style({\n transform: 'translate3d(100%, 0, 0)',\n minHeight: '1px',\n visibility: 'hidden',\n })),\n transition('* => left, * => right, left => center, right => center', animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)')),\n transition('void => left-origin-center', [\n style({ transform: 'translate3d(-100%, 0, 0)', visibility: 'hidden' }),\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)'),\n ]),\n transition('void => right-origin-center', [\n style({ transform: 'translate3d(100%, 0, 0)', visibility: 'hidden' }),\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)'),\n ]),\n ]),\n};\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * The portal host directive for the contents of the tab.\n * @docs-private\n */\nclass 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\n .pipe(startWith(this._host._isCenterPosition(this._host._position)))\n .subscribe((isCentering) => {\n if (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}\nMatTabBodyPortal.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabBodyPortal, deps: [{ token: i0.ComponentFactoryResolver }, { token: i0.ViewContainerRef }, { token: forwardRef(() => MatTabBody) }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive });\nMatTabBodyPortal.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatTabBodyPortal, selector: \"[matTabBodyHost]\", usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabBodyPortal, decorators: [{\n type: Directive,\n args: [{\n selector: '[matTabBodyHost]',\n }]\n }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i0.ViewContainerRef }, { type: MatTabBody, decorators: [{\n type: Inject,\n args: [forwardRef(() => MatTabBody)]\n }] }, { type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }]; } });\n/**\n * Base class with all of the `MatTabBody` functionality.\n * @docs-private\n */\nclass _MatTabBodyBase {\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\n .pipe(distinctUntilChanged((x, y) => {\n return x.fromState === y.fromState && x.toState === y.toState;\n }))\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 /** 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 /**\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 }\n else if (this._positionIndex > 0) {\n this._position = dir == 'ltr' ? 'right' : 'left';\n }\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}\n_MatTabBodyBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: _MatTabBodyBase, deps: [{ token: i0.ElementRef }, { token: i1.Directionality, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });\n_MatTabBodyBase.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: _MatTabBodyBase, inputs: { _content: [\"content\", \"_content\"], origin: \"origin\", animationDuration: \"animationDuration\", preserveContent: \"preserveContent\", position: \"position\" }, outputs: { _onCentering: \"_onCentering\", _beforeCentering: \"_beforeCentering\", _afterLeavingCenter: \"_afterLeavingCenter\", _onCentered: \"_onCentered\" }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: _MatTabBodyBase, decorators: [{\n type: Directive\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.Directionality, decorators: [{\n type: Optional\n }] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { _onCentering: [{\n type: Output\n }], _beforeCentering: [{\n type: Output\n }], _afterLeavingCenter: [{\n type: Output\n }], _onCentered: [{\n type: Output\n }], _content: [{\n type: Input,\n args: ['content']\n }], origin: [{\n type: Input\n }], animationDuration: [{\n type: Input\n }], preserveContent: [{\n type: Input\n }], position: [{\n type: Input\n }] } });\n/**\n * Wrapper for the contents of a tab.\n * @docs-private\n */\nclass MatTabBody extends _MatTabBodyBase {\n constructor(elementRef, dir, changeDetectorRef) {\n super(elementRef, dir, changeDetectorRef);\n }\n}\nMatTabBody.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabBody, deps: [{ token: i0.ElementRef }, { token: i1.Directionality, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });\nMatTabBody.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatTabBody, selector: \"mat-tab-body\", host: { classAttribute: \"mat-tab-body\" }, viewQueries: [{ propertyName: \"_portalHost\", first: true, predicate: CdkPortalOutlet, descendants: true }], usesInheritance: true, ngImport: i0, template: \"
\\n \\n
\\n\", styles: [\".mat-tab-body-content{height:100%;overflow:auto}.mat-tab-group-dynamic-height .mat-tab-body-content{overflow:hidden}.mat-tab-body-content[style*=\\\"visibility: hidden\\\"]{display:none}\"], dependencies: [{ kind: \"directive\", type: MatTabBodyPortal, selector: \"[matTabBodyHost]\" }], animations: [matTabsAnimations.translateTab], changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabBody, decorators: [{\n type: Component,\n args: [{ selector: 'mat-tab-body', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.Default, animations: [matTabsAnimations.translateTab], host: {\n 'class': 'mat-tab-body',\n }, template: \"
\\n \\n
\\n\", styles: [\".mat-tab-body-content{height:100%;overflow:auto}.mat-tab-group-dynamic-height .mat-tab-body-content{overflow:hidden}.mat-tab-body-content[style*=\\\"visibility: hidden\\\"]{display:none}\"] }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.Directionality, decorators: [{\n type: Optional\n }] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { _portalHost: [{\n type: ViewChild,\n args: [CdkPortalOutlet]\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Injection token that can be used to provide the default options the tabs module. */\nconst MAT_TABS_CONFIG = new InjectionToken('MAT_TABS_CONFIG');\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n// Boilerplate for applying mixins to MatTabLabelWrapper.\n/** @docs-private */\nconst _MatTabLabelWrapperBase = mixinDisabled(class {\n});\n/**\n * Used in the `mat-tab-group` view to display tab labels.\n * @docs-private\n */\nclass MatTabLabelWrapper extends _MatTabLabelWrapperBase {\n constructor(elementRef) {\n super();\n this.elementRef = elementRef;\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}\nMatTabLabelWrapper.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabLabelWrapper, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });\nMatTabLabelWrapper.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatTabLabelWrapper, selector: \"[matTabLabelWrapper]\", inputs: { disabled: \"disabled\" }, host: { properties: { \"class.mat-tab-disabled\": \"disabled\", \"attr.aria-disabled\": \"!!disabled\" } }, usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabLabelWrapper, decorators: [{\n type: Directive,\n args: [{\n selector: '[matTabLabelWrapper]',\n inputs: ['disabled'],\n host: {\n '[class.mat-tab-disabled]': 'disabled',\n '[attr.aria-disabled]': '!!disabled',\n },\n }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }]; } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Config used to bind passive event listeners */\nconst passiveEventListenerOptions = normalizePassiveListenerOptions({\n passive: true,\n});\n/**\n * The distance in pixels that will be overshot when scrolling a tab label into view. This helps\n * provide a small affordance to the label next to it.\n */\nconst EXAGGERATED_OVERSCROLL = 60;\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 */\nclass MatPaginatedTabHeader {\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 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 // Bind the `mouseleave` event on the outside since it doesn't change anything in the view.\n _ngZone.runOutsideAngular(() => {\n fromEvent(_elementRef.nativeElement, 'mouseleave')\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => {\n this._stopInterval();\n });\n });\n }\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 get disablePagination() {\n return this._disablePagination;\n }\n set disablePagination(value) {\n this._disablePagination = coerceBooleanProperty(value);\n }\n /** The index of the active tab. */\n get selectedIndex() {\n return this._selectedIndex;\n }\n set selectedIndex(value) {\n value = coerceNumberProperty(value);\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 ngAfterViewInit() {\n // We need to handle these events manually, because we want to bind passive event listeners.\n fromEvent(this._previousPaginator.nativeElement, 'touchstart', passiveEventListenerOptions)\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => {\n this._handlePaginatorPress('before');\n });\n fromEvent(this._nextPaginator.nativeElement, 'touchstart', passiveEventListenerOptions)\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => {\n this._handlePaginatorPress('after');\n });\n }\n ngAfterContentInit() {\n const dirChange = this._dir ? this._dir.change : of('ltr');\n const resize = this._viewportRuler.change(150);\n const realign = () => {\n this.updatePagination();\n this._alignInkBarToSelectedTab();\n };\n this._keyManager = new FocusKeyManager(this._items)\n .withHorizontalOrientation(this._getLayoutDirection())\n .withHomeAndEnd()\n .withWrap();\n this._keyManager.updateActiveItem(this._selectedIndex);\n // Defer the first call in order to allow for slower browsers to lay out the elements.\n // This helps in cases where the user lands directly on a page with paginated tabs.\n // Note that we use `onStable` instead of `requestAnimationFrame`, because the latter\n // can hold up tests that are in a background tab.\n this._ngZone.onStable.pipe(take(1)).subscribe(realign);\n // On dir change or window resize, realign the ink bar and update the orientation of\n // the key manager if the direction has changed.\n merge(dirChange, resize, this._items.changes, this._itemsResized())\n .pipe(takeUntil(this._destroyed))\n .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.pipe(takeUntil(this._destroyed)).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._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 this.selectFocusedIndex.emit(this.focusIndex);\n this._itemSelected(event);\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 if (!this._items) {\n return true;\n }\n const tab = this._items ? this._items.toArray()[index] : null;\n return !!tab && !tab.disabled;\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 }\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 { offsetLeft, offsetWidth } = selectedLabel.elementRef.nativeElement;\n let labelBeforePos, labelAfterPos;\n if (this._getLayoutDirection() == 'ltr') {\n labelBeforePos = offsetLeft;\n labelAfterPos = labelBeforePos + offsetWidth;\n }\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 + EXAGGERATED_OVERSCROLL;\n }\n else if (labelAfterPos > afterVisiblePos) {\n // Scroll header to move label to the after direction\n this.scrollDistance += labelAfterPos - afterVisiblePos + EXAGGERATED_OVERSCROLL;\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 }\n else {\n const isEnabled = this._tabListInner.nativeElement.scrollWidth > this._elementRef.nativeElement.offsetWidth;\n if (!isEnabled) {\n this.scrollDistance = 0;\n }\n if (isEnabled !== this._showPaginationControls) {\n this._changeDetectorRef.markForCheck();\n }\n this._showPaginationControls = isEnabled;\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 }\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 }\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)))\n .subscribe(() => {\n const { maxScrollDistance, distance } = 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 { maxScrollDistance: 0, distance: 0 };\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 { maxScrollDistance, distance: this._scrollDistance };\n }\n}\nMatPaginatedTabHeader.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatPaginatedTabHeader, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1$1.ViewportRuler }, { token: i1.Directionality, optional: true }, { token: i0.NgZone }, { token: i3.Platform }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Directive });\nMatPaginatedTabHeader.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatPaginatedTabHeader, inputs: { disablePagination: \"disablePagination\" }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatPaginatedTabHeader, decorators: [{\n type: Directive\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1$1.ViewportRuler }, { type: i1.Directionality, decorators: [{\n type: Optional\n }] }, { type: i0.NgZone }, { type: i3.Platform }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }]; }, propDecorators: { disablePagination: [{\n type: Input\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Base class with all of the `MatTabHeader` functionality.\n * @docs-private\n */\nclass _MatTabHeaderBase extends MatPaginatedTabHeader {\n constructor(elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode) {\n super(elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode);\n this._disableRipple = false;\n }\n /** Whether the ripple effect is disabled or not. */\n get disableRipple() {\n return this._disableRipple;\n }\n set disableRipple(value) {\n this._disableRipple = coerceBooleanProperty(value);\n }\n _itemSelected(event) {\n event.preventDefault();\n }\n}\n_MatTabHeaderBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: _MatTabHeaderBase, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1$1.ViewportRuler }, { token: i1.Directionality, optional: true }, { token: i0.NgZone }, { token: i3.Platform }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Directive });\n_MatTabHeaderBase.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: _MatTabHeaderBase, inputs: { disableRipple: \"disableRipple\" }, usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: _MatTabHeaderBase, decorators: [{\n type: Directive\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1$1.ViewportRuler }, { type: i1.Directionality, decorators: [{\n type: Optional\n }] }, { type: i0.NgZone }, { type: i3.Platform }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }]; }, propDecorators: { disableRipple: [{\n type: Input\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 */\nclass MatTabHeader extends _MatTabHeaderBase {\n constructor(elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode) {\n super(elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode);\n }\n}\nMatTabHeader.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabHeader, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1$1.ViewportRuler }, { token: i1.Directionality, optional: true }, { token: i0.NgZone }, { token: i3.Platform }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Component });\nMatTabHeader.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatTabHeader, selector: \"mat-tab-header\", inputs: { selectedIndex: \"selectedIndex\" }, outputs: { selectFocusedIndex: \"selectFocusedIndex\", indexFocused: \"indexFocused\" }, host: { properties: { \"class.mat-tab-header-pagination-controls-enabled\": \"_showPaginationControls\", \"class.mat-tab-header-rtl\": \"_getLayoutDirection() == 'rtl'\" }, classAttribute: \"mat-tab-header\" }, queries: [{ propertyName: \"_items\", predicate: MatTabLabelWrapper }], viewQueries: [{ propertyName: \"_inkBar\", first: true, predicate: MatInkBar, descendants: true, static: true }, { propertyName: \"_tabListContainer\", first: true, predicate: [\"tabListContainer\"], descendants: true, static: true }, { propertyName: \"_tabList\", first: true, predicate: [\"tabList\"], descendants: true, static: true }, { propertyName: \"_tabListInner\", first: true, predicate: [\"tabListInner\"], descendants: true, static: true }, { propertyName: \"_nextPaginator\", first: true, predicate: [\"nextPaginator\"], descendants: true }, { propertyName: \"_previousPaginator\", first: true, predicate: [\"previousPaginator\"], descendants: true }], usesInheritance: true, ngImport: i0, template: \"\\n\\n
\\n \\n
\\n \\n
\\n \\n
\\n\\n\\n\\n\", styles: [\".mat-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0}.mat-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-tab-header-pagination::-moz-focus-inner{border:0}.mat-tab-header-pagination-controls-enabled .mat-tab-header-pagination{display:flex}.mat-tab-header-pagination-before,.mat-tab-header-rtl .mat-tab-header-pagination-after{padding-left:4px}.mat-tab-header-pagination-before .mat-tab-header-pagination-chevron,.mat-tab-header-rtl .mat-tab-header-pagination-after .mat-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-tab-header-rtl .mat-tab-header-pagination-before,.mat-tab-header-pagination-after{padding-right:4px}.mat-tab-header-rtl .mat-tab-header-pagination-before .mat-tab-header-pagination-chevron,.mat-tab-header-pagination-after .mat-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;height:8px;width:8px}.mat-tab-header-pagination-disabled{box-shadow:none;cursor:default}.mat-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-ink-bar{position:absolute;bottom:0;height:2px;transition:500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-ink-bar._mat-animation-noopable{transition:none !important;animation:none !important}.mat-tab-group-inverted-header .mat-ink-bar{bottom:auto;top:0}.cdk-high-contrast-active .mat-ink-bar{outline:solid 2px;height:0}.mat-tab-labels{display:flex}[mat-align-tabs=center]>.mat-tab-header .mat-tab-labels{justify-content:center}[mat-align-tabs=end]>.mat-tab-header .mat-tab-labels{justify-content:flex-end}.mat-tab-label-container{display:flex;flex-grow:1;overflow:hidden;z-index:1}.mat-tab-list._mat-animation-noopable{transition:none !important;animation:none !important}.mat-tab-label{height:48px;padding:0 24px;cursor:pointer;box-sizing:border-box;opacity:.6;min-width:160px;text-align:center;display:inline-flex;justify-content:center;align-items:center;white-space:nowrap;position:relative}.mat-tab-label:focus{outline:none}.mat-tab-label:focus:not(.mat-tab-disabled){opacity:1}.mat-tab-label.mat-tab-disabled{cursor:default}.cdk-high-contrast-active .mat-tab-label.mat-tab-disabled{opacity:.5}.mat-tab-label .mat-tab-label-content{display:inline-flex;justify-content:center;align-items:center;white-space:nowrap}.cdk-high-contrast-active .mat-tab-label{opacity:1}.mat-tab-label::before{margin:5px}@media(max-width: 599px){.mat-tab-label{min-width:72px}}\"], dependencies: [{ kind: \"directive\", type: i4.MatRipple, selector: \"[mat-ripple], [matRipple]\", inputs: [\"matRippleColor\", \"matRippleUnbounded\", \"matRippleCentered\", \"matRippleRadius\", \"matRippleAnimation\", \"matRippleDisabled\", \"matRippleTrigger\"], exportAs: [\"matRipple\"] }, { kind: \"directive\", type: i5.CdkObserveContent, selector: \"[cdkObserveContent]\", inputs: [\"cdkObserveContentDisabled\", \"debounce\"], outputs: [\"cdkObserveContent\"], exportAs: [\"cdkObserveContent\"] }, { kind: \"directive\", type: MatInkBar, selector: \"mat-ink-bar\" }], changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabHeader, decorators: [{\n type: Component,\n args: [{ selector: 'mat-tab-header', inputs: ['selectedIndex'], outputs: ['selectFocusedIndex', 'indexFocused'], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.Default, host: {\n 'class': 'mat-tab-header',\n '[class.mat-tab-header-pagination-controls-enabled]': '_showPaginationControls',\n '[class.mat-tab-header-rtl]': \"_getLayoutDirection() == 'rtl'\",\n }, template: \"\\n\\n
\\n \\n
\\n \\n
\\n \\n
\\n\\n\\n\\n\", styles: [\".mat-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0}.mat-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-tab-header-pagination::-moz-focus-inner{border:0}.mat-tab-header-pagination-controls-enabled .mat-tab-header-pagination{display:flex}.mat-tab-header-pagination-before,.mat-tab-header-rtl .mat-tab-header-pagination-after{padding-left:4px}.mat-tab-header-pagination-before .mat-tab-header-pagination-chevron,.mat-tab-header-rtl .mat-tab-header-pagination-after .mat-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-tab-header-rtl .mat-tab-header-pagination-before,.mat-tab-header-pagination-after{padding-right:4px}.mat-tab-header-rtl .mat-tab-header-pagination-before .mat-tab-header-pagination-chevron,.mat-tab-header-pagination-after .mat-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;height:8px;width:8px}.mat-tab-header-pagination-disabled{box-shadow:none;cursor:default}.mat-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-ink-bar{position:absolute;bottom:0;height:2px;transition:500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-ink-bar._mat-animation-noopable{transition:none !important;animation:none !important}.mat-tab-group-inverted-header .mat-ink-bar{bottom:auto;top:0}.cdk-high-contrast-active .mat-ink-bar{outline:solid 2px;height:0}.mat-tab-labels{display:flex}[mat-align-tabs=center]>.mat-tab-header .mat-tab-labels{justify-content:center}[mat-align-tabs=end]>.mat-tab-header .mat-tab-labels{justify-content:flex-end}.mat-tab-label-container{display:flex;flex-grow:1;overflow:hidden;z-index:1}.mat-tab-list._mat-animation-noopable{transition:none !important;animation:none !important}.mat-tab-label{height:48px;padding:0 24px;cursor:pointer;box-sizing:border-box;opacity:.6;min-width:160px;text-align:center;display:inline-flex;justify-content:center;align-items:center;white-space:nowrap;position:relative}.mat-tab-label:focus{outline:none}.mat-tab-label:focus:not(.mat-tab-disabled){opacity:1}.mat-tab-label.mat-tab-disabled{cursor:default}.cdk-high-contrast-active .mat-tab-label.mat-tab-disabled{opacity:.5}.mat-tab-label .mat-tab-label-content{display:inline-flex;justify-content:center;align-items:center;white-space:nowrap}.cdk-high-contrast-active .mat-tab-label{opacity:1}.mat-tab-label::before{margin:5px}@media(max-width: 599px){.mat-tab-label{min-width:72px}}\"] }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1$1.ViewportRuler }, { type: i1.Directionality, decorators: [{\n type: Optional\n }] }, { type: i0.NgZone }, { type: i3.Platform }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }]; }, propDecorators: { _items: [{\n type: ContentChildren,\n args: [MatTabLabelWrapper, { descendants: false }]\n }], _inkBar: [{\n type: ViewChild,\n args: [MatInkBar, { static: true }]\n }], _tabListContainer: [{\n type: ViewChild,\n args: ['tabListContainer', { static: true }]\n }], _tabList: [{\n type: ViewChild,\n args: ['tabList', { static: true }]\n }], _tabListInner: [{\n type: ViewChild,\n args: ['tabListInner', { static: true }]\n }], _nextPaginator: [{\n type: ViewChild,\n args: ['nextPaginator']\n }], _previousPaginator: [{\n type: ViewChild,\n args: ['previousPaginator']\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Used to generate unique ID's for each tab component */\nlet nextId = 0;\n/** A simple change event emitted on focus or selection changes. */\nclass MatTabChangeEvent {\n}\n// Boilerplate for applying mixins to MatTabGroup.\n/** @docs-private */\nconst _MatTabGroupMixinBase = mixinColor(mixinDisableRipple(class {\n constructor(_elementRef) {\n this._elementRef = _elementRef;\n }\n}), 'primary');\n/**\n * Base class with all of the `MatTabGroupBase` functionality.\n * @docs-private\n */\nclass _MatTabGroupBase extends _MatTabGroupMixinBase {\n constructor(elementRef, _changeDetectorRef, defaultConfig, _animationMode) {\n super(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._dynamicHeight = false;\n this._selectedIndex = null;\n /** Position of the tab header. */\n this.headerPosition = 'above';\n this._disablePagination = false;\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 this._groupId = nextId++;\n this.animationDuration =\n defaultConfig && defaultConfig.animationDuration ? defaultConfig.animationDuration : '500ms';\n this.disablePagination =\n defaultConfig && defaultConfig.disablePagination != null\n ? defaultConfig.disablePagination\n : false;\n this.dynamicHeight =\n defaultConfig && defaultConfig.dynamicHeight != null ? defaultConfig.dynamicHeight : false;\n this.contentTabIndex = defaultConfig?.contentTabIndex ?? null;\n this.preserveContent = !!defaultConfig?.preserveContent;\n }\n /** Whether the tab group should grow to the size of the active tab. */\n get dynamicHeight() {\n return this._dynamicHeight;\n }\n set dynamicHeight(value) {\n this._dynamicHeight = coerceBooleanProperty(value);\n }\n /** The index of the active tab. */\n get selectedIndex() {\n return this._selectedIndex;\n }\n set selectedIndex(value) {\n this._indexToSelect = coerceNumberProperty(value, null);\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 this._animationDuration = /^\\d+$/.test(value + '') ? value + 'ms' : value;\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 = coerceNumberProperty(value, null);\n }\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 get disablePagination() {\n return this._disablePagination;\n }\n set disablePagination(value) {\n this._disablePagination = coerceBooleanProperty(value);\n }\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 get preserveContent() {\n return this._preserveContent;\n }\n set preserveContent(value) {\n this._preserveContent = coerceBooleanProperty(value);\n }\n /** Background color of the tab group. */\n get backgroundColor() {\n return this._backgroundColor;\n }\n set backgroundColor(value) {\n const nativeElement = this._elementRef.nativeElement;\n nativeElement.classList.remove(`mat-background-${this.backgroundColor}`);\n if (value) {\n nativeElement.classList.add(`mat-background-${value}`);\n }\n this._backgroundColor = value;\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 if (!tab.disabled) {\n this.selectedIndex = tabHeader.focusIndex = index;\n }\n }\n /** Retrieves the tabindex for the tab. */\n _getTabIndex(tab, index) {\n if (tab.disabled) {\n return null;\n }\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}\n_MatTabGroupBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: _MatTabGroupBase, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: MAT_TABS_CONFIG, optional: true }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Directive });\n_MatTabGroupBase.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: _MatTabGroupBase, inputs: { dynamicHeight: \"dynamicHeight\", selectedIndex: \"selectedIndex\", headerPosition: \"headerPosition\", animationDuration: \"animationDuration\", contentTabIndex: \"contentTabIndex\", disablePagination: \"disablePagination\", preserveContent: \"preserveContent\", backgroundColor: \"backgroundColor\" }, outputs: { selectedIndexChange: \"selectedIndexChange\", focusChange: \"focusChange\", animationDone: \"animationDone\", selectedTabChange: \"selectedTabChange\" }, usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: _MatTabGroupBase, decorators: [{\n type: Directive\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{\n type: Inject,\n args: [MAT_TABS_CONFIG]\n }, {\n type: Optional\n }] }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }]; }, propDecorators: { dynamicHeight: [{\n type: Input\n }], selectedIndex: [{\n type: Input\n }], headerPosition: [{\n type: Input\n }], animationDuration: [{\n type: Input\n }], contentTabIndex: [{\n type: Input\n }], disablePagination: [{\n type: Input\n }], preserveContent: [{\n type: Input\n }], backgroundColor: [{\n type: Input\n }], selectedIndexChange: [{\n type: Output\n }], focusChange: [{\n type: Output\n }], animationDone: [{\n type: Output\n }], selectedTabChange: [{\n type: Output\n }] } });\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 */\nclass MatTabGroup extends _MatTabGroupBase {\n constructor(elementRef, changeDetectorRef, defaultConfig, animationMode) {\n super(elementRef, changeDetectorRef, defaultConfig, animationMode);\n }\n}\nMatTabGroup.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabGroup, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: MAT_TABS_CONFIG, optional: true }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Component });\nMatTabGroup.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatTabGroup, selector: \"mat-tab-group\", inputs: { color: \"color\", disableRipple: \"disableRipple\" }, host: { properties: { \"class.mat-tab-group-dynamic-height\": \"dynamicHeight\", \"class.mat-tab-group-inverted-header\": \"headerPosition === \\\"below\\\"\" }, classAttribute: \"mat-tab-group\" }, providers: [\n {\n provide: MAT_TAB_GROUP,\n useExisting: MatTabGroup,\n },\n ], queries: [{ propertyName: \"_allTabs\", predicate: MatTab, descendants: true }], viewQueries: [{ propertyName: \"_tabBodyWrapper\", first: true, predicate: [\"tabBodyWrapper\"], descendants: true }, { propertyName: \"_tabHeader\", first: true, predicate: [\"tabHeader\"], descendants: true }], exportAs: [\"matTabGroup\"], usesInheritance: true, ngImport: i0, template: \"\\n
\\n\\n\\n
\\n \\n \\n \\n \\n\\n \\n {{tab.textLabel}}\\n
\\n
\\n
\\n\\n\\n \\n \\n\\n\", styles: [\".mat-tab-group{display:flex;flex-direction:column;max-width:100%}.mat-tab-group.mat-tab-group-inverted-header{flex-direction:column-reverse}.mat-tab-label{height:48px;padding:0 24px;cursor:pointer;box-sizing:border-box;opacity:.6;min-width:160px;text-align:center;display:inline-flex;justify-content:center;align-items:center;white-space:nowrap;position:relative}.mat-tab-label:focus{outline:none}.mat-tab-label:focus:not(.mat-tab-disabled){opacity:1}.mat-tab-label.mat-tab-disabled{cursor:default}.cdk-high-contrast-active .mat-tab-label.mat-tab-disabled{opacity:.5}.mat-tab-label .mat-tab-label-content{display:inline-flex;justify-content:center;align-items:center;white-space:nowrap}.cdk-high-contrast-active .mat-tab-label{opacity:1}@media(max-width: 599px){.mat-tab-label{padding:0 12px}}@media(max-width: 959px){.mat-tab-label{padding:0 12px}}.mat-tab-group[mat-stretch-tabs]>.mat-tab-header .mat-tab-label{flex-basis:0;flex-grow:1}.mat-tab-body-wrapper{position:relative;overflow:hidden;display:flex;transition:height 500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-tab-body-wrapper._mat-animation-noopable{transition:none !important;animation:none !important}.mat-tab-body{top:0;left:0;right:0;bottom:0;position:absolute;display:block;overflow:hidden;outline:0;flex-basis:100%}.mat-tab-body.mat-tab-body-active{position:relative;overflow-x:hidden;overflow-y:auto;z-index:1;flex-grow:1}.mat-tab-group.mat-tab-group-dynamic-height .mat-tab-body.mat-tab-body-active{overflow-y:hidden}\"], dependencies: [{ kind: \"directive\", type: i1$2.NgClass, selector: \"[ngClass]\", inputs: [\"class\", \"ngClass\"] }, { kind: \"directive\", type: i1$2.NgForOf, selector: \"[ngFor][ngForOf]\", inputs: [\"ngForOf\", \"ngForTrackBy\", \"ngForTemplate\"] }, { kind: \"directive\", type: i1$2.NgIf, selector: \"[ngIf]\", inputs: [\"ngIf\", \"ngIfThen\", \"ngIfElse\"] }, { kind: \"directive\", type: i2.CdkPortalOutlet, selector: \"[cdkPortalOutlet]\", inputs: [\"cdkPortalOutlet\"], outputs: [\"attached\"], exportAs: [\"cdkPortalOutlet\"] }, { kind: \"directive\", type: i4.MatRipple, selector: \"[mat-ripple], [matRipple]\", inputs: [\"matRippleColor\", \"matRippleUnbounded\", \"matRippleCentered\", \"matRippleRadius\", \"matRippleAnimation\", \"matRippleDisabled\", \"matRippleTrigger\"], exportAs: [\"matRipple\"] }, { kind: \"directive\", type: i7.CdkMonitorFocus, selector: \"[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]\", outputs: [\"cdkFocusChange\"], exportAs: [\"cdkMonitorFocus\"] }, { kind: \"directive\", type: MatTabLabelWrapper, selector: \"[matTabLabelWrapper]\", inputs: [\"disabled\"] }, { kind: \"component\", type: MatTabBody, selector: \"mat-tab-body\" }, { kind: \"component\", type: MatTabHeader, selector: \"mat-tab-header\", inputs: [\"selectedIndex\"], outputs: [\"selectFocusedIndex\", \"indexFocused\"] }], changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabGroup, decorators: [{\n type: Component,\n args: [{ selector: 'mat-tab-group', exportAs: 'matTabGroup', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.Default, inputs: ['color', 'disableRipple'], providers: [\n {\n provide: MAT_TAB_GROUP,\n useExisting: MatTabGroup,\n },\n ], host: {\n 'class': 'mat-tab-group',\n '[class.mat-tab-group-dynamic-height]': 'dynamicHeight',\n '[class.mat-tab-group-inverted-header]': 'headerPosition === \"below\"',\n }, template: \"\\n
\\n\\n\\n
\\n \\n \\n \\n \\n\\n \\n {{tab.textLabel}}\\n
\\n
\\n
\\n\\n\\n \\n \\n\\n\", styles: [\".mat-tab-group{display:flex;flex-direction:column;max-width:100%}.mat-tab-group.mat-tab-group-inverted-header{flex-direction:column-reverse}.mat-tab-label{height:48px;padding:0 24px;cursor:pointer;box-sizing:border-box;opacity:.6;min-width:160px;text-align:center;display:inline-flex;justify-content:center;align-items:center;white-space:nowrap;position:relative}.mat-tab-label:focus{outline:none}.mat-tab-label:focus:not(.mat-tab-disabled){opacity:1}.mat-tab-label.mat-tab-disabled{cursor:default}.cdk-high-contrast-active .mat-tab-label.mat-tab-disabled{opacity:.5}.mat-tab-label .mat-tab-label-content{display:inline-flex;justify-content:center;align-items:center;white-space:nowrap}.cdk-high-contrast-active .mat-tab-label{opacity:1}@media(max-width: 599px){.mat-tab-label{padding:0 12px}}@media(max-width: 959px){.mat-tab-label{padding:0 12px}}.mat-tab-group[mat-stretch-tabs]>.mat-tab-header .mat-tab-label{flex-basis:0;flex-grow:1}.mat-tab-body-wrapper{position:relative;overflow:hidden;display:flex;transition:height 500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-tab-body-wrapper._mat-animation-noopable{transition:none !important;animation:none !important}.mat-tab-body{top:0;left:0;right:0;bottom:0;position:absolute;display:block;overflow:hidden;outline:0;flex-basis:100%}.mat-tab-body.mat-tab-body-active{position:relative;overflow-x:hidden;overflow-y:auto;z-index:1;flex-grow:1}.mat-tab-group.mat-tab-group-dynamic-height .mat-tab-body.mat-tab-body-active{overflow-y:hidden}\"] }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{\n type: Inject,\n args: [MAT_TABS_CONFIG]\n }, {\n type: Optional\n }] }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }]; }, propDecorators: { _allTabs: [{\n type: ContentChildren,\n args: [MatTab, { descendants: true }]\n }], _tabBodyWrapper: [{\n type: ViewChild,\n args: ['tabBodyWrapper']\n }], _tabHeader: [{\n type: ViewChild,\n args: ['tabHeader']\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n// Increasing integer for generating unique ids for tab nav components.\nlet nextUniqueId = 0;\n/**\n * Base class with all of the `MatTabNav` functionality.\n * @docs-private\n */\nclass _MatTabNavBase extends MatPaginatedTabHeader {\n constructor(elementRef, dir, ngZone, changeDetectorRef, viewportRuler, platform, animationMode) {\n super(elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode);\n this._disableRipple = false;\n /** Theme color of the nav bar. */\n this.color = 'primary';\n }\n /** Background color of the tab nav. */\n get backgroundColor() {\n return this._backgroundColor;\n }\n set backgroundColor(value) {\n const classList = this._elementRef.nativeElement.classList;\n classList.remove(`mat-background-${this.backgroundColor}`);\n if (value) {\n classList.add(`mat-background-${value}`);\n }\n this._backgroundColor = value;\n }\n /** Whether the ripple effect is disabled or not. */\n get disableRipple() {\n return this._disableRipple;\n }\n set disableRipple(value) {\n this._disableRipple = coerceBooleanProperty(value);\n }\n _itemSelected() {\n // noop\n }\n ngAfterContentInit() {\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 /** 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}\n_MatTabNavBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: _MatTabNavBase, deps: [{ token: i0.ElementRef }, { token: i1.Directionality, optional: true }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i1$1.ViewportRuler }, { token: i3.Platform }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Directive });\n_MatTabNavBase.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: _MatTabNavBase, inputs: { backgroundColor: \"backgroundColor\", disableRipple: \"disableRipple\", color: \"color\", tabPanel: \"tabPanel\" }, usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: _MatTabNavBase, decorators: [{\n type: Directive\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.Directionality, decorators: [{\n type: Optional\n }] }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i1$1.ViewportRuler }, { type: i3.Platform }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }]; }, propDecorators: { backgroundColor: [{\n type: Input\n }], disableRipple: [{\n type: Input\n }], color: [{\n type: Input\n }], tabPanel: [{\n type: Input\n }] } });\n/**\n * Navigation component matching the styles of the tab group header.\n * Provides anchored navigation with animated ink bar.\n */\nclass MatTabNav extends _MatTabNavBase {\n constructor(elementRef, dir, ngZone, changeDetectorRef, viewportRuler, platform, animationMode) {\n super(elementRef, dir, ngZone, changeDetectorRef, viewportRuler, platform, animationMode);\n }\n}\nMatTabNav.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabNav, deps: [{ token: i0.ElementRef }, { token: i1.Directionality, optional: true }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i1$1.ViewportRuler }, { token: i3.Platform }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Component });\nMatTabNav.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatTabNav, selector: \"[mat-tab-nav-bar]\", inputs: { color: \"color\" }, host: { properties: { \"attr.role\": \"_getRole()\", \"class.mat-tab-header-pagination-controls-enabled\": \"_showPaginationControls\", \"class.mat-tab-header-rtl\": \"_getLayoutDirection() == 'rtl'\", \"class.mat-primary\": \"color !== \\\"warn\\\" && color !== \\\"accent\\\"\", \"class.mat-accent\": \"color === \\\"accent\\\"\", \"class.mat-warn\": \"color === \\\"warn\\\"\" }, classAttribute: \"mat-tab-nav-bar mat-tab-header\" }, queries: [{ propertyName: \"_items\", predicate: i0.forwardRef(function () { return MatTabLink; }), descendants: true }], viewQueries: [{ propertyName: \"_inkBar\", first: true, predicate: MatInkBar, descendants: true, static: true }, { propertyName: \"_tabListContainer\", first: true, predicate: [\"tabListContainer\"], descendants: true, static: true }, { propertyName: \"_tabList\", first: true, predicate: [\"tabList\"], descendants: true, static: true }, { propertyName: \"_tabListInner\", first: true, predicate: [\"tabListInner\"], descendants: true, static: true }, { propertyName: \"_nextPaginator\", first: true, predicate: [\"nextPaginator\"], descendants: true }, { propertyName: \"_previousPaginator\", first: true, predicate: [\"previousPaginator\"], descendants: true }], exportAs: [\"matTabNavBar\", \"matTabNav\"], usesInheritance: true, ngImport: i0, template: \"\\n\\n\\n\\n\\n\\n\", styles: [\".mat-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0}.mat-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-tab-header-pagination::-moz-focus-inner{border:0}.mat-tab-header-pagination-controls-enabled .mat-tab-header-pagination{display:flex}.mat-tab-header-pagination-before,.mat-tab-header-rtl .mat-tab-header-pagination-after{padding-left:4px}.mat-tab-header-pagination-before .mat-tab-header-pagination-chevron,.mat-tab-header-rtl .mat-tab-header-pagination-after .mat-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-tab-header-rtl .mat-tab-header-pagination-before,.mat-tab-header-pagination-after{padding-right:4px}.mat-tab-header-rtl .mat-tab-header-pagination-before .mat-tab-header-pagination-chevron,.mat-tab-header-pagination-after .mat-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;height:8px;width:8px}.mat-tab-header-pagination-disabled{box-shadow:none;cursor:default}.mat-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-tab-links{display:flex}[mat-align-tabs=center]>.mat-tab-link-container .mat-tab-links{justify-content:center}[mat-align-tabs=end]>.mat-tab-link-container .mat-tab-links{justify-content:flex-end}.mat-ink-bar{position:absolute;bottom:0;height:2px;transition:500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-ink-bar._mat-animation-noopable{transition:none !important;animation:none !important}.mat-tab-group-inverted-header .mat-ink-bar{bottom:auto;top:0}.cdk-high-contrast-active .mat-ink-bar{outline:solid 2px;height:0}.mat-tab-link-container{display:flex;flex-grow:1;overflow:hidden;z-index:1}.mat-tab-link{height:48px;padding:0 24px;cursor:pointer;box-sizing:border-box;opacity:.6;min-width:160px;text-align:center;display:inline-flex;justify-content:center;align-items:center;white-space:nowrap;vertical-align:top;text-decoration:none;position:relative;overflow:hidden;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-tab-link:focus{outline:none}.mat-tab-link:focus:not(.mat-tab-disabled){opacity:1}.mat-tab-link.mat-tab-disabled{cursor:default}.cdk-high-contrast-active .mat-tab-link.mat-tab-disabled{opacity:.5}.mat-tab-link .mat-tab-label-content{display:inline-flex;justify-content:center;align-items:center;white-space:nowrap}.cdk-high-contrast-active .mat-tab-link{opacity:1}[mat-stretch-tabs] .mat-tab-link{flex-basis:0;flex-grow:1}.mat-tab-link.mat-tab-disabled{pointer-events:none}.mat-tab-link::before{margin:5px}@media(max-width: 599px){.mat-tab-link{min-width:72px}}\"], dependencies: [{ kind: \"directive\", type: i4.MatRipple, selector: \"[mat-ripple], [matRipple]\", inputs: [\"matRippleColor\", \"matRippleUnbounded\", \"matRippleCentered\", \"matRippleRadius\", \"matRippleAnimation\", \"matRippleDisabled\", \"matRippleTrigger\"], exportAs: [\"matRipple\"] }, { kind: \"directive\", type: i5.CdkObserveContent, selector: \"[cdkObserveContent]\", inputs: [\"cdkObserveContentDisabled\", \"debounce\"], outputs: [\"cdkObserveContent\"], exportAs: [\"cdkObserveContent\"] }, { kind: \"directive\", type: MatInkBar, selector: \"mat-ink-bar\" }], changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabNav, decorators: [{\n type: Component,\n args: [{ selector: '[mat-tab-nav-bar]', exportAs: 'matTabNavBar, matTabNav', inputs: ['color'], host: {\n '[attr.role]': '_getRole()',\n 'class': 'mat-tab-nav-bar mat-tab-header',\n '[class.mat-tab-header-pagination-controls-enabled]': '_showPaginationControls',\n '[class.mat-tab-header-rtl]': \"_getLayoutDirection() == 'rtl'\",\n '[class.mat-primary]': 'color !== \"warn\" && color !== \"accent\"',\n '[class.mat-accent]': 'color === \"accent\"',\n '[class.mat-warn]': 'color === \"warn\"',\n }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.Default, template: \"\\n\\n\\n\\n\\n\\n\", styles: [\".mat-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0}.mat-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-tab-header-pagination::-moz-focus-inner{border:0}.mat-tab-header-pagination-controls-enabled .mat-tab-header-pagination{display:flex}.mat-tab-header-pagination-before,.mat-tab-header-rtl .mat-tab-header-pagination-after{padding-left:4px}.mat-tab-header-pagination-before .mat-tab-header-pagination-chevron,.mat-tab-header-rtl .mat-tab-header-pagination-after .mat-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-tab-header-rtl .mat-tab-header-pagination-before,.mat-tab-header-pagination-after{padding-right:4px}.mat-tab-header-rtl .mat-tab-header-pagination-before .mat-tab-header-pagination-chevron,.mat-tab-header-pagination-after .mat-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;height:8px;width:8px}.mat-tab-header-pagination-disabled{box-shadow:none;cursor:default}.mat-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-tab-links{display:flex}[mat-align-tabs=center]>.mat-tab-link-container .mat-tab-links{justify-content:center}[mat-align-tabs=end]>.mat-tab-link-container .mat-tab-links{justify-content:flex-end}.mat-ink-bar{position:absolute;bottom:0;height:2px;transition:500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-ink-bar._mat-animation-noopable{transition:none !important;animation:none !important}.mat-tab-group-inverted-header .mat-ink-bar{bottom:auto;top:0}.cdk-high-contrast-active .mat-ink-bar{outline:solid 2px;height:0}.mat-tab-link-container{display:flex;flex-grow:1;overflow:hidden;z-index:1}.mat-tab-link{height:48px;padding:0 24px;cursor:pointer;box-sizing:border-box;opacity:.6;min-width:160px;text-align:center;display:inline-flex;justify-content:center;align-items:center;white-space:nowrap;vertical-align:top;text-decoration:none;position:relative;overflow:hidden;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-tab-link:focus{outline:none}.mat-tab-link:focus:not(.mat-tab-disabled){opacity:1}.mat-tab-link.mat-tab-disabled{cursor:default}.cdk-high-contrast-active .mat-tab-link.mat-tab-disabled{opacity:.5}.mat-tab-link .mat-tab-label-content{display:inline-flex;justify-content:center;align-items:center;white-space:nowrap}.cdk-high-contrast-active .mat-tab-link{opacity:1}[mat-stretch-tabs] .mat-tab-link{flex-basis:0;flex-grow:1}.mat-tab-link.mat-tab-disabled{pointer-events:none}.mat-tab-link::before{margin:5px}@media(max-width: 599px){.mat-tab-link{min-width:72px}}\"] }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.Directionality, decorators: [{\n type: Optional\n }] }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i1$1.ViewportRuler }, { type: i3.Platform }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }]; }, propDecorators: { _items: [{\n type: ContentChildren,\n args: [forwardRef(() => MatTabLink), { descendants: true }]\n }], _inkBar: [{\n type: ViewChild,\n args: [MatInkBar, { static: true }]\n }], _tabListContainer: [{\n type: ViewChild,\n args: ['tabListContainer', { static: true }]\n }], _tabList: [{\n type: ViewChild,\n args: ['tabList', { static: true }]\n }], _tabListInner: [{\n type: ViewChild,\n args: ['tabListInner', { static: true }]\n }], _nextPaginator: [{\n type: ViewChild,\n args: ['nextPaginator']\n }], _previousPaginator: [{\n type: ViewChild,\n args: ['previousPaginator']\n }] } });\n// Boilerplate for applying mixins to MatTabLink.\nconst _MatTabLinkMixinBase = mixinTabIndex(mixinDisableRipple(mixinDisabled(class {\n})));\n/** Base class with all of the `MatTabLink` functionality. */\nclass _MatTabLinkBase extends _MatTabLinkMixinBase {\n constructor(_tabNavBar, \n /** @docs-private */ elementRef, globalRippleOptions, tabIndex, _focusMonitor, animationMode) {\n super();\n this._tabNavBar = _tabNavBar;\n this.elementRef = elementRef;\n this._focusMonitor = _focusMonitor;\n /** Whether the tab link is active or not. */\n this._isActive = false;\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 = { enterDuration: 0, exitDuration: 0 };\n }\n }\n /** Whether the link is active. */\n get active() {\n return this._isActive;\n }\n set active(value) {\n const newValue = coerceBooleanProperty(value);\n if (newValue !== this._isActive) {\n this._isActive = newValue;\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 ||\n this.disableRipple ||\n this._tabNavBar.disableRipple ||\n !!this.rippleConfig.disabled);\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._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 (this._tabNavBar.tabPanel && event.keyCode === SPACE) {\n this.elementRef.nativeElement.click();\n }\n }\n _getAriaControls() {\n return this._tabNavBar.tabPanel\n ? this._tabNavBar.tabPanel?.id\n : this.elementRef.nativeElement.getAttribute('aria-controls');\n }\n _getAriaSelected() {\n if (this._tabNavBar.tabPanel) {\n return this.active ? 'true' : 'false';\n }\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 }\n else {\n return this.tabIndex;\n }\n }\n}\n_MatTabLinkBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: _MatTabLinkBase, deps: [{ token: _MatTabNavBase }, { token: i0.ElementRef }, { token: MAT_RIPPLE_GLOBAL_OPTIONS, optional: true }, { token: 'tabindex', attribute: true }, { token: i7.FocusMonitor }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Directive });\n_MatTabLinkBase.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: _MatTabLinkBase, inputs: { active: \"active\", id: \"id\" }, usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: _MatTabLinkBase, decorators: [{\n type: Directive\n }], ctorParameters: function () { return [{ type: _MatTabNavBase }, { type: i0.ElementRef }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_RIPPLE_GLOBAL_OPTIONS]\n }] }, { type: undefined, decorators: [{\n type: Attribute,\n args: ['tabindex']\n }] }, { type: i7.FocusMonitor }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }]; }, propDecorators: { active: [{\n type: Input\n }], id: [{\n type: Input\n }] } });\n/**\n * Link inside of a `mat-tab-nav-bar`.\n */\nclass MatTabLink extends _MatTabLinkBase {\n constructor(tabNavBar, elementRef, ngZone, platform, globalRippleOptions, tabIndex, focusMonitor, animationMode) {\n super(tabNavBar, elementRef, globalRippleOptions, tabIndex, focusMonitor, animationMode);\n this._tabLinkRipple = new RippleRenderer(this, ngZone, elementRef, platform);\n this._tabLinkRipple.setupTriggerEvents(elementRef.nativeElement);\n }\n ngOnDestroy() {\n super.ngOnDestroy();\n this._tabLinkRipple._removeTriggerEvents();\n }\n}\nMatTabLink.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabLink, deps: [{ token: MatTabNav }, { token: i0.ElementRef }, { token: i0.NgZone }, { token: i3.Platform }, { token: MAT_RIPPLE_GLOBAL_OPTIONS, optional: true }, { token: 'tabindex', attribute: true }, { token: i7.FocusMonitor }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Directive });\nMatTabLink.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatTabLink, selector: \"[mat-tab-link], [matTabLink]\", inputs: { disabled: \"disabled\", disableRipple: \"disableRipple\", tabIndex: \"tabIndex\" }, host: { listeners: { \"focus\": \"_handleFocus()\", \"keydown\": \"_handleKeydown($event)\" }, properties: { \"attr.aria-controls\": \"_getAriaControls()\", \"attr.aria-current\": \"_getAriaCurrent()\", \"attr.aria-disabled\": \"disabled\", \"attr.aria-selected\": \"_getAriaSelected()\", \"attr.id\": \"id\", \"attr.tabIndex\": \"_getTabIndex()\", \"attr.role\": \"_getRole()\", \"class.mat-tab-disabled\": \"disabled\", \"class.mat-tab-label-active\": \"active\" }, classAttribute: \"mat-tab-link mat-focus-indicator\" }, exportAs: [\"matTabLink\"], usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabLink, decorators: [{\n type: Directive,\n args: [{\n selector: '[mat-tab-link], [matTabLink]',\n exportAs: 'matTabLink',\n inputs: ['disabled', 'disableRipple', 'tabIndex'],\n host: {\n 'class': 'mat-tab-link mat-focus-indicator',\n '[attr.aria-controls]': '_getAriaControls()',\n '[attr.aria-current]': '_getAriaCurrent()',\n '[attr.aria-disabled]': 'disabled',\n '[attr.aria-selected]': '_getAriaSelected()',\n '[attr.id]': 'id',\n '[attr.tabIndex]': '_getTabIndex()',\n '[attr.role]': '_getRole()',\n '[class.mat-tab-disabled]': 'disabled',\n '[class.mat-tab-label-active]': 'active',\n '(focus)': '_handleFocus()',\n '(keydown)': '_handleKeydown($event)',\n },\n }]\n }], ctorParameters: function () { return [{ type: MatTabNav }, { type: i0.ElementRef }, { type: i0.NgZone }, { type: i3.Platform }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_RIPPLE_GLOBAL_OPTIONS]\n }] }, { type: undefined, decorators: [{\n type: Attribute,\n args: ['tabindex']\n }] }, { type: i7.FocusMonitor }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }]; } });\n/**\n * Tab panel component associated with MatTabNav.\n */\nclass MatTabNavPanel {\n constructor() {\n /** Unique id for the tab panel. */\n this.id = `mat-tab-nav-panel-${nextUniqueId++}`;\n }\n}\nMatTabNavPanel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabNavPanel, deps: [], target: i0.ɵɵFactoryTarget.Component });\nMatTabNavPanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.2.0\", type: MatTabNavPanel, selector: \"mat-tab-nav-panel\", inputs: { id: \"id\" }, host: { attributes: { \"role\": \"tabpanel\" }, properties: { \"attr.aria-labelledby\": \"_activeTabId\", \"attr.id\": \"id\" }, classAttribute: \"mat-tab-nav-panel\" }, exportAs: [\"matTabNavPanel\"], ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabNavPanel, decorators: [{\n type: Component,\n args: [{\n selector: 'mat-tab-nav-panel',\n exportAs: 'matTabNavPanel',\n template: '',\n host: {\n '[attr.aria-labelledby]': '_activeTabId',\n '[attr.id]': 'id',\n 'class': 'mat-tab-nav-panel',\n 'role': 'tabpanel',\n },\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n }]\n }], propDecorators: { id: [{\n type: Input\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatTabsModule {\n}\nMatTabsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nMatTabsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabsModule, declarations: [MatTabGroup,\n MatTabLabel,\n MatTab,\n MatInkBar,\n MatTabLabelWrapper,\n MatTabNav,\n MatTabNavPanel,\n MatTabLink,\n MatTabBody,\n MatTabBodyPortal,\n MatTabHeader,\n MatTabContent], imports: [CommonModule,\n MatCommonModule,\n PortalModule,\n MatRippleModule,\n ObserversModule,\n A11yModule], exports: [MatCommonModule,\n MatTabGroup,\n MatTabLabel,\n MatTab,\n MatTabNav,\n MatTabNavPanel,\n MatTabLink,\n MatTabContent] });\nMatTabsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabsModule, imports: [CommonModule,\n MatCommonModule,\n PortalModule,\n MatRippleModule,\n ObserversModule,\n A11yModule, MatCommonModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.2.0\", ngImport: i0, type: MatTabsModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [\n CommonModule,\n MatCommonModule,\n PortalModule,\n MatRippleModule,\n ObserversModule,\n A11yModule,\n ],\n // Don't export all components because some are only to be used internally.\n exports: [\n MatCommonModule,\n MatTabGroup,\n MatTabLabel,\n MatTab,\n MatTabNav,\n MatTabNavPanel,\n MatTabLink,\n MatTabContent,\n ],\n declarations: [\n MatTabGroup,\n MatTabLabel,\n MatTab,\n MatInkBar,\n MatTabLabelWrapper,\n MatTabNav,\n MatTabNavPanel,\n MatTabLink,\n MatTabBody,\n MatTabBodyPortal,\n MatTabHeader,\n MatTabContent,\n ],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MAT_TAB, MAT_TABS_CONFIG, MAT_TAB_GROUP, MatInkBar, MatTab, MatTabBody, MatTabBodyPortal, MatTabChangeEvent, MatTabContent, MatTabGroup, MatTabHeader, MatTabLabel, MatTabLabelWrapper, MatTabLink, MatTabNav, MatTabNavPanel, MatTabsModule, _MAT_INK_BAR_POSITIONER, _MatTabBodyBase, _MatTabGroupBase, _MatTabHeaderBase, _MatTabLinkBase, _MatTabNavBase, matTabsAnimations };\n","import * as i0 from '@angular/core';\nimport { EventEmitter, Component, ChangeDetectionStrategy, Input, Output, forwardRef, NgModule } from '@angular/core';\nimport * as i2 from 'ngx-color';\nimport { isValidHex, ColorWrap, AlphaModule, CheckboardModule, EditableInputModule, HueModule, SaturationModule } from 'ngx-color';\nimport { TinyColor } from '@ctrl/tinycolor';\nimport * as i1 from '@angular/common';\nimport { CommonModule } from '@angular/common';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\n\nclass ChromeFieldsComponent {\n constructor() {\n this.onChange = new EventEmitter();\n this.view = '';\n this.input = {\n fontSize: '11px',\n color: '#333',\n width: '100%',\n borderRadius: '2px',\n border: 'none',\n boxShadow: 'inset 0 0 0 1px #dadada',\n height: '21px',\n 'text-align': 'center',\n };\n this.label = {\n 'text-transform': 'uppercase',\n fontSize: '11px',\n 'line-height': '11px',\n color: '#969696',\n 'text-align': 'center',\n display: 'block',\n marginTop: '12px',\n };\n }\n ngOnInit() {\n if (this.hsl.a === 1 && this.view !== 'hex') {\n this.view = 'hex';\n }\n else if (this.view !== 'rgb' && this.view !== 'hsl') {\n this.view = 'rgb';\n }\n }\n toggleViews() {\n if (this.view === 'hex') {\n this.view = 'rgb';\n }\n else if (this.view === 'rgb') {\n this.view = 'hsl';\n }\n else if (this.view === 'hsl') {\n if (this.hsl.a === 1) {\n this.view = 'hex';\n }\n else {\n this.view = 'rgb';\n }\n }\n }\n round(value) {\n return Math.round(value);\n }\n handleChange({ data, $event }) {\n if (data.hex) {\n if (isValidHex(data.hex)) {\n const color = new TinyColor(data.hex);\n this.onChange.emit({\n data: {\n hex: this.disableAlpha ? color.toHex() : color.toHex8(),\n source: 'hex',\n },\n $event,\n });\n }\n }\n else if (data.r || data.g || data.b) {\n this.onChange.emit({\n data: {\n r: data.r || this.rgb.r,\n g: data.g || this.rgb.g,\n b: data.b || this.rgb.b,\n source: 'rgb',\n },\n $event,\n });\n }\n else if (data.a) {\n if (data.a < 0) {\n data.a = 0;\n }\n else if (data.a > 1) {\n data.a = 1;\n }\n if (this.disableAlpha) {\n data.a = 1;\n }\n this.onChange.emit({\n data: {\n h: this.hsl.h,\n s: this.hsl.s,\n l: this.hsl.l,\n a: Math.round(data.a * 100) / 100,\n source: 'rgb',\n },\n $event,\n });\n }\n else if (data.h || data.s || data.l) {\n const s = data.s && data.s.replace('%', '');\n const l = data.l && data.l.replace('%', '');\n this.onChange.emit({\n data: {\n h: data.h || this.hsl.h,\n s: Number(s || this.hsl.s),\n l: Number(l || this.hsl.l),\n source: 'hsl',\n },\n $event,\n });\n }\n }\n}\nChromeFieldsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: ChromeFieldsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\nChromeFieldsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.1.2\", type: ChromeFieldsComponent, selector: \"color-chrome-fields\", inputs: { disableAlpha: \"disableAlpha\", hsl: \"hsl\", rgb: \"rgb\", hex: \"hex\" }, outputs: { onChange: \"onChange\" }, ngImport: i0, template: `\n
\n
\n \n
\n \n
\n
\n \n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n\n
\n
\n \n \n \n \n
\n
\n
\n `, isInline: true, styles: [\".chrome-wrap{padding-top:16px;display:flex}.chrome-fields{flex:1;display:flex;margin-left:-6px}.chrome-field{padding-left:6px;width:100%}.chrome-toggle{width:32px;text-align:right;position:relative}.chrome-icon{margin-right:-4px;margin-top:12px;cursor:pointer;position:relative}.chrome-toggle-svg{width:24px;height:24px;border:1px transparent solid;border-radius:5px}.chrome-toggle-svg:hover{background:#eee}\\n\"], dependencies: [{ kind: \"directive\", type: i1.NgIf, selector: \"[ngIf]\", inputs: [\"ngIf\", \"ngIfThen\", \"ngIfElse\"] }, { kind: \"component\", type: i2.EditableInputComponent, selector: \"color-editable-input\", inputs: [\"style\", \"label\", \"value\", \"arrowOffset\", \"dragLabel\", \"dragMax\", \"placeholder\"], outputs: [\"onChange\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: ChromeFieldsComponent, decorators: [{\n type: Component,\n args: [{ selector: 'color-chrome-fields', template: `\n
\n
\n \n
\n \n
\n
\n \n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n\n
\n
\n \n \n \n \n
\n
\n
\n `, changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, styles: [\".chrome-wrap{padding-top:16px;display:flex}.chrome-fields{flex:1;display:flex;margin-left:-6px}.chrome-field{padding-left:6px;width:100%}.chrome-toggle{width:32px;text-align:right;position:relative}.chrome-icon{margin-right:-4px;margin-top:12px;cursor:pointer;position:relative}.chrome-toggle-svg{width:24px;height:24px;border:1px transparent solid;border-radius:5px}.chrome-toggle-svg:hover{background:#eee}\\n\"] }]\n }], propDecorators: { disableAlpha: [{\n type: Input\n }], hsl: [{\n type: Input\n }], rgb: [{\n type: Input\n }], hex: [{\n type: Input\n }], onChange: [{\n type: Output\n }] } });\n\nclass ChromeComponent extends ColorWrap {\n constructor() {\n super();\n /** Remove alpha slider and options from picker */\n this.disableAlpha = false;\n this.circle = {\n width: '12px',\n height: '12px',\n borderRadius: '6px',\n boxShadow: 'rgb(255, 255, 255) 0px 0px 0px 1px inset',\n transform: 'translate(-6px, -8px)',\n };\n this.pointer = {\n width: '12px',\n height: '12px',\n borderRadius: '6px',\n transform: 'translate(-6px, -2px)',\n backgroundColor: 'rgb(248, 248, 248)',\n boxShadow: '0 1px 4px 0 rgba(0, 0, 0, 0.37)',\n };\n }\n afterValidChange() {\n const alpha = this.disableAlpha ? 1 : this.rgb.a;\n this.activeBackground = `rgba(${this.rgb.r}, ${this.rgb.g}, ${this.rgb.b}, ${alpha})`;\n }\n handleValueChange({ data, $event }) {\n this.handleChange(data, $event);\n }\n}\nChromeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: ChromeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\nChromeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.1.2\", type: ChromeComponent, selector: \"color-chrome\", inputs: { disableAlpha: \"disableAlpha\" }, providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ChromeComponent),\n multi: true,\n },\n {\n provide: ColorWrap,\n useExisting: forwardRef(() => ChromeComponent),\n },\n ], usesInheritance: true, ngImport: i0, template: `\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n \n
\n
\n `, isInline: true, styles: [\".chrome-picker{background:#fff;border-radius:2px;box-shadow:0 0 2px #0000004d,0 4px 8px #0000004d;box-sizing:initial;width:225px;font-family:Menlo}.chrome-controls{display:flex}.chrome-color{width:42px}.chrome-body{padding:14px 14px 12px}.chrome-active{position:absolute;top:0;bottom:0;left:0;right:0;border-radius:20px;box-shadow:inset 0 0 0 1px #0000001a;z-index:2}.chrome-swatch{width:28px;height:28px;border-radius:15px;position:relative;overflow:hidden}.saturation{width:100%;padding-bottom:55%;position:relative;border-radius:2px 2px 0 0;overflow:hidden}.chrome-toggles{flex:1}.chrome-hue{height:10px;position:relative;margin-bottom:8px}.chrome-alpha{height:10px;position:relative}\\n\"], dependencies: [{ kind: \"directive\", type: i0.forwardRef(function () { return i1.NgIf; }), selector: \"[ngIf]\", inputs: [\"ngIf\", \"ngIfThen\", \"ngIfElse\"] }, { kind: \"component\", type: i0.forwardRef(function () { return i2.AlphaComponent; }), selector: \"color-alpha\", inputs: [\"hsl\", \"rgb\", \"pointer\", \"shadow\", \"radius\", \"direction\"], outputs: [\"onChange\"] }, { kind: \"component\", type: i0.forwardRef(function () { return i2.CheckboardComponent; }), selector: \"color-checkboard\", inputs: [\"white\", \"size\", \"grey\", \"boxShadow\", \"borderRadius\"] }, { kind: \"component\", type: i0.forwardRef(function () { return i2.HueComponent; }), selector: \"color-hue\", inputs: [\"hsl\", \"pointer\", \"radius\", \"shadow\", \"hidePointer\", \"direction\"], outputs: [\"onChange\"] }, { kind: \"component\", type: i0.forwardRef(function () { return i2.SaturationComponent; }), selector: \"color-saturation\", inputs: [\"hsl\", \"hsv\", \"radius\", \"pointer\", \"circle\"], outputs: [\"onChange\"] }, { kind: \"component\", type: i0.forwardRef(function () { return ChromeFieldsComponent; }), selector: \"color-chrome-fields\", inputs: [\"disableAlpha\", \"hsl\", \"rgb\", \"hex\"], outputs: [\"onChange\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: ChromeComponent, decorators: [{\n type: Component,\n args: [{ selector: 'color-chrome', template: `\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n \n
\n
\n `, changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ChromeComponent),\n multi: true,\n },\n {\n provide: ColorWrap,\n useExisting: forwardRef(() => ChromeComponent),\n },\n ], styles: [\".chrome-picker{background:#fff;border-radius:2px;box-shadow:0 0 2px #0000004d,0 4px 8px #0000004d;box-sizing:initial;width:225px;font-family:Menlo}.chrome-controls{display:flex}.chrome-color{width:42px}.chrome-body{padding:14px 14px 12px}.chrome-active{position:absolute;top:0;bottom:0;left:0;right:0;border-radius:20px;box-shadow:inset 0 0 0 1px #0000001a;z-index:2}.chrome-swatch{width:28px;height:28px;border-radius:15px;position:relative;overflow:hidden}.saturation{width:100%;padding-bottom:55%;position:relative;border-radius:2px 2px 0 0;overflow:hidden}.chrome-toggles{flex:1}.chrome-hue{height:10px;position:relative;margin-bottom:8px}.chrome-alpha{height:10px;position:relative}\\n\"] }]\n }], ctorParameters: function () { return []; }, propDecorators: { disableAlpha: [{\n type: Input\n }] } });\nclass ColorChromeModule {\n}\nColorChromeModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: ColorChromeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nColorChromeModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.1.2\", ngImport: i0, type: ColorChromeModule, declarations: [ChromeComponent, ChromeFieldsComponent], imports: [CommonModule,\n AlphaModule,\n CheckboardModule,\n EditableInputModule,\n HueModule,\n SaturationModule], exports: [ChromeComponent, ChromeFieldsComponent] });\nColorChromeModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: ColorChromeModule, imports: [CommonModule,\n AlphaModule,\n CheckboardModule,\n EditableInputModule,\n HueModule,\n SaturationModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: ColorChromeModule, decorators: [{\n type: NgModule,\n args: [{\n declarations: [ChromeComponent, ChromeFieldsComponent],\n exports: [ChromeComponent, ChromeFieldsComponent],\n imports: [\n CommonModule,\n AlphaModule,\n CheckboardModule,\n EditableInputModule,\n HueModule,\n SaturationModule,\n ],\n }]\n }] });\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { ChromeComponent, ChromeFieldsComponent, ColorChromeModule };\n","import * as i1 from '@angular/common';\nimport { CommonModule } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { Component, ChangeDetectionStrategy, Input, NgModule, Directive, Output, HostListener, EventEmitter, isDevMode, forwardRef } from '@angular/core';\nimport { Subject, Subscription, fromEvent } from 'rxjs';\nimport { distinctUntilChanged, debounceTime, tap } from 'rxjs/operators';\nimport { TinyColor } from '@ctrl/tinycolor';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\n\nconst checkboardCache = {};\nfunction render(c1, c2, size) {\n if (typeof document === 'undefined') {\n return null;\n }\n const canvas = document.createElement('canvas');\n canvas.width = size * 2;\n canvas.height = size * 2;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return null;\n } // If no context can be found, return early.\n ctx.fillStyle = c1;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.fillStyle = c2;\n ctx.fillRect(0, 0, size, size);\n ctx.translate(size, size);\n ctx.fillRect(0, 0, size, size);\n return canvas.toDataURL();\n}\nfunction getCheckerboard(c1, c2, size) {\n const key = `${c1}-${c2}-${size}`;\n if (checkboardCache[key]) {\n return checkboardCache[key];\n }\n const checkboard = render(c1, c2, size);\n if (!checkboard) {\n return null;\n }\n checkboardCache[key] = checkboard;\n return checkboard;\n}\n\nclass CheckboardComponent {\n constructor() {\n this.white = 'transparent';\n this.size = 8;\n this.grey = 'rgba(0,0,0,.08)';\n }\n ngOnInit() {\n const background = getCheckerboard(this.white, this.grey, this.size);\n this.gridStyles = {\n borderRadius: this.borderRadius,\n boxShadow: this.boxShadow,\n background: `url(${background}) center left`,\n };\n }\n}\nCheckboardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: CheckboardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\nCheckboardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.1.2\", type: CheckboardComponent, selector: \"color-checkboard\", inputs: { white: \"white\", size: \"size\", grey: \"grey\", boxShadow: \"boxShadow\", borderRadius: \"borderRadius\" }, ngImport: i0, template: `
`, isInline: true, styles: [\".grid{top:0px;right:0px;bottom:0px;left:0px;position:absolute}\\n\"], dependencies: [{ kind: \"directive\", type: i1.NgStyle, selector: \"[ngStyle]\", inputs: [\"ngStyle\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: CheckboardComponent, decorators: [{\n type: Component,\n args: [{ selector: 'color-checkboard', template: `
`, preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, styles: [\".grid{top:0px;right:0px;bottom:0px;left:0px;position:absolute}\\n\"] }]\n }], propDecorators: { white: [{\n type: Input\n }], size: [{\n type: Input\n }], grey: [{\n type: Input\n }], boxShadow: [{\n type: Input\n }], borderRadius: [{\n type: Input\n }] } });\nclass CheckboardModule {\n}\nCheckboardModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: CheckboardModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nCheckboardModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.1.2\", ngImport: i0, type: CheckboardModule, declarations: [CheckboardComponent], imports: [CommonModule], exports: [CheckboardComponent] });\nCheckboardModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: CheckboardModule, imports: [CommonModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: CheckboardModule, decorators: [{\n type: NgModule,\n args: [{\n declarations: [CheckboardComponent],\n exports: [CheckboardComponent],\n imports: [CommonModule],\n }]\n }] });\n\nclass CoordinatesDirective {\n constructor(el) {\n this.el = el;\n this.coordinatesChange = new Subject();\n this.mousechange = new Subject();\n this.mouseListening = false;\n }\n mousemove($event, x, y, isTouch = false) {\n if (this.mouseListening) {\n $event.preventDefault();\n this.mousechange.next({ $event, x, y, isTouch });\n }\n }\n mouseup() {\n this.mouseListening = false;\n }\n mousedown($event, x, y, isTouch = false) {\n $event.preventDefault();\n this.mouseListening = true;\n this.mousechange.next({ $event, x, y, isTouch });\n }\n ngOnInit() {\n this.sub = this.mousechange\n .pipe(\n // limit times it is updated for the same area\n distinctUntilChanged((p, q) => p.x === q.x && p.y === q.y))\n .subscribe(n => this.handleChange(n.x, n.y, n.$event, n.isTouch));\n }\n ngOnDestroy() {\n this.sub?.unsubscribe();\n }\n handleChange(x, y, $event, isTouch) {\n const containerWidth = this.el.nativeElement.clientWidth;\n const containerHeight = this.el.nativeElement.clientHeight;\n const left = x -\n (this.el.nativeElement.getBoundingClientRect().left + window.pageXOffset);\n let top = y - this.el.nativeElement.getBoundingClientRect().top;\n if (!isTouch) {\n top = top - window.pageYOffset;\n }\n this.coordinatesChange.next({\n x,\n y,\n top,\n left,\n containerWidth,\n containerHeight,\n $event,\n });\n }\n}\nCoordinatesDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: CoordinatesDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });\nCoordinatesDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"14.1.2\", type: CoordinatesDirective, selector: \"[ngx-color-coordinates]\", outputs: { coordinatesChange: \"coordinatesChange\" }, host: { listeners: { \"window:mousemove\": \"mousemove($event,$event.pageX,$event.pageY)\", \"window:touchmove\": \"mousemove($event,$event.touches[0].clientX,$event.touches[0].clientY,true)\", \"window:mouseup\": \"mouseup()\", \"window:touchend\": \"mouseup()\", \"mousedown\": \"mousedown($event,$event.pageX,$event.pageY)\", \"touchstart\": \"mousedown($event,$event.touches[0].clientX,$event.touches[0].clientY,true)\" } }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: CoordinatesDirective, decorators: [{\n type: Directive,\n args: [{ selector: '[ngx-color-coordinates]' }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { coordinatesChange: [{\n type: Output\n }], mousemove: [{\n type: HostListener,\n args: ['window:mousemove', ['$event', '$event.pageX', '$event.pageY']]\n }, {\n type: HostListener,\n args: ['window:touchmove', [\n '$event',\n '$event.touches[0].clientX',\n '$event.touches[0].clientY',\n 'true',\n ]]\n }], mouseup: [{\n type: HostListener,\n args: ['window:mouseup']\n }, {\n type: HostListener,\n args: ['window:touchend']\n }], mousedown: [{\n type: HostListener,\n args: ['mousedown', ['$event', '$event.pageX', '$event.pageY']]\n }, {\n type: HostListener,\n args: ['touchstart', [\n '$event',\n '$event.touches[0].clientX',\n '$event.touches[0].clientY',\n 'true',\n ]]\n }] } });\nclass CoordinatesModule {\n}\nCoordinatesModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: CoordinatesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nCoordinatesModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.1.2\", ngImport: i0, type: CoordinatesModule, declarations: [CoordinatesDirective], exports: [CoordinatesDirective] });\nCoordinatesModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: CoordinatesModule });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: CoordinatesModule, decorators: [{\n type: NgModule,\n args: [{\n declarations: [CoordinatesDirective],\n exports: [CoordinatesDirective],\n }]\n }] });\n\nclass AlphaComponent {\n constructor() {\n this.direction = 'horizontal';\n this.onChange = new EventEmitter();\n }\n ngOnChanges() {\n if (this.direction === 'vertical') {\n this.pointerLeft = 0;\n this.pointerTop = this.rgb.a * 100;\n this.gradient = {\n background: `linear-gradient(to bottom, rgba(${this.rgb.r},${this.rgb.g},${this.rgb.b}, 0) 0%,\n rgba(${this.rgb.r},${this.rgb.g},${this.rgb.b}, 1) 100%)`,\n };\n }\n else {\n this.gradient = {\n background: `linear-gradient(to right, rgba(${this.rgb.r},${this.rgb.g},${this.rgb.b}, 0) 0%,\n rgba(${this.rgb.r},${this.rgb.g},${this.rgb.b}, 1) 100%)`,\n };\n this.pointerLeft = this.rgb.a * 100;\n }\n }\n handleChange({ top, left, containerHeight, containerWidth, $event }) {\n let data;\n if (this.direction === 'vertical') {\n let a;\n if (top < 0) {\n a = 0;\n }\n else if (top > containerHeight) {\n a = 1;\n }\n else {\n a = Math.round(top * 100 / containerHeight) / 100;\n }\n if (this.hsl.a !== a) {\n data = {\n h: this.hsl.h,\n s: this.hsl.s,\n l: this.hsl.l,\n a,\n source: 'rgb',\n };\n }\n }\n else {\n let a;\n if (left < 0) {\n a = 0;\n }\n else if (left > containerWidth) {\n a = 1;\n }\n else {\n a = Math.round(left * 100 / containerWidth) / 100;\n }\n if (this.hsl.a !== a) {\n data = {\n h: this.hsl.h,\n s: this.hsl.s,\n l: this.hsl.l,\n a,\n source: 'rgb',\n };\n }\n }\n if (!data) {\n return;\n }\n this.onChange.emit({ data, $event });\n }\n}\nAlphaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: AlphaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\nAlphaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.1.2\", type: AlphaComponent, selector: \"color-alpha\", inputs: { hsl: \"hsl\", rgb: \"rgb\", pointer: \"pointer\", shadow: \"shadow\", radius: \"radius\", direction: \"direction\" }, outputs: { onChange: \"onChange\" }, usesOnChanges: true, ngImport: i0, template: `\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n `, isInline: true, styles: [\".alpha{position:absolute;top:0;bottom:0;left:0;right:0}.alpha-checkboard{position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden}.alpha-gradient{position:absolute;top:0;bottom:0;left:0;right:0}.alpha-container{position:relative;height:100%;margin:0 3px}.alpha-pointer{position:absolute}.alpha-slider{width:4px;border-radius:1px;height:8px;box-shadow:0 0 2px #0009;background:#fff;margin-top:1px;transform:translate(-2px)}\\n\"], dependencies: [{ kind: \"directive\", type: i1.NgStyle, selector: \"[ngStyle]\", inputs: [\"ngStyle\"] }, { kind: \"component\", type: CheckboardComponent, selector: \"color-checkboard\", inputs: [\"white\", \"size\", \"grey\", \"boxShadow\", \"borderRadius\"] }, { kind: \"directive\", type: CoordinatesDirective, selector: \"[ngx-color-coordinates]\", outputs: [\"coordinatesChange\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: AlphaComponent, decorators: [{\n type: Component,\n args: [{ selector: 'color-alpha', template: `\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n `, changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, styles: [\".alpha{position:absolute;top:0;bottom:0;left:0;right:0}.alpha-checkboard{position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden}.alpha-gradient{position:absolute;top:0;bottom:0;left:0;right:0}.alpha-container{position:relative;height:100%;margin:0 3px}.alpha-pointer{position:absolute}.alpha-slider{width:4px;border-radius:1px;height:8px;box-shadow:0 0 2px #0009;background:#fff;margin-top:1px;transform:translate(-2px)}\\n\"] }]\n }], propDecorators: { hsl: [{\n type: Input\n }], rgb: [{\n type: Input\n }], pointer: [{\n type: Input\n }], shadow: [{\n type: Input\n }], radius: [{\n type: Input\n }], direction: [{\n type: Input\n }], onChange: [{\n type: Output\n }] } });\nclass AlphaModule {\n}\nAlphaModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: AlphaModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nAlphaModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.1.2\", ngImport: i0, type: AlphaModule, declarations: [AlphaComponent], imports: [CommonModule, CheckboardModule, CoordinatesModule], exports: [AlphaComponent] });\nAlphaModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: AlphaModule, imports: [CommonModule, CheckboardModule, CoordinatesModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: AlphaModule, decorators: [{\n type: NgModule,\n args: [{\n declarations: [AlphaComponent],\n exports: [AlphaComponent],\n imports: [CommonModule, CheckboardModule, CoordinatesModule],\n }]\n }] });\n\nfunction simpleCheckForValidColor(data) {\n const keysToCheck = ['r', 'g', 'b', 'a', 'h', 's', 'l', 'v'];\n let checked = 0;\n let passed = 0;\n keysToCheck.forEach(letter => {\n if (!data[letter]) {\n return;\n }\n checked += 1;\n if (!isNaN(data[letter])) {\n passed += 1;\n }\n if (letter === 's' || letter === 'l') {\n const percentPatt = /^\\d+%$/;\n if (percentPatt.test(data[letter])) {\n passed += 1;\n }\n }\n });\n return checked === passed ? data : false;\n}\nfunction toState(data, oldHue, disableAlpha) {\n const color = data.hex ? new TinyColor(data.hex) : new TinyColor(data);\n if (disableAlpha) {\n color.setAlpha(1);\n }\n const hsl = color.toHsl();\n const hsv = color.toHsv();\n const rgb = color.toRgb();\n const hex = color.toHex();\n if (hsl.s === 0) {\n hsl.h = oldHue || 0;\n hsv.h = oldHue || 0;\n }\n const transparent = hex === '000000' && rgb.a === 0;\n return {\n hsl,\n hex: transparent ? 'transparent' : color.toHexString(),\n rgb,\n hsv,\n oldHue: data.h || oldHue || hsl.h,\n source: data.source,\n };\n}\nfunction isValidHex(hex) {\n return new TinyColor(hex).isValid;\n}\nfunction getContrastingColor(data) {\n if (!data) {\n return '#fff';\n }\n const col = toState(data);\n if (col.hex === 'transparent') {\n return 'rgba(0,0,0,0.4)';\n }\n const yiq = (col.rgb.r * 299 + col.rgb.g * 587 + col.rgb.b * 114) / 1000;\n return yiq >= 128 ? '#000' : '#fff';\n}\n\nvar ColorMode;\n(function (ColorMode) {\n ColorMode[\"HEX\"] = \"hex\";\n ColorMode[\"HSL\"] = \"hsl\";\n ColorMode[\"HSV\"] = \"hsv\";\n ColorMode[\"RGB\"] = \"rgb\";\n})(ColorMode || (ColorMode = {}));\nclass ColorWrap {\n constructor() {\n /**\n * Descriptors the return color format if the component is used with two-way binding\n */\n this.mode = ColorMode.HEX;\n this.color = {\n h: 250,\n s: 0.5,\n l: 0.2,\n a: 1,\n };\n this.colorChange = new EventEmitter();\n this.onChange = new EventEmitter();\n this.onChangeComplete = new EventEmitter();\n this.onSwatchHover = new EventEmitter();\n this._onChangeCompleteSubscription = new Subscription();\n this._onSwatchHoverSubscription = new Subscription();\n }\n ngOnInit() {\n this.changes = this.onChange\n .pipe(debounceTime(100), tap(event => {\n this.onChangeComplete.emit(event);\n switch (this.mode) {\n case ColorMode.HEX:\n this.colorChange.emit(event.color.hex);\n break;\n case ColorMode.HSL:\n this.colorChange.emit(event.color.hsl);\n break;\n case ColorMode.HSV:\n this.colorChange.emit(event.color.hsv);\n break;\n case ColorMode.RGB:\n this.colorChange.emit(event.color.rgb);\n break;\n default:\n const msg = `The mode '${this.mode}' is not supported`;\n if (isDevMode()) {\n throw new Error(msg);\n }\n else {\n console.warn(msg);\n }\n break;\n }\n }))\n .subscribe();\n this.setState(toState(this.color, 0));\n this.currentColor = this.hex;\n }\n ngOnChanges() {\n this.setState(toState(this.color, this.oldHue));\n }\n ngOnDestroy() {\n this.changes?.unsubscribe();\n this._onChangeCompleteSubscription?.unsubscribe();\n this._onSwatchHoverSubscription?.unsubscribe();\n }\n setState(data) {\n this.oldHue = data.oldHue;\n this.hsl = data.hsl;\n this.hsv = data.hsv;\n this.rgb = data.rgb;\n this.hex = data.hex;\n this.source = data.source;\n this.afterValidChange();\n }\n handleChange(data, $event) {\n const isValidColor = simpleCheckForValidColor(data);\n if (isValidColor) {\n const color = toState(data, data.h || this.oldHue, this.disableAlpha);\n this.setState(color);\n this.onChange.emit({ color, $event });\n this.afterValidChange();\n }\n }\n /** hook for components after a complete change */\n afterValidChange() { }\n handleSwatchHover(data, $event) {\n const isValidColor = simpleCheckForValidColor(data);\n if (isValidColor) {\n const color = toState(data, data.h || this.oldHue);\n this.setState(color);\n this.onSwatchHover.emit({ color, $event });\n }\n }\n registerOnChange(fn) {\n this._onChangeCompleteSubscription.add(this.onChangeComplete.pipe(tap(event => fn(event.color.hex))).subscribe());\n }\n registerOnTouched(fn) {\n this._onSwatchHoverSubscription.add(this.onSwatchHover.pipe(tap(() => fn())).subscribe());\n }\n setDisabledState(isDisabled) { }\n writeValue(hex) {\n this.color = hex;\n }\n}\nColorWrap.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: ColorWrap, deps: [], target: i0.ɵɵFactoryTarget.Component });\nColorWrap.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.1.2\", type: ColorWrap, selector: \"color-wrap\", inputs: { className: \"className\", mode: \"mode\", color: \"color\" }, outputs: { colorChange: \"colorChange\", onChange: \"onChange\", onChangeComplete: \"onChangeComplete\", onSwatchHover: \"onSwatchHover\" }, providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ColorWrap),\n multi: true,\n }\n ], usesOnChanges: true, ngImport: i0, template: ``, isInline: true });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: ColorWrap, decorators: [{\n type: Component,\n args: [{\n // create seletor base for test override property\n selector: 'color-wrap',\n template: ``,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ColorWrap),\n multi: true,\n }\n ]\n }]\n }], propDecorators: { className: [{\n type: Input\n }], mode: [{\n type: Input\n }], color: [{\n type: Input\n }], colorChange: [{\n type: Output\n }], onChange: [{\n type: Output\n }], onChangeComplete: [{\n type: Output\n }], onSwatchHover: [{\n type: Output\n }] } });\nclass ColorWrapModule {\n}\nColorWrapModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: ColorWrapModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nColorWrapModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.1.2\", ngImport: i0, type: ColorWrapModule, declarations: [ColorWrap], imports: [CommonModule], exports: [ColorWrap] });\nColorWrapModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: ColorWrapModule, imports: [CommonModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: ColorWrapModule, decorators: [{\n type: NgModule,\n args: [{\n declarations: [ColorWrap],\n exports: [ColorWrap],\n imports: [CommonModule],\n }]\n }] });\n\nlet nextUniqueId = 0;\nclass EditableInputComponent {\n constructor() {\n this.placeholder = '';\n this.onChange = new EventEmitter();\n this.focus = false;\n this.uniqueId = `editableInput-${++nextUniqueId}`;\n }\n ngOnInit() {\n this.wrapStyle = this.style && this.style.wrap ? this.style.wrap : {};\n this.inputStyle = this.style && this.style.input ? this.style.input : {};\n this.labelStyle = this.style && this.style.label ? this.style.label : {};\n if (this.dragLabel) {\n this.labelStyle.cursor = 'ew-resize';\n }\n }\n handleFocus($event) {\n this.focus = true;\n }\n handleFocusOut($event) {\n this.focus = false;\n this.currentValue = this.blurValue;\n }\n handleKeydown($event) {\n // In case `e.target.value` is a percentage remove the `%` character\n // and update accordingly with a percentage\n // https://github.com/casesandberg/react-color/issues/383\n const stringValue = String($event.target.value);\n const isPercentage = stringValue.indexOf('%') > -1;\n const num = Number(stringValue.replace(/%/g, ''));\n if (isNaN(num)) {\n return;\n }\n const amount = this.arrowOffset || 1;\n // Up\n if ($event.keyCode === 38) {\n if (this.label) {\n this.onChange.emit({\n data: { [this.label]: num + amount },\n $event,\n });\n }\n else {\n this.onChange.emit({ data: num + amount, $event });\n }\n if (isPercentage) {\n this.currentValue = `${num + amount}%`;\n }\n else {\n this.currentValue = num + amount;\n }\n }\n // Down\n if ($event.keyCode === 40) {\n if (this.label) {\n this.onChange.emit({\n data: { [this.label]: num - amount },\n $event,\n });\n }\n else {\n this.onChange.emit({ data: num - amount, $event });\n }\n if (isPercentage) {\n this.currentValue = `${num - amount}%`;\n }\n else {\n this.currentValue = num - amount;\n }\n }\n }\n handleKeyup($event) {\n if ($event.keyCode === 40 || $event.keyCode === 38) {\n return;\n }\n if (`${this.currentValue}` === $event.target.value) {\n return;\n }\n if (this.label) {\n this.onChange.emit({\n data: { [this.label]: $event.target.value },\n $event,\n });\n }\n else {\n this.onChange.emit({ data: $event.target.value, $event });\n }\n }\n ngOnChanges() {\n if (!this.focus) {\n this.currentValue = String(this.value).toUpperCase();\n this.blurValue = String(this.value).toUpperCase();\n }\n else {\n this.blurValue = String(this.value).toUpperCase();\n }\n }\n ngOnDestroy() {\n this.unsubscribe();\n }\n subscribe() {\n this.mousemove = fromEvent(document, 'mousemove').subscribe((ev) => this.handleDrag(ev));\n this.mouseup = fromEvent(document, 'mouseup').subscribe(() => this.unsubscribe());\n }\n unsubscribe() {\n this.mousemove?.unsubscribe();\n this.mouseup?.unsubscribe();\n }\n handleMousedown($event) {\n if (this.dragLabel) {\n $event.preventDefault();\n this.handleDrag($event);\n this.subscribe();\n }\n }\n handleDrag($event) {\n if (this.dragLabel) {\n const newValue = Math.round(this.value + $event.movementX);\n if (newValue >= 0 && newValue <= this.dragMax) {\n this.onChange.emit({ data: { [this.label]: newValue }, $event });\n }\n }\n }\n}\nEditableInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: EditableInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\nEditableInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.1.2\", type: EditableInputComponent, selector: \"color-editable-input\", inputs: { style: \"style\", label: \"label\", value: \"value\", arrowOffset: \"arrowOffset\", dragLabel: \"dragLabel\", dragMax: \"dragMax\", placeholder: \"placeholder\" }, outputs: { onChange: \"onChange\" }, usesOnChanges: true, ngImport: i0, template: `\n
\n \n \n {{ label }}\n \n
\n `, isInline: true, styles: [\":host{display:flex}.wrap{position:relative}\\n\"], dependencies: [{ kind: \"directive\", type: i1.NgIf, selector: \"[ngIf]\", inputs: [\"ngIf\", \"ngIfThen\", \"ngIfElse\"] }, { kind: \"directive\", type: i1.NgStyle, selector: \"[ngStyle]\", inputs: [\"ngStyle\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: EditableInputComponent, decorators: [{\n type: Component,\n args: [{ selector: 'color-editable-input', template: `\n
\n \n \n {{ label }}\n \n
\n `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [\":host{display:flex}.wrap{position:relative}\\n\"] }]\n }], propDecorators: { style: [{\n type: Input\n }], label: [{\n type: Input\n }], value: [{\n type: Input\n }], arrowOffset: [{\n type: Input\n }], dragLabel: [{\n type: Input\n }], dragMax: [{\n type: Input\n }], placeholder: [{\n type: Input\n }], onChange: [{\n type: Output\n }] } });\nclass EditableInputModule {\n}\nEditableInputModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: EditableInputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nEditableInputModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.1.2\", ngImport: i0, type: EditableInputModule, declarations: [EditableInputComponent], imports: [CommonModule], exports: [EditableInputComponent] });\nEditableInputModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: EditableInputModule, imports: [CommonModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: EditableInputModule, decorators: [{\n type: NgModule,\n args: [{\n declarations: [EditableInputComponent],\n exports: [EditableInputComponent],\n imports: [CommonModule],\n }]\n }] });\n\nclass HueComponent {\n constructor() {\n this.hidePointer = false;\n this.direction = 'horizontal';\n this.onChange = new EventEmitter();\n this.left = '0px';\n this.top = '';\n }\n ngOnChanges() {\n if (this.direction === 'horizontal') {\n this.left = `${this.hsl.h * 100 / 360}%`;\n }\n else {\n this.top = `${-(this.hsl.h * 100 / 360) + 100}%`;\n }\n }\n handleChange({ top, left, containerHeight, containerWidth, $event }) {\n let data;\n if (this.direction === 'vertical') {\n let h;\n if (top < 0) {\n h = 359;\n }\n else if (top > containerHeight) {\n h = 0;\n }\n else {\n const percent = -(top * 100 / containerHeight) + 100;\n h = 360 * percent / 100;\n }\n if (this.hsl.h !== h) {\n data = {\n h,\n s: this.hsl.s,\n l: this.hsl.l,\n a: this.hsl.a,\n source: 'rgb',\n };\n }\n }\n else {\n let h;\n if (left < 0) {\n h = 0;\n }\n else if (left > containerWidth) {\n h = 359;\n }\n else {\n const percent = left * 100 / containerWidth;\n h = 360 * percent / 100;\n }\n if (this.hsl.h !== h) {\n data = {\n h,\n s: this.hsl.s,\n l: this.hsl.l,\n a: this.hsl.a,\n source: 'rgb',\n };\n }\n }\n if (!data) {\n return;\n }\n this.onChange.emit({ data, $event });\n }\n}\nHueComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: HueComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\nHueComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.1.2\", type: HueComponent, selector: \"color-hue\", inputs: { hsl: \"hsl\", pointer: \"pointer\", radius: \"radius\", shadow: \"shadow\", hidePointer: \"hidePointer\", direction: \"direction\" }, outputs: { onChange: \"onChange\" }, usesOnChanges: true, ngImport: i0, template: `\n
\n
\n
\n
\n
\n
\n
\n `, isInline: true, styles: [\".color-hue{position:absolute;top:0;bottom:0;left:0;right:0}.color-hue-container{margin:0 2px;position:relative;height:100%}.color-hue-pointer{position:absolute}.color-hue-slider{margin-top:1px;width:4px;border-radius:1px;height:8px;box-shadow:0 0 2px #0009;background:#fff;transform:translate(-2px)}.color-hue-horizontal{background:linear-gradient(to right,#f00 0%,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,#f00 100%)}.color-hue-vertical{background:linear-gradient(to top,#f00 0%,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,#f00 100%)}\\n\"], dependencies: [{ kind: \"directive\", type: i1.NgIf, selector: \"[ngIf]\", inputs: [\"ngIf\", \"ngIfThen\", \"ngIfElse\"] }, { kind: \"directive\", type: i1.NgStyle, selector: \"[ngStyle]\", inputs: [\"ngStyle\"] }, { kind: \"directive\", type: CoordinatesDirective, selector: \"[ngx-color-coordinates]\", outputs: [\"coordinatesChange\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: HueComponent, decorators: [{\n type: Component,\n args: [{ selector: 'color-hue', template: `\n
\n
\n
\n
\n
\n
\n
\n `, preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, styles: [\".color-hue{position:absolute;top:0;bottom:0;left:0;right:0}.color-hue-container{margin:0 2px;position:relative;height:100%}.color-hue-pointer{position:absolute}.color-hue-slider{margin-top:1px;width:4px;border-radius:1px;height:8px;box-shadow:0 0 2px #0009;background:#fff;transform:translate(-2px)}.color-hue-horizontal{background:linear-gradient(to right,#f00 0%,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,#f00 100%)}.color-hue-vertical{background:linear-gradient(to top,#f00 0%,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,#f00 100%)}\\n\"] }]\n }], propDecorators: { hsl: [{\n type: Input\n }], pointer: [{\n type: Input\n }], radius: [{\n type: Input\n }], shadow: [{\n type: Input\n }], hidePointer: [{\n type: Input\n }], direction: [{\n type: Input\n }], onChange: [{\n type: Output\n }] } });\nclass HueModule {\n}\nHueModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: HueModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nHueModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.1.2\", ngImport: i0, type: HueModule, declarations: [HueComponent], imports: [CommonModule, CoordinatesModule], exports: [HueComponent] });\nHueModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: HueModule, imports: [CommonModule, CoordinatesModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: HueModule, decorators: [{\n type: NgModule,\n args: [{\n declarations: [HueComponent],\n exports: [HueComponent],\n imports: [CommonModule, CoordinatesModule],\n }]\n }] });\n\nclass RaisedComponent {\n constructor() {\n this.zDepth = 1;\n this.radius = 1;\n this.background = '#fff';\n }\n}\nRaisedComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: RaisedComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\nRaisedComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.1.2\", type: RaisedComponent, selector: \"color-raised\", inputs: { zDepth: \"zDepth\", radius: \"radius\", background: \"background\" }, ngImport: i0, template: `\n
\n
\n
\n \n
\n
\n `, isInline: true, styles: [\".raised-wrap{position:relative;display:inline-block}.raised-bg{position:absolute;top:0px;right:0px;bottom:0px;left:0px}.raised-content{position:relative}.zDepth-0{box-shadow:none}.zDepth-1{box-shadow:0 2px 10px #0000001f,0 2px 5px #00000029}.zDepth-2{box-shadow:0 6px 20px #00000030,0 8px 17px #0003}.zDepth-3{box-shadow:0 17px 50px #00000030,0 12px 15px #0000003d}.zDepth-4{box-shadow:0 25px 55px #00000036,0 16px 28px #00000038}.zDepth-5{box-shadow:0 40px 77px #00000038,0 27px 24px #0003}\\n\"], changeDetection: i0.ChangeDetectionStrategy.OnPush });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: RaisedComponent, decorators: [{\n type: Component,\n args: [{ selector: 'color-raised', template: `\n
\n
\n
\n \n
\n
\n `, preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, styles: [\".raised-wrap{position:relative;display:inline-block}.raised-bg{position:absolute;top:0px;right:0px;bottom:0px;left:0px}.raised-content{position:relative}.zDepth-0{box-shadow:none}.zDepth-1{box-shadow:0 2px 10px #0000001f,0 2px 5px #00000029}.zDepth-2{box-shadow:0 6px 20px #00000030,0 8px 17px #0003}.zDepth-3{box-shadow:0 17px 50px #00000030,0 12px 15px #0000003d}.zDepth-4{box-shadow:0 25px 55px #00000036,0 16px 28px #00000038}.zDepth-5{box-shadow:0 40px 77px #00000038,0 27px 24px #0003}\\n\"] }]\n }], propDecorators: { zDepth: [{\n type: Input\n }], radius: [{\n type: Input\n }], background: [{\n type: Input\n }] } });\nclass RaisedModule {\n}\nRaisedModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: RaisedModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nRaisedModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.1.2\", ngImport: i0, type: RaisedModule, declarations: [RaisedComponent], imports: [CommonModule], exports: [RaisedComponent] });\nRaisedModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: RaisedModule, imports: [CommonModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: RaisedModule, decorators: [{\n type: NgModule,\n args: [{\n declarations: [RaisedComponent],\n exports: [RaisedComponent],\n imports: [CommonModule],\n }]\n }] });\n\nclass SaturationComponent {\n constructor() {\n this.onChange = new EventEmitter();\n }\n ngOnChanges() {\n this.background = `hsl(${this.hsl.h}, 100%, 50%)`;\n this.pointerTop = -(this.hsv.v * 100) + 1 + 100 + '%';\n this.pointerLeft = this.hsv.s * 100 + '%';\n }\n handleChange({ top, left, containerHeight, containerWidth, $event }) {\n if (left < 0) {\n left = 0;\n }\n else if (left > containerWidth) {\n left = containerWidth;\n }\n else if (top < 0) {\n top = 0;\n }\n else if (top > containerHeight) {\n top = containerHeight;\n }\n const saturation = left / containerWidth;\n let bright = -(top / containerHeight) + 1;\n bright = bright > 0 ? bright : 0;\n bright = bright > 1 ? 1 : bright;\n const data = {\n h: this.hsl.h,\n s: saturation,\n v: bright,\n a: this.hsl.a,\n source: 'hsva',\n };\n this.onChange.emit({ data, $event });\n }\n}\nSaturationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: SaturationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\nSaturationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.1.2\", type: SaturationComponent, selector: \"color-saturation\", inputs: { hsl: \"hsl\", hsv: \"hsv\", radius: \"radius\", pointer: \"pointer\", circle: \"circle\" }, outputs: { onChange: \"onChange\" }, usesOnChanges: true, ngImport: i0, template: `\n
\n
\n
\n
\n
\n
\n
\n
\n `, isInline: true, styles: [\".saturation-white{background:linear-gradient(to right,#fff,rgba(255,255,255,0));position:absolute;top:0;bottom:0;left:0;right:0}.saturation-black{background:linear-gradient(to top,#000,rgba(0,0,0,0));position:absolute;top:0;bottom:0;left:0;right:0}.color-saturation{position:absolute;top:0;bottom:0;left:0;right:0}.saturation-pointer{position:absolute;cursor:default}.saturation-circle{width:4px;height:4px;box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px #0000004d,0 0 1px 2px #0006;border-radius:50%;cursor:hand;transform:translate(-2px,-4px)}\\n\"], dependencies: [{ kind: \"directive\", type: i1.NgStyle, selector: \"[ngStyle]\", inputs: [\"ngStyle\"] }, { kind: \"directive\", type: CoordinatesDirective, selector: \"[ngx-color-coordinates]\", outputs: [\"coordinatesChange\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: SaturationComponent, decorators: [{\n type: Component,\n args: [{ selector: 'color-saturation', template: `\n
\n
\n
\n
\n
\n
\n
\n
\n `, preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, styles: [\".saturation-white{background:linear-gradient(to right,#fff,rgba(255,255,255,0));position:absolute;top:0;bottom:0;left:0;right:0}.saturation-black{background:linear-gradient(to top,#000,rgba(0,0,0,0));position:absolute;top:0;bottom:0;left:0;right:0}.color-saturation{position:absolute;top:0;bottom:0;left:0;right:0}.saturation-pointer{position:absolute;cursor:default}.saturation-circle{width:4px;height:4px;box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px #0000004d,0 0 1px 2px #0006;border-radius:50%;cursor:hand;transform:translate(-2px,-4px)}\\n\"] }]\n }], propDecorators: { hsl: [{\n type: Input\n }], hsv: [{\n type: Input\n }], radius: [{\n type: Input\n }], pointer: [{\n type: Input\n }], circle: [{\n type: Input\n }], onChange: [{\n type: Output\n }] } });\nclass SaturationModule {\n}\nSaturationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: SaturationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nSaturationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.1.2\", ngImport: i0, type: SaturationModule, declarations: [SaturationComponent], imports: [CommonModule, CoordinatesModule], exports: [SaturationComponent] });\nSaturationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: SaturationModule, imports: [CommonModule, CoordinatesModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: SaturationModule, decorators: [{\n type: NgModule,\n args: [{\n declarations: [SaturationComponent],\n exports: [SaturationComponent],\n imports: [CommonModule, CoordinatesModule],\n }]\n }] });\n\nclass SwatchComponent {\n constructor() {\n this.style = {};\n this.focusStyle = {};\n this.onClick = new EventEmitter();\n this.onHover = new EventEmitter();\n this.divStyles = {};\n this.focusStyles = {};\n this.inFocus = false;\n }\n ngOnInit() {\n this.divStyles = {\n background: this.color,\n ...this.style,\n };\n }\n currentStyles() {\n this.focusStyles = {\n ...this.divStyles,\n ...this.focusStyle,\n };\n return this.focus || this.inFocus ? this.focusStyles : this.divStyles;\n }\n handleFocusOut() {\n this.inFocus = false;\n }\n handleFocus() {\n this.inFocus = true;\n }\n handleHover(hex, $event) {\n this.onHover.emit({ hex, $event });\n }\n handleClick(hex, $event) {\n this.onClick.emit({ hex, $event });\n }\n}\nSwatchComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: SwatchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\nSwatchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.1.2\", type: SwatchComponent, selector: \"color-swatch\", inputs: { color: \"color\", style: \"style\", focusStyle: \"focusStyle\", focus: \"focus\" }, outputs: { onClick: \"onClick\", onHover: \"onHover\" }, ngImport: i0, template: `\n \n \n \n \n `, isInline: true, styles: [\".swatch{outline:none;height:100%;width:100%;cursor:pointer;position:relative}\\n\"], dependencies: [{ kind: \"directive\", type: i1.NgIf, selector: \"[ngIf]\", inputs: [\"ngIf\", \"ngIfThen\", \"ngIfElse\"] }, { kind: \"directive\", type: i1.NgStyle, selector: \"[ngStyle]\", inputs: [\"ngStyle\"] }, { kind: \"component\", type: CheckboardComponent, selector: \"color-checkboard\", inputs: [\"white\", \"size\", \"grey\", \"boxShadow\", \"borderRadius\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: SwatchComponent, decorators: [{\n type: Component,\n args: [{ selector: 'color-swatch', template: `\n \n \n \n \n `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [\".swatch{outline:none;height:100%;width:100%;cursor:pointer;position:relative}\\n\"] }]\n }], propDecorators: { color: [{\n type: Input\n }], style: [{\n type: Input\n }], focusStyle: [{\n type: Input\n }], focus: [{\n type: Input\n }], onClick: [{\n type: Output\n }], onHover: [{\n type: Output\n }] } });\nclass SwatchModule {\n}\nSwatchModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: SwatchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nSwatchModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.1.2\", ngImport: i0, type: SwatchModule, declarations: [SwatchComponent], imports: [CommonModule, CheckboardModule], exports: [SwatchComponent] });\nSwatchModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: SwatchModule, imports: [CommonModule, CheckboardModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: SwatchModule, decorators: [{\n type: NgModule,\n args: [{\n declarations: [SwatchComponent],\n exports: [SwatchComponent],\n imports: [CommonModule, CheckboardModule],\n }]\n }] });\n\nclass ShadeComponent {\n constructor() {\n this.onChange = new EventEmitter();\n }\n ngOnChanges() {\n this.gradient = {\n background: `linear-gradient(to right,\n hsl(${this.hsl.h}, 90%, 55%),\n #000)`,\n };\n const hsv = new TinyColor(this.hsl).toHsv();\n this.pointerLeft = 100 - (hsv.v * 100);\n }\n handleChange({ left, containerWidth, $event }) {\n let data;\n let v;\n if (left < 0) {\n v = 0;\n }\n else if (left > containerWidth) {\n v = 1;\n }\n else {\n v = Math.round((left * 100) / containerWidth) / 100;\n }\n const hsv = new TinyColor(this.hsl).toHsv();\n if (hsv.v !== v) {\n data = {\n h: this.hsl.h,\n s: 100,\n v: 1 - v,\n l: this.hsl.l,\n a: this.hsl.a,\n source: 'rgb',\n };\n }\n if (!data) {\n return;\n }\n this.onChange.emit({ data, $event });\n }\n}\nShadeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: ShadeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\nShadeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"14.1.2\", type: ShadeComponent, selector: \"color-shade\", inputs: { hsl: \"hsl\", rgb: \"rgb\", pointer: \"pointer\", shadow: \"shadow\", radius: \"radius\" }, outputs: { onChange: \"onChange\" }, usesOnChanges: true, ngImport: i0, template: `\n
\n
\n \n \n
\n \n \n \n `, isInline: true, styles: [\".shade,.shade-gradient{position:absolute;top:0;bottom:0;left:0;right:0}.shade-container{position:relative;height:100%;margin:0 3px}.shade-pointer{position:absolute}.shade-slider{width:4px;border-radius:1px;height:8px;box-shadow:0 0 2px #0009;background:#fff;margin-top:1px;transform:translate(-2px)}\\n\"], dependencies: [{ kind: \"directive\", type: i1.NgStyle, selector: \"[ngStyle]\", inputs: [\"ngStyle\"] }, { kind: \"directive\", type: CoordinatesDirective, selector: \"[ngx-color-coordinates]\", outputs: [\"coordinatesChange\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: ShadeComponent, decorators: [{\n type: Component,\n args: [{ selector: 'color-shade', template: `\n
\n
\n \n \n
\n \n \n \n `, changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, styles: [\".shade,.shade-gradient{position:absolute;top:0;bottom:0;left:0;right:0}.shade-container{position:relative;height:100%;margin:0 3px}.shade-pointer{position:absolute}.shade-slider{width:4px;border-radius:1px;height:8px;box-shadow:0 0 2px #0009;background:#fff;margin-top:1px;transform:translate(-2px)}\\n\"] }]\n }], propDecorators: { hsl: [{\n type: Input\n }], rgb: [{\n type: Input\n }], pointer: [{\n type: Input\n }], shadow: [{\n type: Input\n }], radius: [{\n type: Input\n }], onChange: [{\n type: Output\n }] } });\nclass ShadeModule {\n}\nShadeModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: ShadeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nShadeModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"14.1.2\", ngImport: i0, type: ShadeModule, declarations: [ShadeComponent], imports: [CommonModule, CoordinatesModule], exports: [ShadeComponent] });\nShadeModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: ShadeModule, imports: [CommonModule, CoordinatesModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"14.1.2\", ngImport: i0, type: ShadeModule, decorators: [{\n type: NgModule,\n args: [{\n declarations: [ShadeComponent],\n exports: [ShadeComponent],\n imports: [CommonModule, CoordinatesModule],\n }]\n }] });\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { AlphaComponent, AlphaModule, CheckboardComponent, CheckboardModule, ColorMode, ColorWrap, ColorWrapModule, CoordinatesDirective, CoordinatesModule, EditableInputComponent, EditableInputModule, HueComponent, HueModule, RaisedComponent, RaisedModule, SaturationComponent, SaturationModule, ShadeComponent, ShadeModule, SwatchComponent, SwatchModule, getCheckerboard, getContrastingColor, isValidHex, render, simpleCheckForValidColor, toState };\n"],"x_google_ignoreList":[0,1,2,3,4,9,87,88,89,90,91,92,93,94,95,96,97,98,99]}